zoukankan      html  css  js  c++  java
  • 第7章 使用Spring MVC构建Web程序(一)

    7.1 Spring MVC起步

    7.1.1 跟踪Spring MVC的请求

    在spring MVC中,DispatcherServlet是前端控制器,客户端的请求以及各种请求(处理器映射器,处理器适配器,视图解析器等返回的结果都是它转发给下一个模块)的转发都是它控制的。

    1)前端发送请求;2)DispatcherServlet(前端控制器),接受请求,根据url通过处理器映射器会返回一个结果(这个结果是啥,不是很清楚);2)然后这个结果又返回给前端控制器,前端控制器根据这个结果,通过处理器适配器找到要请求的controller(通常我们写成Controller层,实际是Handler);3)controller处理业务,业务处理完之后,会返回ModelAndView(逻辑视图名,或者是数据);4)然后前端控制器将controller返回的ModelAndView转发给视图解析器;视图解析器将数据渲染成jsp页面(或者其他形式的显示页面)或者根据逻辑视图名找到物理视图;5)前端控制器根据视图解析的结果相应客户端。(传智这个讲的非常清晰,可以看看,下面补张图)

     7.1.2 搭建Spring MVC

    搭建springmvc之前先学会用maven+eclipse搭建一个web工程:

    eclipse+maven搭建web工程之创建

    eclipse+maven搭建web工程之发布和访问

    在web.xml中配置前端控制器DispatcherServlet:

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
     3   <display-name>chapter07</display-name>
     4   <welcome-file-list>
     5     <welcome-file>index.html</welcome-file>
     6     <welcome-file>index.htm</welcome-file>
     7     <welcome-file>index.jsp</welcome-file>
     8     <welcome-file>default.html</welcome-file>
     9     <welcome-file>default.htm</welcome-file>
    10     <welcome-file>default.jsp</welcome-file>
    11     
    12     
    13     
    14   </welcome-file-list>
    15   <!-- 配置前端控制器 -->
    16   <servlet>
    17        <servlet-name>spitter</servlet-name>
    18        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    19       <load-on-startup>1</load-on-startup>
    20   </servlet>
    21   <servlet-mapping>
    22       <servlet-name>spitter</servlet-name>
    23       <url-pattern>/</url-pattern>
    24   </servlet-mapping>
    25 </web-app>
    View Code

    同时,在WEB-INF下创建一个spitter-servlet.xml文件,该文件主要是Spring的应用文件:

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans"
     3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4     xmlns:context="http://www.springframework.org/schema/context"
     5     xmlns:aop="http://www.springframework.org/schema/aop" 
     6     xmlns:tx="http://www.springframework.org/schema/tx"  
     7     xmlns:p="http://www.springframework.org/schema/p"
     8     xmlns:mvc="http://www.springframework.org/schema/mvc"
     9     xsi:schemaLocation="http://www.springframework.org/schema/beans 
    10         http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
    11         http://www.springframework.org/schema/context
    12         http://www.springframework.org/schema/context/spring-context-4.0.xsd
    13         http://www.springframework.org/schema/aop 
    14         http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
    15         http://www.springframework.org/schema/tx 
    16         http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
    17         http://www.springframework.org/schema/mvc
    18         http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
    19     
    20     <!-- 开启mvc注解驱动 -->
    21     <mvc:annotation-driven/>
    22     
    23      <!--注解形式的 组件扫描 -->
    24      <context:component-scan 
    25         base-package="com.springinaction.*"></context:component-scan>
    26     
    27     
    28     <!-- 静态文件访问的配置 -->
    29     <mvc:resources location="/js/" mapping="/js/**"/>
    30     <mvc:resources location="/css/" mapping="/css/**"/>
    31     <mvc:resources location="/img/" mapping="/img/**"/>
    32     
    33 </beans>
    View Code

    7.2 编写控制器

     7.2.1 配置注解驱动的Spring MVC

    Spring自带了多个处理器映射器实现供我们选择:

    • BeanNameUrlHandlerMapping:根据控制器Bean的名字将控制器映射到URL
    • ControllerBeanNameHandlerMapping:与BeanNameUrlHandlerMapping类似,根据空控制器Bean的名字将控制器映射到URL。使用该处理器映射实现,Bean的名字不需要遵循URL的约定。
    • ControllerClassNameHandlerMapping:通过使用控制器的类名作为URL基础将控制器映射到URl
    • SimpleUrlHandlerMapping:使用定义在Spring应用上线文的属性集合将控制器映射到URL。

    以上均需要配置一个Bean,但是mvc有个注解驱动<mvc:annotation-driven>,可以代替处理器映射器,处理器适配器等等

     7.2.2 定义首页的控制器

    pom.xml文件:

      1 <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/xsd/maven-4.0.0.xsd">
      2   <modelVersion>4.0.0</modelVersion>
      3   <groupId>com.springinaction.chapter07</groupId>
      4   <artifactId>chapter07</artifactId>
      5   <version>0.0.1-SNAPSHOT</version>
      6   <packaging>war</packaging>
      7   <dependencies>
      8       <!-- log4j的依赖 -->
      9       <dependency>
     10         <groupId>log4j</groupId>
     11         <artifactId>log4j</artifactId>
     12         <version>1.2.14</version>
     13     </dependency>
     14     <!-- junit的依赖 -->
     15       <dependency>
     16           <groupId>junit</groupId>
     17           <artifactId>junit</artifactId>
     18           <version>4.11</version>
     19           <scope>test</scope>
     20       </dependency>
     21       <!-- spring beans的依赖 -->
     22       <dependency>
     23           <groupId>org.springframework</groupId>
     24           <artifactId>spring-beans</artifactId>
     25           <version>4.2.9.RELEASE</version>
     26       </dependency>
     27       <!-- spring context(应用上下文的依赖) -->
     28       <!-- <dependency>
     29           <groupId>org.springframework</groupId>
     30           <artifactId>spring-context</artifactId>
     31           <version>4.2.9.RELEASE</version>
     32       </dependency> -->
     33       <!-- JSR-330的标准注解 -->
     34       <dependency>
     35           <groupId>javax.inject</groupId>
     36           <artifactId>javax.inject</artifactId>
     37           <version>1</version>
     38       </dependency> 
     39       <!-- spring aspects依赖,AOP用到 -->
     40       <!-- <dependency>
     41         <groupId>org.springframework</groupId>
     42         <artifactId>spring-aspects</artifactId>
     43         <version>4.2.9.RELEASE</version>
     44     </dependency> -->
     45     <!-- 配置数据源的链接dbcp( 提供链接池功能)-->
     46       <!-- <dependency>
     47         <groupId>commons-dbcp</groupId>
     48         <artifactId>commons-dbcp</artifactId>
     49         <version>1.3</version>
     50     </dependency> -->
     51     <!-- mysql的链接的驱动包 -->
     52     <!-- <dependency>
     53         <groupId>mysql</groupId>
     54         <artifactId>mysql-connector-java</artifactId>
     55         <version>5.1.40</version>
     56     </dependency> -->
     57     <!-- spring-jdbc配置数据源 -->
     58     <!-- <dependency>
     59         <groupId>org.springframework</groupId>
     60         <artifactId>spring-jdbc</artifactId>
     61         <version>4.2.9.RELEASE</version>
     62     </dependency> -->
     63     <!-- <dependency>
     64         <groupId>org.springframework</groupId>
     65         <artifactId>spring-jdbc</artifactId>
     66         <version>3.1.0.RELEASE</version>
     67     </dependency> -->
     68     <!-- spring orm -->
     69     <!-- <dependency>
     70         <groupId>springframework</groupId>
     71         <artifactId>spring-orm</artifactId>
     72         <version>1.1.3</version>
     73     </dependency> -->
     74     <!-- spring orm -->
     75     <!-- <dependency>
     76         <groupId>org.springframework</groupId>
     77         <artifactId>spring-orm</artifactId>
     78         <version>4.2.9.RELEASE</version>
     79     </dependency> -->
     80     <!-- mybatis jar -->
     81     <!-- <dependency>
     82         <groupId>org.mybatis</groupId>
     83         <artifactId>mybatis</artifactId>
     84         <version>3.2.2</version>
     85     </dependency> -->
     86     <!-- mybatis spring jar -->
     87     <!-- <dependency>
     88         <groupId>org.mybatis</groupId>
     89         <artifactId>mybatis-spring</artifactId>
     90         <version>1.3.0</version>
     91     </dependency> -->
     92     <!-- spring mvc的jar包 -->
     93     <dependency>
     94         <groupId>org.springframework</groupId>
     95         <artifactId>spring-webmvc</artifactId>
     96         <version>4.2.8.RELEASE</version>
     97     </dependency>
     98     
     99     <!-- 编写测试用例用到,初次用 -->
    100     <dependency>
    101         <groupId>org.mockito</groupId>
    102         <artifactId>mockito-all</artifactId>
    103         <version>1.10.19</version>
    104     </dependency>
    105 
    106     
    107   </dependencies>
    108   
    109   
    110   
    111   <build>
    112         <!-- 配置插件 -->
    113         <plugins>
    114             <plugin>
    115                 <groupId>org.apache.tomcat.maven</groupId>
    116                 <artifactId>tomcat7-maven-plugin</artifactId>
    117                 <configuration>
    118                     <port>8080</port>
    119                     <path>/</path>
    120                     <url>localhost:8080/</url>
    121                     <username>tomcat</username>
    122                     <password>tomcat</password>
    123                 </configuration>
    124             </plugin>
    125         </plugins>
    126     </build>
    127     
    128 </project>
    View Code

    controller:

     1 package com.springinaction.controller;
     2 
     3 import java.util.Map;
     4 
     5 import javax.inject.Inject;
     6 
     7 import org.springframework.stereotype.Controller;
     8 import org.springframework.web.bind.annotation.RequestMapping;
     9 
    10 import com.springinaction.service.SpitterService;
    11 
    12 
    13 @Controller
    14 public class HomeController {
    15     
    16     public static final int DEFAULT_SPITTLES_PER_PAGE = 25;
    17     
    18     private SpitterService spitterService;
    19     
    20     @Inject
    21     public HomeController(SpitterService spitterService){
    22         this.spitterService = spitterService;
    23     }
    24     
    25     @RequestMapping({"/","/home"})
    26     public String showHomePage(Map<String,Object> model){
    27         model.put("spittles", spitterService.getRecentSpittles(DEFAULT_SPITTLES_PER_PAGE));
    28         
    29         return "home";
    30     }
    31     
    32     
    33 }
    View Code

    model:

    1 package com.springinaction.model;
    2 
    3 public class Spitte {
    4 
    5 }
    View Code

    service:

    1 package com.springinaction.service;
    2 
    3 public interface SpitterService {
    4 
    5     Object getRecentSpittles(int defaultSpittlesPerPage);
    6 
    7 }
    View Code

    serviceImpl:

     1 package com.springinaction.service.impl;
     2 
     3 import com.springinaction.service.SpitterService;
     4 
     5 public class SpitterServiceImpl implements SpitterService {
     6 
     7     @Override
     8     public Object getRecentSpittles(int defaultSpittlesPerPage) {
     9         
    10         return null;
    11     }
    12 
    13 }
    View Code

    测试用例:

     1 package com.springinaction.test;
     2 
     3 import static com.springinaction.controller.HomeController.*;
     4 import static org.junit.Assert.*;
     5 import static org.mockito.Mockito.*;
     6 import static java.util.Arrays.*;
     7 
     8 import java.util.HashMap;
     9 import java.util.List;
    10 
    11 import org.junit.After;
    12 import org.junit.AfterClass;
    13 import org.junit.Before;
    14 import org.junit.BeforeClass;
    15 import org.junit.Test;
    16 
    17 import com.springinaction.controller.HomeController;
    18 import com.springinaction.model.Spitte;
    19 import com.springinaction.service.SpitterService;
    20 
    21 public class HomeControllerTest {
    22 
    23     @Test
    24     public void test() {
    25         //模拟SpitterService
    26         List<Spitte> expectedSpittles = asList(new Spitte(),new Spitte(),new Spitte());
    27         SpitterService spitterService = mock(SpitterService.class);
    28         
    29         when(spitterService.getRecentSpittles(DEFAULT_SPITTLES_PER_PAGE))
    30         .thenReturn(expectedSpittles);
    31         
    32         //创建控制器
    33         HomeController controller = new HomeController(spitterService);
    34         HashMap<String, Object> model = new HashMap<String,Object>();
    35         String viewName = controller.showHomePage(model);//调用处理方
    36         
    37         //对处理方法进行对比
    38         assertEquals("home", viewName);
    39         verify(spitterService).getRecentSpittles(DEFAULT_SPITTLES_PER_PAGE);
    40     }
    41 
    42 }
    View Code

    上面测试用例写的懵逼啊,但是测试是通过的,又涨姿势了,若是想用某个包下面的某个类的方法,import static 包名.类名.*;这样就可以了。

     7.2.3 解析视图

    视图解析器的工作是将逻辑视图的名字与org.springframework.web.servlet.View的实现相匹配。视图解析器就是将名称与JSP进行匹配。

    解析内部视图:InternalResourceViewResolver是一个面向约定的元素。他将逻辑视图名称解析为View对象,而该对象将渲染的任务委托给Web应用程序上下文中的一个模板。

    在spitter-servlet.xml配置视图解析器的bean:

    1 <!-- 视图解析器 -->
    2     <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    3         <!-- 这个属性之前没见过,是因为home.jsp使用了一些JSTL标签, -->
    4         <property name="prefix" value="/WEB-INF/views/*"></property>
    5         <property name="suffix" value="/WEB-INF/.jsp"></property>
    6     </bean>
    View Code

    这本书的下面用到了一个Tiles布局视图,看着懵逼,没工夫研究他。下面我自己根据学习的知识(传智的视频,这里只是说他视频资源非常好,没有广告的嫌疑,网上都可以下载到的资源)搭建一个从前台展示到controller的一个请求和数据回显的过程。

    首先整个工程结构还是如上,

    1.上面讲述一种的spitter-servlet.xml(这是书本里叫的名字,后面我重命名另外一个名字springmvc.xml)的配置,是将其放在了WEB-INF下面,这是web.xml加载spitter-servlet.xml的默认位置,而且命名必须是*-servlet.xml,还有第二种配法,是将其其位置统一放在了src/main/resources下面的文件夹下(我上面的搭建过程还自动生成了几个xml文件,自动生成的删掉或者重命名成自己需要的,如下图),maven工程项目中的大部分xml配置文件都放在这个文件夹下,在springmvc.xml文件中做与spitter-servlet.xml相同的配置,因为不用spitter-servlet配置,所以最好将之前的HomeController里的注解注释掉。

    2.想连接数据库做一个查询分页的效果(并且采用jquey-EasyUi的控件尝试一下,所以),所以搞定准备工作先,

      2.1数据库(mysql)里建立一张user表(id主键)

      

      2.2将需要的mybatis依赖的jar文件,spring的jar文件等等通过pom.xml引进来,里面应该是大部分引进来了,有需要的后面再添加:

      1 <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/xsd/maven-4.0.0.xsd">
      2   <modelVersion>4.0.0</modelVersion>
      3   <groupId>com.springinaction.chapter07</groupId>
      4   <artifactId>chapter07</artifactId>
      5   <version>0.0.1-SNAPSHOT</version>
      6   <packaging>war</packaging>
      7   <dependencies>
      8       <!-- log4j的依赖 -->
      9       <dependency>
     10         <groupId>log4j</groupId>
     11         <artifactId>log4j</artifactId>
     12         <version>1.2.14</version>
     13     </dependency>
     14     <!-- junit的依赖 -->
     15       <dependency>
     16           <groupId>junit</groupId>
     17           <artifactId>junit</artifactId>
     18           <version>4.11</version>
     19           <scope>test</scope>
     20       </dependency>
     21       <!-- 引入jstl标签库的jar -->
     22       <dependency>
     23         <groupId>javax.servlet</groupId>
     24         <artifactId>jstl</artifactId>
     25         <version>1.2</version>
     26     </dependency>
     27     <!-- 引入tiles标签库的jar -->
     28     <!-- <dependency>
     29         <groupId>org.apache.tiles</groupId>
     30         <artifactId>tiles-jsp</artifactId>
     31         <version>2.2.2</version>
     32     </dependency> -->
     33       <!-- spring beans的依赖 -->
     34       <dependency>
     35           <groupId>org.springframework</groupId>
     36           <artifactId>spring-beans</artifactId>
     37           <version>4.2.9.RELEASE</version>
     38       </dependency>
     39       <!-- spring context(应用上下文的依赖) -->
     40       <dependency>
     41           <groupId>org.springframework</groupId>
     42           <artifactId>spring-context</artifactId>
     43           <version>4.2.9.RELEASE</version>
     44       </dependency>
     45       <!-- JSR-330的标准注解 -->
     46       <!-- <dependency>
     47           <groupId>javax.inject</groupId>
     48           <artifactId>javax.inject</artifactId>
     49           <version>1</version>
     50       </dependency> --> 
     51       <!-- spring aspects依赖,AOP用到 -->
     52       <dependency>
     53         <groupId>org.springframework</groupId>
     54         <artifactId>spring-aspects</artifactId>
     55         <version>4.2.9.RELEASE</version>
     56     </dependency>
     57     <!-- 配置数据源的链接dbcp( 提供链接池功能)-->
     58       <dependency>
     59         <groupId>commons-dbcp</groupId>
     60         <artifactId>commons-dbcp</artifactId>
     61         <version>1.3</version>
     62     </dependency>
     63     <!-- mysql的链接的驱动包 -->
     64     <dependency>
     65         <groupId>mysql</groupId>
     66         <artifactId>mysql-connector-java</artifactId>
     67         <version>5.1.40</version>
     68     </dependency>
     69     <!-- spring-jdbc配置数据源 -->
     70     <dependency>
     71         <groupId>org.springframework</groupId>
     72         <artifactId>spring-jdbc</artifactId>
     73         <version>4.2.9.RELEASE</version>
     74     </dependency>
     75     <!-- <dependency>
     76         <groupId>org.springframework</groupId>
     77         <artifactId>spring-jdbc</artifactId>
     78         <version>3.1.0.RELEASE</version>
     79     </dependency> -->
     80     <!-- spring orm -->
     81     <!-- <dependency>
     82         <groupId>springframework</groupId>
     83         <artifactId>spring-orm</artifactId>
     84         <version>1.1.3</version>
     85     </dependency> -->
     86     <!-- spring orm -->
     87     <!-- <dependency>
     88         <groupId>org.springframework</groupId>
     89         <artifactId>spring-orm</artifactId>
     90         <version>4.2.9.RELEASE</version>
     91     </dependency> -->
     92     <!-- mybatis jar -->
     93     <dependency>
     94         <groupId>org.mybatis</groupId>
     95         <artifactId>mybatis</artifactId>
     96         <version>3.2.2</version>
     97     </dependency>
     98     <!-- mybatis spring jar -->
     99     <dependency>
    100         <groupId>org.mybatis</groupId>
    101         <artifactId>mybatis-spring</artifactId>
    102         <version>1.3.0</version>
    103     </dependency>
    104     <!-- spring mvc的jar包 -->
    105     <dependency>
    106         <groupId>org.springframework</groupId>
    107         <artifactId>spring-webmvc</artifactId>
    108         <version>4.2.8.RELEASE</version>
    109     </dependency>
    110     
    111     <!-- 编写测试用例用到,初次用 -->
    112     <dependency>
    113         <groupId>org.mockito</groupId>
    114         <artifactId>mockito-all</artifactId>
    115         <version>1.10.19</version>
    116     </dependency>
    117 
    118     
    119   </dependencies>
    120   
    121   
    122   
    123   <build>
    124         <!-- 配置插件 -->
    125         <plugins>
    126             <plugin>
    127                 <groupId>org.apache.tomcat.maven</groupId>
    128                 <artifactId>tomcat7-maven-plugin</artifactId>
    129                 <configuration>
    130                     <port>8080</port>
    131                     <path>/</path>
    132                     <url>localhost:8080/</url>
    133                     <username>tomcat</username>
    134                     <password>tomcat</password>
    135                 </configuration>
    136             </plugin>
    137         </plugins>
    138     </build>
    139     
    140 </project>
    View Code

      2.3 介绍一个逆向工程的工具(有点吊,很好使)下载地址

      

     下面是generatorConfig.xml配置:1、配置数据库的连接信息,我的user表在test库里面,2、配置生成的po(其实就是model了,我习惯了model)类的位置,3、配置生成的mapper接口(其实就是dao层的接口)的位置,4、配置mapper映射文件的位置(mybatis主要就是写这个mapper.xml文件,但是有逆向工程了,还写个毛线),5、配数据库中要使用的表名,这几个配置好,直接运行GeneratorSqlmap.java中的main方法,就会生成了(若是没有看到,请刷新工程),如下图:

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <!DOCTYPE generatorConfiguration
     3   PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
     4   "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
     5 
     6 <generatorConfiguration>
     7     <context id="testTables" targetRuntime="MyBatis3">
     8         <commentGenerator>
     9             <!-- 是否去除自动生成的注释 true:是 : false:否 -->
    10             <property name="suppressAllComments" value="true" />
    11         </commentGenerator>
    12         <!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->
    13         <jdbcConnection driverClass="com.mysql.jdbc.Driver"
    14             connectionURL="jdbc:mysql://localhost:3306/test" userId="root"
    15             password="mysql">
    16         </jdbcConnection>
    17         <!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和 
    18             NUMERIC 类型解析为java.math.BigDecimal -->
    19         <javaTypeResolver>
    20             <property name="forceBigDecimals" value="false" />
    21         </javaTypeResolver>
    22 
    23         <!-- targetProject:生成PO类的位置 -->
    24         <javaModelGenerator targetPackage="com.springinaction.model"
    25             targetProject=".src">
    26             <!-- enableSubPackages:是否让schema作为包的后缀 -->
    27             <property name="enableSubPackages" value="false" />
    28             <!-- 从数据库返回的值被清理前后的空格 -->
    29             <property name="trimStrings" value="true" />
    30         </javaModelGenerator>
    31         <!-- targetProject:mapper映射文件生成的位置 -->
    32         <sqlMapGenerator targetPackage="com.springinaction.mapper" 
    33             targetProject=".src">
    34             <!-- enableSubPackages:是否让schema作为包的后缀 -->
    35             <property name="enableSubPackages" value="false" />
    36         </sqlMapGenerator>
    37         <!-- targetPackage:mapper接口生成的位置 -->
    38         <javaClientGenerator type="XMLMAPPER"
    39             targetPackage="com.springinaction.mapper" 
    40             targetProject=".src">
    41             <!-- enableSubPackages:是否让schema作为包的后缀 -->
    42             <property name="enableSubPackages" value="false" />
    43         </javaClientGenerator>
    44         <!-- 指定数据库表 -->
    45         <table schema="" tableName="user"></table>
    46         
    47 
    48     </context>
    49 </generatorConfiguration>
    View Code

     3、配置一些xml文件:

      3.1配置mybatis的sqlMapConfig.xml,在src/main/resources下面,创建mybatis/sqlMapConfig.xml,里面先不配置,需要再配置:

    1 <?xml version="1.0" encoding="UTF-8" ?>
    2 <!DOCTYPE configuration
    3         PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    4         "http://mybatis.org/dtd/mybatis-3-config.dtd">
    5 <configuration>
    6 
    7 </configuration>
    View Code

      3.2在src/main/resources创建resource/db.properties的数据库连接配置文件

    1 jdbc.driver=com.mysql.jdbc.Driver
    2 jdbc.url=jdbc:mysql://localhost:3306/test?characterEncoding=utf-8
    3 jdbc.username=root
    4 jdbc.password=mysql
    View Code

      3.3在spring文件夹配置dao层(即mapper接口层)的spring bean容器applicationContext-dao.xml,里面主要配置数据源,和扫描mapper接口的bean配置(这里只是扫描mapper接口,而mapper.xml却扫描不到,下面有关于这个问题的处理):

     1 <beans xmlns="http://www.springframework.org/schema/beans"
     2     xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
     3     xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
     4     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     5     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
     6     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
     7     http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
     8     http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">
     9 
    10     <!-- 数据库链接池 -->
    11     <!-- 加载配置文件 -->
    12     <context:property-placeholder location="classpath:resource/*.properties"/>
    13     <bean  id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" >
    14         <property name="url" value="${jdbc.url}"></property>
    15         <property name="username" value="${jdbc.username}"></property>
    16         <property name="password" value="${jdbc.password}"></property>
    17         <property name="driverClassName" value="${jdbc.driver}"></property>
    18         <property name="initialSize" value="5"></property>
    19          <property name="maxActive" value="10"></property>
    20     </bean>
    21     
    22     <!-- 配置SqlSessionFactory -->
    23     <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    24         
    25         <property name="configLocation" value="classpath:mybatis/sqlMapConfig.xml"></property>
    26         <property name="dataSource" ref="dataSource"></property>
    27     </bean>
    28     <!-- 配置扫描包 -->
    29     <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    30         <property name="basePackage" value="com.springinaction.mapper"></property>
    31     </bean>
    32     
    33 </beans>
    View Code

      3.4在spring文件夹配置service的spring bean容器applicationContext-service.xml,这里主要扫面service实现类,

     1 <beans xmlns="http://www.springframework.org/schema/beans"
     2     xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
     3     xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
     4     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     5     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
     6     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
     7     http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
     8     http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">
     9         
    10         <!-- 扫描包加载Service实现类 -->
    11         <context:component-scan base-package="com.springinaction.service"></context:component-scan>
    12         
    13 </beans>
    View Code

      3.5在spring文件夹中配置事务的spring bean容器applicationContext-trans.xml,这里主要是配置事务管理的:

     1 <beans xmlns="http://www.springframework.org/schema/beans"
     2     xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
     3     xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
     4     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     5     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
     6     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
     7     http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
     8     http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">
     9         
    10     <!-- 事务管理器 -->
    11     <bean id="transactionManager" 
    12             class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    13         <property name="dataSource" ref="dataSource"></property>        
    14     </bean>
    15     
    16     <!-- 通知 -->
    17     <tx:advice id="txAdvice" transaction-manager="transactionManager">
    18         <tx:attributes>
    19             <!-- 传播行为 -->
    20             <tx:method name="save*" propagation="REQUIRED"/>
    21             <tx:method name="insert*" propagation="REQUIRED"/>
    22             <tx:method name="add*" propagation="REQUIRED"/>
    23             <tx:method name="create*" propagation="REQUIRED"/>
    24             <tx:method name="delete" propagation="REQUIRED"/>
    25             <tx:method name="update*" propagation="REQUIRED"/>
    26             <tx:method name="find*" propagation="SUPPORTS" read-only="true"/>
    27             <tx:method name="select*" propagation="SUPPORTS" read-only="true"/>
    28             <tx:method name="get*" propagation="SUPPORTS" read-only="true"/>
    29         </tx:attributes>
    30     </tx:advice>
    31     
    32     <!-- 切面 -->
    33     <aop:config>
    34         <aop:advisor advice-ref="txAdvice"
    35             pointcut="execution(* com.springinaction.service.*.*(..))"/>
    36     </aop:config>
    37     
    38     
    39 </beans>
    View Code

    以上的几个配置文件其实可以直接集中配置到springmvc.xml中,不过分离后,层面更加清晰,分离之后这几个文件还要在web.xml文件中配置一项,让其加载进来:

    4.配置web.xml,如下:

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
     3   <display-name>chapter07</display-name>
     4   <welcome-file-list>
     5     <welcome-file>index.html</welcome-file>
     6     <welcome-file>index.htm</welcome-file>
     7     <welcome-file>index.jsp</welcome-file>
     8     <welcome-file>default.html</welcome-file>
     9     <welcome-file>default.htm</welcome-file>
    10     <welcome-file>default.jsp</welcome-file>
    11     
    12     
    13     
    14   </welcome-file-list>
    15   <!-- 配置前端控制器 -->
    16   <!-- <servlet>
    17        <servlet-name>spitter</servlet-name>
    18        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    19       <load-on-startup>1</load-on-startup>
    20   </servlet>
    21   <servlet-mapping>
    22       <servlet-name>spitter</servlet-name>
    23       <url-pattern>/</url-pattern>
    24   </servlet-mapping> -->
    25   
    26   <!-- 前端控制器的第二种配法 -->
    27   
    28   <servlet>
    29        <servlet-name>springmvc</servlet-name>
    30        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    31        <!-- 注意这里和上面的配置不一样,若是采取第二种配置,必须配置初始化参数的位置,加载springmvc.xml-->
    32       <init-param>
    33           <param-name>contextConfigLocation</param-name>
    34           <param-value>classpath:spring/springmvc.xml</param-value>
    35       </init-param>
    36       <load-on-startup>1</load-on-startup>
    37   </servlet>
    38   <servlet-mapping>
    39       <servlet-name>springmvc</servlet-name>
    40       <url-pattern>/</url-pattern>
    41   </servlet-mapping>
    42   
    43   <!-- 加载spring容器 -->
    44   <context-param>
    45       <param-name>contextConfigLocation</param-name>
    46       <param-value>classpath:spring/applicationContext-*.xml</param-value>
    47   </context-param>
    48   <listener>
    49       <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    50   </listener>
    51 </web-app>
    View Code

    下面maven build运行一下,可以访问到index.jsp页面,maven build在搭建maven工程里面有涉及,说明目前配置没多大问题,我们进行开发了:

    首先将刚才逆向工程的文件copy进来,然后开发service、controller

    UserService:

     1 package com.springinaction.service;
     2 
     3 import java.util.List;
     4 
     5 import com.springinaction.model.User;
     6 
     7 public interface UserService {
     8 
     9     List<User> selectAllUser();
    10 
    11 }
    View Code

    UserServiceImpl:

     1 package com.springinaction.service.impl;
     2 
     3 import java.util.List;
     4 
     5 import org.springframework.beans.factory.annotation.Autowired;
     6 import org.springframework.stereotype.Service;
     7 
     8 import com.springinaction.mapper.UserMapper;
     9 import com.springinaction.model.User;
    10 import com.springinaction.service.UserService;
    11 
    12 @Service
    13 public class UserServiceImpl implements UserService {
    14     
    15     //mapper是逆向工程生成的,方法也是,所以直接调用里面的方法就可以
    16     @Autowired
    17     private UserMapper userMapper;
    18     
    19     @Override
    20     public List<User> selectAllUser() {
    21         
    22         return userMapper.selectByExample(null);
    23     }
    24 
    25 }
    View Code

    UserController:

     1 package com.springinaction.controller;
     2 
     3 import java.util.List;
     4 
     5 import org.springframework.beans.factory.annotation.Autowired;
     6 import org.springframework.stereotype.Controller;
     7 import org.springframework.web.bind.annotation.RequestMapping;
     8 
     9 import com.springinaction.model.User;
    10 import com.springinaction.service.UserService;
    11 
    12 @Controller
    13 public class UserController {
    14     
    15     @Autowired
    16     private UserService userService;
    17     
    18     @RequestMapping("/user/userList")
    19     public List<User> selectAllUser(){
    20         System.out.println(userService.selectAllUser());
    21         return userService.selectAllUser();
    22     }
    23     
    24 }
    View Code

    然后开启服务,进行访问,报错:

    上面图中说插件不准确,是在pom.xml中的<build>标签中配置一个<resources></resources>,具体如下:

     1 <!-- 如果不添加此节点mybatis的mapper.xml文件都会被漏掉 -->
     2         <resources>
     3             <!-- 坑就在这里,视频里就配置第一个resource
     4                 他的目的是把src/main/java/**下面的所有的properties、xml文件拷贝到
     5                 chapter07	argetclassescomspringinaction下面对应的文件夹中,
     6              -->
     7             <resource>
     8                 <directory>src/main/java</directory>
     9                 <includes>
    10                     <include>**/*.properties</include>
    11                     <include>**/*.xml</include>
    12                 </includes>
    13                 <filtering>false</filtering>
    14             </resource>
    15             <!-- 我只配了上面那个就报错了,所示找不到spring/文件夹下的spring bean容器文件,
    16                 结果我查看chapter07	argetclasses,确实是哪些文件没有被拷贝进来,于是上面的写法
    17                 配置了如下的resource,他就把src/main/resources文件下的哪些配置文件拷贝到chapter07	argetclasses下面了
    18             -->
    19             <resource>
    20                 <directory>src/main/resources</directory>
    21                 <includes>
    22                     <include>**/*.properties</include>
    23                     <include>**/*.xml</include>
    24                 </includes>
    25                 <filtering>false</filtering>
    26             </resource> 
    27         </resources>
    28         
    View Code

    这时候访问路径localhost:8080/user/userList,由于没有jsp页面所以报错,但是控制台打印出了从数据库拿到的数据:

    源码下载(里面有逆向工程的工具)

    下一篇:第7章 使用Spring MVC构建Web程序(二),前端用jquery-EasyUi显示,运用分页插件,进行分页处理。

  • 相关阅读:
    14、数列
    13、Hangover
    12、Anagrams by Stack
    彩票软件7) 重构数据库accesser
    彩票软件6)观察者模式
    彩票软件5)Sqlite 数据库访问类
    彩票软件4)插叙
    彩票软件3)wpf界面布局
    彩票软件2)代码管理git
    彩票软件1)前言
  • 原文地址:https://www.cnblogs.com/huaxueyihao/p/6671287.html
Copyright © 2011-2022 走看看