|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
为什么外国人还要写那些框架进行代码封装,他们不就是为了别人使用时可以更简单么!如果要达到一个企业级项目的不用框架是很难的。小一些的项目还行,大的光是MVC模式的设计的编码量就够大的了。还有性能方面,单轮windows,这个工具是微软写的,。
Struts2框架自己没有文件上传的功效模块,而是使用如今盛行的几个文件上传开源框架,如Common-FileUpload和COS等。Struts2使用拦阻器将这些文件上传的框架奇妙的集成出去,不克不及不被称为一个优异的拿来主义者。因为拦阻器的利用,我们利用Struts2完成文件上传变的十分简单,仿佛甚么也没产生,文件已上传到服务器了,但假如仅仅是利用这个功效,大概永久不晓得Struts2为你做了几事变。比来有点闲,剖析了下下Struts2源码,才弄分明个中的原形,条记一下,以避免忘记。
Struts2使用request剖析器来集成其他的文件上传框架,Struts2供应了默许的request剖析器JakartaMultiPartRequest,在default.properties的struts.multipart.parser参数就是设置request解析器,默许为jakarta也就是JakartaMultiPartRequest。固然,你也能够设置成cos,不外Struts2没有供应适配cos的request剖析器,你得本人完成,然后设置到本人的使用。JakartaMultiPartRequest也就是使用Common-FileUpload来对request举行剖析,然后保留剖析了局。详细事情就是使用Common-FileUpload的ServletFileUpload对request举行剖析,失掉一切的FileItem的list,然后对这个list进行剖析。假如是文件上传表单,则以表单的name属性分组,以表单name属性为key,对应的FileItem列表为Value保留到一个Map中。JakartaMultiPartRequest的事情已完成,固然,这个Map中保留的一切的FileItem,框架已将文件保留到一个一时目次里了,这个一时目次你也能够设置,参数为struts.multipart.saveDir,还要设置一个文件上传总巨细,参数为struts.multipart.maxSize。
接着就是FileUploadInterceptor的事情了,他的事情也十分复杂。起首举行考证,如文件上传巨细限定,上传范例限定考证等。然后以表单名来机关三个参数,比方:你的文件上传表单name为upload,则这三个参数为:upload,uploadContentType,uploadFileName。然后保留到ActionContext的PARAMETERS中,固然假如表单良多,并且表单名又分歧,他就会发生分歧表单名对应的参数。最初体系的ParametersInterceptor拦阻器会将ActionContext的getParameters()失掉的各个参数映照赋值给Action的各个属性,这就是为何我们在开辟文件上传的时分必定要在Action中供应与表单名不异的File对象(假如一个表单名又多个上传文件,这是能够是File数组或是File的List),文件名+ContentType,和文件名+FileName这三种参数。
框架为我们所做的就是这些了,剩下的就是文件拷贝了。如今我们来注重下Action的这几个参数,个中File对象(固然也多是数组或List),这时候他们已指向体系一时目次里的某个文件,或是体系的内存里的数据了。在我们传输数据时,实践上是从这个一时文件或内存将数据库拷贝到上传目次里往的,当实行完Action以后,FileUploadInterceptor会将一时目次里一切一时文件删除,这也是为何上传文件完成后会有一些日记显现说删除一些一时文件的缘故原由。
如今完成一个复杂的文件上传,起首熟习下几个参数设置:
1.struts.multipart.parser 设置request剖析器,Struts2默许为jakarta也就是JakartaMultiPartRequest,我们也能够本人开辟本人的剖析器。
2.struts.multipart.saveDir 上传文件的一时保留目次,我们晓得Common-FileUpload必要供应一个一时目次的。假如没有设置,则是ServletContext.getAttribute("javax.servlet.context.tempdir")对应的目次,对应于Common-FileUpoad中的repository参数。
3.struts.multipart.maxSize这个是设置文件上传总巨细,单位为B,默许巨细为2097152b,对应于Common-FileUpload中的sizeMax参数。
在设置FileUploadInterceptor时分也有几个参数:
1.maximumSize 这是设置同意上传的单个文件的巨细,假如某个文件巨细年夜于这个巨细,则会发生一个毛病保留到Action中,毛病的i18n的key为struts.messages.error.file.too.large
2.allowedTypesSet这是设置同意上传文件的范例,多个范例以逗号“,”离隔,假如某个文件的范例没在这个设置之类,则会发生一个毛病保留到Action中,毛病的i18n的的key为struts.messages.error.content.type.not.allowed
3.allowedExtensionsSet这是设置同意上传文件的后缀,多个范例以逗号“,”离隔,假如某个文件的后缀没在这个设置之类,则会产生一个毛病保留到Action中,毛病的i18n的的key为struts.messages.error.file.extension.not.allowed
struts.xml设置示例:
Xml代码
<struts>
//设置文件保留的一时目次
<constant name="struts.multipart.saveDir" value="C:Documents and SettingsondMy Documents emp"></constant>
//设置上传总巨细
<constant name="struts.multipart.maxSize" value="1024102400"></constant>
<package name="strutsDemo" extends="struts-default">
<action name="Upload" method="upload" class="com.bond.action.LoginAction">
//文件上传的保存目次
<param name="savePath">/upload</param>
<result name="success">/success.jsp</result>
<result name="error">/failure.jsp</result>
<interceptor-ref name="fileUpload">
//单个文件同意的巨细
<param name="maxinumSize">10240000000</param>
//同意上传的文件范例,能够到%Tomcat_home%/conf下的web.xml文件中找到一切文件范例的范例名
<param name="allowedTypesSet">application/zip,application/pdf,image/gif</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
</package>
</struts>
这里我们设置了fileUpload拦阻器,我们还必需吧dufaultStack加上,因为defaultStack中已包括了fileUpload拦阻器,以是fileUpload拦阻器会实行俩遍,以是我们会在日记信息中看到俩次扫除一时文件的纪录。
<p>
最后我再次声明,我并没有说不看好java,实际上我对java很乐观的,毕竟她正在不断改进中,我相信她总有一天会和.net网页编程并驾齐驱的 |
|