2012-09-12 61 views
0

初學者到春季mvc。 我需要預先編輯springmvc框架中的編輯表單。春季mvc烘烤形式編輯

contact_edit.jsp

<form:form method="post" action="edit/1" commandName="contact"> 
<% Contact contact = (Contact)request.getAttribute("contact"); %> 
    <table> 

     <tr> 
      <td><form:label path="firstname"> 
        <spring:message code="label.firstname" /> 
       </form:label></td> 
      <td><form:input path="firstname" value="<%=contact.getFirstname() %>"/></td> 
     </tr> 
     <tr> 
      <td><form:label path="lastname"> 
        <spring:message code="label.lastname" /> 
       </form:label></td> 
      <td><form:input path="lastname" value="<%=contact.getLastname() %>"/></td> 
     </tr> 
     <tr> 
      <td><form:label path="email"> 
        <spring:message code="label.email" /> 
       </form:label></td> 
      <td><form:input path="email" value="<%=contact.getEmail()%>" /></td> 
     </tr> 
     <tr> 
      <td><form:label path="telephone"> 
        <spring:message code="label.telephone" /> 
       </form:label></td> 
      <td><form:input path="telephone" value="<%=contact.getTelephone()%>"/></td> 
     </tr> 
     <tr> 
      <td colspan="2"><input type="submit" 
       value="<spring:message code="label.addcontact"/>" /></td> 
     </tr> 
    </table> 
</form:form> 

控制器代碼得到這個頁面:

@RequestMapping(value = "/edit/{contactId}", method = RequestMethod.GET) 
public ModelAndView edit(@PathVariable("contactId") Integer contactId, 
     HttpServletRequest request) { 
    System.out.println("I was here"); 
    Contact contact = contactService.getContact(contactId); 
    request.setAttribute("contact", contact); 
    Map<String, Object> model = new HashedMap(); 
    model.put("contact", contact); 

    return new ModelAndView("contact_edit", model); 
} 

我的例外:

org.springframework.beans.InvalidPropertyException: Invalid property 'firstname' of bean class [net.viralpatel.contact.form.Contact_$$_javassist_0]: Getter for property 'firstname' threw exception; nested exception is java.lang.reflect.InvocationTargetException 
org.springframework.beans.BeanWrapperImpl.getPropertyValue(BeanWrapperImpl.java:845) 
org.springframework.beans.BeanWrapperImpl.getPropertyValue(BeanWrapperImpl.java:721) 
org.springframework.validation.AbstractPropertyBindingResult.getActualFieldValue(AbstractPropertyBindingResult.java:99) 
org.springframework.validation.AbstractBindingResult.getFieldValue(AbstractBindingResult.java:219) 
org.springframework.web.servlet.support.BindStatus.<init>(BindStatus.java:120) 
org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getBindStatus(AbstractDataBoundFormElementTag.java:178) 
org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getPropertyPath(AbstractDataBoundFormElementTag.java:198) 
org.springframework.web.servlet.tags.form.LabelTag.autogenerateFor(LabelTag.java:129) 
org.springframework.web.servlet.tags.form.LabelTag.resolveFor(LabelTag.java:119) 
org.springframework.web.servlet.tags.form.LabelTag.writeTagContent(LabelTag.java:89) 
org.springframework.web.servlet.tags.form.AbstractFormTag.doStartTagInternal(AbstractFormTag.java:102) 
org.springframework.web.servlet.tags.RequestContextAwareTag.doStartTag(RequestContextAwareTag.java:79) 
org.apache.jsp.WEB_002dINF.jsp.contact_005fedit_jsp._jspx_meth_form_005flabel_005f0(contact_005fedit_jsp.java:320) 
org.apache.jsp.WEB_002dINF.jsp.contact_005fedit_jsp._jspService(contact_005fedit_jsp.java:147) 
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:433) 
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:389) 
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:333) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 
org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:238) 
org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:262) 
org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1180) 
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:950) 
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852) 
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882) 
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:621) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 

