一、拦截器intercepor
(1)Spring配置文件中的配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<!-- 被扫描的控制器所在的包路径 -->
<context:component-scan base-package="com.ly.controller"/>
<!--用注解会代替 DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter -->
<mvc:annotation-driven />
<mvc:interceptors>
<mvc:interceptor>
<!-- 需要拦截的方法的映射value值,如 @RequestMapping(value="/interceptorone")
public String interceptorone(){
System.out.println("调用interceptorone");
return "success"; -->
<mvc:mapping path="/interceptorone"/>
<!--拦截器所在的类,即 implements HandlerInterceptor实现此接口的类 -->
<bean class="com.ly.controller.InterceptorTest"></bean>
</mvc:interceptor>
</mvc:interceptors>
<!-- ViewResolver 视图解析器 -->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>
(2)实现HandlerInterceptor接口的InterceptorTest拦截器
package com.ly.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class InterceptorTest implements HandlerInterceptor {
/**
* preHandle方法是进行处理器拦截用的,顾名思义,该方法将在Controller处理之前进行调用,SpringMVC中的Interceptor拦截器是链式的,可以同时存在多个Interceptor,然后SpringMVC会根据声明的前后顺序一个接一个的执行,而且所有的Interceptor中的preHandle方法都会在 Controller方法调用之前调用。
* SpringMVC的这种Interceptor链式结构也是可以进行中断的,这种中断方式是令preHandle的返回值为false,当preHandle的返回值为false的时候整个请求就结束了。
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("preHandle>>>>>");
return true;
}
/**
* 这个方法只会在当前这个Interceptor的preHandle方法返回值为true的时候才会执行。postHandle是进行处理器拦截用的,它的执行时间是在处理器进行处理之后,
* 也就是在Controller的方法调用之后执行,但是它会在DispatcherServlet进行视图的渲染之前执行,也就是说在这个方法中你可以对ModelAndView进行操作。
* 这个方法的链式结构跟正常访问的方向是相反的,也就是说先声明的Interceptor拦截器该方法反而会后调用,这跟Struts2里面的拦截器的执行过程有点像,
*
* 只是Struts2里面的intercept方法中要手动的调用ActionInvocation的invoke方法,
* Struts2中调用ActionInvocation的invoke方法就是调用下一个Interceptor 或者是调用action,然后要在Interceptor之前调用的内容都写在调用invoke之前,
* 要在Interceptor之后调用的内容都写在调用invoke方法之后。
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("postHandle>>>>>");
}
/**
* 该方法也是需要当前对应的Interceptor的preHandle方法的返回值为true时才会执行。该方法将在整个请求完成之后,
* 也就是DispatcherServlet渲染了视图执行, 这个方法的主要作用是用于清理资源的,当然这个方法也只能在当前这个Interceptor的preHandle方法的返回值为true时才会执行。
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("afterCompletion>>>>>");
}
}
(3)以下为某个需要调用拦截器的方法,即为(1)中配置的<mvc:mapping path="/interceptorone">
@Controller public class InterceptorMethod { @RequestMapping(value="/interceptorone") public String interceptorone(){ System.out.println("调用interceptorone"); return "success"; }
(1)Maven中pom.xml中的配置,需添加Json的相关包二、SpringMVC中json字符串输出
相同版本2.8.1的可以这样设置
properties> <springframework.version>4.3.0.RELEASE</springframework.version> <jackson.version>2.8.1</jackson.version> </properties>
<!-- Json解析所需jar包 --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</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-databind</artifactId> <version>${jackson.version}</version> </dependency>
(2)json字符串输出的两种方式1.利用注解@ResponseBody用这个来修饰某个类,让其以json字符串输出
@RequestMapping(value="jsonuser") public @ResponseBody User getJsonUser(){ User user = new User(); user.setId(1001); user.setName("张三"); user.setPassword("123"); return user; } /** 是@ResponseBody用这个来修饰某个类,让其以json字符串输出 */ @RequestMapping(value="jsonlist") public @ResponseBody List<User> getJsonUserList(){ User user1 = new User(1001,"张三","123"); User user2 = new User(1002,"李四","abc"); List<User> userList = new ArrayList<User>(); userList.add(user1); userList.add(user2); return userList; }
2.利用ResponseEntity<>来实现json字符串的输出
/* * 用ResponseEntity<User> 来修饰User这个类,返回 new ResponseEntity<User>(user1,HttpStatus.OK); * 使user1以json字符串输出 */ @RequestMapping(value="json_user") public ResponseEntity<User> getUserEntity(){ User user1 = new User(1001,"张三","123"); return new ResponseEntity<User>(user1,HttpStatus.OK); } @RequestMapping(value="json_message") public ResponseEntity<Message> getMessageEntity(){ User user1 = new User(1001,"张三","123"); User user2 = new User(1002,"李四","abc"); List<User> userList = new ArrayList<User>(); userList.add(user1); userList.add(user2); Message message = new Message(); message.setCode(1); message.setMessage("数据正常"); message.setUserlist(userList); return new ResponseEntity<Message>(message,HttpStatus.OK); }