200分,讨论一下struts的BUG

xue_sharp 2003-11-19 09:05:49
是关于upload的问题。
struts带了一个struts-upload的例子,用与上传文件,我只改动了一下struts-config.xml,如下部分
--------------------------
<action-mappings>
<!-- Upload Action -->
<action path="/upload"
type="org.apache.struts.webapp.upload.UploadAction"
name="uploadForm">
<forward name="display" path="/upload2.do" />
</action>
<action path="/upload2"
type="org.apache.struts.webapp.upload.UploadAction"
name="uploadForm">
<forward name="display" path="/display.jsp" />
</action>
</action-mappings>
然后运行,上传文件,出现异常。
javax.servlet.ServletException: MultipartIterator: no multipart request data
> >> sent
> >> java.lang.Throwable(java.lang.String)
> >> java.lang.Exception(java.lang.String)
> >> javax.servlet.ServletException(java.lang.String)
> >> void org.apache.struts.upload.MultipartIterator.parseRequest()
> >>
> >> org.apache.struts.upload.MultipartIterator(javax.servlet.http.HttpServletRequest
> >> , int, long, java.lang.String)
> >> void
> >> org.apache.struts.upload.DiskMultipartRequestHandler.handleRequest(javax.servlet
> >> .http.HttpServletRequest)
疑惑中,能解释的马上给200分。
...全文
37 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
cbhyk 2003-11-21
  • 打赏
  • 举报
回复
/upload的定义中的name属性就是request属性中Form的key:
<action path="/upload"
type="org.apache.struts.webapp.upload.UploadAction"
name="uploadForm">
<forward name="display" path="/upload2.do" />
</action>
在这个定义中,"uploadForm"即是Form的key。

参考:
ActionServlet的processActionForm方法。
xue_sharp 2003-11-21
  • 打赏
  • 举报
回复
to:powerman_lyj(刘瑜江)

不知道你用不用struts-config.xml
xue_sharp 2003-11-21
  • 打赏
  • 举报
回复
to:cbhyk() 精彩,鼓掌,很感谢。
我感觉是在action2的form初始化的时候struts对multipart/form-data考虑的不周全,用MultipartIterator读request来初始化form的数据,request的数据在别的content-type可以一直保存,但stream类型的数据就只能用一次,所以导致forward到第二个action时候,如果定义了form就会读取错误。应该是如果是multipart/form-data类型,在读出以后放在request的属性中,forward以后从request的属性中初始化form,而不是再次从request中取得。

至于struts是以什么样的方式传递的数据,struts并没有具体说明,我也是遍历了request的属性才发现的,而且key值也没有写明命名方式,是struts的内部实现。感觉这么用是饶开了struts,并不很好,你有什么自然的方式吗?

to:zxl19790710(雪龙),我的文件并不在服务器保存是直接解析然后向后传递的。
yujinping 2003-11-20
  • 打赏
  • 举报
回复
是啊!没有必要放两个action在这里啊!
zxl19790710 2003-11-20
  • 打赏
  • 举报
回复
我想不通你为什么要传输两便,在第二个action的时候没有得到需要传输的数据,
Lihaitao312 2003-11-20
  • 打赏
  • 举报
回复
不知道,希望了解解决之后,发邮件给我xiaoxigua_312@163.net。谢谢!
tylike 2003-11-20
  • 打赏
  • 举报
回复
up
BillyW 2003-11-20
  • 打赏
  • 举报
回复
> This is an old post that follows. I have found the same problem with Struts
> 1.01. Is this behaviour a bug or is it how Struts is meant to work?
> Also can someone please tell me what setting
> the value of redirect="true" does besides clearing the request attributes.
xue_sharp 2003-11-20
  • 打赏
  • 举报
回复
wuyg(wuyuguang) :我就是用的struts带的例子改的,这点肯定没问题。

真的没人知道吗?我看了一下src,感觉好象不太对
zxl19790710 2003-11-20
  • 打赏
  • 举报
回复
楼上的厉害,
楼主根据你所说第二个action应当是解析,为什么还要upload,而不是通过已存在的文件直接解析呢
cbhyk 2003-11-20
  • 打赏
  • 举报
回复
1.从"/upload" forward到 "/upload2",request是同一个实例

