我感觉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,与本人交流。
...全文
1984 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
new_up 2011-04-14
  • 打赏
  • 举报
回复
我也在学习中
suzhixing 2010-03-16
  • 打赏
  • 举报
回复
我是来学习的...
「已注销」 2009-03-02
  • 打赏
  • 举报
回复
见下面连接http://blog.csdn.net/haole/archive/2008/10/28/3166816.aspx
villagehead 2009-02-23
  • 打赏
  • 举报
回复
我也遇到楼主的问题了,
顶上去
高手来呀~~~~

good luck
superfofo 2009-02-14
  • 打赏
  • 举报
回复
lz解决了上面的问题没有?
我现在也遇到这样的问题。我想如果两个form的业务逻辑不是很一样的话,iframe解决?如果form的业务是相关联,是否可以将两个实体command到一个里面去,或者系两个实体存在继承的关系,用一个form来提交!
希望有遇到的朋友也帮帮忙提提意见!
激情期待......
「已注销」 2008-09-28
  • 打赏
  • 举报
回复
这个问题真的没有碰到吗?希望有这方面经验的高手参加讨论
「已注销」 2008-09-27
  • 打赏
  • 举报
回复
希望有高手继续参加讨论
「已注销」 2008-09-26
  • 打赏
  • 举报
回复
谢谢你的解答,就是一个jsp内有多个form,分别对应不同的controller。就如同百度,
最上面一个查询的form,查询出结果后,在下面列出查询结果,此查询结果也是一个form,可以对查询结果再进一步处理。
这种需求是很平常的。我不理解spring为什么不考虑这种情况。
我理解simpleformcontroller的工作流程。
你的那种方式会导致controller爆炸,
例如有3个form:form1,form2,form3,
jsp1内是form1和form2;
jsp2内是form1和form3;
jsp3内是form2和form3;
这样会导致相同的功能存在于多处。
sunxing007 2008-09-26
  • 打赏
  • 举报
回复
我明白你的意思, 你是想一个jsp中多个form提交到多个或者有个controller. 不知道对否?
要是这样, 那肯定会出错的. 你可以去研究一下simpleformcontroller的工作流程:
当你用get方式想进入form页面的时候, 它会调用一个formbackingObject方法构造你页面需要的form, 然后结合你的页面进行绑定, 他的这个绑定是单一的, 也就是只有一个commandName, 你不妨做一个过渡form, 他包含你需要的所有的子form, 然后在controller中配置好他们, 在你的controller中再从这个大form 中得到你想要的子form.
我家里的demo太简单了, 书上到处都是, 比较复杂的放在公司, 但是这周我休假.
「已注销」 2008-09-26
  • 打赏
  • 举报
回复
非常感谢sunxing007,现在需要解决的问题不是要一个大的form,而是多个没有任何联系的form。
在simpleFormController中用到的successView 和formView中我指定的jsp,是通过
<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>
来查找的。
我不知道通过什么连接进入包含form的jsp。
对于只包含一个form的jsp来说,我只能通过actionA进入,
即使我这样定义了
<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" />
也不能通过jspA.html进入。

我是从spring 2.5.4开始学习的,以前版本的spring我没有看过,我了解的是<spring:bind path="book.id">
这样格式不建议使用,而是直接是
<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>
这种格式。
如果<spring:bind path="book.id">这种格式能够解决问题,也好
请给发我发邮件mai101@tom.com
或者qq联系也可以:645621848
多谢了!!!

sunxing007 2008-09-26
  • 打赏
  • 举报
回复
如果你要demo, 可以给我email, 我发给你.
sunxing007 2008-09-26
  • 打赏
  • 举报
回复
跟你说两点:
1: 在你的simpleFormController中用到的successView 和formView你不能通过jsp来访问, 要通过你配置的controller bean name 来访问, 比如你的actionA, actionB.
2: jsp中数据绑定不要按你那样, 那样会出错. 像我这样:

<form method="post" action="addbook.do">
<spring:bind path="book.id">
<input type="text" name="id" value="<core:out value="${book.id}"/>"/>
</spring:bind>
<spring:bind path="book.name">
<input type="text" name="name" value="<core:out value="${book.name}"/>"/>
</spring:bind>
<spring:bind path="book.author">
<input type="text" name="author" value="<core:out value="${book.author}"/>"/>
</spring:bind>
<spring:bind path="book.price">
<input type="text" name="price" value="<core:out value="${book.price}"/>"/>
</spring:bind>
<input type="submit" value="Submit" /><br>
</form>
sunxing007 2008-09-26
  • 打赏
  • 举报
回复
我们项目中用到过simpleformcontroller, 我个人觉得他功能很强大, 扩展性很强, 我们做过一个项目, 项目中包含6个大表单, 表单中有小表单, 每个小表单可以随意增加一行, 我们用simpleFormController 一下子就得到了所有form的直.
你说的问题我遇到过, 我先查一下笔记,然后给你一个demo.
「已注销」 2008-09-26
  • 打赏
  • 举报
回复
难道没有人用spring mvc吗,怎么没有人回答
haole0122 2008-09-24
  • 打赏
  • 举报
回复
一直没有人用spring mvc吗?这个需求是很正常的
「已注销」 2008-09-24
  • 打赏
  • 举报
回复
ding
「已注销」 2008-09-23
  • 打赏
  • 举报
回复
怎么没有人回答啊
「已注销」 2008-09-23
  • 打赏
  • 举报
回复
goal_ 你好,昨晚一直等你,请帮忙解答
goal_ 2008-09-22
  • 打赏
  • 举报
回复
由于下班才能回家看笔记,所以先网上查了下 ,你先参考下
http://opensource.atlassian.com/confluence/spring/display/COOK/Forms+-+Multiple+forms+on+the+same+page
「已注销」 2008-09-22
  • 打赏
  • 举报
回复
非常感谢,我一直因为这个问题头疼
加载更多回复(2)

67,538

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