Struts2集成cos(转)

Struts2因License的原因早就不再支持Cos上传了,具体见http://struts.apache.org/2.1.6/docs/file-upload.html 的官方说明: 
There was a third alternative, cos, but it was removed due to licensing incompatibilities.

目前是内嵌了commons-fileupload,同时通过plugin方式支持Pell。但是struts.properties依然没有更新,网上的文章也依然是通过修改struts.multipart.parser对应的值为cos来自动支持Cos。

我们先不考虑license因素,看看让Struts2怎么支持Cos: 
1) 创建一个实现org.apache.struts2.dispatcher.multipart.MultiPartRequest借口的类

Java代码  

  1. /**
  2. * @author <a href="http://intolong.spaces.live.com/">Jalen</a>
  3. */
  4. public class CosMultiPartRequest implements MultiPartRequest {
  5. private MultipartRequest multi;
  6. private String defaultEncoding;
  7. private boolean maxSizeProvided;
  8. private int maxSize;
  9. @Inject(StrutsConstants.STRUTS_I18N_ENCODING)
  10. public void setDefaultEncoding(String defaultEncoding) {
  11. this.defaultEncoding = defaultEncoding;
  12. }
  13. @Inject(StrutsConstants.STRUTS_MULTIPART_MAXSIZE)
  14. public void setMaxSize(String maxSize) {
  15. this.maxSizeProvided = true;
  16. this.maxSize = Integer.parseInt(maxSize);
  17. }
  18. @Override
  19. public String[] getContentType(String fieldName) {
  20. return new String[] { multi.getContentType(fieldName) };
  21. }
  22. @SuppressWarnings("unchecked")
  23. @Override
  24. public List getErrors() {
  25. return Collections.EMPTY_LIST;
  26. }
  27. @Override
  28. public File[] getFile(String fieldName) {
  29. return new File[] { multi.getFile(fieldName) };
  30. }
  31. @Override
  32. public String[] getFileNames(String fieldName) {
  33. return new String[] { multi.getFile(fieldName).getName() };
  34. }
  35. @SuppressWarnings("unchecked")
  36. @Override
  37. public Enumeration<String> getFileParameterNames() {
  38. return multi.getFileNames();
  39. }
  40. @Override
  41. public String[] getFilesystemName(String name) {
  42. return new String[] { multi.getFilesystemName(name) };
  43. }
  44. @Override
  45. public String getParameter(String name) {
  46. return multi.getParameter(name);
  47. }
  48. @SuppressWarnings("unchecked")
  49. @Override
  50. public Enumeration<String> getParameterNames() {
  51. return multi.getParameterNames();
  52. }
  53. @Override
  54. public String[] getParameterValues(String name) {
  55. return multi.getParameterValues(name);
  56. }
  57. @Override
  58. public void parse(HttpServletRequest request, String saveDir) throws IOException {
  59. if (maxSizeProvided) {
  60. multi = new MultipartRequest(request, saveDir, maxSize, defaultEncoding);
  61. } else {
  62. multi = new MultipartRequest(request, saveDir, defaultEncoding);
  63. }
  64. }
  65. }

2) 修改struts.xml,指定你的parser

Java代码  

  1. <constant name="struts.multipart.parser" value="cos" />

这个也可以通过修改struts.properties来,效果相同

3) 修改struts.xml,注册你的parser

Java代码  

  1. <bean type="org.apache.struts2.dispatcher.multipart.MultiPartRequest" name="cos" class="jalen.core.struts2.CosMultiPartRequest" />

大功告成。

以下转贴个Cos和其他上传lib的性能对比,我自己并未实测:

处理基于http的文件上传,有这么几个opensource lib,O‘Reilly的Cos,Apache的fileupload,还有JspSmart的SmartUpload。

网上查了下他们的性能对比,摘录如下:

使用2M、20M、45M、200M的上传大小测试三种组件所花费的时间(单位为ms)结果是:

2M


第1次


第2次


第3次


第4次


平均


Cos


297


203


234


245


245


FileUpload


281


312


281


312


297


SmartUpload


531


594


485


532


536

20M


第1次


第2次


第3次


第4次


平均


Cos


2562


2109


2719


2172


2391


FileUpload


4062


4140


5360


3922


4371


SmartUpload


3453


3094


3078


3547


3293

45M


第1次


第2次


第3次


第4次


平均


Cos


4860


4844


5125


5171


5000


FileUpload


9000


8391


10375


10078


9461


SmartUpload


8265


9187


8672


8856


8745

200M


第1次


第2次


第3次


第4次


平均


Cos


55813


52282


54796


51187


53520


FileUpload


76343


68531


80954


79031


76215


SmartUpload


内存堆栈溢出

