示例 @RequestAttribute注解和@SessionAttribute注解的使用
新建一个项目AttributeTest,加入所需的jar文件,示例代码如下:
项目结构
展开/折叠
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
   | G:\Desktop\随书源码\Spring+Mybatis企业应用实战(第2版)\codes\03\AttributeTest ├─src\ │ └─org\ │   └─fkit\ │     ├─controller\ │     │ └─AttributeController.java │     └─filter\ │       └─TestAttributeFilter.java └─WebContent\   ├─index.jsp   ├─META-INF\   │ └─MANIFEST.MF   └─WEB-INF\     ├─content\     │ └─welcome.jsp     ├─lib\     │ ├─commons-logging-1.2.jar     │ ├─spring-aop-5.0.1.RELEASE.jar     │ ├─spring-aspects-5.0.1.RELEASE.jar     │ ├─spring-beans-5.0.1.RELEASE.jar     │ ├─spring-context-5.0.1.RELEASE.jar     │ ├─spring-context-indexer-5.0.1.RELEASE.jar     │ ├─spring-context-support-5.0.1.RELEASE.jar     │ ├─spring-core-5.0.1.RELEASE.jar     │ ├─spring-expression-5.0.1.RELEASE.jar     │ ├─spring-instrument-5.0.1.RELEASE.jar     │ ├─spring-jcl-5.0.1.RELEASE.jar     │ ├─spring-jdbc-5.0.1.RELEASE.jar     │ ├─spring-jms-5.0.1.RELEASE.jar     │ ├─spring-messaging-5.0.1.RELEASE.jar     │ ├─spring-orm-5.0.1.RELEASE.jar     │ ├─spring-oxm-5.0.1.RELEASE.jar     │ ├─spring-test-5.0.1.RELEASE.jar     │ ├─spring-tx-5.0.1.RELEASE.jar     │ ├─spring-web-5.0.1.RELEASE.jar     │ ├─spring-webflux-5.0.1.RELEASE.jar     │ ├─spring-webmvc-5.0.1.RELEASE.jar     │ └─spring-websocket-5.0.1.RELEASE.jar     ├─springmvc-config.xml     └─web.xml
 
   | 
 
 
index.jsp
1 2 3 4 5 6 7 8 9 10 11 12 13 14
   | <%@ page language="java" contentType="text/html; charset=UTF-8"     pageEncoding="UTF-8"%> <!DOCTYPE> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>@RequestAttribute和@SessionAttribute测试</title> </head> <body>     <h2>@RequestAttribute和@SessionAttribute测试</h2>     <a href="attrbuteTest">测试@RequestAttribute和@SessionAttribute</a>     <br> </body> </html>
   | 
 
AttributeController.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
   | package org.fkit.controller;
  import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.SessionAttribute; import org.springframework.web.servlet.ModelAndView;
  @Controller public class AttributeController {               @GetMapping(value = "/attrbuteTest")     public ModelAndView attrbuteTest(ModelAndView mv)     {         System.out.println("attributeTest方法被调用...");                  mv.setViewName("redirect:main");         return mv;     }     
 
 
 
      @RequestMapping("/main")     public String main(@RequestAttribute("name") String name,             @SessionAttribute("sex") String sex)     {         System.out.println("main方法被调用...");                  System.out.println("name: " + name);                  System.out.println("sex: " + sex);         return "welcome";     } }
   | 
 
attributeTest方法处理请求后重定向到main请求, 
main请求会被自定义过滤器拦截, 
- 在过滤器中会分别设置两个属性到
request作用域和session作用域。 
- 在
main方法中使用@RequestAttribute和@SessionAttribute进行赋值。 
TestAttributeFilter.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
   | package org.fkit.filter;
  import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest;
 
  @WebFilter(value = "/main") public class TestAttributeFilter implements Filter {     @Override     public void destroy()     {     }     @Override     public void doFilter(ServletRequest request, ServletResponse response,             FilterChain chain) throws IOException, ServletException     {         System.out.println("进入AuthFilter过滤器的doFilter方法");                  HttpServletRequest httpRequest = (HttpServletRequest) request;                  httpRequest.setAttribute("name", "小明");                  httpRequest.getSession().setAttribute("sex", "男");                  chain.doFilter(httpRequest, response);     }     @Override     public void init(FilterConfig arg0) throws ServletException     {     } }
   | 
 
TestAttributeFilter过滤器拦截"main"请求,在dofilter方法中分别设置两个属性到request作用域和session作用域。
测试
部署AttributeTest这个Web应用,在浏览器中输入如下URL来测试应用:
1
   | http://localhost:8080/AttributeTest/
   | 
 
单击测试@RequestAttribute和@SessionAttribute"超链接发送请求,将调用attrbuteTest方法,然后经过过滤器,重定向到main方法,控制台输出结果如下:
1 2 3 4 5
   | attributeTest方法被调用... 进入AuthFilter过滤器的doFilter方法 main方法被调用... name: 小明 sex: 男
   | 
 
浏览器显示内容:
可以看到,request作用域中的name的值被传递到请求处理方法main的name变量, session作用域中的sex的值被传递到请求处理方法main的sex变量,并输出打印在控制台。