java mvc 绑定_关于Java:Spring MVC:将请求属性绑定到控制器方法参数
在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:将请求属性绑定到控制器方法参数相关推荐
- java 时间格式化_彻底解决Spring mvc中时间的转换和序列化等问题
痛点 在使用Spring mvc 进行开发时我们经常遇到前端传来的某种格式的时间字符串无法用java8的新特性java.time包下的具体类型参数来直接接收. 我们使用含有java.time封装类型的 ...
- java性能最好的mvc框架_详解Spring MVC的异步模式(高性能的关键)
什么是异步模式 要知道什么是异步模式,就先要知道什么是同步模式,先看最典型的同步模式: 浏览器发起请求,Web服务器开一个线程处理,处理完把处理结果返回浏览器.好像没什么好说的了,绝大多数Web服务器 ...
- java request 处理过程_小猿圈Java开发之从代码看spring mvc请求处理过程
原标题:小猿圈Java开发之从代码看spring mvc请求处理过程 Java作为编程界的常青树,有自己生存的独到之处,小猿圈java讲师今天就分享一个关于从代码看spring mvc请求处理过程,通 ...
- 【Java学习路线之JavaWeb】Spring MVC框架入门教程
文章目录 读者 阅读条件 MVC设计模式简介 JSP+JavaBean Servlet+JSP+JavaBean MVC优缺点 优点 缺点 Spring MVC是什么 Spring MVC优点 第一个 ...
- 一步一步手绘Spring MVC运行时序图(Spring MVC原理)
相关内容: 架构师系列内容:架构师学习笔记(持续更新) 一步一步手绘Spring IOC运行时序图一(Spring 核心容器 IOC初始化过程) 一步一步手绘Spring IOC运行时序图二(基于XM ...
- java怎么设置404界面_如何使用Spring MVC显示自定义的404 Not Found页面
本篇文章给大家带来的内容是关于如何使用Spring MVC显示自定义的404 Not Found页面,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 不知道大家对千篇一律的404 No ...
- java查询图片前台展示_Java +spring MVC 后台图片流在前台页面显示
用户上传图片后 (头像 or 个人照片等) ,需要在页面上显示,现在提供一种显示方式. 后台采用spring mvc的架构 前台是html Java代码: @ResponseBody @Request ...
- java mvc 菜鸟_【java框架】SpringMVC(1)--SpringMVC入门
1. SpringMVC框架认识 Spring MVC是一个基于MVC模式的Web框架,SpringMVC作为Spring中的一个模块,它与Spring能够无缝集成,主要用于解决企业Web开发中常见的 ...
- springboot java获取版本号_深入实践Spring Boot 实战篇,大佬整理出的PDF文档
如何使用Spring Boot 本文章将会详细介绍如何使用Spring Boot.它覆盖了构建系统,自动配置和运行/部署选项等主题.我们也覆盖了一些Spring Boot最佳实践.尽管Spring B ...
最新文章
- R 语言常用操作与函数汇总
- 实验三linux服务与进程管理,Linux 进程与服务管理1
- 量产加速!干线物流创新中心迎地平线入伙,嬴彻地平线达成战略合作
- CentOS7安装iptables防火墙的方法
- SQLite 安装(http://www.w3cschool.cc/sqlite/sqlite-installation.html)
- python面向对象的基本概念_面向对象的概念和基本语法,python,学习,笔记,一,基础...
- java如何分页_java中分页的实现
- 14、mysql中事务的应用
- 51单片机之音乐代码
- [Hands On ML] 5. 支持向量机
- JSF 网站汇总(转)
- 本地mysql数据库初始密码_忘记本地MySQL数据库密码的解决方法
- iOS 11.2 版本紧急修复黑屏 Bug,却遇 FaceID 识别错误,真实原因在此
- python 将txt文件转换为excel_Python学习笔记-Txt文件转Excel文件
- coolfire文章之六
- pyc文件反编译成py文件
- 一文整理常见Java后端面试题系列——Kafka篇(2022最新版)
- python识别文字坐标_python识别图片上的文字并返回文字在图片中的坐标
- 对比汇新云和猪八戒?
- 计算机重启事件查看,事件查看器检查上一次电脑关机时间
热门文章
- NCBI-SRA数据下载
- python 字符串转字典,字典转字符串 Expecting property name enclosed in double quotes
- flask https启动
- 二值人脸对齐--Binarized Convolutional Landmark Localizers for Human Pose Estimation and Face Alignment
- 人脸检测--FaceBoxes: A CPU Real-time Face Detector with High Accuracy
- android 释放 so,这 10 个值得开启的隐藏功能,让你的 Chrome 释放更多潜力
- expert one on one oracle,数据库表——EXPERT ONE-ON-ONE ORACLE
- echart的关系图高亮_echarts鼠标覆盖高亮显示节点及关系名称详解
- 网件r4500刷第三方固件_网件R6800刷PandoraBox固件,激发潜在的160MHz频宽
- 5分钟搞懂如何使用探针检查Kubernetes健康