我正在学习spring mvc。我开发了一个屏幕,登录时会显示用户的个人数据。在同一个屏幕上会有更新按钮来更新个人数据。
我的问题是在personaldata.jsp中,表单提交后,用户名,密码等用户属性(未作为表单字段提及)设置为null。
以下是我的个人数据.jsp
<form:form name="customerForm" id="customerForm" commandName="customerForm" method="post" >
<form:hidden path="userName" id="userName"/>
<form:hidden path="emailAddress" id="emailAddress"/>
<form:hidden path="password" id="password"/>
<div class="faq_rightin">
<div class="faq_icon"><img src='<c:url value="/images/icon19.png" />' alt=""></div>
<div class="faq_ohc2">
<h1><spring:message code="myaccount.label.personaldata" text="Personal Data"></spring:message></h1>
<span class="common ul-font-style m_top ">Welcome ${customerForm.firstName} ${customer.lastName}</span>
<span class="red"><spring:message code="myaccount.label.personalinfodesc" text="You may here enter your personal Information, enabling you to use those when you make your next booking. Doing so, your user experience is better, quicker."></spring:message></span>
<div class="m_top pd-form-box">
<div class="comm_md m_top float-left">
<div class="pd-colum1 mrg-rgt10">
<span class="pd-name-title mrg-rgt10">
<select class="select-pd-name1" id="delivery_method" >
<option class="select-pd-name1" value="0">Mr</option>
<option value="1">Mrs</option>
<option value="2">Miss</option>
</select>
</span>
<span>
<spring:message code="myaccount.label.firstname" text="First Name" var="firstname" />
<form:input path="firstName" id="firstName" cssClass="pd-form-txt-common pd-txt1 float-left shadow" placeholder="${firstname}*" />
</span>
</div>
<div class="pd-colum2 ">
<spring:message code="myaccount.label.familyname" text="Family Name" var="lastname"></spring:message>
<form:input path="lastName" id="lastName" cssClass="pd-form-txt-common pd-txt2 float-left shadow" placeholder="${lastname}*" />
</div>
</div><!--end row -->
<div class="comm_md m_top float-left">
<div class="pd-colum1 mrg-rgt10">
<div class="comm_md float-left">
<spring:message code="myaccount.label.emailaddress" text="Email-Address"></spring:message>* : ${customerForm.emailAddress}
</div>
<a href="#" class="comm_md blue_txt bold float-left"><spring:message code="myaccount.label.changeyouremailaddress" text="Change your Email Address"></spring:message> ></a>
</div>
<div class="pd-colum2 ">
<div class="comm_md float-left">
<spring:message code="myaccount.label.birthday" text="Birthday"></spring:message>*
</div>
<div class="comm_md float-left">
<!--<form method="post" action="">
<div class="select_md3 float-left">
<form:select path="day" id="" cssClass="select2">
<form:option value="1">1</form:option>
<form:option value="2">2</form:option>
<form:option value="3">3</form:option>
<form:option value="4">4</form:option>
</form:select>
</div>
</form>-->
<div class="select_md3 float-left">
<form:select path="day" id="birthDay" cssClass="select2" items="${days}"/>
</div>
<span class="float-left f13 p_5">/</span>
<!--<form method="post" action="">
<div class="select_md3 float-left">
<form:select path="month" id="" cssClass="select2">
<form:option value="1">1</form:option>
<form:option value="2">2</form:option>
<form:option value="3">3</form:option>
<form:option value="4">4</form:option>
</form:select>
</div>
</form>-->
<div class="select_md3 float-left">
<form:select path="month" id="birthMonth" cssClass="select2" items="${months}"/>
</div>
<span class="float-left f13 p_5">/</span>
<!--<form method="post" action="">
<div class="select_md4 float-left">
<form:select path="year" id="" cssClass="select2">
<form:option value="1">2011</form:option>
<form:option value="2">2012</form:option>
<form:option value="3">2013</form:option>
<form:option value="4">2014</form:option>
</form:select>
</div>
</form> -->
<div class="select_md4 float-left">
<form:select path="year" id="birthYear" cssClass="select2" items="${years}"/>
</div>
</div>
</div>
</div><!--end row -->
<div class="comm_md m_top float-left">
<div class="pd-colum1 mrg-rgt10">
<span>
<spring:message code="myaccount.label.code" text="Code" var="phonecode"></spring:message>
<form:input path="phoneCode" id="phoneCode" cssClass="pd-form-txt-common pd-txt3 float-left mrg-rgt10 shadow" placeholder="${phonecode}"/>
</span>
<span>
<spring:message code="myaccount.label.phonenumber" text="Phone Number" var ="phonenumber"></spring:message>
<form:input path="phoneNumber" id="phoneNumber" cssClass="pd-form-txt-common pd-txt1 float-left shadow" placeholder="${phonenumber}"/>
</span>
</div>
<div class="pd-colum2 ">
<span>
<spring:message code="myaccount.label.code" text="Code" var="mobileCode"></spring:message>
<form:input path="mobileCode" id="mobileCode" cssClass="pd-form-txt-common pd-txt3 float-left mrg-rgt10 shadow" placeholder="${mobileCode}"/>
</span>
<span>
<spring:message code="myaccount.label.mobilenumber" text="Mobile Number" var="mobileNumber"></spring:message>
<form:input path="mobileNumber" id="mobileNumber" cssClass="pd-form-txt-common pd-txt4 float-left shadow" placeholder="${mobileNumber}*"/>
</span>
</div>
</div><!--end row -->
<div class="comm_md m_top float-left">
<div class="pd-colum1 mrg-rgt10">
<form:select path="idDocument" cssClass="select-pd-name" id="idDocument">
<form:option value="0"><spring:message code="myaccount.label.identificationdocument" text="Identification Document"></spring:message></form:option>
<form:option value="1"><spring:message code="myaccount.label.passport" text="Passport"></spring:message></form:option>
<form:option value="2"><spring:message code="myaccount.label.license" text="License"></spring:message></form:option>
</form:select>
</div>
<div class="pd-colum2 ">
<span class="f13 bold"><spring:message code="myaccount.label.invoiceaddressforcompanies" text="Invoice Address for Companies"></spring:message></span>
</div>
</div><!--end row -->
<div class="comm_md m_top float-left">
<div class="pd-colum1 mrg-rgt10">
<form:input path="idNumber" cssClass="pd-form-txt-common pd-txt5 float-left shadow" placeholder="Ausweisnumber*"/>
</div>
<div class="pd-colum2 ">
<input type="checkbox" name="" class="mrgrgt5" id=" "><span class="f13"><spring:message code="myaccount.label.sameasmailaddress" text="Same as mail Address"></spring:message> </span>
</div>
</div><!--end row -->
<div class="comm_md m_top float-left">
<div class="pd-colum1 mrg-rgt10">
<span class="f13 bold"><spring:message code="myaccount.label.address" text="Address"></spring:message></span>
</div>
<div class="pd-colum2 ">
<span>
<spring:message code="myaccount.label.companyname" text="Company Name" var="companyname"></spring:message>
<form:input id="companyName" path="companyName" class="pd-form-txt-common pd-txt2 float-left mrg-rgt10 shadow" placeholder="${companyname}"/>
</span>
</div>
</div><!--end row -->
<div class="comm_md m_top float-left">
<div class="pd-colum1 mrg-rgt10">
<span>
<spring:message code="myaccount.label.street" text="Street" var="${street}"></spring:message>
<form:input path="address.street" id="street" cssClass="pd-form-txt-common pd-txt1 float-left mrg-rgt10 shadow" placeholder="${street}"/>
</span>
<span>
<form:input path="address.streetNo" id="streetNo" cssClass="pd-form-txt-common pd-txt3 float-left shadow" placeholder="No"/>
</span>
</div>
<div class="pd-colum2 ">
<span>
<spring:message code="myaccount.label.street" text="Street" var="street"></spring:message>
<form:input path="address.companyStreet" id="compStreet" cssClass="pd-form-txt-common pd-txt4 float-left mrg-rgt10 shadow" placeholder="${street}"/>
</span>
<span>
<form:input path="address.companyStreetNo" id="compStreetNo" cssClass="pd-form-txt-common pd-txt3 float-left shadow" placeholder="No"/>
</span>
</div>
</div><!--end row -->
<div class="comm_md m_top float-left">
<div class="pd-colum1 mrg-rgt10">
<span>
<spring:message code="myaccount.label.plz" text="PLZ" var="zip"></spring:message>
<form:input path="address.postalCode" id="postalCode" cssClass="pd-form-txt-common pd-txt3 float-left mrg-rgt10 shadow" placeholder="${zip}"/>
</span>
<span>
<spring:message code="myaccount.label.town" text="Town" var="compcity"></spring:message>
<form:input path="address.city" id="city" cssClass="pd-form-txt-common pd-txt1 float-left shadow" placeholder="${compcity}"/>
</span>
</div>
<div class="pd-colum2 ">
<span>
<spring:message code="myaccount.label.plz" text="PLZ" var="plzcomp"></spring:message>
<form:input path="address.companyPostalCode" id="compPostalCode" cssClass="pd-form-txt-common pd-txt3 float-left mrg-rgt10 shadow" placeholder="${plzcomp}"/>
</span>
<span>
<spring:message code="myaccount.label.town" text="Town" var="comtown"></spring:message>
<form:input path="address.companyCity" id="compCity" cssClass="pd-form-txt-common pd-txt4 float-left shadow" placeholder="${comtown}"/>
</span>
</div>
</div><!--end row -->
<div class="comm_md m_top float-left">
<div class="pd-colum1 mrg-rgt10">
<!--<select class="select-pd-name" id="delivery_method" >
<option class="select-pd-name" value="0"><spring:message code="myaccount.label.country" text="Country"></spring:message></option>
<option value="1">England</option>
<option value="2">Irland</option>
</select> -->
<spring:message code="myaccount.label.country" text="Country" var="country"></spring:message>
<form:input path="address.country" id="country" cssClass="select-pd-name" placeholder="${country}"/>
</div>
<div class="pd-colum2 ">
<!-- <select class="select-pd-name" id="delivery_method" >
<option class="select-pd-name" value="0"><spring:message code="myaccount.label.country" text="Country"></spring:message></option>
<option value="1">England</option>
<option value="2">Irland</option>
</select>-->
<spring:message code="myaccount.label.country" text="Country" var="compCountry"></spring:message>
<form:input path="address.companyCountry" id="compCountry" cssClass="select-pd-name" placeholder="${compCountry}"/>
</div>
</div><!--end row -->
<div class="comm_md m_top float-left">
<div class="pd-colum1 mrg-rgt10">
<select class="select-pd-name" id="delivery_method" >
<option class="select-pd-name" value="0"><spring:message code="myaccount.label.eticketidentification" text="E-ticket Identification"></spring:message></option>
<option value="1">England</option>
<option value="2">Irland</option>
</select>
</div>
<div class="pd-colum2 flt-rgt ">
<spring:message code="myaccount.label.vatnumber" text="VAT Number" var="vatNumber"></spring:message>
<form:input path="vatNumber" id="vatNumber" cssclass="pd-form-txt-common pd-txt2 float-left mrg-rgt10 shadow" placeholder="${vatNumber}"/>
</div>
</div><!--end row -->
<div class="comm_md m_top float-left">
<div class="pd-colum1 mrg-rgt10">
<span class="f13 blue_txt"><b>*</b><spring:message code="myaccount.label.fieldsmustbefilledout" text="Fields must be filled out"></spring:message></span>
</div>
<div class="pd-colum2 flt-rgt ">
<input type="checkbox" name="" class="mrgrgt5"><span class="f13"><spring:message code="myaccount.label.futureinformationsofspecialofferings" text="I want to have in future informations about special of ferings for t4b customers."></spring:message> </span>
</div>
</div><!--end row -->
<div class="comm_md m_top float-left">
<div class="pd-colum1 mrg-rgt10">
<select class="select-pd-name" id="delivery_method" >
<option class="select-pd-name" value="0"><spring:message code="myaccount.label.languagepreferred" text="Language ,Preferred"></spring:message></option>
<option value="1">Sizilian</option>
<option value="2">English</option>
</select>
</div>
<div class="pd-colum2 flt-rgt ">
<input type="submit" name="" id="store" class="common-btn float-right" value="<spring:message code="myaccount.label.store" text="Store"></spring:message>" />
</div>
</div><!--end row -->
</div><!--end pd-form-box -->
</div>
</div>
</form:form>
要解决此问题,我必须使用隐藏的表单字段作为用户名和密码。有没有其他解决方案,所以jsp中没有提到的表单字段没有设置为null?
成功登录后,下面是我的请求处理程序
@RequestMapping(value = "/personaldata", method = RequestMethod.GET)
public String personalData(Map<String, Object> map,
HttpServletRequest request, Principal principal) {
logger.info("Default Page");
try {
String userName = principal.getName();
logger.debug("*******User name: " + userName);
CustomerVO customerVO = customerService.findByUserName(userName);
map.put("customerForm", customerVO);
} catch (T4BException e) {
logger.error(e.getLocalizedMessage());
}
/*
* map.put("search", searchVO); if
* (request.getParameter("ajax_get_standard_content") != null &&
* request.getParameter("ajax_get_standard_content").equals("on")) {
* return "home.definition.ajax"; } else { return "home.definition"; }
*/
return "myaccount.personaldata";
}
所以,我在模型mao中添加了我的支持bean。
以下是我的数据更新请求处理程序
@RequestMapping(value = "/storepersonal", method = RequestMethod.POST)
public String storePersonal(@ModelAttribute("customerForm")CustomerVO customerVO , Map<String, Object> map,
HttpServletRequest request, HttpSession session,Principal principal) {
try {
customerService.updateCustomer(customerVO);
//map.put("customerForm", customerService.findByUserName(customerVO.getUserName()));
} catch (T4BException e) {
logger.error(e.getLocalizedMessage());
}
logger.info("Store Personal Page");
/*
* map.put("search", searchVO); if
* (request.getParameter("ajax_get_standard_content") != null &&
* request.getParameter("ajax_get_standard_content").equals("on")) {
* return "home.definition.ajax"; } else { return "home.definition"; }
*/
return "myaccount.personaldata";
}
为'customerForm'指定的@ModelAtrribute应该根据文档使用模型映射中存在的现有modelAttribute。因此,只有jsp中提到的表单字段应该设置为任何用户已经被占用,而customerForm的剩余字段应该与之前在模型映射中的字段一样。
答案 0 :(得分:1)
以下摘自the documentation:
方法参数上的@ModelAttribute指示应从模型中检索参数。如果模型中不存在,则应首先实例化参数,然后将其添加到模型中。一旦出现在模型中,参数的字段应该从所有具有匹配名称的请求参数中填充。
[...]
@RequestMapping(value="/owners/{ownerId}/pets/{petId}/edit", method = RequestMethod.POST)
public String processSubmit(@ModelAttribute Pet pet) {
}
鉴于上面的例子,Pet实例可以来自哪里?有几种选择:
- 由于使用@SessionAttributes,它可能已经在模型中 - 请参阅“使用@SessionAttributes在请求之间的HTTP会话中存储模型属性”一节。
- 由于同一个控制器中的@ModelAttribute方法,它可能已经在模型中 - 如上一节所述。
- 可以基于URI模板变量和类型转换器检索它(在下面更详细地解释)。
- 可以使用其默认构造函数进行实例化。
所以你的控制器应该有以下内容:
@ModelAttribute("foo")
private Foo prepareFoo() {
// get the foo to update from the database and return it.
// Spring will store it in the model
}
@RequestMapping(...)
public ModelAndView submitForm(@ModelAttribute("foo") Foo foo) {
// Spring will pass the Foo that has been prepared and stored in the model,
// updated with the values submitted in the HTML form
}