Spring-SpringMVC-Mybatis整合的步骤

时间:2023-03-09 09:50:37
Spring-SpringMVC-Mybatis整合的步骤

1.导入jar包

  1.1  spring面向切面jar包

    com.springsource.net.sf.cglib-2.2.0.jar
    com.springsource.org.aopalliance-1.0.0.jar
    com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
  1.2 springJDBCjar包
    c3p0-0.9.2.1.jar
    mchange-commons-java-0.2.3.4.jar

    spring-jdbc-4.2.2.RELEASE.jar

  1.3  mybatis与spring整合jar包
    mybatis-3.2.2.jar
    mybatis-spring-1.2.1.jar

  1.4  mysql数据库jar包
    mysql-connector-java-5.0.8-bin.jar

  1.5 springAOP及springMVCjar包

    commons-logging-1.1.3.jar
    spring-aop-4.2.2.RELEASE.jar
    spring-beans-4.2.2.RELEASE.jar
    spring-context-4.2.2.RELEASE.jar
    spring-core-4.2.2.RELEASE.jar
    spring-expression-4.2.2.RELEASE.jar
    spring-tx-4.2.2.RELEASE.jar
    spring-web-4.2.2.RELEASE.jar
    spring-webmvc-4.2.2.RELEASE.jar

  1.6 js标签库jar包

    jstl.jar
    standard.jar

  1.7 文件上传jar包

    commons-fileupload-1.3.1.jar

    commons-io-2.2.jar

  1.8 springMVC与ajax交互jar包

    jackson-annotations-2.2.1.jar

    jackson-core-2.2.1.jar

    jackson-databind-2.2.1.jar

2.配置spring的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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="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.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd"> <!-- 包扫描 *业务层 -->
<context:component-scan base-package="com.eduask.liusheng.service"/> <!-- 引入属性文件 *数据源属性及连接池属性 -->
<context:property-placeholder location="classpath:db.properties"/> <!-- 配置数据源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driver}"></property>
<property name="jdbcUrl" value="${jdbc.url}"></property>
<property name="user" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean> <!-- 配置SQLSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 注入数据库连接池 -->
<property name="dataSource" ref="dataSource"/>
<!-- 扫描实体类包,使用别名 -->
<property name="typeAliasesPackage" value="com.eduask.liusheng.bean"/>
<!-- 扫描映射文件 -->
<property name="mapperLocations" value="classpath:com/eduask/liusheng/mapper/*.xml"/>
</bean> <!-- 配置扫描Dao接口包,动态实现Dao接口,注入到spring容器中 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 注入sqlSessionFactory -->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
<!-- 给出需要扫描Dao接口包,自动生成对应实体,不用手动实现 -->
<property name="basePackage" value="com.eduask.liusheng.dao"/>
</bean> <!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean> <!-- 配置事务通知 *如果是注解方式,需要配置事务管理注解驱动-->
<tx:advice id="advice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="insert*" propagation="REQUIRED" isolation="DEFAULT" read-only="false"/>
<tx:method name="update*" propagation="REQUIRED" isolation="DEFAULT" read-only="false"/>
<tx:method name="delete*" propagation="REQUIRED" isolation="DEFAULT" read-only="false"/>
<tx:method name="select*" read-only="true"/>
<tx:method name="*" read-only="true"/>
</tx:attributes>
</tx:advice> <!-- 配置切点 -->
<aop:config>
<!-- 配置切点 -->
<aop:pointcut expression="execution(* com.eduask.liusheng.service.*.*(..))" id="pointcut"/>
<!-- 关联切点与通知 -->
<aop:advisor advice-ref="advice" pointcut-ref="pointcut"/>
</aop:config> </beans>
 jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/employeemanager
jdbc.username=root
jdbc.password=root
#连接池属性在这里配置

属性文件

3.配置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/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!-- 配置包扫描 *控制器层 注意:扫描包为com.eduask.liusheng时,会使Service事物管理失效,需要加限制条件context:exclude-filter-->
<context:component-scan base-package="com.eduask.liusheng.controller"/> <!-- 配置视图解析器 *受保护的网页放在/WEB-INF下,不能被直接访问,只能请求转发到该页面 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/view/"></property>
<property name="suffix" value=".jsp"></property>
</bean>   <!-- 访问静态资源 js jpg html css 等静态资源 -->
  <mvc:default-servlet-handler/>   <!-- 配置登陆拦截器 -->
  <mvc:interceptors>
  <mvc:interceptor>
  <mvc:mapping path="/**"/>
   <bean class="com.eduask.liusheng.inerceptor.LoginInterceptor"></bean>
   </mvc:interceptor>
  </mvc:interceptors> <!-- 配置全局时间转化类 没有时间转化可省略以下 -->
<!-- 第一步: 创建自定义日期转换规则 class:为时间转化类的全类名 -->
<bean id="dateConvert" class="com.eduask.liusheng.util.DateConvert"/>
<!-- 第二步: 创建convertion-Service ,并注入dateConvert-->
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<set>
<ref bean="dateConvert"/>
</set>
</property>
</bean>
<!-- 第三步:注册处理器映射器/处理器适配器 ,添加conversion-service属性-->
<mvc:annotation-driven conversion-service="conversionService"/>
    
   <!-- 配置文件上传的映射 *id必须为multipartResolver -->
