我可以通过模型从控制器向jsp页面发送一个对象,但是在将一些数据保存到控制器之后如何将该对象返回给控制器?
我的表单如下:
<form:form method="POST" modelAttribute="user" action="/GENEPI/userChangePassword" commandName="user">
<spring:message code="label.newPassword" />
<br>
<input id="password" type="password"
pattern=".{8,30}" class="input-block-level"
onFocusOut="passwordValidation();"
title="ERROR" />
</form:form>
我的控制器是这样的:
@RequestMapping(value = "/userChangePassword", method = RequestMethod.POST)
public String changePasswordPOST(@ModelAttribute("user") UserEntity user,
@ModelAttribute("newPassword") String newPassword, Model model) {
System.out.println("USERNAME: " + user.getUsername());
}
尽管user
始终是null
。如何让它将user
对象从jsp传递给控制器,并且数据用户已填充到那里?
编辑:换句话说 - 有什么方法,如何使用model
页面中的对键值填充jsp
地图并将其发布回controller
?< / p>
答案 0 :(得分:1)
将jsp
呈现为HTML,将其作为HTTP响应的主体发送给某个客户端。
HTML中没有Object的概念。您正在对表单执行的操作是将一些输入字段序列化为请求参数并在新的HTTP请求中发送这些字段。在这种情况下,您正在发送POST。
Spring使用名为HandlerMethodArgumentResolver
的接口为@Controller
处理程序方法构造参数。它使用名为ModelAttributeMethodProcessor
的实现来解析具有@ModelAttribute
注释的参数。 javadoc陈述
模型属性是从模型中获得的,或者如果找不到则可能 如果可用,则使用默认构造函数创建。一旦创建, 属性通过数据绑定和请求数据填充 如果参数用注释,也可以应用验证 @ javax.validation.Valid。
换句话说,如果模型中没有可通过命名键(@ModelAttribute
value
属性值访问的属性),Spring将根据请求参数构造它,其名称为等于Class类字段的名称。在这种情况下,没有。
如果您希望Spring为您序列化UserEntity
对象,则需要将input
字段放在与name
具有相同UserEntity
属性值的表单中类字段,并为这些输入提供一个值,可能是之前的值。
查看Spring的标记库的documentation。
答案 1 :(得分:1)
检查此链接: Using Spring Form Library
逻辑是您将Bean或Model传递给JSP,用户将输入值,然后将模型传递给控制器。 您必须使用@ModelAttribute来获取模型,然后在获得模型后可以使用它。
我在JSP和Controlller中看到两个错误。 1.您在同一个模型上使用了modelAttribute和commandName。用户。 用户modelAttribute或commandName。
2.您的JSP中没有名为newPassword的模型,而您正试图在Controller中获取它。
3.我假设此用户Bean具有您尝试从JSP设置的密码属性。因此,您必须获取该用户Bean而不是单个属性。
如果您仍有疑问,请告诉我。
答案 2 :(得分:1)
你可以使用spring taglib form
并隐藏到ie table
,类似的东西:
<table align="center" style="position: relative; left: 0px; top: -20px; width: 100%">
<tr>
<td width="40%" class="">
<form:label path="user">Username: </form:label></td>
<td width="60%" class="">
<form:input path="usuario" cssClass="" readonly="true"/></td>
</tr>
<form:hidden path="password" id="pwdDB" />
<tr>
<td width="40%" class="">
<form:label path="password">Password: </form:label></td>
<td width="60%" class=""><form:password path="" id="password" cssClass="" maxlength="14"/></td>
</tr>
<tr>
<td colspan="2"><form:hidden path="username" /></td>
</tr>
<tr>
<td colspan="2"><form:hidden path="otherattributePOJO" /></td>
</tr>
<tr>
<td colspan="2"><form:hidden path="anotherattributePOJO" /></td>
</tr>
</table>
您将POJO中的属性放到path
。
我希望能帮到你:)
答案 3 :(得分:-1)
基本思想是使用HTTP Post,通常将输入数据设置为字符串或原始数据类型,数据将发布到servlet。
对于扩展基本http框架的所有框架,这个基本思想保持不变。例如。 Struts,Spring MVC,StripesFramework等。
我建议您对HTTP的工作原理感到满意。
在您的特定情况下,查找用户的关键信息也应该能够通过让用户输入用户信息(通常是用户ID /密码)或将信息存储为隐藏字段来回发到servlet。