在Spring MVC中,很容易将请求参数绑定到处理请求的方法参数。 我只是使用@RequestParameter("name")。 但是我可以对request属性做同样的事情吗? 当前,当我要访问请求属性时,必须执行以下操作:

MyClass obj = (MyClass) request.getAttribute("attr_name");

但是我真的很想使用这样的东西:

@RequestAttribute("attr_name") MyClass obj

不幸的是,这种方式行不通。 我可以以某种方式扩展Spring功能并添加自己的"绑定器"吗?

编辑(我要实现的目标):我将当前登录的用户存储在request属性中。 因此,每当我要访问当前登录的用户(几乎在每种方法中都需要访问)时,都必须写此额外的行user = (User) request.getAttribute("user");。 我想使其尽可能短,最好将其作为方法参数注入。 或者,如果您知道另一种如何在拦截器和控制器之间传递内容的方法,我将很高兴听到。

好吧,我终于了解了模型的工作原理以及@ModelAttribute的作用。这是我的解决方案。

@Controller

class MyController

{

@ModelAttribute("user")

public User getUser(HttpServletRequest request)

{

return (User) request.getAttribute("user");

}

@RequestMapping(value ="someurl", method = RequestMethod.GET)

public String HandleSomeUrl(@ModelAttribute("user") User user)

{

// ... do some stuff

}

}

标有@ModelAttribute注释的getUser()方法将自动填充所有标有@ModelAttribute的User user参数。因此,在调用HandleSomeUrl方法时,该调用看起来类似于MyController.HandleSomeUrl(MyController.getUser(request))。至少这是我的想象。很棒的事情是,用户也可以从JSP视图进行访问,而无需任何进一步的努力。

这确实解决了我的问题,但是我还有其他问题。我可以在哪里放那些@ModelAttribute方法,使它们对于我所有的控制器都通用吗?我可以以某种方式从拦截器的preHandle()方法内部添加模型属性吗?

太棒了!谢谢。

如果参数名称与模型对象上的属性匹配,则不需要其他的getUser方法,spring会自动设置这些属性

这样,您方法中的User对象不仅会从视图模型中检索,而且它的属性也会被传入的请求或表单参数绑定(并覆盖)。例如,如果User对象具有id属性(许多用户对象将具有该属性),并且请求url或表单也具有不相关的id参数,则它将覆盖User对象的id。这曾经在我的代码中创建了一个讨厌的错误。在这种情况下,您不需要@ModelAttribute的表单绑定属性。一种替代方法是使用User u = (User) model.get("user");

使用(从Spring 4.3开始)@RequestAttribute:

@RequestMapping(value ="someurl", method = RequestMethod.GET)

public String handleSomeUrl(@RequestAttribute User user) {

// ... do some stuff

}

或如果请求属性名称与方法参数名称不匹配:

@RequestMapping(value ="someurl", method = RequestMethod.GET)

public String handleSomeUrl(@RequestAttribute(name="userAttributeName") User user) {

// ... do some stuff

}

我认为您正在寻找的是:

@ModelAttribute("attr_name") MyClass obj

您可以在控制器中方法的参数中使用它。

这是一个带有问题详细信息的链接,在Spring MVC中,@ ModelAttribute是什么?

该问题链接到Spring文档,并提供了一些使用它的示例。你可以在这里看到

更新资料

我不确定您如何设置页面,但是可以通过两种不同的方式将用户添加为模型属性。我在下面设置了一个简单的示例。

@RequestMapping(value ="/account", method = RequestMethod.GET)

public ModelAndView displayAccountPage() {

User user = new User(); //most likely you've done some kind of login step this is just for simplicity

return new ModelAndView("account","user", user); //return view, model attribute name, model attribute

}

然后,当用户提交请求时,Spring会将用户属性绑定到方法参数中的User对象。

@RequestMapping(value ="/account/delivery", method = RequestMethod.POST)

public ModelAndView updateDeliverySchedule(@ModelAttribute("user") User user) {

user = accountService.updateDeliverySchedule(user); //do something with the user

return new ModelAndView("account","user", user);

}