<bean id="multipartResolver"
      class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
  <!-- 配置上传的大小 -->
  <property name="maxUploadSize" value="104857600"></property>
  <!-- 配置缓存 -->
  <property name="maxInMemorySize" value="4096" />
  <!-- 配置上传的编码 -->
  <property name="defaultEncoding" value="utf-8"></property>
 </bean> </beans>
 import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date; import org.springframework.core.convert.converter.Converter; public class DateConvert implements Converter<String, Date> { @Override
public Date convert(String stringDate){
//时间转化类(时间格式)
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
try {
return simpleDateFormat.parse(stringDate);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
} }

DateConvert.java

 import java.io.File;
import java.io.FileOutputStream; import javax.servlet.http.HttpServletRequest; import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.commons.CommonsMultipartFile; @Controller
public class UploadController {
@RequestMapping("/upload1.do")
public String upload(HttpServletRequest req) throws Exception{
long startTime=System.currentTimeMillis();
MultipartHttpServletRequest multiRequest=(MultipartHttpServletRequest)req;
MultipartFile multiFile=multiRequest.getFile("myfile1");
String path=req.getSession().getServletContext().getRealPath("/upload");
File file=new File(path+"\\"+multiFile.getOriginalFilename());
FileOutputStream fos=new FileOutputStream(file);
fos.write(multiFile.getBytes());
fos.flush();
fos.close();
long endTime=System.currentTimeMillis();
System.out.println("upload1运行时间:"+String.valueOf(endTime-startTime)+"ms");
return "a";
} @RequestMapping("/upload2.do")
public String upload1(@RequestParam("myfile2") CommonsMultipartFile file,HttpServletRequest req) throws Exception{
long startTime=System.currentTimeMillis();
String path=req.getSession().getServletContext().getRealPath("/upload");
File uploadfile=new File(path+"\\"+file.getOriginalFilename());
file.transferTo(uploadfile);
long endTime=System.currentTimeMillis();
System.out.println("upload2运行时间:"+String.valueOf(endTime-startTime)+"ms");
return "a";
} @RequestMapping("/upload3.do")
public String upload3(HttpServletRequest req) throws Exception{
long startTime=System.currentTimeMillis();
MultipartHttpServletRequest multiRequest=(MultipartHttpServletRequest)req;
MultipartFile multiFile=multiRequest.getFile("myfile3");
String path=req.getSession().getServletContext().getRealPath("/upload");
File file=new File(path+"\\"+multiFile.getOriginalFilename());
multiFile.transferTo(file);
long endTime=System.currentTimeMillis();
System.out.println("upload3运行时间:"+String.valueOf(endTime-startTime)+"ms");
return "a";
} }

文件上传三种方法

 import java.io.PrintWriter;

 import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody; @Controller
public class AjaxController { @RequestMapping("/fun1.do")
public void fun1(PrintWriter out,User user){
System.out.println(user);
out.print("你好");
} @RequestMapping("/fun2.do")
@ResponseBody
public User fun2(User user){
return user;
} }

spring与ajax交互,spring的自动封装

 import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView; public class LoginInterceptor implements HandlerInterceptor { /**
* preHandle方法是进行处理器拦截用的,顾名思义,该方法将在Controller处理之前进行调用,
* SpringMVC中的Interceptor拦截器是链式的,可以同时存在多个Interceptor,
* 然后SpringMVC会根据声明的前后顺序一个接一个的执行,
* 而且所有的Interceptor中的preHandle方法都会在Controller方法调用之前调用。
* SpringMVC的这种Interceptor链式结构也是可以进行中断的,
* 这种中断方式是令preHandle的返回值为false,当preHandle的返回值为false的时候整个请求就结束了。
*/
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object o) throws Exception {
System.out.println("----------preHandle------------");
String path=request.getServletPath();
System.out.println("path:"+path);
if("/login.do".equals(path)){
return true;
}
if("/logout.do".equals(path)){
request.getSession().removeAttribute("user");
}
String str=(String) request.getSession().getAttribute("user");
if (str!=null) {
return true;
}else{
response.sendRedirect("login.jsp");
return false;
}
} /**
* 这个方法只会在当前这个Interceptor的preHandle方法返回值为true的时候才会执行。
* postHandle是进行处理器拦截用的,它的执行时间是在处理器进行处理之后,
* 也就是在Controller的方法调用之后执行,但是它会在DispatcherServlet进行视图的渲染之前执行,
* 也就是说在这个方法中你可以对ModelAndView进行操作。
* 这个方法的链式结构跟正常访问的方向是相反的,也就是说先声明的Interceptor拦截器该方法反而会后调用,
* 这跟Struts2里面的拦截器的执行过程有点像,
* 只是Struts2里面的intercept方法中要手动的调用ActionInvocation的invoke方法,
* Struts2中调用ActionInvocation的invoke方法就是调用下一个Interceptor
* 或者是调用action,然后要在Interceptor之前调用的内容都写在调用invoke之前,
* 要在Interceptor之后调用的内容都写在调用invoke方法之后。
*/
public void postHandle(HttpServletRequest request, HttpServletResponse response,
Object o, ModelAndView ex) throws Exception {
System.out.println("----------postHandle------------");
} /**
* 该方法也是需要当前对应的Interceptor的preHandle方法的返回值为true时才会执行。
* 该方法将在整个请求完成之后,也就是DispatcherServlet渲染了视图执行,
* 这个方法的主要作用是用于清理资源的,当然这个方法也只能在当前这个Interceptor的preHandle方法的返回值为true时才会执行。
*/
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object o, Exception ex)
throws Exception {
System.out.println("----------afterCompletion------------");
} }

LoginInterceptor.java

4.配置web.xml

 <?xml version="1.0" encoding="UTF-8"?>
<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">
<display-name>EmployeeManager</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list> <!-- 配置前端控制器 和 springMVC-servlet 的配置文件引入-->
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springMVC-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping> <!-- 设置servlet所有编码的过滤器 -->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping> <!-- 配置监听器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener> <!-- Spring配置文件的引入 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param> </web-app>

注意:配置error page时,如果不跳转到error页面,可能是浏览器选项中,高级-显示友好页面信息未取消勾选