less than 1 minute read

继续 Spring MVC example anatomy 中springapp的例子。

PriceIncreaseController extends SimpleFormControllerSimpleFormController 有2个视图:formView 用来显示 form,successView 则是 form 提交后转到的页面。

当我们从 hello.htm (实际是 hello.jsp) 上点击 priceincrease.htm 的超链接时,实际是发送了一个 GET 方法的请求,然后处理流程如下:

如果 priceincrease.jsp 页面上需要显示一些数据,可以通过 formBackingObject() 方法来初始化 Command Object,这个接下来再讲。

一般使用 DI 来设置 SimpleFormControllerformViewsuccessView

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

这里还有个有意思的事情:即使不配置 formView,根据 惯例优先原则DispatchServlet 还是能找到 “priceincrease” 这个 viewName,然后去交给 InternalResourceViewResolver 解析 (如果配置了,应该是 SimpleFormController 执行 showForm 操作,返回一个 new ModelAndView (formView)DispatchServlet)

我们注意到这里有 commandClasscommandName,这个还是相当于 jsp 页面的 Attribute。整个的提交的处理流程如下:

这里需要注意的有以下几点:

  • Command Object 不需要名字。commandName 并不是 Command Object 的名字,所以在 formBackingObject() 方法里面创建 Command Object 不需要特别注意名字。formBackingObject() 是一个覆写方法,父类中的方法应该也只是简单地 new 一个 Command Object
  • Command Object 的属性、JSP 中 <form> 标签中的 path、和 Validator 中的 reject 方法的参数存在对应关系,如下图所示 (文字描述太复杂了,画图算了):

  • <form:input path="percentage"> 表示把这个文本框的输入内容写入 Command Object (已通过 commandName=“priceIncrease” 指定);而 <form:error path="percentage"> 会被展开为成一个 <span> 来显示错误信息 (if any),详见 The errors tag

Categories:

Updated:

Comments