root cause 

    java.lang.reflect.InvocationTargetException 
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
java.lang.reflect.Method.invoke(Method.java:601) 
org.springframework.beans.BeanWrapperImpl.getPropertyValue(BeanWrapperImpl.java:761) 
org.springframework.beans.BeanWrapperImpl.getPropertyValue(BeanWrapperImpl.java:721) 
org.springframework.validation.AbstractPropertyBindingResult.getActualFieldValue(AbstractPropertyBindingResult.java:99) 
org.springframework.validation.AbstractBindingResult.getFieldValue(AbstractBindingResult.java:219) 
org.springframework.web.servlet.support.BindStatus.<init>(BindStatus.java:120) 
org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getBindStatus(AbstractDataBoundFormElementTag.java:178) 
org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getPropertyPath(AbstractDataBoundFormElementTag.java:198) 
org.springframework.web.servlet.tags.form.LabelTag.autogenerateFor(LabelTag.java:129) 
org.springframework.web.servlet.tags.form.LabelTag.resolveFor(LabelTag.java:119) 
org.springframework.web.servlet.tags.form.LabelTag.writeTagContent(LabelTag.java:89) 
org.springframework.web.servlet.tags.form.AbstractFormTag.doStartTagInternal(AbstractFormTag.java:102) 
org.springframework.web.servlet.tags.RequestContextAwareTag.doStartTag(RequestContextAwareTag.java:79) 
org.apache.jsp.WEB_002dINF.jsp.contact_005fedit_jsp._jspx_meth_form_005flabel_005f0(contact_005fedit_jsp.java:320) 
org.apache.jsp.WEB_002dINF.jsp.contact_005fedit_jsp._jspService(contact_005fedit_jsp.java:147) 
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:433) 
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:389) 
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:333) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 
org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:238) 
org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:262) 
org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1180) 
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:950) 
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852) 
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882) 
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:621) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 

我聯繫類別:

@Entity 
@Table(name="CONTACTS") 
public class Contact { 

@Id 
@Column(name="ID") 
@GeneratedValue 
private Integer id; 

@Column(name="FIRSTNAME") 
private String firstname; 

@Column(name="LASTNAME") 
private String lastname; 

@Column(name="EMAIL") 
private String email; 

@Column(name="TELEPHONE") 
private String telephone; 


public String getEmail() { 
    return email; 
} 
public String getTelephone() { 
    return telephone; 
} 
public void setEmail(String email) { 
    this.email = email; 
} 
public void setTelephone(String telephone) { 
    this.telephone = telephone; 
} 
public String getFirstname() { 
    return firstname; 
} 
public String getLastname() { 
    return lastname; 
} 
public void setFirstname(String firstname) { 
    this.firstname = firstname; 
} 
public void setLastname(String lastname) { 
    this.lastname = lastname; 
} 
public Integer getId() { 
    return id; 
} 
public void setId(Integer id) { 
    this.id = id; 
} 

} 

我的聯繫人類包含所有getters和setters方法,即使我的創建表單工作正常。無法弄清楚什麼是創建問題的地方。我已經在請求中以及在ModelAndView類中插入了聯繫人對象。 !?? !!

+0

你可以發佈你的聯繫人模型類嗎? –

+0

我已添加聯繫人類別。如果有其他需要,請告訴我。而且我重複的獲得者和制定者是完美的創造工作正常 –

回答

1

我解決了它,通過在applicationContext.xml中初始化sessionFactory而不是spring-servlet.xml。並確保從spring-servlet.xml中刪除它。

0

我認爲問題出在你的模型類上。您的模型中是否有firstname的getter/setter方法?如果是,請爲我們添加代碼調查更多

+0

獲得者已經在那裏...我編輯了我的帖子..你可以請檢查 –

0

您不需要明確調用getter。由於您使用的是彈簧窗體標籤,Spring會自動填充您的窗體。

編輯:

@RequestMapping(value = "/edit/{contactId}", method = RequestMethod.GET) 
public ModelAndView edit(@PathVariable("contactId") Integer contactId) { 
    System.out.println("I was here"); 
    Contact contact = contactService.getContact(contactId); 
    return new ModelAndView("contact_edit","contact", contact); 
} 

請儘量使用

Contact contact = new Contact(); 

替換該行

Contact contact = contactService.getContact(contactId); 

只是爲了找出其中的問題,其根源

+0

獲得者已經在那裏...我編輯了我的帖子..你能請檢查 –

0

幾件事情至 在您的代碼中正確:

1)將域對象添加到模型時,spring mvc使它們可用於您的JSP。您不需要再次在請求中設置域對象。 所以,從您的控制器中刪除以下內容。

request.setAttribute("contact", contact);

,同樣沒有必要參考在JSP請求對象。所以除去

Contact contact = (Contact)request.getAttribute("contact");

2)當設置使用彈簧的形式標籤的「命令名」屬性,彈簧使用域對象的屬性來設置/獲取值的形式的元素形式背襯域對象。

例如,在下面的代碼中,Spring將在填充/提交表單時使用getter/setter作爲聯繫人的firstname屬性。

<form:form method="post" action="edit/1" commandName="contact"> 
    <form:input path="firstname"/> 
</form> 

只要確保getter/setter是爲所有需要從域/表單烘焙對象使用的屬性實現的。

+0

獲取者已經在那裏...我編輯了我的帖子..你可以請檢查 –

+0

正如我在我的迴應中提到的,從控制器和jsps中刪除不需要的代碼(從請求中設置和讀取對象),然後重試。如果這不起作用,請發佈您的創建聯繫人控制器方法 – vorak