从上述的表格对比中可以看出Cos始终保持着良好的性能。在上传量较小(容量<2M,这是最常出现的情况)时,Cos比FileUpload性能并没有好很多,但SmartUpload就已经开始显出弱势。随着容量的增大,FileUpload和SmartUpload的性能下降非常快,直到200M容量时,SmartUpload已经不堪重负崩溃了,而Cos此时的花费时间比FileUpload少了20多秒,不能不说在本次的评测中,Cos的性能位居第一。

时间: 2024-12-12 14:30:23

Struts2集成cos(转)的相关文章

Spring与Struts2集成开发

Struts2和Spring都是不错的开源框架,Spring与Struts2集成开发,把二者结合在一起使用,开发效果更佳,效率杠杠的.下面介绍一下如何将Spring与Struts2集成在一起开发.分七步战略: 1.添加Struts2 支持jar包 :注意:加上一个Struts-spring-plugin(集成)插件包 2.添加spring 支持jar包 3.编写struts.xml配置文件 注意:Action是交由Spring管理:所以action class属性应和spring 中配置的Act

Struts2集成Spring

转载请注明出处:jiq?钦's technical Blog 1 集成Struts: 给web工程集成Struts2比较简单,下载struts2,将所需的jar文件add进去,然后配置web.xml增加请求处理者配置: <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmln

struts2 集成 easyui

关键点: json数据格式 获取json数据 输出json 分页 #json数据格式# datagrid: {"total":1,"rows":[{"name":"小李"}]} combobox: [{"value":"001","text":"小李"},{"value":"002","text&q

Struts2之—集成Json插件实现Ajax

   上篇博客介绍了Struts2中自定义结果集实现Ajax,也分析了它的缺点:这样自定义的结果集,写死了,不能做到客户端需要什么数据就传什么数据:Struts2之-自定义结果集实现ajax 本篇博客提出Struts2的集成Json插件,很好的解决了自定义结果集带来的问题. 一,引题 1,Json数据格式简介 因为JSON是脱离语言的理想的数据交换格式,所以它被频繁的应用在客户端与服务器的通信过程中,这一点是毋庸置疑的.而在客户端与服务器的通信过程中,JSON数据的传递又被分为服务器向客户端传送

(二十四)Struts2 Spring集成

Spring是当下流行的Web框架,可提供带有许多常见Web任务的简易的集成.那么问题是,当我们有Struts2时,为什么我们需要Spring?因为Spring不仅仅是一个MVC框架,它提供了许多其他在Struts中不可用的好东西.例如:依赖注入可以对任何框架有用.在本章中,我们将通过一个简单的例子来了解如何将Spring和Struts2集成在一起.首先,你需要将以下文件添加到Spring的项目的构建路径.你可以从http://www.springsource.org/download下载并安装

(二十五)Struts2 Tiles集成

在本章中,我们会学习到将Tiles框架与Struts2集成所涉及的步骤.Apache Tiles是一个模板框架,用于简化Web应用程序用户界面的开发.首先,我们需要从Apache Tiles网站下载tiles jar文件.你需要将以下jar文件添加到项目的类路径. tiles-api-x.y.z.jar tiles-compat-x.y.z.jar tiles-core-x.y.z.jar tiles-jsp-x.y.z.jar tiles-servlet-x.y.z.jar 除了上面的,我们必

SSH Struts2+hiberante+Spring整合

使用SSH框架编写学生信息: 一.新建Java工程: (1)建立好Java各层级之间的结构:业务处理层dao,数据模型层domain,页面请求处理层(Struts2 MVC层)action,service层. (2)建立好各层的实现类及接口; (3)建立一个source folder文件夹,用来存放一些配置问价. (4)改变字节码生成的位置,改为WEB-INF下面的classes文件夹下. Java工程层级结构如下图: 二.hibernate整合到Spring容器中 步骤: 1.编写domain

Struts2 标签

使用struts2的标签需要先在jsp界面添加下面定义 <%@ taglib prefix="s" uri="/struts-tags"%> struts2的标签共分为五大类: 一.逻辑控制标签 1)条件标签:用于执行基本的条件流转 <s:if>:拥有一个test属性,其表达式的值用来决定标签里内容是否显示. <s:if test="#request.username=='hzd'">欢迎hzd</s:i

Struts2工作流程

Struts2是一个非常优秀的MVC框架,它主要通过StrutsPrepareAndExecuteFilter过滤器将Struts2集成到Web应用中的. 基本工作流程: 1.客户端提交一个HttpServletRequest请求(action或JSP页面): 2.请求经过一系列的过滤器(如ActionContextCleanUp,SiteMesh等): 3.Struts2的核心过滤器StrutsPrepareAndExecuteFilter被调用,并询问ActionMapper来决定这个请求是