2012-02-24 61 views
0

我是Spring MVC (3.1.1)的新用戶。來自Rails和Struts1的世界。如何在Spring MVC中使用表單bean?

在Struts中,我們的FormBeans自動映射到我們的控制器。例如:

# JS file 
ExtJS.ajax({action:'update', value:42}); 

那麼,我們的控制器:

bean.getAction(); // 'update' 
bean.getValue(); // 42 

我們實例豆狀:

public ActionForward execute(ActionMapping mapping, ActionForm form, 
     HttpServletRequest request, HttpServletResponse response) 
     throws Exception { 

    MyBean bean = (MyBean) form; 
    .... 
} 

請原諒我的無知,但我會怎麼做同樣的事情在春天MVC?

回答

0

是從,Spring MVC中去 - 軌。我更喜歡Rails :-)。有很多啓動Spring MVC的教程。但春天有一個很好的教程,你可以遵循。但首先你必須從spring-dispatch-servlet.xml開始。在那裏你將定義視圖,控制器和表單之間的關聯。例如,在此下面的代碼片斷:

<bean name="/priceincrease.htm" class="springapp.web.PriceIncreaseFormController"> 
    <property name="sessionForm" value="true"/> 
    <property name="commandName" value="priceIncrease"/> 
    <property name="commandClass" value="springapp.service.PriceIncrease"/> 
    <property name="validator"> 
     <bean class="springapp.service.PriceIncreaseValidator"/> 
    </property> 
    <property name="formView" value="priceincrease"/> 
    <property name="successView" value="hello.htm"/> 
    <property name="productManager" ref="productManager"/> 
</bean 

控制器是PriceIncreaseFormController和priceIncrease是等效的命令對象。相應的視圖即JSP將有

<form:form method="post" commandName="priceIncrease"> <table width="95%" bgcolor="f8f8ff" border="0" cellspacing="0" cellpadding="5"> <tr> <td align="right" width="20%">Increase (%):</td> <td width="20%"> <form:input path="percentage"/> </td> <td width="60%"> <form:errors path="percentage" cssClass="error"/> </td> </tr> </table>

但我認爲你可以從這裏得到一個完整的畫面,我從 http://static.springsource.org/docs/Spring-MVC-step-by-step/part4.html#step4.5拿起代碼,並在那裏你可以得到Spring MVC的示例代碼的地方基地是https://src.springframework.org/svn/spring-samples/mvc-basic

1

在JSP中做這樣的事情:

<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%> 

<form:form name="frmFoo" id="frmFoo" action="/FormSubmitUrl" method="POST" modelAttribute="foo"> 
    <form:select path="myField"> 
    <form:errors path="myField" /> 
</form:form> 

而且只需添加支持對象的模型在控制器的方法:

@RequestMapping(value = "/MyFooForm", method = RequestMethod.GET) 
public String getFoo(final Model model) 
{ 
    model.addAttribute("foo", foo); 
    return "fooForm.jsp"; 
} 
0

我一直在尋找這個答案,根據我繼承的項目中的一些代碼。我發現,如果你在multiActionController上創建一個控制器動作。表單值可以映射到一個bean,它將成爲處理器動作的第三個參數。

在我來說,我有一個控制器這樣

public void submit(HttpServletRequest request, 
        HttpServletResponse response, SomeBean sb) { 
{ 
    //do something with sb - SomeBean 
} 

我的問題是搞清楚我的表單中的值是如何映射到控制器的動作。在我的jsp表單中沒有提到SomeBean。事實證明,Spring基於控制器動作參數和表單中使用的名稱來運行魔術。它基本上將表單中的值映射到用作操作方法中第三個參數的bean。

例如,我的SomeBean有一些名字byday和bymonth。它也有相應的byday和bymonth setter和getters(即getBymonth(),setBymonth)。在我爲我提交操作映射上提交,我有輸入值BYDAY和按月像這樣:

<select id="weekly_option" name="byday"> 
      <option value="MON">Monday</option> 
      <option value="TUE">Tuesday</option> 
      <option value="WED">Wednesday</option> 
      <option value="THU">Thursday</option> 
      <option value="FRI">Friday</option> 
      <option value="SAT">Saturday</option> 
      <option value="SUN">Sunday</option> 
      </select> 

我不得不做一些挖掘的映射是如何準確地正在做。我偷看進MultiActionController的源代碼,看看,如果執行以下操作:

  1. 控制器計算出,如果你在你的行動第三個參數(它不能是類型爲HttpSession)。
  2. 然後MultiActionController通知第三個參數(SomeBean)的一個實例。基於http請求值,它將HttpServleRequest中的所有值推送到SomeBean對象。

在這一點上,它似乎只適用於屬性是字符串。我想如果你想在你的bean中使用除字符串之外的其他屬性,你將不得不以某種方式擴展MVC。

+0

我剛剛測試了這個概念,它與綁定到一個整數。這意味着它將綁定到你在bean中聲明的任何其他基本類型。 – FernandoZ 2013-07-03 21:11:06