SpringMVC
1.SpringMVC的引言
为了使Spring可插入的MVC架构,SpringFrameWork在Spring基础上开发SpringMVC框架,从而在使用Spring进行WEB开发时可以选择使用Spring的SpringMVC框架作为web开发的控制器框架。
2.为什么是SpringMVC
- 可以和spring框架无缝整合
- 运行效率高于struts2框架
- 注解式开发更高效
3.SpringMVC的特点
SpringMVC 轻量级,典型MVC框架,在整个MVC架构中充当控制器框架,相对于之前学习的struts2框架,SpringMVC运行更快,其注解式开发更高效灵活。
4.SpringMVC与Struts2运行流程对比
5.第一个环境搭建
1.引入相关依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.3.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.3.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.3.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>4.3.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>4.3.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>4.3.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.3.2.RELEASE</version>
</dependency>
<!--springmvc核心依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.2.RELEASE</version>
</dependency>
<!--servlet-api-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
2.编写springmvc配置文件
<!--开启注解扫描-->
<context:component-scan base-package="com"/>
<!--注册处理器映射器-->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
<!--注册处理器适配器-->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
<!--注册视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"/>
<property name="suffix" value=".jsp"/>
</bean>
3.配置springmvc的核心Servlet
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--指定springmvc配置文件位置-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
- 注意:
这里还要加载spring配置,通过在servlet写initparam标签,还是contextConfigLocation属性,value用来加载springmvc配置文件
4.创建控制器
@Controller
@RequestMapping("/hello")
public class HelloController {
@RequestMapping("/hello")
public String hello(){
System.out.println("hello springmvc");
return "index";//解析结果:前缀+返回值+后缀
}
}
-
@Controller
: 该注解用来类上标识这是一个控制器组件类并创建这个类实例 -
@RequestMapping
:- 修饰范围: 用在方法或者类上
- 注解作用: 用来指定类以及类中方法的请求路径
- 注解详解:
用在类上相当于struts2中namespace在访问类中方法必须先加入这个路径
用在方法上相当于action标签的name属性用来表示访问这个方法的路径
5.部署项目,启动项目测试
访问路径: http://localhost:8989/springmvc_day1/hello/hello
6. 代码
7.Springmvc说明
6.SpringMVC中跳转方式
1.跳转方式
- 说明 : 跳转有两种,一种forward,一种是redirect。
forward跳转,一次请求,地址栏不变,redirect跳转多次请求,地址栏改变
。
# 1. Controller跳转到JSP
forward跳转到页面 : 默认就是forward跳转
语法: return "页面逻辑名"
redirect跳转到页面: 使用springmvc提供redirect:关键字进行重定向页面跳转
语法: return "redirect:/index.jsp"
注意: 使用redirect跳转页面不会经过试图解析器
# 2. Controller跳转到Controller
forward跳转到Controller : 使用springmvc提供的关键字forward:
语法: forward:/跳转类上@requestMapping的值/跳转类上@RequestMapping的值
redirect:跳转到Controller: 使用springmvc提供关键字redirect:
语法: redirect:/跳转类上@requestMapping的值/跳转类上@RequestMapping的值
2.跳转方式总结
7.SpringMVC中参数接收
接收参数语法说明:springmvc中使用控制器方法参数来收集客户端的请求参数,因此在接收请求参数时直接在需要控制器方法声明即可,springmvc可以自动根据指定类型完成类型的转换操作
1.接收零散类型参数
如: 八种基本类型 + String + 日期类型
a.前台传递参数
/**
* 零散类型参数接收
* url?name=zhangsan&age=23&sex=true&bir
*
* 注意:springmvc 默认日期格式 spring日期格式 yyyy/MM/dd HH:mm:ss struts2日期格式:yyyy-MM-dd
* 修改默认日期格式: @DateTimeFormat 必须使用mvc标签配置
*
* 注意:在springmvc中出现400错误说明传递参数的格式存在问题
*/
# GET 方式传递参数
http://localhost:8080/springmvc_day1/param/test?name=zhangsan&age=19&sex=true&salary=11.11&bir=2012/12/12
# POST 方式传递参数
<h1>测试参数接收</h1>
<form action="${pageContext.request.contextPath}/param/test" method="post">
用户名: <input type="text" name="name"/> <br>
年龄: <input type="text" name="age"/> <br>
性别: <input type="text" name="sex"> <br>
工资: <input type="text" name="salary"> <br>
生日: <input type="text" name="bir"> <br>
<input type="submit" value="提交"/>
</form>
b.后台控制器接收
@Controller
@RequestMapping("/param")
public class ParamController {
@RequestMapping("/test")
public String test(String name, Integer age, Boolean sex,Double salary,Date bir){
System.out.println("姓名: "+name);
System.out.println("年龄: "+age);
System.out.println("性别: "+sex);
System.out.println("工资: "+salary);
System.out.println("生日: "+bir);
return "index";
}
}
注意:springmvc在接收日期类型参数时日期格式必须为yyyy/MM/dd HH:mm:ss
2.接收对象类型参数
/**
* 对象类型参数接收
* 语法:将要接收对象作为控制器方法形参数声明即可
* 前台传递参数形式: 只需要保证前台传递参数名与接受的对象属性名一致,自动封装对象
* url?id=21&name=zhangsan&age=23&bir=2012/12/12
* {id name age bir Order:{id name}}
*/
a.前台传递参数
# GET 方式请求参数传递
http://localhost:8080/springmvc_day1/param/test1?name=zhangsan&age=19&sex=true&salary=11.11&bir=2012/12/12
# POST 方式请求参数传递
<h1>测试对象类型参数接收</h1>
<form action="${pageContext.request.contextPath}/param/test1" method="post">
用户名: <input type="text" name="name"/> <br>
年龄: <input type="text" name="age"/> <br>
性别: <input type="text" name="sex"> <br>
工资: <input type="text" name="salary"> <br>
生日: <input type="text" name="bir"> <br>
<input type="submit" value="提交"/>
</form>
注意:在接收对象类型参数时和struts2接收不同,springmvc直接根据传递参数名与对象中属性名一致自动封装对象
b.后台控制器接收
// 1.定义对象
public class User {
private String name;
private Integer age;
private Double salary;
private Boolean sex;
private Date bir;
}
// 2.控制器中接收
@RequestMapping("/test1")
public String test1(User user){
System.out.println("接收的对象: "+user);
return "index";
}
3.接收数组类型参数
/**
* 接收数组类型参数
* 语法: 将要接收数组作为控制器方法的参数声明即可
* 前台语法: 要求前台传递的多个参数的参数变量名都要与接受数组变量名一致,
* springmvc自动将多个变量名放入一个数组中
* url?names=zhangsan&names=李四...
*/
a.前台传递参数
# GET 方式请求参数传递
http://localhost:8080/springmvc_day1/param/test2?names=zhangsan&names=lisi&names=wangwu
# POST 方式请求参数传递
<h1>测试对象类型参数接收</h1>
<form action="${pageContext.request.contextPath}/param/test2" method="post">
爱好: <br>
看书: <input type="checkbox" name="names"/>
看电视:<input type="checkbox" name="names"/>
吃饭: <input type="checkbox" name="names"/>
玩游戏: <input type="checkbox" name="names"/>
<input type="submit" value="提交"/>
</form>
b.后台控制器接收
@RequestMapping("/test2")
public String test2(String[] names){
for (String name : names) {
System.out.println(name);
}
return "index";
}
注意:接收数组类型数据时前台传递多个key一致自动放入同一个数组中
4.接收集合类型参数
说明:springmvc不支持直接将接收集合声明为控制器方法参数进行接收,如果要接收集合类型参数必须使用对象封装要接收接收类型才可以
推荐使用VO进行接收 value object 值对象 oo oriented object面向对象 DTO data transfer object 数据传输对象
a.前台传递参数
# GET 方式请求参数传递
http://localhost:8080/springmvc_day1/param/test3?lists=zhangsan&lists=lisi&lists=wangwu
# POST 方式请求参数传递
<h1>测试对象类型参数接收</h1>
<form action="${pageContext.request.contextPath}/param/test3" method="post">
爱好: <br>
看书: <input type="checkbox" name="lists"/>
看电视:<input type="checkbox" name="lists"/>
吃饭: <input type="checkbox" name="lists"/>
玩游戏: <input type="checkbox" name="lists"/>
<input type="submit" value="提交"/>
</form>
b.后台控制器接收
// 1.封装接收集合类型对象---->在spring mvc中用来接收集合类型参数
public class CollectionVO {
private List<String> lists;
public List<String> getLists() {
return lists;
}
public void setLists(List<String> lists) {
this.lists = lists;
}
}
// 2.控制器中接收集合类型参数
@RequestMapping("/test3")
public String test3(CollectionVO collectionVO){
collectionVO.getLists().forEach(name-> System.out.println(name));
return "index";
}
8. 接收参数中文乱码解决方案
注意:在使用springmvc过程中接收客户端的请求参数时有时会出现中文乱码,这是因为springmvc并没有对象请求参数进行编码控制,如果需要控制需要自行指定
# 1.针对于GET方式中文乱码解决方案:
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>
1.针对于post方式中文乱码解决方案:
<!--配置filter-->
<filter>
<filter-name>charset</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>charset</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
9.SpringMVC中数据传递机制
1.数据传递机制
# 1.数据怎么存
Servlet 作用域 Struts2 作用域 SpringMVC 作用域
# 2.数据怎么取
Servlet EL表达式 Struts2 EL表达式 SpringMVC EL表达式
# 3.数据怎么展示
Servlet JSTL标签 Struts2 JSTl标签 SpringMVC JSTL标签
2.使用forward跳转传递数据
# 1.使用servlet中原始的request作用域传递数据
request.setAttribute("key",value);
# 2.使用是springmvc中封装的Model和ModelMap对象(底层对request作用域封装)
model.addAttribute(key,value);
modelMap.addAttribute(key,value);
3.使用Redirect跳转传递数据
# 1.使用地址栏进行数据传递
url?name=zhangsan&age=21
# 2.使用session作用域
session.setAttribute(key,value);
session.getAttribute(key);
10.SpringMVC处理静态资源拦截
# 1.处理静态资源拦截
# 问题:当web.xml中配置为"/"时,会拦截项目静态资源
<mvc:default-servlet-handler/>
11.文件上传
文件上传
: 指的就是将用户本地计算机中文件上传到服务器上的过程称之为文件上传
1).文件上传编程步骤
# 1.项目中引入相关依赖
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3</version>
</dependency>
# 2.开发页面
<h1>文件上传</h1>
<form action="${pageContext.request.contextPath}/file/upload" method="post" enctype="multipart/form-data">
<input type="file" name="bb"/>
<input type="submit" value="上传文件"/>
</form>
注意:
1. form表单提交方式必须为post
2.form表单的enctype属性必须为multipart/form-data
# 3.开发控制器
@RequestMapping("upload")
public String upload(MultipartFile bb, HttpServletRequest request) throws IOException {
System.out.println("文件名: "+bb.getOriginalFilename());
System.out.println("文件类型: "+bb.getContentType());
System.out.println("文件大小: "+bb.getSize());
//处理文件上传
//根据相对upload获取绝对upload路径
String realPath = request.getSession().getServletContext().getRealPath("/upload");
//修改文件名 新的文件名生成策略 uuid 时间戳方式
String newFileNamePrefix = new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date())
+UUID.randomUUID().toString().replace("-","");
//String fileNameSuffix = bb.getOriginalFilename().substring(bb.getOriginalFilename().lastIndexOf("."));
String fileNameSuffix = "."+FilenameUtils.getExtension(bb.getOriginalFilename());
System.out.println("动态获取文件类型: "+request.getSession().getServletContext().getMimeType("."+fileNameSuffix));
//新的文件名
String newFileName = newFileNamePrefix+fileNameSuffix;
//创建日期目录
String dateDirString = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
File dateDir = new File(realPath, dateDirString);
if(!dateDir.exists()){
dateDir.mkdirs();
}
//文件上传
bb.transferTo(new File(dateDir,newFileName));
return "index";
}
# 4.配置文件上传解析器
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!--控制文件上传大小单位字节 默认没有大小限制 这里是2-->
<property name="maxUploadSize" value="2097152"/>
</bean>
注意:使用springmvc中multipartfile接收客户端上传的文件必须配置文件上传解析器且解析的id必须为multipartResolver
12.文件下载
文件下载:
将服务器上的文件下载到当前用户访问的计算机的过程称之为文件下载
1).文件下载编程思路
# 1.项目中准备下载目录并存在下载的相关文件
# 2.开发下载控制器
@RequestMapping("down")
public void down(String fileName,String openStyle, HttpServletRequest request, HttpServletResponse response) throws IOException {
openStyle = openStyle==null?"attachment":openStyle;
//根据相对目录获取绝对路径
String realPath = request.getSession().getServletContext().getRealPath("/down");
//读取下载的指定文件
File file = new File(realPath, fileName);
//获取文件输入流
FileInputStream is = new FileInputStream(file);
//默认下载方式是在线打开 inline 附件形式下载 attachment
response.setHeader("content-disposition",openStyle+";fileName="+ URLEncoder.encode(fileName,"UTF-8"));
//响应输出流
ServletOutputStream os = response.getOutputStream();
//IO拷贝
IOUtils.copy(is,os);
IOUtils.closeQuietly(is);//优雅的关流
IOUtils.closeQuietly(os);//优雅的关流
}
注意:下载时必须设置响应的头信息,指定文件以何种方式保存,另外下载文件的控制器不能存在返回值,代表响应只用来下载文件信息
# 3.开发页面
<h1>文件下载</h1>
<a href="${pageContext.request.contextPath}/file/download?fileName=init.txt">init.txt</a>
13.@ResponseBody注解使用
@ResponseBody
:为了进一步方便控制器与ajax集成,springmvc提供@responseBody该注解用在方法的返回值上,代表可以将方法的返回值转换为json格式字符串并响应到前台,省去了通过第三方工具转换json的过程
1). 引入相关依赖
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
2).开发控制器
@Controller
@RequestMapping("json")
public class JsonController {
@RequestMapping("test")
@ResponseBody
public Map<String,String> test(){
HashMap<String,String> map = new HashMap<>();
map.put("message","测试成功");
return map;
}
}
3).访问测试
/http://localhost:8989/springmvc_day2/json/test/
14.SpringMVC中拦截器
1.作用
作用:类似于javaweb中的Filter,用来对请求进行拦截,可以将多个Controller中执行的共同代码放入拦截器中执行,减少Controller类中代码的冗余.
2.特点
拦截器器只能拦截Controller的请求,不能拦截jsp
拦截器可中断用户的请求轨迹
- 请求先经过拦截器,之后之后还会经过拦截器
3.开发拦截器
package com.yxj.interceptors;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;
/**
* 自定义拦截器
*/
public class MyInterceptor implements HandlerInterceptor {
//1.请求经过拦截器会优先进入拦截器中preHandler方法执行preHandler方法中内容
//2.如果preHandler 返回为true 代表放行请求 如果返回值为false 中断请求
//3.如果preHandler返回值为true,会执行当前请求对应的控制器中方法
//4.当控制器方法执行结束之后,会返回拦截器中执行拦截器中postHandler方法
//5.posthanlder执行完成之后响应请求,在响应请求完成后会执行afterCompletion方法
@Override
//参数1: 当前请求对象 参数2:当前请求对应响应对象 参数3:当前请求的控制器对应的方法对象
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println(((HandlerMethod)handler).getMethod().getName());
System.out.println("===========1=============");
//强制用户登录
/*Object user = request.getSession().getAttribute("user");
if(user==null){
//重定向到登录页面
response.sendRedirect(request.getContextPath()+"/login.jsp");
return false;
}*/
return true;
}
@Override
//参数1: 当前请求对象 参数2:当前请求对应响应对象 参数3:当前请求的控制器对应的方法对象 参数4: 当前请求控制器方法返回值 = 当前请求控制器方法返回的modelandview对象 modelandview 模型和试图
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println(modelAndView);
System.out.println("===========3=============");
}
@Override
//注意: 无论正确还是失败都会执行
//参数1: 当前请求对象 参数2:当前请求对应响应对象 参数3:当前请求的控制器对应的方法对象 参数4: 请求过程中出现异常时异常对象
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
if(ex!=null){
System.out.println(ex.getMessage());
}
System.out.println("===========4=============");
}
}
4.配置拦截器
# 单个拦截器
<!--注册拦截器-->
<bean id="myInterceptor" class="com.yxj.interceptors.MyInterceptor"/>
<!--配置拦截器-->
<mvc:interceptors>
<!--配置一个拦截器-->
<mvc:interceptor>
<!--mvc:mapping 代表拦截那个请求路径-->
<mvc:mapping path="/json/*"/>
<!--mvc:exclude-mapping 排除拦截那个请求-->
<mvc:exclude-mapping path="/json/showAll"/>
<!--使用那个拦截器-->
<ref bean="myInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
# 多个拦截器
<!--配置拦截器-->
<bean id="myInterceptor1" class="com.yxj.interceptors.MyInterceptor1"></bean>
<bean id="myInterceptor2" class="com.yxj.interceptors.MyInterceptor2"></bean>
<!--配置拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<!--拦截的请求是谁-->
<mvc:mapping path="/json/**"/>
<!--放行某些请求-->
<!--<mvc:exclude-mapping path="/json/test2"/>-->
<ref bean="myInterceptor1"/>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/json/test2"/>
<ref bean="myInterceptor2"></ref>
</mvc:interceptor>
</mvc:interceptors>
/*``: 代表拦截所有请求路径
15.SpringMVC全局异常处理
1.作用
当控制器中某个方法在运行过程中突然发生运行时异常时,为了增加用户体验对于用户不能出现500错误代码,应该给用户良好展示错误界面,全局异常处理就能更好解决这个问题
2.全局异常处理开发
public class GlobalExceptionResolver implements HandlerExceptionResolver {
/**
* 用来处理发生异常时方法
* @param request 当前请求对象
* @param response 当前请求对应的响应对象
* @param handler 当前请求的方法对象
* @param ex 当前出现异常时的异常对象
* @return 出现异常时展示视图和数据
*/
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
System.out.println("进入全局异常处理器获取的异常信息为: "+ex.getMessage());
ModelAndView modelAndView = new ModelAndView();
//基于不同业务异常跳转到不同页面
if(ex instanceof UserNameNotFoundException){
modelAndView.setViewName("redirect:/login.jsp");
}else{
modelAndView.setViewName("redirect:/error.jsp");//return "error" ===> /error.jsp
}
//modelandview中model 默认放入request作用域 如果使用redirect跳转:model中数据会自动拼接到跳转url
modelAndView.addObject("msg",ex.getMessage());
return modelAndView;
}
}
package com.yxj.exceptions;
/**
* Created by HIAPAD on 2019/10/28.
*/
//自定义用户名不存在异常类
public class UserNameNotFoundException extends RuntimeException {
public UserNameNotFoundException(String message) {
super(message);
}
}
3.配置全局异常处理
<!--配置全局异常处理 -->
<bean class="com.yxj.handlerxception.GlobalExceptionResolver"/>
16.常用注解
@ResponseBody // 4.x 版本底层默认使用 jackson gson 使用时先用jackson,当jackson不存在时在使用gson
// 3.x 版本底层默认使用 jackson 不支持gson fastjson
17.常用配置
<?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">
<!--开启注解扫描-->
<context:component-scan base-package="com.yxj" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!--开启注解驱动-->
<mvc:annotation-driven/>
<!--配置视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"/>
<property name="suffix" value=".jsp"></property>
</bean>
<!--配置静态资源拦截问题-->
<mvc:default-servlet-handler/>
<!--配置文件上传解析器-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!--单位字节 默认无限制 这里是20M-->
<property name="maxUploadSize" value="20971520"/>
</bean>
<!--配置拦截器-->
<bean id="myInterceptor1" class="com.yxj.interceptors.MyInterceptor1"></bean>
<bean id="myInterceptor2" class="com.yxj.interceptors.MyInterceptor2"></bean>
<!--配置拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<!--拦截的请求是谁-->
<mvc:mapping path="/json/**"/>
<!--放行某些请求-->
<!--<mvc:exclude-mapping path="/json/test2"/>-->
<ref bean="myInterceptor1"/>
</mvc:interceptor>
<!--mvc:interceptor>
<mvc:mapping path="/json/test2"/>
<ref bean="myInterceptor2"></ref>
</mvc:interceptor>-->
</mvc:interceptors>
<!--配置全局异常处理类-->
<bean class="com.yxj.exceptions.CustomerExceptionResolver"></bean>
</beans>
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<!--配置post请求方式中文乱码的Filter-->
<filter>
<filter-name>charset</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>charset</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--配置springmvc核心servlet-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--配置springmvc配置文件为止-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
18. 图片