本案例中,集成了maven,spring,springmvc,mybatis。除了没有shiro,其他的都算全。maven坐标全,xml配置全。

一,新建maven工程,Maven里选择webapp的ID,生成后,需要自己手动改webapp的版本由2.3改为2.5,否则jsp的el表达式,不起作用。webapp2.5的文件头为:

<?xml version="1.0" encoding="UTF-8"?>
 <web-app xmlns="http://java.sun.com/xml/ns/javaee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
 version="2.5">
 </web-app> 

二,导入pom的坐标,在导入c3p0的时候,提示用mchange的那个,不用c3p0->c3p0的。否则启动时,提示c3p0的abstract关闭等等错误。在导入后,eclipse后续提示一个错误,即在applicationContext和springmvc的配置文件中,如果自动扫描包配置,包含或者排除Controller注解,他不提示全类名,但是在java的src文件中,有提示。

<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>cn.taotao</groupId>
  <artifactId>mssm02</artifactId>
  <packaging>war</packaging>
  <version>0.0.1-SNAPSHOT</version>
  <name>mssm02 Maven Webapp</name>
  <url>http://maven.apache.org</url>
 <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>

    <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>

<!-- https://mvnrepository.com/artifact/taglibs/standard -->
<dependency>
    <groupId>taglibs</groupId>
    <artifactId>standard</artifactId>
    <version>1.1.2</version>
</dependency>


<!-- https://mvnrepository.com/artifact/c3p0/c3p0 -->

<dependency>
    <groupId>com.mchange</groupId>
    <artifactId>c3p0</artifactId>
    <version>0.9.5.2</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>4.3.25.RELEASE</version>
</dependency>


<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>4.3.25.RELEASE</version>
</dependency>

    <!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>4.3.25.RELEASE</version>
</dependency>
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-beans -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-beans</artifactId>
    <version>4.3.25.RELEASE</version>
</dependency>
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-web -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>4.3.25.RELEASE</version>
</dependency>
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>4.3.25.RELEASE</version>
</dependency>
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-aop -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aop</artifactId>
    <version>4.3.25.RELEASE</version>
</dependency>

    <!-- https://mvnrepository.com/artifact/org.springframework/spring-context-support -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>4.3.25.RELEASE</version>
</dependency>
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-expression -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-expression</artifactId>
    <version>4.3.25.RELEASE</version>

</dependency>

<!-- https://mvnrepository.com/artifact/org.springframework/spring-tx -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
    <version>4.3.25.RELEASE</version>
</dependency>


<dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    <version>1.1.3</version>
</dependency>

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.48</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.4.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>1.3.3</version>
</dependency>


  </dependencies>
  <build>
    <finalName>mssm02</finalName>
  </build>
</project>

三、建立包,

cn.taotao.bean

cn.taotao.dao

cn.taotao.service

cn.taotao.controller

然后书写实体类等,bean下写Employee.java类。dao下写接口EmployeeMapper.java接口文件。service下写业务类EmployeeService.java,这个类用@Service注解标识。controller下写EmployeeController控制类,这个类用@Controller类标识。各个类之间的引用关系,用@Autowire注解标识。

四、编写web.xml文件,此文件头必须改为servlet 2.5规范的。

有两个部分,一个是引入spring文件的contextConfigLocation,一个是引入springmvc的springDispatcherServlet,如果这个servlet不写引用地址,可以在WEB-INF目录下建立与此servlet名字加-servlet的xml文件,它自动会加载。

<?xml version="1.0" encoding="UTF-8"?>
 <web-app xmlns="http://java.sun.com/xml/ns/javaee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
 version="2.5">

   <!-- needed for ContextLoaderListener -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>

    <!-- Bootstraps the root web application context before servlet initialization -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <!-- The front controller of this Spring Web application, responsible for handling all application requests -->
    <servlet>
        <servlet-name>springDispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <!-- Map all requests to the DispatcherServlet for handling -->
    <servlet-mapping>
        <servlet-name>springDispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

五、编写applicationContext.xml文件,即spring的配置文件

1.数据源。c3p0 的 ComboPooledDataSource,实例化bean',然后引用4个属性,jdbcUrl,driverClass,user,password。在这里建议用context的property-placeholder,来引入一个properties文件,里面保存着已经写好的配置文件,在bean的property里直接引用。

2.自动扫描包。<context:compont-scan >在这里,排除掉exclude,这个类所代表的注解 org.springframework.stereotype.Controller,就是说除了@Controller以外,其他的包都扫描。

3.配置事务。DataSourceTransactionManager,实例化这个类。然后注入属性,引用上面的数据源。开启基于注解的事务,<tx:annotation-driven >他的管理器引用上面的管理器Id

4.Mybatis的sqlSessionFactoryBean。实例化这个bean,然后配置数据源,配置configlocation,和mapperLocation的位置。

5.配置一个可以批量执行的sqlsession。org.mybatis.spring.SqlSessionTemplate。实例化这个类,然后设置构造器属性,sqlSessionFactory,引用上面的。executorType,的值为BATCH。

6.mybatis-spring自动扫描包。<mybatis-spring:scan base-package="cn.taotao.dao">

