spring mvc二

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. 配置虚拟目录

步骤一:

 

步骤二:


步骤三:

 

步骤四:

 

步骤五:

 

步骤六:修改端口号,防止冲突.



 

步骤七:

 

步骤八:


访问测试:http://127.0.0.1:8081/pic/springmvc.jpg

 

5.2.2. 部署阶段配置虚拟目录

步骤一:

步骤二:



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;

   }

 

图一:

 

图二:



 

 

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,就可以执行

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值