- 浏览: 88811 次
- 性别:
- 来自: 杭州
-
文章分类
最新评论
-
yekui:
假设integer 地址值为0001h ---->对应值 ...
JAVA 值传递还是引用传递 -
yekui:
lyy3323 写道yekui 写道弱弱的请教一下 Integ ...
JAVA 值传递还是引用传递 -
lyy3323:
yekui 写道弱弱的请教一下 Integer 是引用数据类型 ...
JAVA 值传递还是引用传递 -
yekui:
弱弱的请教一下 Integer 是引用数据类型 Intege ...
JAVA 值传递还是引用传递 -
lizhongyi199:
源码不全啊,能不能上传完整看看。
抄袭ibatis缓存设计。自实现缓存设计
悲剧的一个BUG····STRUTS2 上传 问题。
-------------------------
搞了大半天,总是奇怪问题的现象,最后附录自己的思考过程。
---------------------------------------
现象:
由于当用户在上传文件的时候,由于文件在上传过程中流还没传送完毕结果客户端就断开了链接(可能耗时比较久,造成浏览器假死的状态,然后用户强制关闭了浏览器的进程),导致上传组件抛出异常,而且这个异常在关闭上传页面之后再打开的时候还是存在,引起上传的功能点崩溃。
----------------------分析-------------------
原因分析:
原先使用 struts2 自带的common-fileupload 组件上传文件。
当文件上传出错时(包括强行关闭浏览器导致的流关闭错误),会产生actionerror对象 。
在进入Action之前 会 经过 validate 方法,
validate 方法 检测到 actionerror 后,会直接转向input页面,导致错误信息一直出现,从而导致上传组件不可用。只能通过服务器重启来解决。
(PS:spring 配置的action是单列)
---------STRUTS2源码--------
源码大家自己去看吧。
大概流程就是
FilterDispatcher--->Dispatcher--->MultiPartRequestWrapper
然后交由Apache的commons-fileupload组件来解析了。
在MultiPartRequestWrapper的构造方法中,会调用MultiPartRequest(默认为JakartaMultiPartRequest类)的parse方法来解析请求。
--------------------------------------------------------------
解决方案如下:
1. 覆盖组件中的JakartaMultiPartRequest方法,丢弃error对象。
(据说还诡异的出现问题。)
2. 修改action类,重写validate ()方法,清除ErrorsAndMessages 。
3. 更换组件。采用smartupload组件(但是这个组件对大文件上传存在着内存溢出的问题,只支持到100M 左右)
所以妥妥的 方案2.。。。。。。。。。。。
---------------方案一-----------------
方案1的方法:别忘记了配置struts.xml的bean ,和struts.properties.
--------------思考过程---------------
1. 为什么关闭浏览器后,问题依旧存在。。
自然会想到单列~~~~~~~~~~~~
2. 为什么后续问题不进ACTION
自然会想到拦截·····是什么拦截呢?(结合源码分析中的error对象,
这个对象校验使用到,那么 自然而然 变成是 校验拦截)
3.结合起来,问题就不奇怪了·········
,要发现问题现象和JAVA领域知识相结合。
你好好学习一下如何让struts2和spring集成在一块。我看这帖子很久了就是没发言。忍不住了我,发现你就是死不承认自己对struts2还没了解透彻。很多人都已经告诉你原委了。甚至有人一针见血的指出了struts和struts2有本质不同。
1年前的文章了,现在回过头来,多谢大家批评~s2不配置成多列是无法想象的,愿各位不要被我误导~
因为这种大标题的帖子会给不明真相群众很大误解,本来是楼主一知半解,当结论发表了。
你好好学习一下如何让struts2和spring集成在一块。我看这帖子很久了就是没发言。忍不住了我,发现你就是死不承认自己对struts2还没了解透彻。很多人都已经告诉你原委了。甚至有人一针见血的指出了struts和struts2有本质不同。
spring 里的action 配置 相信大家基本都是配的单列。
项目配置的问题。
我也不明白为什么把action配置成singleton有什么好处。
struts1.x中的action通常情况下,我们只会定义成员函数,不会定义成员变量,是一个无状态的类对象,也就是只有成员函数,没有成员变量,不会引起并发和线程访问问题,设置为单例,可以节省内存空间,提高执行效率,而struct2,action定义为一个普通的javaben,具有状态,如果定义成单例会引起并发和线程访问问题。当然你也可以按照struct1.x的方式来用struct2
的确struts1.x 的action是默认的单列模式,参数是由request来传递,
所以在使用成语变量的时候要额外注意。
struts2.x 作为一个状态BEAN 单列确实会引发同步问题。
可惜啊 ,现在的项目大家都使用spring , 都没配置bean的状态,默认是单例~~~~
struts2的spring插件负责将struts2的Action动态的加入到Spring的beanfactory里,你可以去看一下代码被动态加入到beanfactory里的action的scope默认是prototype
不需要singleton就是优秀?这样做的代价也是很大的,有的时候就变成泛滥的使用成员变量,成了悲剧。
强烈赞同....
-------------------------
搞了大半天,总是奇怪问题的现象,最后附录自己的思考过程。
---------------------------------------
现象:
由于当用户在上传文件的时候,由于文件在上传过程中流还没传送完毕结果客户端就断开了链接(可能耗时比较久,造成浏览器假死的状态,然后用户强制关闭了浏览器的进程),导致上传组件抛出异常,而且这个异常在关闭上传页面之后再打开的时候还是存在,引起上传的功能点崩溃。
----------------------分析-------------------
原因分析:
原先使用 struts2 自带的common-fileupload 组件上传文件。
当文件上传出错时(包括强行关闭浏览器导致的流关闭错误),会产生actionerror对象 。
在进入Action之前 会 经过 validate 方法,
validate 方法 检测到 actionerror 后,会直接转向input页面,导致错误信息一直出现,从而导致上传组件不可用。只能通过服务器重启来解决。
(PS:spring 配置的action是单列)
---------STRUTS2源码--------
源码大家自己去看吧。
大概流程就是
FilterDispatcher--->Dispatcher--->MultiPartRequestWrapper
然后交由Apache的commons-fileupload组件来解析了。
在MultiPartRequestWrapper的构造方法中,会调用MultiPartRequest(默认为JakartaMultiPartRequest类)的parse方法来解析请求。
--------------------------------------------------------------
解决方案如下:
1. 覆盖组件中的JakartaMultiPartRequest方法,丢弃error对象。
(据说还诡异的出现问题。)
2. 修改action类,重写validate ()方法,清除ErrorsAndMessages 。
3. 更换组件。采用smartupload组件(但是这个组件对大文件上传存在着内存溢出的问题,只支持到100M 左右)
所以妥妥的 方案2.。。。。。。。。。。。
---------------方案一-----------------
public void parse(HttpServletRequest servletRequest, String saveDir) throws IOException { DiskFileItemFactory fac = new DiskFileItemFactory(); // Make sure that the data is written to file fac.setSizeThreshold(0); if (saveDir != null) { fac.setRepository(new File(saveDir)); } // Parse the request try { ServletFileUpload upload = new ServletFileUpload(fac); upload.setSizeMax(maxSize); List items = upload.parseRequest(createRequestContext(servletRequest)); for (Object item1 : items) { FileItem item = (FileItem) item1; if (log.isDebugEnabled()) log.debug("Found item " + item.getFieldName()); if (item.isFormField()) { log.debug("Item is a normal form field"); List<String> values; if (params.get(item.getFieldName()) != null) { values = params.get(item.getFieldName()); } else { values = new ArrayList<String>(); } // note: see http://jira.opensymphony.com/browse/WW-633 // basically, in some cases the charset may be null, so // we're just going to try to "other" method (no idea if this // will work) String charset = servletRequest.getCharacterEncoding(); if (charset != null) { values.add(item.getString(charset)); } else { values.add(item.getString()); } params.put(item.getFieldName(), values); } else { log.debug("Item is a file upload"); // Skip file uploads that don't have a file name - meaning that no file was selected. if (item.getName() == null || item.getName().trim().length() < 1) { log.debug("No file has been uploaded for the field: " + item.getFieldName()); continue; } List<FileItem> values; if (files.get(item.getFieldName()) != null) { values = files.get(item.getFieldName()); } else { values = new ArrayList<FileItem>(); } values.add(item); files.put(item.getFieldName(), values); } } } catch (FileUploadException e) { log.error(e); e.printStackTrace(); //注意此处的修改~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //errors.add(e.getMessage()); } }
方案1的方法:别忘记了配置struts.xml的bean ,和struts.properties.
--------------思考过程---------------
1. 为什么关闭浏览器后,问题依旧存在。。
自然会想到单列~~~~~~~~~~~~
2. 为什么后续问题不进ACTION
自然会想到拦截·····是什么拦截呢?(结合源码分析中的error对象,
这个对象校验使用到,那么 自然而然 变成是 校验拦截)
3.结合起来,问题就不奇怪了·········
,要发现问题现象和JAVA领域知识相结合。
评论
59 楼
lyy3323
2012-07-16
黑暗浪子 写道
lyy3323 写道
呵呵~~~~~
统计一下 大家公司项目的里action在SPRING 中的配置情况好吗?
呵呵,和struts2有什么关系?
是SPRING的错误配置造成的OK?
统计一下 大家公司项目的里action在SPRING 中的配置情况好吗?
呵呵,和struts2有什么关系?
是SPRING的错误配置造成的OK?
你好好学习一下如何让struts2和spring集成在一块。我看这帖子很久了就是没发言。忍不住了我,发现你就是死不承认自己对struts2还没了解透彻。很多人都已经告诉你原委了。甚至有人一针见血的指出了struts和struts2有本质不同。
1年前的文章了,现在回过头来,多谢大家批评~s2不配置成多列是无法想象的,愿各位不要被我误导~
58 楼
Josun
2011-04-08
学习了。。。
57 楼
无根V稻草
2011-04-08
学习了 我配的时候都没用过单例
56 楼
Speak-shuai
2011-04-08
学习了 自己的水平又有了提高
55 楼
ilrxx
2011-02-11
单例的本意是为了减少过多创建对象而造成的内存开销大,也要看场合。
54 楼
beyondqinghua
2011-02-10
LZ真杯具!
53 楼
yanbingwei
2011-02-04
struts2的Action使用命令模式 , 每次请求都会生成一个新的action来处理用户的请求 ,因此action不要配置成单例的,否则会出现许多意想不到的错误
52 楼
yjl6691088
2011-02-03
lz struts1 与struts2 最基本区别是神马?
1 貌似是单例
2 发一次请求new一个action
1 貌似是单例
2 发一次请求new一个action
51 楼
coolbamboo2008
2011-02-02
还是很佩服楼主的钻研精神的
50 楼
little_shieh
2011-02-02
悲剧都是自己弄出来的,
struts1和struts2的最大区别就是action是否单例,你把struts2搞成个单例不出问题才怪呢。
struts1和struts2的最大区别就是action是否单例,你把struts2搞成个单例不出问题才怪呢。
49 楼
tiyi
2011-02-02
s2用单例?牛逼!
48 楼
dwangel
2011-02-02
xrqsjj 写道
这样的帖子蛮好的,大家讨论的这么激烈,干嘛要隐藏呢,难道大家都是神马
因为这种大标题的帖子会给不明真相群众很大误解,本来是楼主一知半解,当结论发表了。
47 楼
buyajun
2011-02-01
现在内存那么便宜,CPU的速度也快,还在为区区几个性能指标纠结么?
46 楼
黑暗浪子
2011-01-31
lyy3323 写道
呵呵~~~~~
统计一下 大家公司项目的里action在SPRING 中的配置情况好吗?
呵呵,和struts2有什么关系?
是SPRING的错误配置造成的OK?
统计一下 大家公司项目的里action在SPRING 中的配置情况好吗?
呵呵,和struts2有什么关系?
是SPRING的错误配置造成的OK?
你好好学习一下如何让struts2和spring集成在一块。我看这帖子很久了就是没发言。忍不住了我,发现你就是死不承认自己对struts2还没了解透彻。很多人都已经告诉你原委了。甚至有人一针见血的指出了struts和struts2有本质不同。
45 楼
黑暗浪子
2011-01-31
SeanHe 写道
lyy3323 写道
lanxia39 写道
lyy3323 写道
Agrael 写道
是你自己弄的悲剧,struts2的action需要是prototype的。你配置成singleton的当然会保留之前的状态。验证的时候有那个Error的状态自然会错。
spring 里的action 配置 相信大家基本都是配的单列。
项目配置的问题。
我也不明白为什么把action配置成singleton有什么好处。
struts1.x中的action通常情况下,我们只会定义成员函数,不会定义成员变量,是一个无状态的类对象,也就是只有成员函数,没有成员变量,不会引起并发和线程访问问题,设置为单例,可以节省内存空间,提高执行效率,而struct2,action定义为一个普通的javaben,具有状态,如果定义成单例会引起并发和线程访问问题。当然你也可以按照struct1.x的方式来用struct2
的确struts1.x 的action是默认的单列模式,参数是由request来传递,
所以在使用成语变量的时候要额外注意。
struts2.x 作为一个状态BEAN 单列确实会引发同步问题。
可惜啊 ,现在的项目大家都使用spring , 都没配置bean的状态,默认是单例~~~~
struts2的spring插件负责将struts2的Action动态的加入到Spring的beanfactory里,你可以去看一下代码被动态加入到beanfactory里的action的scope默认是prototype

44 楼
yxhzj
2011-01-30
beer2008cn 写道
struts2 比struts1优秀的其中一点就是,它不需要singleton
不需要singleton就是优秀?这样做的代价也是很大的,有的时候就变成泛滥的使用成员变量,成了悲剧。
43 楼
beer2008cn
2011-01-30
struts2 比struts1优秀的其中一点就是,它不需要singleton
42 楼
yin_bp
2011-01-29
有空看看bbossgroups3.0中的mvc框架和aop框架以及持久层框架,一整套体系,不过mvc框架还在孵化中。。。。绝对不比struts 2和spring mvc逊色哦
mvc中也自带了个上传的功能,有空写篇文章给大家指教,呵呵
最近发布了个bbossgroups专题论坛,没空写文章。。。。。。
http://www.xtzy.com:800/forums/list.page
mvc中也自带了个上传的功能,有空写篇文章给大家指教,呵呵
最近发布了个bbossgroups专题论坛,没空写文章。。。。。。
http://www.xtzy.com:800/forums/list.page
41 楼
jxdwinter
2011-01-29
我一般都是把 action配置成prototype,单例模式会出现很多问题。
40 楼
yagesi
2011-01-29
fatesymphony 写道
struts2整合spring,action不能为单例,不是不建议,是根本不能为单例。
在说了上传文件出错时?不应该产生actionerror吗????
在说了上传文件出错时?不应该产生actionerror吗????
强烈赞同....
发表评论
-
java位运算
2011-07-27 14:06 1243想将字符串转化成整数,通过整数来做位运算,再将结果转化成二进制 ... -
值引用的副本传递。(很容易搞错)
2011-05-16 16:11 1650package com.test; import java. ... -
jstl标签库的介绍(转载)
2010-09-07 09:24 1164jstl标签库的介绍(转载) 文章分类:Java编程 ... -
java中System.Properties的用法
2010-08-20 14:14 1528今天无聊看了下代码。看见 System.getProper ... -
7月mark
2010-07-26 15:51 0即使是多个线程运用同一个对象。 对象方法完全保存在自己的副本里 ... -
对面向对象的理解
2010-05-25 17:32 1027面向对象包括三个特征:继承、封装、多态。 类的继承性是指从 ... -
5月离职
2010-05-25 15:21 01.使用mina框架编写。 2.自己写一个线程池。 -
如何选择数据结构
2010-04-26 17:20 946D:\我的文档\桌面\data.bmp -
JAVA 接口成员变量的问题
2010-04-09 17:25 4519今天看到接口中定义成语变量必须是static ,final的 ... -
2010年4月学习
2010-03-25 14:30 01:Java数据结构 34页 2分查找法 冒泡排序,选择排序 ... -
java 堆与栈(内存分配策略)
2010-03-07 15:58 1917内存分配策略 按照编 ... -
java 堆与栈(一)
2010-03-07 15:57 8931. 栈(stack)与堆(heap)都是Java用来在Ram ... -
java中Thread线程中的 start()和run()方法的区别(2)——
2010-03-05 23:40 4541java中Thread线程中的 start()和run()方法 ... -
java中hashmap和hashtable(2)
2010-03-05 23:32 1221java中hashmap和hashtable(2) ——应用篇 ... -
JAVA 值传递还是引用传递
2010-03-05 22:33 5109java值传递与引用传递(1)——一语中的篇2009-02-1 ... -
Java中抽象类和接口的区别
2010-03-05 21:59 1300在Java语言中, abstract class 和inter ... -
java 基础之 字符编码
2010-03-05 21:34 799很久很久以前,有一 ... -
java 基础之"实例方法,实例变量,类方法,类变量"
2010-03-05 14:43 4288先一一分析一下这几个东东:实例方法,实例变量,类方法,类变量。 ...
相关推荐
这个bug是由Struts2上传文件后return SUCCESS后报的错误: java.lang.AbstractMethodError: be.telio.mediastore.ui.upload.GarryMultiPartRequest.cleanUp()V at org.apache.struts2.dispatcher.multipart....
情况是这样的:新建一个Delphi7项目,拖入一个advStringGrid控件和一个button控件,创建窗体时,指定表格一行四列,然后,在Button的点击事件中,添加如下代码!然后,运行,点击一次Button就会随机填入一些数据!可...
-- 为修复struts2 s2-016、s2-017漏洞,重写DefaultActionMapper --> <bean type="org.apache.struts2.dispatcher.mapper.ActionMapper" name="myDefaultActionMapper" class=...
本程序是作者学习struts spring hibernate构架后为了练习开发的一个小程序。开发此程序的目的是为了验证框架技术在项目中的应用。本程序尽量包含了开发当中遇到的一些问题及解决方案。同时欢迎广大网友到作者的群内...
Struts2是一个非常著名的Java Web框架,它基于MVC(Model-View-Controller)设计模式,为开发人员提供了构建企业级应用的强大工具。Struts2官方中文帮助文档是开发者了解和学习该框架的重要参考资料,其最新修复Bug...
Struts2是一个非常流行的Java Web开发框架,它提供了一种模型-视图-控制器(MVC)架构,便于开发者创建动态、数据驱动的Web应用程序。然而,任何软件都可能存在安全漏洞,Struts2也不例外。"struts2-016/017漏洞"指...
标题 "XSS转码 && struts2 property标签的bug" 指向的是一个关于Web安全的话题,特别是针对Struts2框架的一个特定安全问题。XSS(Cross-site scripting)是Web应用中的常见安全漏洞,而Struts2是Java开发中的流行MVC...
Struts2是一个基于MVC(Model-View-Controller)设计模式的Java web应用程序框架,它在Web开发领域中被广泛使用。这个“超好的Struts2 pdf 文档”很可能包含了关于Struts2的全面介绍、核心概念、配置、拦截器、结果...
Struts2是一个流行的Java web框架,它为构建MVC(模型-视图-控制器)架构的应用程序提供了便利。然而,正如标题所示,“Struts2的bug——关于Struts2中找不到Action的”,这个问题可能困扰了许多开发者。在Struts2...
struts2-json-plugin-2.3.15.1 -Lee修复bug版.jarstruts2-json-plugin-2.3.15.1 -Lee修复bug版.jarstruts2-json-plugin-2.3.15.1 -Lee修复bug版.jarstruts2-json-plugin-2.3.15.1 -Lee修复bug版.jar
官方描述: ... ... 官方建议修复方案:升级到最新版本 struts-2.3.15.1 但通常现有系统升级,可能导致不稳定及与其他...鉴于此csdn网友jzshmyt整理了一种既可以不用升级现有struts版本,有能完美解决这两个漏洞的方案,
Struts2SpringUnitDemo是一个示例项目,展示了如何在Java应用程序中将Struts2和Spring框架进行集成,并进行单元测试。这两个框架都是Java Web开发中的关键组件,Struts2负责控制层逻辑,Spring则提供了全面的依赖...
但在Struts 2.1.6版本中,这个配置对POST请求的中文乱码问题无效,这是一个已知的bug。升级到2.1.8.1或更高版本可以修复这个问题,因为官方已经改进了过滤器处理字符编码的方式。 2. **POST乱码问题**: POST请求...
Struts2是Apache软件基金会旗下的一个开源框架,主要用于构建企业级Java Web应用程序。这个框架基于Model-View-Controller(MVC)设计模式,提供了一种结构化的开发方式,简化了Web应用的开发流程。最新版本为2.5.13...
相对于2007年发布的Struts 2.0,Struts 2.1改变较大,Struts 2.1不仅修正了Struts 2.0中少量Bug(这些Bug在《Struts 2.1权威指南》第一版中已经指出)。而且新增了REST、Convention和Java Templates,这些都是Struts 2...
)"的资源显然聚焦于一个包含错误的Java程序,可能是用于教学或实际项目中的一个白板应用。白板程序通常指的是用于画图、演示或教学目的的软件,而在这里,它显然存在一些需要修复的编程问题。 首先,我们来谈谈...
但有些Struts2的插件或者拦截器可能期望动作类是一个接口,这可能导致问题。确保你知道哪种代理模式正在被使用,并且它与你的代码兼容。 4. **依赖注入问题**:Spring的依赖注入可能会在Struts2的生命周期中出现...
bug tracker system!!!!bug tracker system!!!!bug tracker system!!!!bug tracker system!!!!bug tracker system!!!!bug tracker system!!!!
Struts2是一个流行的Java web应用程序框架,用于构建和维护可扩展、高效且易于维护的Web应用。在开发基于Struts2的应用时,除了主要的Struts2核心库外,还需要依赖一些辅助的JAR包来确保项目的正常运行。标题提到的...
具体到struts-2.3.16版本,这是Struts2的一个稳定版本,包含了多个组件和修复的bug,旨在提供更高效、更安全的开发环境。 核心jar包是Struts2框架的基础,主要包括以下几个关键组件: 1. **struts2-core.jar**:这...