1. 高级参数绑定
2. @RequestMapping注解
3. Controller方法的返回值
4. 异常处理
5. 图片文件上传
6. json数据交互
7. restfult支持
8. 拦截器
1. 高级参数绑定
1.1. 准备环境
1.1.1. 复制ssm工程,修改项目名称为:springmvc-second
1.1.2. 修改工程上下文路径
1.1.3. 修改pom.xml文件中项目信息
<projectxmlns="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/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion>
<groupId>cn.caicai</groupId> <artifactId>springmvc-second</artifactId> <version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>springmvc-second MavenWebapp</name> <url>http://maven.apache.org</url>
<properties> <!-- spring版本号 --> <spring.version>4.3.8.RELEASE</spring.version> <!-- aspectj版本号 --> <aspectj.version>1.6.12</aspectj.version> <!-- jstl标签版本 --> <jstl.version>1.2</jstl.version> <!-- mybatis版本号 --> <mybatis.version>3.4.5</mybatis.version> <!-- mybatis-spring整合包版本 --> <mybatis.spring.version>1.3.1</mybatis.spring.version> <!-- mysql版本号 --> <mysql.version>5.1.30</mysql.version> <!-- dbcp数据源连接池jar包 --> <dbcp.version>1.2.2</dbcp.version> <!-- log4j日志包版本 --> <slf4j.version>1.7.7</slf4j.version> <log4j.version>1.2.17</log4j.version> <!-- commons-lang版本 --> <commons.lang.version>2.6</commons.lang.version> </properties>
<dependencies> <!-- springmvc依赖包 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>${aspectj.version}</version> </dependency> <!-- JSTL标签类 --> <dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>${jstl.version}</version> </dependency> <!-- mybatis核心包 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>${mybatis.version}</version> </dependency> <!-- mybatis-spring整合包 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>${mybatis.spring.version}</version> </dependency> <!-- 导入Mysql数据库链接jar包 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> </dependency> <!-- 导入dbcp数据源连接池jar包 --> <dependency> <groupId>commons-dbcp</groupId> <artifactId>commons-dbcp</artifactId> <version>${dbcp.version}</version> </dependency> <!-- 日志文件管理包 --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>${log4j.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${slf4j.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>${slf4j.version}</version> </dependency> <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>${commons.lang.version}</version> </dependency>
<!-- jsp依赖包,只在编译时需要 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>jsp-api</artifactId> <version>2.0</version> <scope>provided</scope> </dependency> </dependencies> <build> <finalName>springmvc-second</finalName> <plugins> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.1</version> <configuration> <!-- tomcat 的端口号 --> <port>8080</port> <!-- 访问应用的路径 --> <path>/springmvc-second</path> <!-- URL按UTF-8进行编码,解决中文参数乱码 --> <uriEncoding>UTF-8</uriEncoding> <!-- tomcat名称 --> <server>tomcat7</server> </configuration> </plugin> </plugins> </build> </project> |
1.2. 数组参数类型
1.2.1. 需求
实现商品数据的批量删除。
1.2.2. 需求实现
1.2.2.1. 修改商品列表页面,增加商品id复选功能
商品列表: <table width="100%" border=1> <tr> <td>商品Id</td> <td>商品名称</td> <td>商品价格</td> <td>生产日期</td> <td>商品描述</td> <td>操作</td> </tr> <c:forEach items="${itemList}" var="item"> <tr> <td><input type="checkbox" name="ids" value="${item.id}"/></td> <td>${item.name }</td> <td>${item.price }</td> <td><fmt:formatDate value="${item.createtime}" pattern="yyyy-MM-dd HH:mm:ss" /></td> <td>${item.detail }</td>
<td><a href="${pageContext.request.contextPath }/queryItemById.do?id=${item.id}">修改</a></td>
</tr> </c:forEach>
</table> |
1.2.2.2. 在queryItem方法中,增加形参数组ids
1.3. list参数类型
1.3.1. 需求
实现商品数据的批量修改。
1.3.2. 需求实现
1.3.2.1. 修改商品列表,增加批量修改商品的功能
<p/><p/> <!-- 批量修改商品 --> <form action="${pageContext.request.contextPath}/queryItem.do" method="post"> 商品列表批量修改:<input type="submit" value="批量修改"/> <table width="100%" border=1> <tr> <td>商品名称</td> <td>商品价格</td> <td>生产日期</td> <td>商品描述</td> </tr> <c:forEach items="${itemList}" var="item"> <tr> <input type="hidden" name=" "value="${item.id}"/> <td><input type="text" name=" "value="${item.name }"/></td> <td><input type="text" name=" "value="${item.price }"/></td> <td> <input type="text" name=" "value='<fmt:formatDatevalue="${item.createtime}" pattern="yyyy-MM-dd HH:mm:ss" />'/> </td> <td><input type="text" name=" "value="${item.detail }"/></td> </tr> </c:forEach> </table> </form> |
<p/><p/> <!-- 批量修改商品 --> <form action="${pageContext.request.contextPath}/queryItem.do" method="post"> 商品列表批量修改:<input type="submit" value="批量修改"/> <table width="100%" border=1> <tr> <td>商品名称</td> <td>商品价格</td> <td>生产日期</td> <td>商品描述</td> </tr> <c:forEach items="${itemList}" var="item"varStatus="vs"> <!-- itemList:要绑定的集合属性 itemList[0]:要绑定的第一个商品对象 itemList[0].id:把id属性值绑定到商品对象上
varStatus:当前遍历对象的状态 vs.index:当前遍历的是第几个对象 --> <tr> <input type="hidden"name="itemList[${vs.index}].id"value="${item.id}"/> <td><input type="text"name="itemList[${vs.index}].name"value="${item.name }"/></td> <td><input type="text"name="itemList[${vs.index}].price"value="${item.price }"/></td> <td> <input type="text"name="itemList[${vs.index}].createtime"value='<fmt:formatDatevalue="${item.createtime}" pattern="yyyy-MM-dd HH:mm:ss" />'/> </td> <td><input type="text"name="itemList[${vs.index}].detail"value="${item.detail }"/></td> </tr> </c:forEach> </table> </form> |
1.3.2.2. 修改综合查询条件pojo,包装商品集合List
public class QueryVo { // 包装商品对象 // 商品名称:<input type="text" name="item.name" value=""/> // item属性的名称,与name属性一致 private Item item; // 包装商品集合list private List<Item> itemList;
/** * @return the itemList */ public List<Item> getItemList() { return itemList; }
/** * @param itemList the itemList to set */ public void setItemList(List<Item> itemList) { this.itemList = itemList; }
/** * @return the item */ public Item getItem() { return item; }
/** * @param item the item to set */ public void setItem(Item item) { this.item = item; }
} |
1.3.2.3. 测试
注意事项:list参数类型绑定,List需要作为pojo的属性。不能直接在方法形参中使用list,否则绑定不成功。
2.@RequestMapping注解
2.1. 作用一:配置请求的url
2.1.1. value属性
// @RequestMapping注解讲解专用 //@RequestMapping("/queryItem.do") // value属性:是一个数组,可以配置多个请求的url //@RequestMapping(value={"/queryItem.do","/queryItem123.do"}) // "/"和".do"是可以省略的 @RequestMapping(value={"queryItem","queryItem123"}) public ModelAndView queryItem(QueryVo queryVo,Integer[] ids){
// 1.创建ModelAndView对象 ModelAndView mav = new ModelAndView();
// 2.设置响应的商品列表数据 // 查询数据库中的商品,替换静态商品数据 List<Item> itemList = this.itemService.queryItemList(); mav.addObject("itemList", itemList);
// 3.设置响应的视图 mav.setViewName("item/itemList");
return mav; } |
2.2. 作用二:限制http请求方法
2.2.1. method属性
// @RequestMapping注解讲解专用 //@RequestMapping("/queryItem.do") // value属性:是一个数组,可以配置多个请求的url //@RequestMapping(value={"/queryItem.do","/queryItem123.do"}) // "/"和".do"是可以省略的 //@RequestMapping(value={"queryItem","queryItem123"}) // method属性:限制http请求方法 // RequestMethod.POST:只允许post请求 //@RequestMapping(value={"queryItem","queryItem123"},method={RequestMethod.POST}) // RequestMethod.POST,RequestMethod.GET:只允许post/get请求 @RequestMapping(value={"queryItem","queryItem123"},method={RequestMethod.POST,RequestMethod.GET}) public ModelAndView queryItem(QueryVo queryVo,Integer[] ids){
// 1.创建ModelAndView对象 ModelAndView mav = new ModelAndView();
// 2.设置响应的商品列表数据 // 查询数据库中的商品,替换静态商品数据 List<Item> itemList = this.itemService.queryItemList(); mav.addObject("itemList", itemList);
// 3.设置响应的视图 mav.setViewName("item/itemList");
return mav; } |
2.3. 作用三:在类上面使用,对请求的url进行分类管理(窄化请求)
3.Controller方法返回值
返回值的类型:ModelAndView,Void,String
3.1. 返回ModelAndView
作用:用于设置响应的模型数据,用于设置响应的视图。
3.2. 返回Void
说明:返回void,使用request对象和response对象响应。
3.2.1. request转发
// Controller方法返回void讲解专用 @RequestMapping("/returnVoid.do") public void controllerReturnVoid(HttpServletRequest request,HttpServletResponse response){
// 1.request转发 // 转发是原来的请求,可以获取到旧的request对象中的参数数据 // 转发浏览器的url不会发生改变 //转发只能在项目内部转发
// getRequestDispatcher方法:获得转发器对象 // path参数:转发的目标url try { request.getRequestDispatcher("queryItem.do") .forward(request, response); } catch (ServletException | IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }
} |
3.2.2. response重定向
// Controller方法返回void讲解专用 @RequestMapping("/returnVoid.do") public void controllerReturnVoid(HttpServletRequest request,HttpServletResponse response){
// 1.request转发 // 转发是原来的请求,可以获取到旧的request对象中的参数数据 // 转发浏览器的url不会发生改变 //转发只能在项目内部转发
// getRequestDispatcher方法:获得转发器对象 // path参数:转发的目标url // try { // request.getRequestDispatcher("queryItem.do") // .forward(request, response); // } catch (ServletException | IOException e) { // // TODO Auto-generated catch block // e.printStackTrace(); // }
// 2.response重定向 // 重定向是产生了新的请求,旧的request的参数数据获取不到 // 浏览器的url会改变成目标url // 可以在项目内部重定向,也可以重定向到外部项目
// sendRedirect方法:执行重定向 // location参数:目标url try { // 1.在项目内部重定向 //response.sendRedirect("queryItem.do");
// 2.重定向到外部项目 response.sendRedirect("https://www.cnblogs.com"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }
} |
3.2.3. response响应数据
// Controller方法返回void讲解专用 @RequestMapping("/returnVoid.do") public void controllerReturnVoid(HttpServletRequest request,HttpServletResponse response){
// 1.request转发 // 转发是原来的请求,可以获取到旧的request对象中的参数数据 // 转发浏览器的url不会发生改变 //转发只能在项目内部转发
// getRequestDispatcher方法:获得转发器对象 // path参数:转发的目标url // try { // request.getRequestDispatcher("queryItem.do") // .forward(request, response); // } catch (ServletException | IOException e) { // // TODO Auto-generated catch block // e.printStackTrace(); // }
// 2.response重定向 // 重定向是产生了新的请求,旧的request的参数数据获取不到 // 浏览器的url会改变成目标url // 可以在项目内部重定向,也可以重定向到外部项目
// sendRedirect方法:执行重定向 // location参数:目标url // try { // // 1.在项目内部重定向 // //response.sendRedirect("queryItem.do"); // // // 2.重定向到外部项目 // response.sendRedirect("https://www.cnblogs.com"); // } catch (IOException e) { // // TODO Auto-generated catch block // e.printStackTrace(); // }
// 3.response响应数据 try { response.setCharacterEncoding("utf-8"); response.setContentType("application/json;charset=utf-8"); response.getWriter().write("json数据"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }
} |
3.3. 返回String
3.3.1. 返回响应的视图
3.3.2. forward转发
// controller方法返回String讲解专用 @RequestMapping("/returnString.do") public String controllerReturnString(){
// 1.forward转发 // 转发的格式:forward关键字+":"+目标url return "forward:queryItem.do"; // 请求的url,不能省略.do //return "forward:queryItem";
} |
3.3.3. redriect重定向
// controller方法返回String讲解专用 @RequestMapping("/returnString.do") public String controllerReturnString(){
// 1.forward转发 // 转发的格式:forward关键字+":"+目标url //return "forward:queryItem.do"; // 请求的url,不能省略.do //return "forward:queryItem";
// 2.redirect重定向 // 重定向格式:redirect关键字+":"+目标url return "redirect:queryItem.do"; // 请求的url,不能省略.do //return "redirect:queryItem";
} |
4.异常处理
4.1. 异常介绍
异常,就是不正常。异常可以分类预期的异常和运行时异常。预期的异常可以通过捕获进行处理;运行时异常只能通过规范代码,增加测试来减少。
4.2. 处理思路
请求处理流程:客户端(浏览器)->前端控制器(DispatcherServlet)->表现层(controller)->业务层(service)->持久层(dao)
处理思路:从dao开始,每一层发生异常,都向上一层抛出,一直抛到前端控制器,前端控制器需要调用异常处理器包装异常,返回一个友好的提示页面给用户。
4.3. 自定义系统异常
public class SsmExceptionextends Exception { // 异常消息 private String message; /** * */ public SsmException() { super(); }
/** * @param message */ public SsmException(String message) { super(); this.message = message; }
/** * @return the message */ public String getMessage() { return message; }
/** * @param message the message to set */ public void setMessage(String message) { this.message = message; }
} |
4.4. 自定义异常处理器
说明:异常处理器需要实现接口(HandlerExceptionResolver)。
public class SsmExceptionResolver implements HandlerExceptionResolver {
/* (non-Javadoc) * @see org.springframework.web.servlet.HandlerExceptionResolver#resolveException(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, java.lang.Object, java.lang.Exception) */ @Override public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { // TODO Auto-generated method stub // 包装异常 // 定义系统异常 SsmException sse = null;
// 判断是否是系统异常 if(ex instanceof SsmException){ sse = (SsmException) ex; }else{ // 创建一个未知异常 sse = new SsmException("未知异常!"); }
// 创建ModelAndView对象 ModelAndView mav = new ModelAndView(); mav.addObject("message", sse.getMessage());
mav.setViewName("error/error");
return mav; }
} |
4.5. 在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:p="http://www.springframework.org/schema/p" 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-4.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<!-- 配置组件扫描controller --> <context:component-scan base-package="cn.itheima.ssm.controller"></context:component-scan> <!-- 注解驱动配置处理器映射器,处理器适配器 --> <mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven> <!-- 配置转换服务对象 --> <beanid="conversionService"class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> <property name="converters"> <set> <bean class="cn.itheima.ssm.converter.DateConverter"></bean> </set> </property> </bean> <!-- 配置视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 配置视图的公共目录路径 --> <property name="prefix"value="/WEB-INF/jsp/"></property> <!-- 配置视图扩展名称 --> <property name="suffix"value=".jsp"></property> </bean> <!-- 配置异常处理器 --> <bean class="cn.itheima.ssm.exception.SsmExceptionResolver"></bean>
</beans> |
4.6. 测试异常
// 使用简单类型Integer,接收请求的商品参数id // 形参id的名称,要与请求参数的名称一致 @RequestMapping("/queryItemById.do") public String queryItemById(Model model,Integer id) throws SsmException{
// 1.根据商品Id查询商品 Item item = this.itemService.queryItemById(id);
// 增加异常测试======================start if(item == null){ throw new SsmException("商品不存在!"); }
// 测试运行时异常 //int i = 1/0; // 增加异常测试======================end // 2.响应商品数据 // addAttribute方法:设置响应的模型数据 model.addAttribute("item", item);
return "item/itemEdit";
} |
5.图片文件上传
5.1. 需求
实现商品图片文件上传。
5.2. 需求实现
5.2.1. 配置虚拟目录
步骤一:
步骤二:
步骤三:
步骤四:
步骤五:
步骤六:修改端口号,防止冲突.
![](https://i-blog.csdnimg.cn/blog_migrate/497d147cb701477642eeb4fddb488e75.png)
步骤七:
步骤八:
![](https://i-blog.csdnimg.cn/blog_migrate/503e71e702c614dfe77212ca0bd2071f.png)
访问测试:http://127.0.0.1:8081/pic/springmvc.jpg
5.2.2. 部署阶段配置虚拟目录
步骤一:
步骤二:
![](https://i-blog.csdnimg.cn/blog_migrate/c3cad10fd6d18efaaed890335dcde6da.png)
5.2.3. 配置pom.xml文件,加入文件上传依赖
commons-fileupload.jar
commons-io.jar
<projectxmlns="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/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion>
<groupId>cn.itheima</groupId> <artifactId>springmvc-second</artifactId> <version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>springmvc-second MavenWebapp</name> <url>http://maven.apache.org</url>
<properties> <!-- spring版本号 --> <spring.version>4.3.8.RELEASE</spring.version> <!-- aspectj版本号 --> <aspectj.version>1.6.12</aspectj.version> <!-- jstl标签版本 --> <jstl.version>1.2</jstl.version> <!-- mybatis版本号 --> <mybatis.version>3.4.5</mybatis.version> <!-- mybatis-spring整合包版本 --> <mybatis.spring.version>1.3.1</mybatis.spring.version> <!-- mysql版本号 --> <mysql.version>5.1.30</mysql.version> <!-- dbcp数据源连接池jar包 --> <dbcp.version>1.2.2</dbcp.version> <!-- log4j日志包版本 --> <slf4j.version>1.7.7</slf4j.version> <log4j.version>1.2.17</log4j.version> <!-- commons-lang版本 --> <commons.lang.version>2.6</commons.lang.version>
<!-- 文件上传包版本 --> <fileupload.version>1.3.1</fileupload.version> <commonsio.version>2.4</commonsio.version> <commonscodec.version>1.9</commonscodec.version> </properties>
<dependencies> <!-- springmvc依赖包 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>${aspectj.version}</version> </dependency> <!-- JSTL标签类 --> <dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>${jstl.version}</version> </dependency> <!-- mybatis核心包 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>${mybatis.version}</version> </dependency> <!-- mybatis-spring整合包 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>${mybatis.spring.version}</version> </dependency> <!-- 导入Mysql数据库链接jar包 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> </dependency> <!-- 导入dbcp数据源连接池jar包 --> <dependency> <groupId>commons-dbcp</groupId> <artifactId>commons-dbcp</artifactId> <version>${dbcp.version}</version> </dependency> <!-- 日志文件管理包 --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>${log4j.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${slf4j.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>${slf4j.version}</version> </dependency> <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>${commons.lang.version}</version> </dependency> <!-- 文件上传组件包 --> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>${fileupload.version}</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>${commonsio.version}</version> </dependency> <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>${commonscodec.version}</version> </dependency> <!-- jsp依赖包,只在编译时需要 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>jsp-api</artifactId> <version>2.0</version> <scope>provided</scope> </dependency> </dependencies> <build> <finalName>springmvc-second</finalName> <plugins> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.1</version> <configuration> <!-- tomcat 的端口号 --> <port>8080</port> <!-- 访问应用的路径 --> <path>/springmvc-second</path> <!-- URL按UTF-8进行编码,解决中文参数乱码 --> <uriEncoding>UTF-8</uriEncoding> <!-- tomcat名称 --> <server>tomcat7</server> </configuration> </plugin> </plugins> </build> </project> |
5.2.4. 配置文件上传解析器
说明:spring提供了文件上传解析器接口(MultipartResolver)。
<?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:p="http://www.springframework.org/schema/p" 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-4.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"> <!-- 配置组件扫描controller --> <context:component-scan base-package="cn.itheima.ssm.controller"></context:component-scan> <!-- 注解驱动配置处理器映射器,处理器适配器 --> <mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven> <!-- 配置转换服务对象 --> <beanid="conversionService"class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> <property name="converters"> <set> <bean class="cn.itheima.ssm.converter.DateConverter"></bean> </set> </property> </bean> <!-- 配置视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 配置视图的公共目录路径 --> <property name="prefix"value="/WEB-INF/jsp/"></property> <!-- 配置视图扩展名称 --> <property name="suffix"value=".jsp"></property> </bean> <!-- 配置异常处理器 --> <bean class="cn.itheima.ssm.exception.SsmExceptionResolver"></bean> <!-- 配置文件上传解析器 ,说明: 1.文件上传解析器id值,必须是文件上传解析器接口名称的首字母小写(MultipartResolver)--> <bean id="multipartResolver"class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- Provides "maxUploadSize", "maxInMemorySize" and "defaultEncoding" settings as * bean properties -->
<!--maxUploadSize属性:文件上传大小限制,以字节为单位: 10M=10*1024*1024 --> <property name="maxUploadSize" value="10485760"></property>
<!-- maxInMemorySize属性:配置内存缓冲区大小 ,以字节为单位: 4k:4*1024--> <property name="maxInMemorySize" value="4096"></property>
<!-- defaultEncoding属性:配置字符集编码 --> <property name="defaultEncoding" value="UTF-8"></property> </bean>
</beans> |
5.2.5. 修改商品编辑jsp页面,支持文件上传
5.2.6. 实现文件上传逻辑
// http://127.0.0.1:8080/ssm/updateItem.do // 修改商品,保存数据库 // 使用商品pojo接收请求的参数,要求pojo中的属性,与请求的参数名称对应一致 // 增加形参pictureFile,接收上传的商品图片,注意形参的名称与参数名称一致 @RequestMapping("/updateItem.do") public String updateItem(Item item,MultipartFile pictureFile){
// 增加文件上传逻辑===================start if(pictureFile != null && pictureFile.getOriginalFilename() != null){ // 1.获取上传文件的名称 String oriName = pictureFile.getOriginalFilename(); String extName = oriName.substring(oriName.lastIndexOf("."));
// 2.生成新的文件名称 String newName = System.currentTimeMillis()+""; newName = newName+extName;
// 3.上传 File dest = new File("E:\\teach\\0331\\02springmvc\\02课前资料\\pic\\"+newName); try { pictureFile.transferTo(dest); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }
// 4.保存文件名称 item.setPic(newName);
}
// 增加文件上传逻辑===================end try{ // 1.修改商品 this.itemService.updateItem(item); }catch(Exception e){ // 如果异常,返回提示修改失败 return "common/failure"; } // 如果成功,返回成功的提示 return "common/success";
} |
5.2.7. 测试
步骤一:
步骤二:
步骤三:
6.json数据交互
6.1. json数据例子
{ "id":1, "name":"凡客衫", "price":150, "detail":"一件凡客衫走遍天下", "pic":"666666.jpg" } |
6.2. 配置pom.xml文件,加入json数据支持依赖
说明:jackson。
<projectxmlns="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/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion>
<groupId>cn.itheima</groupId> <artifactId>springmvc-second</artifactId> <version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>springmvc-second MavenWebapp</name> <url>http://maven.apache.org</url>
<properties> <!-- spring版本号 --> <spring.version>4.3.8.RELEASE</spring.version> <!-- aspectj版本号 --> <aspectj.version>1.6.12</aspectj.version> <!-- jstl标签版本 --> <jstl.version>1.2</jstl.version> <!-- mybatis版本号 --> <mybatis.version>3.4.5</mybatis.version> <!-- mybatis-spring整合包版本 --> <mybatis.spring.version>1.3.1</mybatis.spring.version> <!-- mysql版本号 --> <mysql.version>5.1.30</mysql.version> <!-- dbcp数据源连接池jar包 --> <dbcp.version>1.2.2</dbcp.version> <!-- log4j日志包版本 --> <slf4j.version>1.7.7</slf4j.version> <log4j.version>1.2.17</log4j.version> <!-- commons-lang版本 --> <commons.lang.version>2.6</commons.lang.version>
<!-- 文件上传包版本 --> <fileupload.version>1.3.1</fileupload.version> <commonsio.version>2.4</commonsio.version> <commonscodec.version>1.9</commonscodec.version>
<!-- json支持,jackson包版本 --> <jackson.version>2.7.4</jackson.version> </properties>
<dependencies> <!-- springmvc依赖包 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>${aspectj.version}</version> </dependency> <!-- JSTL标签类 --> <dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>${jstl.version}</version> </dependency> <!-- mybatis核心包 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>${mybatis.version}</version> </dependency> <!-- mybatis-spring整合包 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>${mybatis.spring.version}</version> </dependency> <!-- 导入Mysql数据库链接jar包 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> </dependency> <!-- 导入dbcp数据源连接池jar包 --> <dependency> <groupId>commons-dbcp</groupId> <artifactId>commons-dbcp</artifactId> <version>${dbcp.version}</version> </dependency> <!-- 日志文件管理包 --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>${log4j.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${slf4j.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>${slf4j.version}</version> </dependency> <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>${commons.lang.version}</version> </dependency> <!-- 文件上传组件包 --> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>${fileupload.version}</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>${commonsio.version}</version> </dependency> <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>${commonscodec.version}</version> </dependency> <!-- jackson依赖包 --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>${jackson.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>${jackson.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>${jackson.version}</version> </dependency> <!-- jsp依赖包,只在编译时需要 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>jsp-api</artifactId> <version>2.0</version> <scope>provided</scope> </dependency> </dependencies> <build> <finalName>springmvc-second</finalName> <plugins> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.1</version> <configuration> <!-- tomcat 的端口号 --> <port>8080</port> <!-- 访问应用的路径 --> <path>/springmvc-second</path> <!-- URL按UTF-8进行编码,解决中文参数乱码 --> <uriEncoding>UTF-8</uriEncoding> <!-- tomcat名称 --> <server>tomcat7</server> </configuration> </plugin> </plugins> </build> </project> |
6.3. 配置
说明:以注解驱动的方式配置处理器映射器,处理器适配器<mvc:annotation-driven />,默认就支持jackson的转换。
6.4. @RequestBody注解
作用:在处理器方法的形参上使用,把请求的json格式的数据,转换成java对象。
6.5. @ResposneBody注解
作用:在方法的返回值上,或者方法上面使用,把响应的java对象,转换json格式的数据。
6.6. json测试
// json数据交互讲解专用 // 传入json个的商品对象,返回商品对象 @RequestMapping("/testJson.do") @ResponseBody public Item testJson(@RequestBody Item item){
return item; } |
图一:
图二:
![](https://i-blog.csdnimg.cn/blog_migrate/98ec17c3f59aac409d9f39df3349fe46.png)
7.restful支持
7.1. restful介绍
restful,它是一种软件设计风格,指的是表现层资源的状态转换(Representational state transfer)。互联网上的一切都可以看成是资源,比如一张图片,一部电影。restful根据HTTP请求方法:POST/GET/PUT/DELETE,定义了资源的操作方法:新增/查询/修改/删除。这样有什么好处呢?好处是使得请求的URL更加简洁。
传统url风格:
restful风格:
说明:
1. restful是一种软件设计风格
2. restful指的是表现层资源的状态转换,具体根据http请求方法:post/get/put/delete,对应资源的:新增/查询/修改/删除操作
3. 使用restful的优点是请求的url更加简洁和优雅
7.2. 需求
使用restful风格,实现根据商品id查询商品。
7.3. 需求实现
7.3.1. 配置web.xml文件,支持restful
<!-- 配置前端控制器 --> <servlet> <servlet-name>ssm</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 加载核心配置文件 --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring/springmvc.xml</param-value> </init-param>
<!-- 配置什么时候加载前端控制器,说明: 1.配置大于等于0的整数,表示启动的时候加载 2.配置小于0的整数,表示在第一次请求到达的时候加载 --> <load-on-startup>1</load-on-startup> </servlet>
<servlet-mapping> <servlet-name>ssm</servlet-name> <!-- 配置什么样的请求进入前端控制器,说明: 1.*.do,表示以.do结尾的请求,进入前端控制器 2./,表示所有请求都进入前端控制器 --> <!-- <url-pattern>*.do</url-pattern> -->
<!-- 配置所有请求都进入前端控制器,支持restful --> <url-pattern>/</url-pattern> </servlet-mapping> |
7.3.2. 测试restful
// http://127.0.0.1:8080/springmvc-second/rest/1 // restful支持讲解专用 // {id}:路径变量(模版参数) // @PathVariable(name="id"):把路径变量值,绑定到方法的形参 // 路径变量其他处理方式: // @PathVariable(value="id") // @PathVariable("id") // @PathVariable() // @PathVariable @RequestMapping("/rest/{id}") @ResponseBody public Item testRestful(@PathVariable Integer id){
// 1.查询商品 Item item = this.itemService.queryItemById(id);
return item; } |
8.拦截器
8.1. 拦截器介绍
拦截器相当于servlet中过滤器,可以对处理器方法执行预处理(在处理器方法执行前执行);对处理器方法执行后处理(在处理器方法执行后执行)。
8.2. 自定义拦截器
说明:自定义拦截器需要实现接口(HandlerInterceptor)接口。
public class FirstInterceptor implements HandlerInterceptor {
/* (non-Javadoc) * @see org.springframework.web.servlet.HandlerInterceptor#preHandle(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, java.lang.Object) */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // TODO Auto-generated method stub System.out.println("FirstInterceptor--preHandle方法执行中......");
return true; }
/* (non-Javadoc) * @see org.springframework.web.servlet.HandlerInterceptor#postHandle(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, java.lang.Object, org.springframework.web.servlet.ModelAndView) */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // TODO Auto-generated method stub System.out.println("FirstInterceptor--postHandle方法执行中......");
modelAndView.addObject("message", "我是postHandle方法......");
}
/* (non-Javadoc) * @see org.springframework.web.servlet.HandlerInterceptor#afterCompletion(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, java.lang.Object, java.lang.Exception) */ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // TODO Auto-generated method stub System.out.println("FirstInterceptor--afterCompletion方法执行中......");
}
} |
8.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:p="http://www.springframework.org/schema/p" 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-4.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"> <!-- 配置组件扫描controller --> <context:component-scan base-package="cn.itheima.ssm.controller"></context:component-scan> <!-- 注解驱动配置处理器映射器,处理器适配器 --> <mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven> <!-- 配置转换服务对象 --> <beanid="conversionService"class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> <property name="converters"> <set> <bean class="cn.itheima.ssm.converter.DateConverter"></bean> </set> </property> </bean> <!-- 配置视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 配置视图的公共目录路径 --> <property name="prefix"value="/WEB-INF/jsp/"></property> <!-- 配置视图扩展名称 --> <property name="suffix"value=".jsp"></property> </bean> <!-- 配置异常处理器 --> <bean class="cn.itheima.ssm.exception.SsmExceptionResolver"></bean> <!-- 配置文件上传解析器 ,说明: 1.文件上传解析器id值,必须是文件上传解析器接口名称的首字母小写(MultipartResolver)--> <beanid="multipartResolver"class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- Provides "maxUploadSize", "maxInMemorySize" and "defaultEncoding" settings as * bean properties -->
<!--maxUploadSize属性:文件上传大小限制,以字节为单位: 10M=10*1024*1024 --> <property name="maxUploadSize" value="10485760"></property>
<!-- maxInMemorySize属性:配置内存缓冲区大小 ,以字节为单位: 4k:4*1024--> <property name="maxInMemorySize" value="4096"></property>
<!-- defaultEncoding属性:配置字符集编码 --> <property name="defaultEncoding" value="UTF-8"></property> </bean> <!-- 配置拦截器 --> <mvc:interceptors> <!-- 配置拦截器一 --> <mvc:interceptor> <!-- 配置拦截器的url,说明: 1.拦截单个url:/interceptor.do,拦截请求/interceptor.do 2.拦截多个url:/inter/**,拦截以/inter开头的所有请求 --> <mvc:mapping path="/interceptor.do"/> <!-- 拦截器处理类 --> <bean class="cn.itheima.ssm.interceptor.FirstInterceptor"></bean> </mvc:interceptor>
</mvc:interceptors>
</beans> |
8.4. 测试拦截器
// 拦截器讲解专用 @RequestMapping("/interceptor.do") public String testInterceptor(Model model){
System.out.println("ItemController--testInterceptor方法执行中......");
model.addAttribute("message1", "我是处理器testInterceptor方法......");
return "inter/interceptor";
} |
执行结果说明:
1.执行拦截器preHandle方法
2.执行处理器testInterceptor方法
3.执行拦截器postHandle方法
4.响应jsp页面
5.执行拦截器afterCompletion方法
拦截器preHandle方法返回false测试:
执行结果说明:
1.返回false,被拦截,终止执行。
8.5. 拦截器方法作用说明
preHandle方法:在处理器方法执行前执行,在jsp响应前执行。执行预处理,返回布尔类型值,返回true,继续执行;返回false,终止执行。在企业项目中,通常在这个方法执行用户登录校验,权限菜单校验业务功能。
postHandle方法:在处理器方法执行后,在jsp响应前执行。执行后处理。在企业项目中,通常在这个方法执行公共的模型数据设置,比如页面的头部信息,尾部信息。
afterCompletion方法:在处理器方法执行后,在jsp页面响应后执行。执行后处理。在企业项目中,通常在这个方法执行操作日志的记录。
8.6. 拦截器应用
8.6.1. 需求
1.访问商品列表,判断用户是否登录
2.如果用户未登录,跳转登录页面,成功登录以后,再访问商品列表
3.如果用户已经登录,直接访问商品列表页面
8.6.2. 需求实现
8.6.2.1. 准备用户登录页面
<%@ page language="java"contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core"prefix="c"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt"prefix="fmt"%> <!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>登录页面</title>
</head> <body>
<form id="userForm" action="${pageContext.request.contextPath }/user/login.do" method="post">
<table width="100%" border=1> <tr> <td>用户名</td> <td><input type="text" name="username"value="" /></td> </tr> <tr> <td>密码</td> <td><input type="password" name="userpwd" value=""/></td> </tr> <tr> <td colspan="2" align="center"><input type="submit" value="提交" /> </td> </tr> </table>
</form> </body>
</html> |
8.6.2.2. 准备用户登录controller
@Controller @RequestMapping("user") public class UserController { // action="${pageContext.request.contextPath }/user/login.do" // 1.实现登录页面跳转 @RequestMapping("/toLogin.do") public String toLogin(){ return "user/login"; } // 2.实现用户登录 @RequestMapping("/login.do") public String login(String username,String userpwd,HttpSession session){
// 1.只要用户名称和密码不为空,就登录 if(StringUtils.isNotBlank(username) && StringUtils.isNotBlank(userpwd)){
session.setAttribute("user", username); }else{ return "user/login"; }
// 2.登录成功,访问商品列表页面 // 当前路径:http://127.0.0.1:8080/springmvc-second/user/login.do // 2.1.不加斜杠,相对路径(http://127.0.0.1:8080/springmvc-second/user/+目标url)
// 2.2.加上斜杠,绝对路径(http://127.0.0.1:8080/springmvc-second/+目标url) return "redirect:/queryItem.do";
}
} |
8.6.2.3. 准备登录拦截器
public class LoginInterceptor implements HandlerInterceptor {
/* (non-Javadoc) * @see org.springframework.web.servlet.HandlerInterceptor#preHandle(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, java.lang.Object) */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // TODO Auto-generated method stub // // 1.访问商品列表,判断用户是否登录 // 2.如果用户未登录,跳转登录页面,成功登录以后,再访问商品列表 // 3.如果用户已经登录,直接访问商品列表页面
// 1.获取session对象 HttpSession session = request.getSession();
// 2.从session对象中,获取用户数据 Object user = session.getAttribute("user");
// 3.如果用户不为空,说明已经登录了 if(user != null){ System.out.println("用户已经登录,放行......"); return true; }
// 用户未登录 System.out.println("您还未登录,请先去登录......"); response.sendRedirect(request.getContextPath()+"/user/toLogin.do"); return false; }
/* (non-Javadoc) * @see org.springframework.web.servlet.HandlerInterceptor#postHandle(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, java.lang.Object, org.springframework.web.servlet.ModelAndView) */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // TODO Auto-generated method stub
}
/* (non-Javadoc) * @see org.springframework.web.servlet.HandlerInterceptor#afterCompletion(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, java.lang.Object, java.lang.Exception) */ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // TODO Auto-generated method stub
}
} |
8.6.2.4. 配置登录拦截器
<!-- 配置拦截器 --> <mvc:interceptors> <!-- 配置拦截器一 --> <mvc:interceptor> <!-- 配置拦截器的url,说明: 1.拦截单个url:/interceptor.do,拦截请求/interceptor.do 2.拦截多个url:/inter/**,拦截以/inter开头的所有请求 --> <mvc:mapping path="/interceptor.do"/> <!-- 拦截器处理类 --> <bean class="cn.itheima.ssm.interceptor.FirstInterceptor"></bean> </mvc:interceptor> <!-- 配置登录拦截器 --> <mvc:interceptor> <mvc:mapping path="/queryItem.do"/> <bean class="cn.itheima.ssm.interceptor.LoginInterceptor"></bean> </mvc:interceptor> </mvc:interceptors> |
8.6.2.5. 测试
1.访问商品列表:http://127.0.0.1:8080/springmvc-second/queryItem.do
跳转到登录页面:
2.输入用户名称和密码登录
3.成功登录,访问商品列表
8.7. 多个拦截器
8.7.1. 自定义拦截器二
public class SecondInteceptor implements HandlerInterceptor {
/* (non-Javadoc) * @see org.springframework.web.servlet.HandlerInterceptor#preHandle(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, java.lang.Object) */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // TODO Auto-generated method stub System.out.println("SecondInteceptor(拦截器二)--preHandle执行中.....");
return true; }
/* (non-Javadoc) * @see org.springframework.web.servlet.HandlerInterceptor#postHandle(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, java.lang.Object, org.springframework.web.servlet.ModelAndView) */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // TODO Auto-generated method stub System.out.println("SecondInteceptor(拦截器二)--postHandle执行中.....");
}
/* (non-Javadoc) * @see org.springframework.web.servlet.HandlerInterceptor#afterCompletion(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, java.lang.Object, java.lang.Exception) */ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // TODO Auto-generated method stub System.out.println("SecondInteceptor(拦截器二)--afterCompletion执行中.....");
}
} |
8.7.2. 配置拦截器二
<!-- 配置拦截器 --> <mvc:interceptors> <!-- 配置拦截器一 --> <mvc:interceptor> <!-- 配置拦截器的url,说明: 1.拦截单个url:/interceptor.do,拦截请求/interceptor.do 2.拦截多个url:/inter/**,拦截以/inter开头的所有请求 --> <mvc:mapping path="/interceptor.do"/> <!-- 拦截器处理类 --> <bean class="cn.itheima.ssm.interceptor.FirstInterceptor"></bean> </mvc:interceptor> <!-- 配置拦截器二 --> <mvc:interceptor> <mvc:mapping path="/interceptor.do"/> <bean class="cn.itheima.ssm.interceptor.SecondInteceptor"></bean> </mvc:interceptor> <!-- 配置登录拦截器 --> <mvc:interceptor> <mvc:mapping path="/queryItem.do"/> <bean class="cn.itheima.ssm.interceptor.LoginInterceptor"></bean> </mvc:interceptor> </mvc:interceptors> |
8.7.3. 测试多个拦截器
8.7.3.1. 拦截器一preHandle方法返回true,拦截器二preHandle方法返回true
拦截器一:
拦截器二:
执行结果说明:
1.preHanlde方法按照配置的顺序执行
2.postHandle方法按照配置的逆序执行
3.afterCompletion方法按照配置的逆序执行
8.7.3.2. 拦截器一peHandle方法返回true,拦截器二preHandle方法返回false
拦截器一:
拦截器二:
执行结果说明:
1.afterCompletion方法,只要当前拦截器返回true,就可以执行