2.如果Action定义了Form,ActionServlet先用request的数据创建Form实例并放到request的attributes中,再调用Action的perform方法

3.如果request包含上传数据((request.getContentType.startsWith("multipart/form-data"))&&(request.getMethod().equalsIgnoreCase("POST")),ActionServlet在创建Form实例时用MultipartIterator处理request.getInputStream()中的上传数据

因此:
如果/upload和/upload2都定义了Form,request.getInputStream()中的上传数据在ActionServlet处理Action "/upload"时就读完了,在处理Action "/upload2"时又尝试从request.getInputStream()中取上传数据,当然会取不到了。
如果/upload定义Form,而/upload2不定义Form,由于处理/upload时,Form实例已经放到request的attributes中了,所以在/upload2中可以通过request.getAttribute(formName)取到Form实例。

表达能力有限,请参考struts中以下class的源代码:
class org.apache.struts.action.ActionServlet
process(HttpServletRequest request, HttpServletResponse response)
processPopulate(ActionForm formInstance, ActionMapping mapping, HttpServletRequest request)

class org.apache.struts.util.RequestUtils
populate(Object bean, String prefix, String suffix, HttpServletRequest request)

class orgapache.struts.upload.MultipartIterator
powerman_lyj 2003-11-20
  • 打赏
  • 举报
回复
我不直接用struts,我抽取其中我要的功能形成自己的类就没有这些问题
软猫克鲁 2003-11-20
  • 打赏
  • 举报
回复
8知道,帮你UP吧
^——^
sadenxu 2003-11-20
  • 打赏
  • 举报
回复
mark
indeed 2003-11-20
  • 打赏
  • 举报
回复
关注,学习中
lynx1111 2003-11-20
  • 打赏
  • 举报
回复
学习!~
Lihaitao312 2003-11-20
  • 打赏
  • 举报
回复
多谢多谢
xue_sharp 2003-11-20
  • 打赏
  • 举报
回复
up
xue_sharp 2003-11-20
  • 打赏
  • 举报
回复
谁有更好的 解决方式吗?200分等你拿
xue_sharp 2003-11-20
  • 打赏
  • 举报
回复
to:BillyW(阿弥陀佛)
我也在apache的maillist里看过这个topic,看来还不是我一个人遇到,而且在1.1里也没有解决。

to:zxl19790710(雪龙),yujinping(JavaFan) ,不只是传两个action,我传4个呢。三个xml文件上传上来,解析,审核,再调用后台ejb,你们认为放到1个action里做???????
to:Lihaitao312(李海涛)
没有解决,但我用别的方法饶开了这个问题,改动如下
<action-mappings>
<!-- Upload Action -->
<action path="/upload"
type="org.apache.struts.webapp.upload.UploadAction"
name="uploadForm">
<forward name="display" path="/upload2.do" />
</action>
<action path="/upload2"
type="org.apache.struts.webapp.upload.UploadAction">
<forward name="display" path="/display.jsp" />
</action>
</action-mappings>
然后你在第二个action里会发现request中有个叫uploadForm的属性,里边就是我们想要的东西。注意所有后续action都不能声明form,否则异常。
这种方法虽然能解决问题,但总感觉不是struts的风格,不那么自然。
加载更多回复(2)
Wicket前生后世篇
Wicket是什么?简单点说,它就是一个基于Java的Web开发框架,与Struts,WebWork,Tapestry相类似。其特点在于对Html和代码进行了有效的离(有利于程序员和美工的合作),基于规则的配置(减少了XML等配置文件的使用),学习曲线较低(开发方式与C/S相似),更加易于调试(错误类型比较少容易,而且容易定位)。如果你不对微软并不反感,可以把它看作Java平台上的ASP.NET。
Wicket现在是Sourceforge上一个非常活跃的项目,开发源码基于Apache协议(也是最宽松,对商业最友好的的源码协议),项目位于http://wicket.sourceforge.net,另外它还有一个独立的域名网站http://www.wicketframework.org/。最新的消息则是,Wicket已经成为Apache孵化器中一个项目,可以通过http://incubator.apache.org/projects/wicket.html来访问。但SourceForge上的网站仍然可以访问。
Wicket出现时,著名的J2EE网站TSS(即http://www.TheServerSide.com,以后简称TSS),对该项目也进行了讨论,有一段旷日持久的论战(地址:http://www.theserverside.com/news/thread.tss?thread_id=28162:),论战主力当然就是Wicket的主要作者Jonathan Locke和Tapestry的作者Howard Lewis Ship ,争论的内容十广泛,从URL的格式到系统结构,从扩展性到界面开发,如果有时间的话,我尽量将其中部内容翻译过来,还是很精彩的。(TSS上很多的讨论都非常精彩,如果英文好的话,建议经常上去看看,国外的牛人就是多啊。有时候我也觉得很奇怪,这些人都不用睡觉的吗,看他们的帖子,完全覆盖了24小时,感觉他们的老板真是宽容啊)。
Wicket的作者中有几个是原Sun公司Swing小组的开发人员(现在可能大部已经不是了),因此Wicket的框架中带有浓厚的C/S色彩。而他们的开发计划中,还包括了Swing,Flash平台的支持,也就是说使用Wicket不仅可以可以输出Html,而且可以支持Swing和Flash,不过和朋友经过讨论后,觉得这个计划看起来有一点不切实际,毕竟Html,Swing,Flash之间的差别还是很大,恐怕想要无缝移植,还是有点难度的。单是一个JavaScript,恐怕就够头痛了。
Wicket带有强烈C/S结构的UI色彩,这一点有助于美工和程序人员的工,与Delphi的开发方式非常类似(Delphi使用.frm文件保存UI控件的定义,而用.pas文件存储代码,从而对控件进行操作)。Wicket则是使用Html描述UI,并将具有特殊标记的Html元素定义为UI控件,在java文件中则直接使用代码操作这些UI控件,控制其输出及行为,样式等。这一点和Tapestry,以及.NET平台上的ASP.NET极为相似,也怪不得与Tapestry的作者争论了这么久,毕竟两者的用户群有很多的重复。其实从结构上看来,无论是Tapestry,ASP.Net,Wicket估计都借鉴了Applet平台上的WebObjects,还有Delphi。(不要忘了,Delphi的创建者Anders Hejlsberg就是.net框架的架构师,所以C#和Asp.net怎么看都带着Delphi的影子。
Wicket目前最新的版本是1.2.2版,已经支持了AJAX,但感觉这个框架的发展时间毕竟还是短了一点,尽管设计思想很不错,但还是有许多问题存在的,包括控件的数量,BUG较多等,希望2006年它可以尽快的成熟起来。
关于重新发明轮子的争论
谈到Wicket,恐怕第一个感觉就是在Java的Web开发中又多了一个轮子,这一点国内外的程序员好象都是一样。
有一个国外的Blog专门写了一篇关于轮子的文章,说明了重复发明轮子的必要性。我个人对于这种轮子是持一种欢迎的态度,因为没有人会去写一段功能完全一样的东东,总是要修正了原有轮子的不足,这样就不能简单当作一种重复。
即使是功能重复,就不需要轮子了吗?JSP能完成Struts到所有功能,而Tapestry能做到的,Struts也全部可以做到,但Struts,Tapestry就不需要了吗?Struts的MVC结构比JSP更加优秀,在很大程度上减轻了开发人员开发量,而Tapestry基于组件的开发方式,则是开创了一种新的Web开发方式,对于多语言的支持也有了新的方式。以往开发多语言页面时,往往使用properties保存字符串资源,但是页面通常都没有什么变化。而Tapestry可以通过不同的Html为不同的国家指定不同的页面。
Wicket吸收了Tapestry的一部内容,但我最喜欢的就是,它是基于规则的,而并非XML配置的方式,这不仅有利于程序员学习,对系统的维护及开发规范都很有效,毕竟XML的编写并不见得就比写一段程序来得更容易。(这里插一句题外话,我觉得XML文件用来表示数据和资源,而不是行为,更不是业务,所以对于XML我只用来存放多语言资源或者用来做数据交换。象Spring这种大量使用XML方式,我并不欣赏,Spring也意识到了这一点,在2.0版本中努力的简化Xml的配置,但是并不尽如人意)。如果使用简单的规则来配置或者管理一个系统,用户就会很容易的查找到自己需要的内容。而通过配置文件,不管这样的一个配置文件的结构如何好,也需要在其中查找自己需要的内容,开发效率肯定要低一些。
因此对于这种有创新性的轮子,多几个,或许Java世界可以跑得更快一些。
去年就听说不少Web框架的开发人员要联合起来开一个Web框架,在Yahoo上还有一个讨论组,上去看了一下。但是这个事件对我的第一感觉就是晕,第二感觉就是特别的晕,虽然目前Java世界的Web框架一通混战,但这样一个联盟,所给出的东西很可能是第二个EJB。
Wicket 是什么?简单点说,它就是一个基于Java 的Web 开发框架,与Struts,WebWork,Tapestry 相类似。其特点在于对Html 和代码进行了有效的离(有利于程序员和美工的合作),基于规则的配置(减少了XML 等配置文件的使用),学习曲线较低(开发方式与C/S 相似),更加易于调试(错误类型比较少容易,而且容易定位)。如果 你不对微软并不反感,可以把它看作Java 平台上的ASP.NET。 Wicket 现在是Sourceforge 上一个非常活跃的项目,开发源码基于Apache 协议(也是最宽松,对商业最友好的的源码协议),项目位于http://wicket.sourceforge.net,另外它还有一个独立的域名网站http://www.wicketframework.org/。最新的消息则是,Wicket 已经成为Apache 孵化器中一个项目,可以通过http://incubator.apache.org/projects/wicket.html 来访问。但SourceForge 上的网站仍然可以访问。Wicket 出现时,著名的J2EE 网站TSS(即http://www.TheServerSide.com,以后简称TSS),对该项目也进行了讨论,有一段旷日持久的论战(地址:http://www.theserverside.com/news/thread.tss?thread_id=28162:),论战主力当然就是Wicket 的主要作者Jonathan Locke 和Tapestry 的作者Howard Lewis Ship ,争论的内容十广泛,从URL 的格式到系统结构,从扩展性到界面开发,如果有时间的话,我尽量将其中部内容翻译过来,还是很精彩的。(TSS 上很多的讨论都非常精彩,如果英文好的话,建议经常上去看看,国外的牛人就是多啊。有时候我也觉得很奇怪,这些人都不用睡觉的吗,看他们的帖子,完全覆盖了24 小时,感觉他们的老板真是宽容啊)。Wicket 的作者中有几个是原Sun 公司Swing 小组的开发人员(现在可能大部已经不 是了),因此Wicket 的框架中带有浓厚的C/S 色彩。而他们的开发计划中,还包括了Swing,Flash 平台的支持,也就是说使用Wicket 不仅可以可以输出Html,而且可以支持Swing 和Flash,不过和朋友经过讨论后,觉得这个计划看起来有一点不切实际,毕竟 Html,Swing,Flash 之间的差别还是很大,恐怕想要无缝移植,还是有点难度的。单是一个JavaScript,恐怕就够头痛了。 Wicket 带有强烈C/S 结构的UI 色彩,这一点有助于美工和程序人员的工,与Delphi 的开的方式非常类似(Delphi 使用Frm 文件保存UI 控件的定义,而用.pas 文件存储代码,从而对控件进行操作)。Wicket 则是使用Html 描述UI,并将具有特殊标记的Html 元素定义为UI 控件,在java 文件中则直接使用代码操作这些UI 控件,控制其输出面向构件成长社区http://gocom.primeton.com 独家首发 Wicket 开发指南SCA/SDO/SOA/Eclipse/BPEL/EOS 技术交流 @gocom.primeton.comgoCom 就是一起享一起成长及行为,样式等。这一点和Tapestry,以及.NET 平台上的ASP.NET 极为相似,也怪不得与Tapestry 的作者争论了这么久,毕竟两者的用户群有很多的重复。其实从结构上看来,无论是Tapestry,ASP.Net,Wicket 估计都借鉴了Applet 平台上的WebObjects,还有Delphi。(不要忘了,Delphi 的创建者Anders Hejlsberg 就是.net 框架的架构师,所以C#和Asp.net 怎么看都带着Delphi 的影子。Wicket 目前最新的版本是1.2.2 版,已经支持了AJAX,但感觉这个框架的发展时间毕 竟还是短了一点,尽管设计思想很不错,但还是有许多问题存在的,包括控件的数量,BUG 较多等,希望2006 年它可以尽快的成熟起来。

67,512

社区成员

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

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