1. Springmvc简介
1.1. 什么是springmvc
SpringMVC是一个Spring框架内置的对MVC模式的实现,就spring的一个子模块
1.2. 什么是mvc
Model - view-controller(模型-视图-控制器),实现页面与业务代码分离
Model I: jsp+javabean
Model II: jsp+servlet+javabean
1.3. mvc的作用
SpringMVC就是MVC这种思想一个实现.所以作用就是实现页面代码和后台代码的分离.
1.4. Springmvc的配置流程
1.5. Springmvc的体系结构
2. 入门案例
2.1. 导入jar包
2.2. 配置核心控制器
<!-- 配置核心控制器 servlet加载的时候会默认会去WEB-INFO下找spring的配置文件 默认的文件名为:<servlet名字>-servlet.xml --> <servlet> <servlet-name>spring</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 修改spring配置文件的路径 --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext-mvc.xml</param-value> </init-param> <!-- 配置tomcat启动时加载该servlet--> <load-on-startup>1</load-on-startup> </servlet> <!-- 配置路径映射 --> <servlet-mapping> <servlet-name>spring</servlet-name> <!-- 映射的路径 *.mvc 拦截 .mvc结尾的请求 / 所有请求全部由springmvc解析 (resful风格) /* 如果配置了/* 返回jsp也由springmvc进行解析(不使用) --> <url-pattern>*.mvc</url-pattern> </servlet-mapping>
|
配置请求路径拦截的注意事项:
可以配/,此工程所有请求全部由springmvc解析
可以配置*.mvc或者*.do,所有请求的url扩展名为*.mvc或者*.do由springmvc解析
不可配置/* ,如果配置了/* 返回jsp也由springmvc进行解析了。
配置了
<load-on-startup>1</load-on-startup>
spring对象容器随项目启动
2.3. 配置处理器映射器和处理器适配器
<!-- 配置处理器映射器 (HandlerMapping) BeanNameUrlHandlerMapping 根据bean的name属性去匹配对应的处理类 --> <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
<!-- 配置处理器适配器(HandlerAdapter) 处理类是什么样的规则--> <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
|
2.4. 编写处理类
/** * ModelAndView 模型与视图 */ @Override public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { System.out.println("第一个springmvc的程序。。。。"); /* //请求转发 request.setAttribute("username", "小明"); request.getRequestDispatcher("/hellospringmvc.jsp").forward(request, response);*/ ModelAndView modelAndView = new ModelAndView(); //设置模型,等同于request.setAttribute modelAndView.addObject("username", "春哥"); //设置响应的视图 modelAndView.setViewName("hellospringmvc.jsp"); returnmodelAndView; } |
在配置文件中配置
<!-- spring管理TestController name为请求的路径 --> <beanid="testController"name="/hellospringmvc.mvc" class="com.ys.controller.TestController"></bean> |
2.5. 编写测试代码
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>springmvc测试</title> </head> <body> <a href="${pageContext.request.contextPath}/hellospringmvc.mvc">测试springmvc</a> </body> </html> |
3. Springmvc核心介绍
3.1. DispathcerServlet核心控制器
DispathcerServlet作为springmvc的中央调度器存在,DispatcherServlet创建时会默认从DispatcherServlet.properties文件加载springmvc所用的各各组件,如果在applicationContext.xml中配置了组件则以applicationContext.xml中配置的为准,DispatcherServlet的存在降低了springmvc各各组件之间的耦合度。
3.2. HandlerMapping处理器映射器
HandlerMapping 负责根据request请求找到对应的Handler处理器及Interceptor拦截器,
将它们封装在HandlerExecutionChain对象中给前端控制器返回。
3.2.1. BeanNameUrlHandlerMapping
BeanNameUrl处理器映射器,根据请求的url与spring容器中定义的bean的name进行匹配,从而从spring容器中找到bean实例
3.2.2. SimpleUrlHandlerMapping
simpleUrlHandlerMapping是BeanNameUrlHandlerMapping的增强版本,它可以将url和处理器bean的id进行统一映射配置。
3.2.3. RequestMappingHandlerMapping
注解式处理器映射器,对类中标记@ResquestMapping的方法进行映射,根据ResquestMapping定义的url匹配ResquestMapping标记的方法,匹配成功返回HandlerMethod对象给前端控制器,HandlerMethod对象中封装url对应的方法Method
注解描述:
@RequestMapping:定义请求url到处理器功能方法的映射
3.3. HandlerAdapter处理器适配器
HandlerAdapter会根据适配器接口对后端控制器进行包装(适配),包装后即可对处理器进行执行,通过扩展处理器适配器可以执行多种类型的处理器,这里使用了适配器设计模式。
3.3.1. SimpleControllerHandlerAdapter
SimpleControllerHandlerAdapter简单控制器处理器适配器,所有实现了org.springframework.web.servlet.mvc.Controller 接口的Bean通过此适配器进行适配、执行。
3.3.2. HttpRequestHandlerAdapter
HttpRequestHandlerAdapter,http请求处理器适配器,所有实现了org.springframework.web.HttpRequestHandler 接口的Bean通过此适配器进行适配、执行。
3.3.3. RequestMappingHandlerAdapter
注解式处理器适配器,对标记@ResquestMapping的方法进行适配。
3.4. ViewResolver视图解析器
InternalResourceViewResolver:支持JSP视图解析viewClass:JstlView表示JSP模板页面需要使用JSTL标签库,所以classpath中必须包含jstl的相关jar 包;prefix 和suffix:查找视图页面的前缀和后缀,最终视图的地址为:前缀+逻辑视图名+后缀,逻辑视图名需要在controller中返回ModelAndView指定,比如逻辑视图名为hello,则最终返回的jsp视图地址 “WEB-INF/jsp/hello.jsp”
<!-- 配置视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 响应的路径为前缀+viewName+后缀 --> <!-- 前缀 --> <property name="prefix" value="/"></property> <!-- 后缀 --> <property name="suffix" value=".jsp"></property> </bean> |
4. 注解开发springmvc
配置注解处理器映射器和处理器适配器
<!-- 配置包扫描 --> <context:component-scan base-package="com.ys.controller"></context:component-scan>
<!-- 配置注解的处理器映射器 --> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean>
<!-- 配置注解的处理器适配器 --> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean> |
可用如下代码代替处理器映射器和处理器适配器
<!-- 配置处理器映射器和处理器适配器 功能更加强大:支持json等东西 --> <mvc:annotation-driven></mvc:annotation-driven> |
在处理类中加上@RequestMapping注解
@Controller//让spring扫描到该类 @RequestMapping("hello")//给该类加命名空间 publicclass HelloController{
/** * @RequestMapping中的路径可以写成如下三种方式: * /sayHello.do * sayHello.do * sayHello */ @RequestMapping("sayHello") public ModelAndView sayHello(){ System.out.println("springmvc注解开发"); ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("name", "张三"); modelAndView.setViewName("hello"); returnmodelAndView; } }
|
5. @RequestMapping详解
5.1. 请求路径的设置
@RequestMapping 中的路径可以写成如下三种方式:
/sayHello.do
sayHello.do
sayHello
5.2. 作为命名空间
@RequestMapping定义在类上作为命名空间
访问时,相应的路径必须带上命名空间
5.3. 两种限制
5.3.1. method限制(请求方式的限制)
根据请求的method的值,来确定请求是否有权限方法执行方法.
如果不设置method限制,允许任何method的值的请求请求执行方法.
如果设置GET请求的限制,那么只能接收GET请求
/** * 限制GET请求方式 * * @return */ @RequestMapping(value="requestmethodget",method=RequestMethod.GET) public String requestmethodget(){
return"test.jsp"; } |
如果设置POST请求的限制,那么只能接收POST请求
/** * 限制POST请求方式 * * @return */ @RequestMapping(value="requestmethodpost",method=RequestMethod.POST) public String requestmethodpost(){
return"test.jsp"; } |
同时支持两种请求方式
/** * @RequestMapping参数讲解 * value : 请求的路径 * 注意事项,在注解中,如果属性为value时可以省略不写 * method: 请求方式的限制 get/post * method=RequestMethod.POST * * @return */ @RequestMapping(value="requestmethod",method={RequestMethod.GET,RequestMethod.POST}) public String requestmethod(){
return"test.jsp"; } |
5.3.2. 参数限制
参数限制就是指,请求中必须包括哪些参数,或者不包括哪些参数.参数对的值的限定
/** * 请求参数的限制 * param * username 参数必须要有username * !userpwd 参数中不能出现userpwd * userSex=man 参数中userSex必须要有,且userSex的值为man * userAge!=12 参数中userAge必须要有,且userAge的值不能为12 * @return */ @RequestMapping(value="requestparam",params={"username","!userpwd","userSex=man","userAge!=12"}) public String requestparam(){
return"test.jsp"; } |
6. 数据绑定
6.1. springmvc的内置对象
springMVC直接内置支持ServletAPI的方式获得和设置数据将ServletAPI中HttpServletRequest,HttpServletResponse,HttpSession这三个接口放在执行方法的参数上,
SpringMVC会自动的将请求参数与这个三个对象关联
6.2. SpringMVC数据的自动绑定
6.2.1. 字段的自动绑定
SpringMVC只要将与表单name属性的字段一一对应的参数写在方法的参数里,SpringMVC会自动绑定
6.2.2. 实体的自动绑定
6.2.3. 数组类型自动绑定
6.3. 强制绑定数据
6.3.1. 参数的强制绑定
参数不是可以通过name属性的对应关系一一对应,为什么还需要强制绑定?
如果请求表单的属性与执行方法参数的字段不一一对应呢?就要强制绑定了.
参数的强制绑定使用注解@RequestParam
6.3.2. Map的强制绑定
SpringMVC默认不支持自动将数据绑定到Map.需要使用@RequestParam强制绑定
也是使用@RequestParam注解.
6.3.3. 获取到地址栏的参数
resuful
@PathVariable
获取到路径的参数
/** * 如果{name}与String name1不一样,要在注解使用value绑定@PathVariable(value="name") * 如果{name}与String name一样就不用,直接使用@PathVariable就可以 * @param name1 * @return */ @RequestMapping(value="{name}/find") public String find(@PathVariable String name){ System.out.println("查询名字为:"+name); return"/hello.jsp"; } |
package com.ys.controller;
import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping;
/** * 获取到地址栏的参数 * 地址栏中不出现问号 * getPathParam?id=12 -----> getPathParam/12 * * 1.核心控制器拦截的路径必须改成 / * 2.@RequestMapping请求路径中定义为 * getPathParam/{id} * {id}相当于一个名字为id的一个占位符 * 在实际请求路径中,需要把占位符代替成具体的内容 * 3.在对应的请求方法中如何获取到该占位符的内容呢? * 答:使用@PathVariable * * @author Administrator * 只在方法中定义路径请求参数 */ @Controller public class PathParamController {
@RequestMapping("getPathParam/{id}") public void getPathParam(@PathVariable String id){ System.out.println("id为:"+id); }
@RequestMapping("getPathParamTwo/{id}/{name}") public void getPathParamTwo(@PathVariable String id,@PathVariable String name){ System.out.println("id为:"+id); System.out.println("name为:"+name); }
}
|
6.3.4. JSON数据强制绑定
@RequestBody
7. Json支持
7.1. Json支持的两个前提条件
1.在配置文件中配置如下代码
<mvc:annotation-driven></mvc:annotation-driven> |
2.导入jasksonjson支持包
7.2. 支持JSON对象的传入
@RequestBody:支持传入JSON字符串自动绑定到Java对象里面
7.3. Struts2对json支持
导入包
在struts.xml中配置package extends=”json-default”
对应result类型为json
public class HelloAction{
//数据
private Useruser;
//setter/getter
getJson(){
//填充User内容
}
}
7.4. 支持JSON数据返回
就是将Java对象自动转成JSON对象返回.
使用注解:@ResponseBody
7.4.1. 返回实体自动转JSON
7.4.2. 返回Map自动转JSON
7.4.3. 返回集合自动转JSON
Google格式化工具
8. 文件上传与下载
8.1. Servlet文件上传
fileupload
8.2. Struts2的文件上传
8.3. Springmvc放行静态资源
<!-- 放行静态资源 location: 资源文件的位置 mapping:访问地址映射 --> <mvc:resources location="/upload/" mapping="/upload/**"></mvc:resources> |
8.4. Springmvc文件上传
导入jar包
文件上传异常处理:
改变form表单的属性:method="post" enctype="multipart/form-data"
<form action="${pageContext.request.contextPath}/singleFileUpload" method="post" enctype="multipart/form-data"> <input type="file" name="uploadFile"/> <input type="submit" name="上传"/> </form> |
需要在applicationContext.xml中配置文件上传解析器(CommonsMultipartResolver)
特别注意:给该bean配置上Id为multipartResolver
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> </bean>
|
8.4.1. 单文件上传
导入文件上传的两个jar包
编写上传的form表单
<form action="${pageContext.request.contextPath}/singleFileUpload" method="post" enctype="multipart/form-data"> <input type="file" name="uploadFile"/> <input type="submit" name="上传"/> </form> |
在配置文件中配置文件上传解析器
<!-- 配置文件上传解析器 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> </bean> |
编写文件上传的处理方法
//单文件上传 /** * 上传文件到本地磁盘 * @param file * @return */ @RequestMapping(value="singleFileUpload") public String singleFileUpload(MultipartFile uploadFile){ //获取到文件上传表单域的name属性 String name2 = uploadFile.getName(); System.out.println(name2); //获取到上传的文件名 String name = uploadFile.getOriginalFilename(); System.out.println("上传文件的名字:"+name); //保存文件到本地目录 File destDir = new File("D:/uploaddir"); if(!destDir.exists()){//如果目录不存在则创建 destDir.mkdirs(); } //保存到目标文件 File destFile = new File(destDir,name); try { uploadFile.transferTo(destFile); } catch (IllegalStateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return"success"; }
/** * 上传文件到tomcat * @param file * @return */ @RequestMapping(value="fileupload2Tomcat") public String fileupload2Tomcat(@RequestParam("uploadFile") MultipartFile file,HttpServletRequest request){ //获取到表单中的name属性 String name = file.getName(); //获取到文件名 String filename = file.getOriginalFilename(); //获取文件的后缀名 String extension = FilenameUtils.getExtension(filename); //处理文件名 String filenameUUID = UUID.randomUUID().toString(); //保存的文件到项目部署路径的upload文件夹下 String realPath = request.getServletContext().getRealPath("/"); System.out.println(realPath); //判断upload文件夹是否存在,不存在则创建 File dirFile = new File(realPath+"upload");//目录 if(!dirFile.exists()){ dirFile.mkdirs(); } File destFile = new File(dirFile, filenameUUID+"."+extension); try { file.transferTo(destFile); } catch (IllegalStateException e) {
e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return"success"; } |
8.4.2. 多文件上传
编写上传的form表单
<form action="${pageContext.request.contextPath}/multipartFileUpload" method="post" enctype="multipart/form-data"> <input type="file" name="uploadFiles"/><br/> <input type="file" name="uploadFiles"/><br/> <input type="file" name="uploadFiles"/><br/> <input type="file" name="uploadFiles"/><br/> <input type="submit" name="上传"/> </form> |
编写文件上传的处理方法
//多文件上传 @RequestMapping(value="multipartFileUpload") public String multipartFileUpload(@RequestParam MultipartFile[] uploadFiles){ //创建保存目录 File destDir = new File("D:/uploaddir"); if(!destDir.exists()){//如果目录不存在则创建 destDir.mkdirs(); } if(uploadFiles!=null){ for(MultipartFile partFile:uploadFiles){ try { //获取单个文件名 String filename = partFile.getOriginalFilename(); //处理重复文件的命名是UUID命名 //需求:以UUID作为文件名,但是后缀保留 //1.获取到文件的后缀名
String houzhui = filename.substring(filename.lastIndexOf(".")); //重新构建文件名 filename = UUID.randomUUID()+houzhui; //构建保存的文件 File destFile = new File(destDir,filename); partFile.transferTo(destFile); } catch (IllegalStateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } return"success"; } |
8.5. 文件下载
1. /** 2. * 文档下载 3. * @param fileName 4. * @param file 5. * @return 6. * @throws IOException 7. */ 8. public ResponseEntity<byte[]> download(String fileName, File file) throws IOException{ 9. String dfileName = new String(fileName.getBytes("gb2312"), "iso8859-1"); 10. HttpHeaders headers = new HttpHeaders(); 11. headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); 12. headers.setContentDispositionFormData("attachment", dfileName); 13. return new ResponseEntity<byte[]>(org.apache.commons.io.FileUtils.readFileToByteArray(file), headers, HttpStatus.CREATED); 14. } 进行调用: [java] view plain copy 1. @RequestMapping("/download") 2. public ResponseEntity<byte[]> downloadFile(@RequestParam("fileName") String fileName) throws IOException { 3. if (fileName != null) { 4. //String realPath = request.getServletContext().getRealPath("resources/files/"); 5. String realPath = "E:\\work"; 6. File file = new File(realPath, fileName); 7. if (file.exists()) { 8. return download(fileName, file); 9. } 10. System.out.println("====文件路径不存在"); 11. } 12. return null; 13. }
|
9. 拦截器
HandlerInterceptor 拦截器必须实现的接口
preHandle
方法执行之前拦截
* Object handler:拦截方法所在的Controller
* 如果返回false,不执行接下来的方法
postHandle
方法执行后:如果方法执行异常,这个方法就不算执行完成,出了异常这个方法就不执行。
afterCompletion
方法完成:不管报不报异常,方法总要结束的,这个结束我们称方法完成,所以异常也会执行
9.1. 拦截器编写
package com.ys.intercept;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView;
public class MyInterceptor implements HandlerInterceptor{
//方法完成后调用(无论是否出现异常都会调用) @Override public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception { System.out.println("方法完成后调用(无论如何都会调用)"); } //方法执行后:(正常结束) @Override public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception {
System.out.println("方法执行后:(正常结束)"); }
//方法执行前调用, //如果返回值为false,将不会调用postHandle,afterCompletion。且不会执行对应的处理方法 @Override public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception { System.out.println("方法执行前调用"); return true; }
}
|
9.2. 拦截器配置
在spring的配置文件中配置:
<!-- 配置拦截器 --> <mvc:interceptors> <mvc:interceptor> <!-- 配置拦截的路径 --> <mvc:mapping path="/interceptorTest"/> <!-- 配置拦截器的bean --> <bean class="com.ys.intercept.MyInterceptor"></bean> </mvc:interceptor> </mvc:interceptors> |
10.SSM整合
10.1. 导入jar包
10.2. 先配置spring和mybatis的整合
applicationContext.xml中的配置
<!-- 扫描包 --> <context:component-scan base-package="com.ys"></context:component-scan> <!-- 配置注解的处理器映射器和处理器适配器 @RequestMapping 修饰的方法当做请求的处理方法 注解对应的value参数作为请求的路径 --> <!-- 整合mybaits(注解) --> <!-- 加载外部属性文件 --> <context:property-placeholder location="classpath:database.properties"/>
<!-- 配置池c3p0数据源 --> <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>
<!-- 配置SqlSessionFactoryBean --> <bean class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 注入数据源 --> <property name="dataSource" ref="dataSource"></property> <!-- 配置mybatis的映射文件路径 --> <property name="mapperLocations" value="classpath:com/ys/mapper/xml/UserMapper.xml"></property> <!-- 配置别名(扫描包) --> <property name="typeAliasesPackage" value="com.ys.entity"></property> </bean>
<!-- 配置扫描Mapper --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <!-- 扫描的包 --> <property name="basePackage" value="com.ys.mapper"></property> </bean> |
10.3. 配置springmvc
applicationContext.xml中的配置
<!-- 配置springmvc --> <!-- 配置处理器适配器和处理器映射器 --> <mvc:annotation-driven></mvc:annotation-driven> |
Web.xml中的配置
<!-- 配置springmvc的核心控制器 --> <servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 配置spring配置文件的路径 --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </init-param> <!-- 配置tomcat启动时,加载核心控制器 --> <load-on-startup>1</load-on-startup> </servlet>
<!-- 核心控制器拦截的路径配置 --> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> |
10.4. 整合log4j
加入log4j的包
加入log4j.properites的配置文件
10.5. 处理post提交中文乱码的问题
在web.xml中配置编码格式的过滤器
<!-- 处理post提交中,出现的中文乱码问题 使用spring提供的过滤器 --> <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> </filter> <!-- 配置过滤器拦截的路径 --> <filter-mapping> <filter-name>characterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
|
解决静态资源无法加载的问题
在spring配置文件中配置如下代码:
第一种方式
<!-- 在spring配置文件中配置不拦截静态资源 --> <!-- 把静态资源不让springmvc去拦截 --> <!-- 1 location: 资源路径 mapping:哪些资源不被拦截 ? 一个字符 * 任意长度字符 ** 任意目录下的文件 -->
<!-- <mvc:resources location="/img/" mapping="/img/**"></mvc:resources> -->
|
第二种方式
<!-- 2 把所有静态资源的管理权交回给web容器(tomcat) --> <mvc:default-servlet-handler/> |
实现用户登录和注册功能
10.6. SSM整合步骤
Spring和mybatis整合
10.6.1. 导入spring和mybatis的基础jar包
mybatis-3.3.0.jar mysql-connector-java-5.1.18-bin.jar commons-logging-1.1.3.jar |
10.6.2. 新建空的spring配置文件
10.6.3. 创建实体类
10.6.4. 新建mapper.xml和mapper.java
注意事项:mapper.xml的namespacemapper.java接口的全限定名(包名+类名)
10.6.5. 编写applicationContext.xml整合mybatis
1.引入外部属性文件
<context:property-placeholder location=""/>
注意事项:在web工程中使用时,使用classpath指向类路径加载属性文件
2.配置数据源
导入c3p0的jar包
c3p0-0.9.5.2.jar
mchange-commons-java-0.2.11.jar
ComboPooledDataSource
3.配置SqlSessionFactoryBean
注意事项:
1.导入mybatis-spring-1.2.0.jar整合
2.mapper.java和mapper.xml文件不在同一包下:需要手动加载mapper.xml
4.配置扫描mapper
MapperScannerConfigurer
注意事项:配置扫描包 (basePackage)
<!-- 引入外部属性文件 --> <context:property-placeholder location="classpath:database.properties"/>
<!-- 扫描注解包service --> <context:component-scan base-package="service"></context:component-scan>
<!-- 配置c3p0数据源 --> <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>
<!-- .配置SqlSessionFactoryBean --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 配置数据源 --> <property name="dataSource" ref="dataSource"></property> <!-- 配置映射文件 --> <property name="mapperLocations" value="classpath:mapper/xml/UserMapper.xml"></property> </bean>
<!-- 配置Mapper扫描 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 配置mapper所在的包 --> <property name="basePackage" value="mapper"></property> </bean> |
10.6.6. 新建service类
使用注解扫描的方式管理service,加载@Service注解,对应的依赖使用@Autowired注 解注入
在配置文件中配置扫描包,扫描相应的注解
<context:component-scan base-package=""></context:component-scan>
10.6.7. 测试spring整合mybatis
导入spring-test-4.2.6.RELEASE.jar+junit4的包
新建service测试类测试
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:applicationContext.xml")
报错解决:
缺失:spring-tx-4.2.6.RELEASE.jar
缺失:spring-jdbc-4.2.6.RELEASE.jar
Springmvc整合
导入包springmvc的包
spring-web-4.2.6.RELEASE.jar
spring-webmvc-4.2.6.RELEASE.jar
10.6.8. 在web.xml下配置springmvc的核心控制器(DispatcherServlet)
注意事项:
1. 配置spring配置文件的路径contextConfigLocation
2. <!-- The front controller of this Spring Web application, responsible for handling all application requests --> 3. <servlet> 4. <servlet-name>springDispatcherServlet</servlet-name> 5. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 6. <init-param> 7. <param-name>contextConfigLocation</param-name> 8. <param-value>classpath:springmvc.xml</param-value> 9. </init-param> 10. <load-on-startup>1</load-on-startup> 11. </servlet> 12. 13. <!-- Map all requests to the DispatcherServlet for handling --> 14. <servlet-mapping> 15. <servlet-name>springDispatcherServlet</servlet-name> 16. <url-pattern>/</url-pattern> 17. </servlet-mapping> 18. 19. 20. <!-- 加载spring容器 --> 21. <!-- needed for ContextLoaderListener --> 22. <context-param> 23. <param-name>contextConfigLocation</param-name> 24. <param-value>classpath:applicationContext.xml</param-value> 25. </context-param> 26. 27. <!-- Bootstraps the root web application context before servlet initialization --> 28. <listener> 29. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 30. </listener> |
10.6.9. 在springMVC.xml中配置处理器映射器和处理器适配器
<mvc:annotation-driven></mvc:annotation-driven>
<!-- 配置处理器映射器和处理器适配器 --> <mvc:annotation-driven />
<!-- 配置扫描包 --> <context:component-scan base-package="controller"></context:component-scan>
<!-- 配置视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/"></property> <property name="suffix" value=".jsp"></property> |
10.6.10. 配置包扫描controller包
10.6.11. 编写Controller
注意事项:
1.在类上用@Controller注解修饰
2.在具体的处理方法上用@RequestMapping修饰并写上对应的请求路径
9.测试springmvc配置成功
10.在applicationContext.xml配置视图解析器
InternalResourceViewResolver
注意事项:
1.实际上的视图名为:前缀+逻辑视图名(处理方法返回的视图名字)+后缀
2.redirect和forward的使用
使用了redirect和forward时,需要跳转到具体的页面,需要把该视图的完整名 称写上。否则会跳转到controller相应的请求。
3.有/ 和没/的区别
有/ :访问项目根目录的资源
没/ : 访问到具体命名空间的资源
增强配置:
1.配置log4j
导入log4j的包log4j-1.2.17.jar
把log4j的配置文件放在resources源代码目录下
2.解决静态资源404的问题
<mvc:default-servlet-handler/>
11. 异常处理
处理程序在运行时出现的异常
11.1. 全局异常处理
编写异常处理类实现HandlerExceptionResolver
package com.ys.handler;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerExceptionResolver; import org.springframework.web.servlet.ModelAndView;
publicclass MyExceptionHandler implements HandlerExceptionResolver{
/** * request * response * handler 出现异常的目标方法 * ex 具体的异常 */ @Override public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { System.out.println("出现异常的目标方法:"+handler+", 异常为:"+ex.getMessage()); returnnull; }
|
在applicationContext.xml中配置全局异常处理
<!-- 配置全局异常处理 --> <bean class="com.ys.handler.MyExceptionHandler"></bean> |
把异常处理类交给spring管理
11.2. 局部异常处理
在需要处理异常的Controller中定义异常处理方法,定义了局部异常处理后,全局异常将不会进行相应的处理
并用@ExceptionHandler注解修饰该方法
@ExceptionHandler public String handlerException(Exception ex){ System.out.println("异常信息为:"+ex.getMessage()); return"error_local"; } |
12.Restful支持
RESTful软件开发理念,RESTful对http进行非常好的诠释。
RESTful即Representational State Transfer的缩写。
原则:
12.1. Url的RESFUL实现
@PathVariable
13.晨考补充知识点
13.1. Jsp model1和model2
13.1.1. model1
1.传统的Jsp Model 1模型
Jsp是独立的,自主完成所有的任务.
2.改进的Jsp Model 1模型
Jsp页面与JavaBeans共同协作完成任务
Model 1模式的实现比较简单,适用于快速开发小规模项目。但从工程化的角度看,它的局限性非常明显:JSP页面身兼View和Controller两种角色,将控制逻辑和表现逻辑混杂在一起,从而导致代码的重用性非常低,增加了应用的扩展性和维护的难度。
早期有大量ASP和JSP技术开发出来的Web应用,这些Web应用都采用了Model 1架构。
13.1.2. model2
1.Jsp Model2中使用了三种技术JSP、Servlet和JavaBeans
Jsp负责生成动态网页,只用做显示页面。
Servl et负责流程控制,用来处理各种请求的分派。
JavaBeans负责业务逻辑,对数据库的操作。
MVC
2.使用Jsp Model2的交互过程:
用户通过浏览器向Web应用中的Servlet发送请求,Servlet接受到请求后实例化JavaBeans对象,调用JavaBeans对象的方法,JavaBeans对象返回从数据库中读取的数据。Servlet选择合适JSP,并且把从数据库中读取的数据通过这个JSP进行显示,最后JSP页面把最终的结果返回给浏览器。
Model 2已经是MVC设计思想下的架构,由于引入了MVC模式,使Model 2具有组件化的特点,更适用于大规模应用的开发,但也增加了应用开发的复杂程度。
Jsp Model2优点
1.消除了Jsp Model1的缺点:
2.该模式适合多人合作开发大型的Web项目
3.各司其职,互不干涉
4.有利于开发中的分工
5.有利于组件的重用
Jsp Model2缺点
Web项目的开发难度加大,同时对开发人员的技术要求也提高了
13.2. 通配符映射路径
什么是通配符
通配符就是使用一个符号匹配多个字符。这个匹配多个字符的符号就是通配符。
符号 | 说明 |
? | 匹配任何一个字符 |
* | 匹配任何长度的字符 |
** | 匹配多级目录的路径 |
案例
路径 | 描述 |
|
/app/*.x | 匹配(Matches)所有在app路径下的.x文件 |
|
/app/p?ttern | 匹配(Matches) /app/pattern 和 /app/pXttern,但是不包括/app/pttern |
|
/**/example | 匹配(Matches) /app/example, /app/foo/example, 和 /example |
|
/app/**/dir/file. | 匹配(Matches) /app/dir/file.jsp, /app/foo/dir/file.html,/app/foo/bar/dir/file.pdf |
|
/**/*.jsp | 匹配(Matches)任何的.jsp 文件 |
|
13.3. 一些其他注解的使用
@CookieValue
获取到cookie的值
@PathVariable
用于绑定路径变量
/** * 如果{name}与String name1不一样,要在注解使用value绑定@PathVariable(value="name") * 如果{name}与String name一样就不用,直接使用@PathVariable就可以 * @param name1 * @return */ @RequestMapping(value="{name}/find") public String find(@PathVariable String name){ System.out.println("查询名字为:"+name); return"/hello.jsp"; } |
14.SSM案例讲解
14.1. 搭建ssm的开发环境
14.2. 实现用户登录功能
前端判空校验
未登录进入首页拦截(拦截器)
14.3. 首页用户列表功能
分页需要的数据
1.每一页的内容(userList) 根据分页条件查询数据库 limitbegin,size
begin:从第几条开始
size:多少条数据
2.当前页(pageIndex) 页面传到后台
3.总条数(totalCount) 通过查询数据库过去
4.总页数(pageCount) 计算
5.每页显示的数量(pageSize) 默认值为5
pageIndex和pageSize ------> begin
pageIndex=1 1-5 begin=0
pageIndex=2 6-10 begin=5
pageIndex=3 11-15 beigin=10
begin = (pageIndex-1)*pageSize;
Foreach的使用:
遍历集合数据
对数字进行遍历
<c:forEach></c:forEach>
翻页:
@ModelAttribute("username")
数据回显表单域
14.4. 新增用户功能
前端判断字段是否为空,并且判断该用户名是否已存在数据库中。
Jquery-validation jquey校验框架
参考网址:http://www.runoob.com/jquery/jquery-plugin-validate.html