0%

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

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

新建一个项目AttributeTest,加入所需的jar文件,示例代码如下:

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
40
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变量,并输出打印在控制台。

原文链接: 示例 @RequestAttribute注解和@SessionAttribute注解的使用