六、编写springmvc.xml文件,即springmvc的配置文件

1.视图解析器,即InternalResourceViewResolver,实例化此bean,然后加入属性前缀和后缀。

2. 自动扫描包,然后加入注解,只包含@Controller注解。

3.驱动注解。

4.默认的serlvet处理器,用来处理静态资源。

七、编写mybatis-config.xml文件。即Mybatis的配置文件,虽然大部分的配置已经移交给了applicationContext但是某些特殊的配置,仍然需要配置。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
 PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
        <setting name="jdbcTypeForNull" value="NULL"/>

        <!--显式的指定每个我们需要更改的配置的值,即使他是默认的。防止版本更新带来的问题  -->
        <setting name="cacheEnabled" value="true"/>
        <setting name="lazyLoadingEnabled" value="true"/>
        <setting name="aggressiveLazyLoading" value="false"/>
    </settings>
</configuration>

 八、编写mybatis的接口映射文件。即mapper。

此文件的namespace属性,对应与实体接口类。id对应与接口的方法。此文件的存放位置默认与接口同一个目录,实践中可以放到资源目录下,建立与接口同级别的目录结构。编译器在打包时会自动导入一个包中。否则需要写mapper的地址映射位置。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.taotao.dao.EmployeeMapper">
  <select id="getEmpId" resultType="cn.taotao.bean.Employee">
    select * from tbl_employee where id = #{id}
  </select>

  <select id="getEmps" resultType="cn.taotao.bean.Employee">
      select * from tbl_employee
  </select>
</mapper>

九、以下为代码片段

dbconfig.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test?allowMultiQueries=true
jdbc.username=root
jdbc.password=123456

applicationContext.xml 

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


    <context:property-placeholder
        location="classpath:dbconfig.properties" />

    <bean id="dbsource"
        class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="jdbcUrl" value="${jdbc.url}"></property>
        <property name="driverClass" value="${jdbc.driver}"></property>
        <property name="user" value="${jdbc.username}"></property>
        <property name="password" value="${jdbc.password}"></property>
    </bean>


    <context:component-scan base-package="cn.taotao">
        <context:exclude-filter type="annotation"
            expression="org.springframework.stereotype.Controller" />
    </context:component-scan>

    <!-- 事务处理 -->
    <bean id="dbTransactionManager"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dbsource"></property>
    </bean>
    <tx:annotation-driven
        transaction-manager="dbTransactionManager" />


    <!-- -->
    <bean class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dbsource"></property>
        <property name="configLocation"
            value="classpath:mybatis-config.xml"></property>
        <!-- <property name="mapperLocations" value=""></property> -->
    </bean>

    <mybatis-spring:scan base-package="cn.taotao.dao"/>
</beans>

 

springmvc.xml

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


        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/pages/"></property>
            <property name="suffix" value=".jsp"></property>
        </bean>
        <context:component-scan base-package="cn.taotao">
            <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
        </context:component-scan>
        <mvc:annotation-driven></mvc:annotation-driven>
        <mvc:default-servlet-handler/>

</beans>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
 <web-app xmlns="http://java.sun.com/xml/ns/javaee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
 version="2.5">

   <!-- needed for ContextLoaderListener -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>

    <!-- Bootstraps the root web application context before servlet initialization -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <!-- The front controller of this Spring Web application, responsible for handling all application requests -->
    <servlet>
        <servlet-name>springDispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <!-- Map all requests to the DispatcherServlet for handling -->
    <servlet-mapping>
        <servlet-name>springDispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

bean代码

package cn.taotao.bean;

public class Employee {

    private int id;
    private String name;
    private String email;
    private String gender;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public String getGender() {
        return gender;
    }
    public void setGender(String gender) {
        this.gender = gender;
    }
    @Override
    public String toString() {
        return "Employee [id=" + id + ", name=" + name + ", email=" + email + ", gender=" + gender + "]";
    }

}

dao 

package cn.taotao.dao;

import java.util.List;

import cn.taotao.bean.Employee;

public interface EmployeeMapper {

    public Employee getEmpById(int id);

    public List<Employee> getEmps();
}

service

package cn.taotao.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Service;

import cn.taotao.bean.Employee;
import cn.taotao.dao.EmployeeMapper;

@Service
public class EmployeeService {

    @Autowired
    private EmployeeMapper empMapper;

    public Employee getEmployeeById(int id) {
        return empMapper.getEmpById(id);
    }

    public List<Employee> getEmps(){

        return empMapper.getEmps();
    }

}

Controller,

此代码中,@RequestMapping注解,用来相应某个href链接。传入的参数Map,会回传给页面,可以用EL表达式显示。返回的字符串list,是需要建立一个list.jsp文件。此返回值与jsp的文件名相同。

package cn.taotao.controller;

import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import cn.taotao.bean.Employee;
import cn.taotao.service.EmployeeService;

@Controller
public class EmployeeController {

    @Autowired
    private EmployeeService empService;

    @RequestMapping("/getemps")
    public String getEmps(Map<String,Object> map) {
        List<Employee> emps = empService.getEmps();
        map.put("emps", emps);
        return "list";
    }

}
01-08 10:02
查看更多