本案例中,集成了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"; } }