传智播客--struts2.x表单重复提交,文件上传下载,转换器

今天是struts2的最后一天了.通过前3天的学习.感觉struts2在各个细节上要比struts1好很多.好东西就是体现在细节啊.上张老师的 课,上一天感觉自己像听了两天的课似的.内容太多了.所有上课得高度集中,一个不留神就跟不上了.今天主要讲解一下在struts2中经常用到的一些技巧 和案例.下面总结一下.

1.防止表单重复提交
1) <s:token>标签在session中 生成Token号码和在网页中生成一个带有该号码的隐藏字段。
2) TokenInterceptor 拦截器检查请求消息中的Token与session中的Token是否匹配:
    匹配则放行,并清除session中的Token号码。
    不匹配则跳转到名称为invalid.token的视图。
3) 用 struts.messages.invalid.token作为key对表单重复提交的消息进行国际化定制,使 用<s:actionError>标签显示表单重复提交的错误消息。   
   
2.文件上传   
1) 要上传文件,需要定义三个变量,类型分别为 File,String,String,名称分别是 xxx,xxxContentType,xxxFileName
上传文件的保存路径就可以作为Action的属性进行配置,在<action>元素下面增加<param>子元素就可以了。
上传成功后,在成功页面调用File对象的path属性可以得到临时文件被保存在服务器上的位置,然后进入到该目录下看,如果看不到,则可能是临时文件创 建和删除的时间间隔太短。在action中加入暂停 3000毫秒的语句,用浏览器刷新刚才的提交操作,就可以看到临时文件了。
renameTo方法生成的文件名与原始文件名可以在不同的硬盘符
2) 限定上传的文件名、或者将文件保存在浏览器无法直接访问 的目录中,或者将文件保存在专用的静态文件服务器上;文件保存的目录可以通过配置文件进行设置;,文件名称用UUID来生成;将文件打散到不同的目录中进 行存储,将文件保存的最终路径记录到数据库中,限制超大的文件等等。   
   
3.文件下载    
Struts2的文件下载是通过一个类型为stream的特殊视图来实现的,该视图几个主要参数:
contentType - the stream mime-type as sent to the web browser (default = text/plain). 
contentLength - the stream length in bytes (the browser displays a progress bar). 
contentDisposition - the content disposition header value for specifing the file name (default = inline, values are typically attachment;filename="document.pdf". 
inputName - the name of the InputStream property from the chained action (default = inputStream). 
bufferSize - the size of the buffer to copy from input to output (default = 1024). 
中文文件名的问题
<param name="contentDisposition">attachement; filename="${@java.net.URLEncoder@encode('中文.zip','UTF-8')}"</param& amp; gt;
   
4.转换器   
Struts2转换器要实现TypeConverter接口,或者继承 DefaultTypeConverter和StrutsTypeConverter两个类中的一个。   
1)转换器的注册:
    全局转换器:xwork-conversion.properties文件
    局部转换器:ActionClassName-conversion.properties文件   
2)转换异常处理:
    系统异常直接抛出,非系统异常要包装为XWorkException or preferably TypeConversionException。
    定制全局异常消息的key为xwork.default.invalid.fieldvalue,定制局部异常消息的key为 invalid.fieldvalue.xxx。   
3)数组和集合属性的转换器处理
    对于数组类型,局部转换器的目标类型即为整个数组,全局转换器则不支持数组类型。
    对于集合类型,局部转换器的目标类型即为整个集合,全局转换器的目标类型即为集合中的元素的类型。

你可能感兴趣的:(struts,Stream,session,action,token,browser)