示例 @RequestAttribute注解和@SessionAttribute注解的使用

示例 @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
{
// 测试@CookieValue注解
// 该方法映射的请求为 /cookieValueTest
@GetMapping(value = "/attrbuteTest")
public ModelAndView attrbuteTest(ModelAndView mv)
{
System.out.println("attributeTest方法被调用...");
// 客户端重定向到main请求,会被自定义过滤器拦截
mv.setViewName("redirect:main");
return mv;
}
/*
* 该方法映射的请求为/main
* @RequestAttribute("name") String name---将request作用范围中"name"属性的值赋给方法的参数name
* @SessionAttribute("sex") String sex---将session作用范围中"sex"属性的值赋给方法的参数sex
*/
@RequestMapping("/main")
public String main(@RequestAttribute("name") String name,
@SessionAttribute("sex") String sex)
{
System.out.println("main方法被调用...");
// 输出@RequestAttribute获得的name
System.out.println("name: " + name);
// 输出@SessionAttribute获得的sex
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;

// 过滤器拦截/main请求
@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方法");
// 将ServletRequest对象强转成HttpServletRequest对象
HttpServletRequest httpRequest = (HttpServletRequest) request;
// 在request作用范围域中设置一个name属性
httpRequest.setAttribute("name", "小明");
// 在session作用范围域中设置一个sex属性
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: 男

浏览器显示内容:

1
2
name:小明
sex:男

可以看到,request作用域中的name的值被传递到请求处理方法mainname变量, session作用域中的sex的值被传递到请求处理方法mainsex变量,并输出打印在控制台。