美文网首页傲视苍穹《Java》VIP专题
springMVC+maven+mybatis+mysql入门

springMVC+maven+mybatis+mysql入门

作者: Mark_Du | 来源:发表于2018-09-06 23:54 被阅读83次

    (五)最简单的springMVC后台程序

    这一小节,我们会搭建一个最简单的springMVC后台服务程序,初步了解这个框架的开发流程

    我们需要使用 (四)创建的Maven Web 工程 中创建的那个工程源码。

    1.添加依赖包
    我们是基于maven来管理项目的,所以添加依赖包只需要修改pom.xml文件即可。
    从Maven仓库查找包获取依赖配置,在 (二)创建maven工程 中有详细介绍,这里不再赘述。
    添加完依赖包的pom.xml文件如下:

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <groupId>com.springdemo</groupId>
      <artifactId>springstart</artifactId>
      <packaging>war</packaging>
      <version>0.0.1-SNAPSHOT</version>
      <name>springstart Maven Webapp</name>
      <url>http://maven.apache.org</url>
      
      <properties>
            <spring.version>4.3.13.RELEASE</spring.version>
            <jackson.version>2.9.5</jackson.version>
            <security.verison>4.1.3.RELEASE</security.verison>
        </properties>
        <dependencies>
    
            <dependency>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <version>3.1.0</version>
            </dependency>
    
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
                <scope>test</scope>
            </dependency>
    
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>javax.servlet-api</artifactId>
                <version>3.1.0</version>
                <scope>provided</scope>
            </dependency>
    
    
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-core</artifactId>
                <version>${jackson.version}</version>
            </dependency>
    
    
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-databind</artifactId>
                <version>${jackson.version}</version>
            </dependency>
    
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-annotations</artifactId>
                <version>${jackson.version}</version>
            </dependency>
    
            
            <dependency>
                <groupId>com.google.code.gson</groupId>
                <artifactId>gson</artifactId>
                <version>2.8.5</version>
            </dependency>
    
            <!-- spring start -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-core</artifactId>
                <version>${spring.version}</version>
            </dependency>
    
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-beans</artifactId>
                <version>${spring.version}</version>
            </dependency>
            
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>${spring.version}</version>
            </dependency>
    
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-web</artifactId>
                <version>${spring.version}</version>
            </dependency>
    
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-webmvc</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-jdbc</artifactId>
                <version>${spring.version}</version>
            </dependency>
            
            <dependency>
                <groupId>org.springframework.security</groupId>
                <artifactId>spring-security-core</artifactId>
                <version>${security.verison}</version>
            </dependency>
            
            <dependency>
                <groupId>org.springframework.security</groupId>
                <artifactId>spring-security-web</artifactId>
                <version>${security.verison}</version>
            </dependency>
            
            <dependency>
                <groupId>org.springframework.security</groupId>
                <artifactId>spring-security-config</artifactId>
                <version>${security.verison}</version>
            </dependency>
            
            
            <!-- spring end -->
    
            <!-- mysql start -->
    
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.6</version>
            </dependency>
    
            <!-- mysql end -->
            <!-- bonecp start  -->
            <dependency>
                <groupId>com.jolbox</groupId>
                <artifactId>bonecp</artifactId>
                <version>0.8.0.RELEASE</version>
            </dependency>
            
            <dependency>
                <groupId>com.jolbox</groupId>
                <artifactId>bonecp-spring</artifactId>
                <version>0.8.0.RELEASE</version>
            </dependency>
            
            
            <!-- bonecp end -->
    
            <!-- mybatis start -->
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis</artifactId>
                <version>3.4.6</version>
            </dependency>
    
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis-spring</artifactId>
                <version>1.3.2</version>
            </dependency>
    
    
            <!-- mybatis end -->
            
            <!-- redis start-->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.9.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-redis</artifactId>
            <version>2.0.8.RELEASE</version>
        </dependency>
        
        <!-- redis end -->
        </dependencies>
        <build>
            <finalName>springstart</finalName>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.0</version>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </project>
    

    修改完成之后,保存pom.xml文件,然后就会有个过程,如果本地没有需要的包,maven会从中央仓库拉取这个包,这个跟网速有关,需要一定时间。
    如果要问,如何得知需要添加这些依赖包呢?其实就是边用边发现缺了,再查找添加上,慢慢的,配置就完善了。
    2.配置web.xml
    src/main/webapp/WEB-INF下面有一个web.xml文件,这个是springMVC框架的webapp的主要配置文件

    web_xml.png

    在上一节中我们已经讲过了如何把app放到tomcat下运行,这里我们不再讲,有不清楚的可以看看上一节(四)创建的Maven Web 工程

    首先,springMVC的一个核心配置

    <servlet>  
        <servlet-name>springStart</servlet-name>
        <servlet-class>
             org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
        <load-on-startup>1</load-on-startup>
      </servlet>
    

    其中的 <servlet-name>springStart</servlet-name> 这个是设置servlet的名字,这个随便设定,后面会用到
    然后

    <servlet-class>
             org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    

    这一段,是springMVC的运行核心
    我们先说一下,什么是 servlet,简单的说,servlet就是对用户请求和返回数据的一个调度器。
    Tomcat是一个servlet容器,将用户的请求转给servlet处理,将servlet返回的数据返给用户。
    而DispatcherServlet就是springMVC实现的一个servlet,工作流程大致如下:

    springMVC基本流程.jpg
    最简单的一个流程说明:用户发出的请求,通过DispatcherServlet过滤,根据请求分发到不同的控制器,控制器将不同的请求分发到不同的业务逻辑来处理,最后将数据逐层返回给用户。
    后面我会单独写文章来讲一讲Servlet,有兴趣的同学可以关注我。
    上面这个流程,后面我们可以逐渐实现、体会。
    Servlet配置之后,还需要配置一个
      <servlet-mapping>
        <servlet-name>springStart</servlet-name>
        <url-pattern>/</url-pattern>
      </servlet-mapping>
    

    url-pattern表示匹配的url规则,具体规则先不细讲,我们这里使用/表示匹配所有url请求,所有到springStart的请求都要使用DispatcherServlet处理。
    这样,我们修改后的web.xml文件如下:

    <!DOCTYPE web-app PUBLIC
     "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
     "http://java.sun.com/dtd/web-app_2_3.dtd" >
    
    <web-app>
      
      <servlet>  
        <servlet-name>springStart</servlet-name>
        <servlet-class>
             org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
        <load-on-startup>1</load-on-startup>
      </servlet>
      
      <servlet-mapping>
        <servlet-name>springStart</servlet-name>
        <url-pattern>/</url-pattern>
      </servlet-mapping>
      
    </web-app>
    
    

    把工程加载到tomcat,然后启动tomcat,从Console打印窗口,可以看到运行情况
    可以看到,有错误发生,最主要的一句就是

    java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/springStart-servlet.xml]
    

    找不到/WEB-INF/springStart-servlet.xml这个文件,这个也是springMVC的一个主要配置文件
    可以看出,默认是在/WEB-INF目录下找这个文件,文件名的格式就是servlet_name-servlet.xml
    那么我们就在这个目录下建一个这个文件,这个文件有一些固定的格式

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="http://www.springframework.org/schema/mvc
                            http://www.springframework.org/schema/mvc/spring-mvc.xsd
                            http://www.springframework.org/schema/beans
                            http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
                            http://www.springframework.org/schema/context
                            http://www.springframework.org/schema/context/spring-context-4.3.xsd">
    
    
    </beans>
    

    再运行tomcat看看,没有报错,我们在浏览器输入 http://localhost:8080/springstart/ 可以访问到我们的index.jsp,说明服务正常跑起来了。
    前面我们说了,DispatcherServlet 会过滤处理所有的请求,而我们设置的过滤条件是/,就是所有请求都会被处理,都会发送到控制层,为什么我们这里还没有写所谓的控制层,就已经可以访问页面了呢
    我的理解,DispatcherServlet 只会控制对/WEB-INF下面的页面的访问,对于/webapp下的访问无法控制,在上一小节中我们没有配置servlet,也能访问到index.jsp。

    好了,现在我们的基础框架已经搭建起来了,接下来,我们进行各种配置和功能添加

    修改servlet配置文件
    首先,我们不一定把servlet_name-servlet.xml放在/WEB-INF/下面,我们更倾向于把所有配置文件放到一个特定目录下,同时,我们也不想就非得叫这个名字,想叫一下其他名字
    一般,我们把配置文件放到src/main/resources下面,我们在这个目录下创建一个文件夹config,后面我们所有的配置文件都放在这里。
    复制servlet_name-servlet.xml到config下,改个名字,比如叫mymvc.xml,目录结构如下图

    添加config的目录结构.png

    然后,修改web.xml中DispatcherServlet的配置

    <servlet>  
        <servlet-name>springStart</servlet-name>
        <servlet-class>
             org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:config/mymvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    

    其中新增的

    <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:config/mymvc.xml</param-value>
    </init-param>
    

    就是指定servlet的配置文件放在哪里,叫什么名字。
    classpath默认情况下指向的是WEB-INF/classes这个路径,但是我们的WEB-INF下面没有这个classes啊。。。这个指的编译之后的路径
    首先,把servlet_name-servlet.xml删了,我们试一下新创建的mymvc.xml有作用没有。
    把刚才运行的tomcat停了,重新运行一次,待运行完成后,在浏览器里刷新刚才那个地址http://localhost:8080/springstart/,页面依然显示出来,说明配置有效。
    这个时候,我们打开tomcat的安装目录,依次打开webapps\springstart\WEB-INF,可以看到,WEB-INF下面有classes目录,而且classes下面有config目录,classpath指向的就是这个classes,目前我们没有写java代码,所以这里面还没有class文件,后面会有的。

    添加控制器
    控制器实际就是对用户访问url的响应控制,简单来说,用户输入 http://localhost:8080/springstart/firstpage 和输入 http://localhost:8080/springstart/secondpage 应该得到不同的响应。
    控制器(controller)这部分比较模式化,也就是有固定结构,在MVC框架下,controller本来的定位就是一个简单的接受数据返回数据的功能,具体数据处理,都在业务逻辑层。
    首先,在src/main/java下面,创建一个包 com.springstart.controller,然后,在这个包里面,创建一个java类,DemoController.class,具体代码如下:

    package com.springstart.controller;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    @Controller
    public class DemoController {
        
        @RequestMapping(value="/hello",method=RequestMethod.GET)
        public String MyFirstController(){
            System.out.println("some one call MyFirstController");
            return "hello";
        }
    }
    
    

    这段代码的意思很简单,就是返回一个字符串hello,只是多了一些注解,我们来解释一下这些注解(关于java的注解请自行百度一下)。

    @Controller这个就是告诉spring,我这个类,是一个controller,实际上,这个就是让这个类成为一个bean,被会spring自动扫描的时候处理为一个bean,但是特定的controller有一些特别的配置,同样的注解还有@Service,@Component等。
    @RequestMapping用来处理请求地址映射,看我们这里写的

    @RequestMapping(value="/hello",method=RequestMethod.GET)
    

    这个就是一个最常用的方式,value后面跟的就是地址映射,value="/hello"的意思就是,我们这个方法处理springstart/hello 这个URI,method表示请求的方法,如GETPOSTPUTDELETE等,如果不添加method,那么就表示对所有方法进行处理,添加了指定method,就只处理这个类型的请求。
    这个注解同时还可以放在类上面,例如:

    @Controller
    @RequestMapping(value="/user")
    public class DemoCon {
        
        @RequestMapping(value="/name",method=RequestMethod.POST)
        public String addUserName(){
            return null;
        }
        
        @RequestMapping(value="/id",method=RequestMethod.POST)
        public String addUserId(){
            return null;
        }
        
    }
    

    这个demo,我们给类DemoCon加了@RequestMapping(value="/user")注解,表示DemoCon整个类处理 /user的地址请求,下面每个方法的地址请求前需要加上/user
    比如方法addUserName处理的就是 /user/name

    好了,控制器写好了,我们需要使用它,得增加一些配置。
    这个配置要写到mymvc.xml中,之前,我们这个文件是空的,写点配置进去之后

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="http://www.springframework.org/schema/mvc
                            http://www.springframework.org/schema/mvc/spring-mvc.xsd
                            http://www.springframework.org/schema/beans
                            http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
                            http://www.springframework.org/schema/context
                            http://www.springframework.org/schema/context/spring-context-4.3.xsd">
    
        <context:component-scan base-package="com.springstart.*"></context:component-scan>
    
        <bean
            class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/pages/" />
            <property name="suffix" value=".jsp" />
        </bean>
    
    </beans>
    

    component-scan这个的意思就是去扫描base-package指定位置中的关于bean的注解,比如@Component,@Service,@Controller,@Repository等,而base-package一般就是包路径
    通过component-scan之后,我们的controller才可以使用
    下面的org.springframework.web.servlet.view.InternalResourceViewResolver这个可以简单的理解为视图处理器,前面我们写的controller返回的是一个字符串 hello,但是,这不是真正的把字符串返回给页面,是告诉servlet返回的是一个叫hello的视图,具体这个视图如何解释呢,就使用这个InternalResourceViewResolver,下面的参数配置告诉了我们
    prefix是前缀,就是视图的路径
    suffix是后缀,就是视图的后缀
    两个结合起来,我们的hello变成了/WEB-INF/pages/hello.jsp,servlet就把这个页面返给浏览器。
    在/WEB-INF/下创建一个pages目录,放一个hello.jsp进去,hello.jsp的源码如下:

    <html>
    <body>
    <h2>This is my HELLO!!</h2>
    </body>
    </html>
    

    这样,/WEB-INF/ 的目录结构如下:

    WEB-INF的目录结构.png
    好了,我们把tomcat运行起来,在浏览器输入 http://localhost:8080/springstart/hello
    可以看到 This is my HELLO!! 正确的显示到了页面上。
    但是,如果我们像index.jsp一样,自己通过链接http://localhost:8080/springstart/hello.jsp去访问hello.jsp,是无法访问的,提示404错误,这是框架对资源的保护,WEB-INF 下的资源,不能直接访问。

    好了,最简单的一个springMVC框架搭建好了,后面我们继续往里面添加各种功能。
    本次生成的工程代码在 sprintStart github springStart_basic_1 目录下,请自行下载

    相关文章

      网友评论

        本文标题:springMVC+maven+mybatis+mysql入门

        本文链接:https://www.haomeiwen.com/subject/szmkiftx.html