如何在Spring MVC中使用表单bean?

时间:2012-02-24 14:33:07

标签: forms spring-mvc

我是Spring MVC (3.1.1)的新手。来自Rails和Struts1世界。

在Struts中,我们的FormBeans会自动映射到我们的控制器。例如:

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

然后我们的控制器可以:

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

我们将bean实例化为:

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

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

请原谅我的无知,但我如何在Spring MVC中做同样的事情?

3 个答案:

答案 0 :(得分: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";
}

答案 1 :(得分:0)

来自Spring MVC - Rails。我更喜欢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
  

Controller是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

答案 2 :(得分:0)

我今天根据我继承的项目中的一些代码寻找这个答案。我发现如果你在multiActionController上创建一个控制器动作。表单值可以映射到bean,它将是处理程序操作的第三个参数。

在我的情况下,我有一个像这样的控制器

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

我的问题在于弄清楚我的表单中的值是如何映射到控制器操作的。在我的jsp表单中根本没有对SomeBean的引用。事实证明,Spring基于控制器动作参数和表单中使用的名称来实现魔力。它基本上将表单中的值映射到bean,该bean用作action方法中的第三个参数。

例如,我的SomeBean有一些名为byday和bymonth的字段。它还有相应的byday和bymonth setter和getter(即getBymonth(),setBymonth)。在我的提交操作中,映射到提交,我有按日和按月的输入值,如下所示:

<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对象。
  3. 此时似乎它只适用于字符串属性。我想如果你想在bean中使用字符串以外的属性,你必须以某种方式扩展MVC。