谢谢,但是我正在尝试实现其他目标。也许我应该解释一下。我使用request属性存储当前登录的用户。因此,就像您呼叫User user = (User) session.getAttribute("user");一样,我也呼叫user = (User) request.getAttribute("user");。但是用每种方法编写它都是很烦人的。我想使其尽可能短,最好将其作为方法参数注入。

您仍然可以使用此方法来执行此操作。您只需要将User对象添加到模型中。然后,您可以访问它。有两种方法可以做到这一点。病态更新我的答案。

我对@SessionAttributes不太熟悉,但这也可能对您有用。这是其文档的链接。

好吧,我不确定我是否理解您,但是您绝对可以使我朝正确的方向发展,我找到了我一直在寻找的东西。所以,谢谢,稍后我会给出我自己的答案:)

不是最优雅的,但至少可以起作用...

@Controller

public class YourController {

@RequestMapping("/xyz")

public ModelAndView handle(

@Value("#{request.getAttribute('key')}") SomeClass obj) {

...

return new ModelAndView(...);

}

}

资料来源:http://blog.crisp.se/tag/requestattribute

从Spring 3.2开始,可以使用Springs ControllerAdvice注释来做得更好。

然后,这将使您获得建议,将@ModelAttributes添加到单独的类中,然后将其应用于所有控制器。

为了完整起见,也可以照原样制作@RequestAttribute(" attr-name")。

(根据本文进行了以下修改以适应我们的要求)

首先,我们必须定义注释:

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.PARAMETER)

public @interface RequestAttribute {

String value();

}

然后,我们需要一个[WebArgumentResolver]来处理绑定属性时需要做的事情

public class RequestAttributeWebArgumentResolver implements WebArgumentResolver {

public Object resolveArgument(MethodParameter methodParameter, NativeWebRequest nativeWebRequest) throws Exception {

// Get the annotation

RequestAttribute requestAttributeAnnotation = methodParameter.getParameterAnnotation(RequestAttribute.class);

if(requestAttributeAnnotation != null) {

HttpServletRequest request = (HttpServletRequest) nativeWebRequest.getNativeRequest();

return request.getAttribute(requestAttributeAnnotation.value);

}

return UNRESOLVED;

}

}

现在,我们需要将此customresolver添加到配置中以对其进行解析:

我们完成了!

在Spring WebMVC 4.x中,它更喜欢实现HandlerMethodArgumentResolver

@Override

public boolean supportsParameter(MethodParameter parameter) {

return parameter.getParameterAnnotation(RequestAttribute.class) != null;

}

@Override

public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,

NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {

return webRequest.getAttribute(parameter.getParameterAnnotation(RequestAttribute.class).value(), NativeWebRequest.SCOPE_REQUEST);

}

}

然后在RequestMappingHandlerAdapter中注册

是的,您可以将自己的"绑定器"添加到request属性-请参阅spring-mvc-3-showcase,或使用@Peter Szanto的解决方案。

或者,按照其他答案中的建议将其绑定为ModelAttribute。

由于您是要传递到控制器中的登录用户,因此您可能需要考虑使用Spring Security。然后,您可以将Principle注入到您的方法中:

@RequestMapping("/xyz")

public String index(Principal principle) {

return"Hello," + principle.getName() +"!";

}

