我感觉spring mvc中form的控制器SimpleFormController是很失败的设计
haole 2008-09-22 11:11:06 最近研究了spring mvc,感觉表单控制器SimpleFormController是一个很失败的设计。
SimpleFormController已经将表单处理流程编制到控制器中,也就是访问包含表单的jsp,是通过表单的action来访问,它能够请求方式是get还是post,自动来区分是初始化表单还是提交表单。
可是,在实际项目中,一个jsp往往包含多个form(这样可以减少页面的跳转,方便用户操作)。
问题的提出是这样的一个流程:
在mvc的xml中有如下配置:
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/index.html">formwardController</prop>
<prop key="/main.html">formwardController</prop>
<prop key="/jspA.html">formwardController</prop>
<prop key="/actionA.html">actionA</prop>
<prop key="/actionB.html">actionB</prop>
</props>
</property>
</bean>
<bean id="formwardController" class="org.springframework.web.servlet.mvc.UrlFilenameViewController" />
<bean name="actionA" class="web.actionA">
<property name="commandClass" value="form.ActionAForm"></property>
<property name="formView" value="jspA"></property>
<property name="successView" value="main"></property>
</bean>
<bean name="actionB" class="web.actionB">
<property name="commandClass" value="form.ActionBForm"></property>
<property name="formView" value="jspA"></property>
<property name="successView" value="main"></property>
</bean>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix">
<value>/WEB-INF/jsp/</value>
</property>
<property name="suffix">
<value>.jsp</value>
</property>
jsp文件都在WEB-INF/jsp下
访问流程是index.html——>main.html,在main.html(main.jsp)中有连接到jspA.html(jspA.jsp)。
jspA.jsp内容如下:
<form:form> <!--对应aciont是actionA -->
属性1:<form:input path="field1" /> <br />
属性2:<form:input path="fidld2" /> <br />
若干字段
...
...
<br />
<input type="submit" value="提交" />
<input type="reset" value="重置" />
</form:form>
<br />
<form:form> <!--对应aciont是actionB -->
属性1:<form:input path="field1" /> <br />
属性2:<form:input path="fidld2" /> <br />
若干字段
...
...
<br />
<input type="submit" value="提交" />
<input type="reset" value="重置" />
</form:form>
现在的问题是在main.jsp中如果通过jspA.html访问jspA.jsp,则会出现下列错误
Neither BindingResult nor plain target object for bean name 'command' available as request attribute
也就不能通过jspA.html来访问jspA.jsp。
如果jspA.jsp中只有一个form,例如只有第一个form(actionA),而没有第二个form(actionB)。在main.jsp
中可以通过<a href="<c:url value="actionA.html"/>">表单1</a>来访问。
可能我多spring mvc理解不深,没有找到正确的方法。但是如果真是上面描述的情况,则我认为spring mvc关于表单的流程真是一个很失败的设计。
因为在实际项目中一个jsp页面包含多个不同form(form之间没有一个联系,当然除了业务方面上的,例如班级和学生,他们之间只是有业务方面的联系,但是在技术上,纯粹是两个一点联系也没有的form)。
可能有人有一个大form来实现,我认为这是很不好的实现,这样会导致一个form会有几百个字段,也不利于模块化。
前端时间有人说使用spring 2.5,使用注解来实现,我看了一下,我认为同样不能解决这个问题。
希望精通spring mvc的各位人士多指导,本人不胜感激,
也可以通过qq联系,本人qq是645621848,
或者发邮件main101@tom.com,与本人交流。