调查管理系统 -(8)增加Logo--Struts2文件上传

1、增加Logo

  增加Logo即上传图片,因此使用到Struts2的文件上传功能。Struts2的文件上传依靠其FileUploadInterceptor(文件上传拦截器),其使用的依然是Apache提供的FileUpload文件上传组件(commons-fileupload.jar)。

2、Struts2文件上传的使用步骤

  Ⅰ、在 Jsp 页面的文件上传表单里使用 file 标签。如果需要一次上传多个文件,就必须使用多个 file 标签,但它们的名字必须是相同的。

  Ⅱ、在 Action 中新添加 3 个和文件上传相关的属性。这 3 个属性的名字必须是以下格式

•[File Name] : File -被上传的文件。例如:data
•[File Name]ContentType : String -上传文件的文件类型。例如:dataContentType
•[File Name]FileName : String -上传文件的文件名。例如:dataFileName
 
Ⅲ、如果上传多个文件可以使用 List

3、配置FileUpload 拦截器,对上传文件加以约束

<interceptors>
    <!-- 注册登陆拦截器 -->
    <interceptor name="loginInterceptor" class="com.atguigu.surveypark.struts2.interceptor.LoginInterceptor" />
    <!-- 定义拦截器栈 -->
    <interceptor-stack name="surveyparkStack">
        <interceptor-ref name="loginInterceptor" />
        <interceptor-ref name="defaultStack">
            <param name="modelDriven.refreshModelBeforeResult">true</param>
            <!-- 文件大小 -->
            <param name="fileUpload.maximumSize">60000</param>
            <!-- 文件扩展名 -->
            <param name="fileUpload.allowedExtensions">.jpg,.jpeg,.png,.bmp,.gif</param>
            <!-- 文件内容类型 -->
            <param name="fileUpload.allowedTypes">image/jpg,image/jpeg,image/pjpeg,image/png,image/gif,image/bmp</param>
        </interceptor-ref>
    </interceptor-stack>
</interceptors>
–maximumSize: 上传单个文件的最大长度(以字节为单位), 默认值为 2 MB;
–allowedTypes: 允许上传文件的类型, 各类型之间以逗号分隔;
–allowedExtensions: 允许上传文件扩展名, 各扩展名之间以逗号分隔;
Commons FileUpload 组件默认接受上传文件总的最大值为 2M, 可以通过在 struts 配置文件中配置常量的方式修改。

4、对错误消息国际化

  在Struts2的核心包struts2-core-version.jar中的struts-messages.properties文件中包含了Struts2内置的各种默认的错误消息,其中关于文件上传的错误提示消息主要有如下3个:

struts.messages.error.file.too.large=The file is to large to be uploaded: {0} "{1}" "{2}" {3}
struts.messages.error.content.type.not.allowed=Content-Type not allowed: {0} "{1}" "{2}" {3}
struts.messages.error.file.extension.not.allowed=File extension not allowed: {0} "{1}" "{2}" {3}

  Struts2有个很大的特点就是属性与Action相关,如国际化、类型转换器的属性文件都与Action相关,所谓的Action相关就是跟Action放在一起。因此,要对错误消息国际化首先要在Action所在包中建立一个名字为ActionName.properties的属性文件作为默认文件,同时建立一个名称为ActionName_zh_CN.properties的属性文件作为中文的国际化文件,并在其中覆盖上面的3个错误消息。

  注:1)当Eclipse或MyEclipse没有属性文件*.properties的编辑器器(能够自动进将中文转换为ASCII码)时,要使用JDK中的转码工具native2ascii.exe将包含中文的文件转换为ASCII形式。如对1.txt进行转码(ascii码),产生2.txt文件。首先使用cmd进入命令行,并切换到文件所在的目录,然后使用命令:

native2ascii -encoding gb2312 1.txt 2.txt

2)在文件上传时,IE浏览器会检测文件头的信息以判断文件的内容类型,这样即使文件的扩展名被修改为符合要求的扩展名时,只要文件内容类型不符合要求依然无法上传;而FireFox浏览器只是检测文件的扩展名,并不检测文件头的内容,因此当文件扩展名被修改后其无法正确判断其类型。(了解)

5、动态指定错误页面

  在一个Action中在执行不同请求的方法之前都有可能出现错误,且出现错误时要跳转的错误页面也有可能不同,如在SurveyAction中在执行updateSurvey()方法时,可能由于类型转换错误或校验未通过等原因导致错误并且需要跳转到编辑页面便于用户修改,而在调用doAddLogo()方法添加Logo时,可能由于上传图片过大或文件类型不合要求而导致错误并且需要跳转到添加Logo页面便于用户重新添加文件。而出现上述错误时,Struts2都会自动查找配置文件中name="input"的result所指定的错误页面。因此需要动态的指定name="input"的result的值。

  步骤如下:

   Ⅰ、在Action中添加一个字符串变量inputPage  private String inputPage; //动态错误页指定 

 Ⅱ、为可能出错的action的方法定义prepare前缀方法,前提是Action实现了Preparable接口。如prepareUpdateSurvey(),prepareDoAddLogo()等,在其中为inputPage赋值。
1 //该方法只在updateSurvey之前运行
2 public void prepareUpdateSurvey(){
3     inputPage = "/editSurvey.jsp" ;
4 }
5 
6 //该方法只在updateSurvey之前运行
7 public void prepareDoAddLogo(){
8     inputPage = "/addLogo.jsp" ;
9 }

Ⅲ、在配置文件struts.xml中将action元素中所配置的name=”input“的result的值使用OGNL表达式进行动态指定

<result name="input">${inputPage}</result>

注:动态指定错误页面的实现原理是利用了Struts2拦截器的执行顺序。由于使用的是Struts2的默认拦截器栈,因此对于这里添加Logo的错误页面的指定使用该方法最合适,不能使用表单的隐藏域,因为params拦截器在prepare拦截器之后才执行;而对于updateSurvey的错误页面的指定则可以放在表单的隐藏域中,因为在拦截器栈中参数的类型转换与校验工作都是在params拦截器之后的拦截器中进行的,此时params拦截器可以为inputPage赋值。切记不能在doAddLogo或updatSurvey方法中再去为inputPage赋值,因为在出错后,将不会在调用Action的业务方法了。

 

 
 
 
 
posted @ 2014-09-18 01:32  KnightKitt  阅读(396)  评论(0编辑  收藏  举报