java mvc 绑定_关于Java:Spring MVC:将请求属性绑定到控制器方法参数相关推荐

  1. java 时间格式化_彻底解决Spring mvc中时间的转换和序列化等问题

    痛点 在使用Spring mvc 进行开发时我们经常遇到前端传来的某种格式的时间字符串无法用java8的新特性java.time包下的具体类型参数来直接接收. 我们使用含有java.time封装类型的 ...

  2. java性能最好的mvc框架_详解Spring MVC的异步模式(高性能的关键)

    什么是异步模式 要知道什么是异步模式,就先要知道什么是同步模式,先看最典型的同步模式: 浏览器发起请求,Web服务器开一个线程处理,处理完把处理结果返回浏览器.好像没什么好说的了,绝大多数Web服务器 ...

  3. java request 处理过程_小猿圈Java开发之从代码看spring mvc请求处理过程

    原标题:小猿圈Java开发之从代码看spring mvc请求处理过程 Java作为编程界的常青树,有自己生存的独到之处,小猿圈java讲师今天就分享一个关于从代码看spring mvc请求处理过程,通 ...

  4. 【Java学习路线之JavaWeb】Spring MVC框架入门教程

    文章目录 读者 阅读条件 MVC设计模式简介 JSP+JavaBean Servlet+JSP+JavaBean MVC优缺点 优点 缺点 Spring MVC是什么 Spring MVC优点 第一个 ...

  5. 一步一步手绘Spring MVC运行时序图(Spring MVC原理)

    相关内容: 架构师系列内容:架构师学习笔记(持续更新) 一步一步手绘Spring IOC运行时序图一(Spring 核心容器 IOC初始化过程) 一步一步手绘Spring IOC运行时序图二(基于XM ...

  6. java怎么设置404界面_如何使用Spring MVC显示自定义的404 Not Found页面

    本篇文章给大家带来的内容是关于如何使用Spring MVC显示自定义的404 Not Found页面,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 不知道大家对千篇一律的404 No ...

  7. java查询图片前台展示_Java +spring MVC 后台图片流在前台页面显示

    用户上传图片后 (头像 or 个人照片等) ,需要在页面上显示,现在提供一种显示方式. 后台采用spring mvc的架构 前台是html Java代码: @ResponseBody @Request ...

  8. java mvc 菜鸟_【java框架】SpringMVC(1)--SpringMVC入门

    1. SpringMVC框架认识 Spring MVC是一个基于MVC模式的Web框架,SpringMVC作为Spring中的一个模块,它与Spring能够无缝集成,主要用于解决企业Web开发中常见的 ...

  9. springboot java获取版本号_深入实践Spring Boot 实战篇,大佬整理出的PDF文档

    如何使用Spring Boot 本文章将会详细介绍如何使用Spring Boot.它覆盖了构建系统,自动配置和运行/部署选项等主题.我们也覆盖了一些Spring Boot最佳实践.尽管Spring B ...

最新文章

  1. R 语言常用操作与函数汇总
  2. 实验三linux服务与进程管理,Linux 进程与服务管理1
  3. 量产加速!干线物流创新中心迎地平线入伙,嬴彻地平线达成战略合作
  4. CentOS7安装iptables防火墙的方法
  5. SQLite 安装(http://www.w3cschool.cc/sqlite/sqlite-installation.html)
  6. python面向对象的基本概念_面向对象的概念和基本语法,python,学习,笔记,一,基础...
  7. java如何分页_java中分页的实现
  8. 14、mysql中事务的应用
  9. 51单片机之音乐代码
  10. [Hands On ML] 5. 支持向量机
  11. JSF 网站汇总(转)
  12. 本地mysql数据库初始密码_忘记本地MySQL数据库密码的解决方法
  13. iOS 11.2 版本紧急修复黑屏 Bug,却遇 FaceID 识别错误,真实原因在此
  14. python 将txt文件转换为excel_Python学习笔记-Txt文件转Excel文件
  15. coolfire文章之六
  16. pyc文件反编译成py文件
  17. 一文整理常见Java后端面试题系列——Kafka篇(2022最新版)
  18. python识别文字坐标_python识别图片上的文字并返回文字在图片中的坐标
  19. 对比汇新云和猪八戒?
  20. 计算机重启事件查看,事件查看器检查上一次电脑关机时间

热门文章

  1. NCBI-SRA数据下载
  2. python 字符串转字典,字典转字符串 Expecting property name enclosed in double quotes
  3. flask https启动
  4. 二值人脸对齐--Binarized Convolutional Landmark Localizers for Human Pose Estimation and Face Alignment
  5. 人脸检测--FaceBoxes: A CPU Real-time Face Detector with High Accuracy
  6. android 释放 so,这 10 个值得开启的隐藏功能,让你的 Chrome 释放更多潜力
  7. expert one on one oracle,数据库表——EXPERT ONE-ON-ONE ORACLE
  8. echart的关系图高亮_echarts鼠标覆盖高亮显示节点及关系名称详解
  9. 网件r4500刷第三方固件_网件R6800刷PandoraBox固件,激发潜在的160MHz频宽
  10. 5分钟搞懂如何使用探针检查Kubernetes健康