Spring中@ModelAttribute注释的替代方法

时间:2019-08-21 08:22:16

标签: java spring spring-mvc

Spring类似,我们以httpServeletRequest.getParameter("key")作为@RequestParam("key")的替代方案, 我们有@ModelAttribute("key")以外的其他选择吗?

model.addAttribute("student",new Student());
...
...
@RequestMapping("/processStudentForm")
public String processTheForm(
    @ModelAttribute("student") Student student
) 
{       
    ...
}

我们有类似的东西吗?

public String processTheForm(
     Model model
) 
{       
    Student student = model.getAtribute("key");
    ...
}

更新1

    @RequestMapping("/showStudentForm")
    public String showTheForm(Model model) {
        model.addAttribute("key",new Student());
        return "studentForm";
    }
<form:form action='processStudentForm' modelAttribute='key' method='post'> 
        ... 
</form:form> 

我将表单值绑定到学生对象中。如何通过请求对象访问此模型属性?

1 个答案:

答案 0 :(得分:1)

无法通过请求对象直接访问学生模型对象,但是您可以通过与请求对象不同的方式来访问它 默认情况下,spring在使用FormHttpMessageConverter将其转换为应用程序/ x-www-form-urlencoded请求的模型映射的后台进行了大量工作,您可以参考文档。

https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/http/converter/FormHttpMessageConverter.html

您可以执行与spring内部相同的操作。我尝试了它的工作原理,但是您可以通过多种方式进行操作。请参考堆栈溢出帖子以获取其他答案

       Map map = httpServletRequest.getParameterMap().entrySet()
            .stream().collect(Collectors.toMap(e -> e.getKey(), e -> Arrays.stream(e.getValue()).findFirst().get()));
       Student student = new ObjectMapper().convertValue(map, Student.class);

Getting request payload from POST request in Java servlet

但是使用默认实现始终是一个好习惯。