SSH框架Struts文件上传自定义错误提示信息解决方案

来源:互联网 发布:论文数据捏造 编辑:程序博客网 时间:2024/05/01 09:05

SSH框架Struts文件上传自定义错误提示信息解决方案

最近做一个SSH框架项目,对于文件上传功能需要对文件类型和大小进行限制,但是Struts的默认错误提示信息为英文,为了提高用户体验,我们决定采用自定义的提示信息,进行初步尝试后没有成功,于是在网上查找资料,也尝试了网上提供的所谓完全解决方案,弯路没少走,但是却没有实现,最后综合网上的资料和个人分析最终问题完美解决,并成功实现,我把解决的步骤和注意的问题进行了总结,希望可以为遇到类似问题的朋友提供一个参考。
 
1.首先在WEB工程的src目录内新建mess.properties属性文件,文件名任意,这是错误提示信息属性文件,在其中加入如下信息:
 
struts.messages.error.uploading=\u6587\u4EF6\u4E0A\u4F20\u5931\u8D25\uFF0C\u8BF7\u91CD\u65B0\u4E0A\u4F20\uFF01\uFF01
struts.messages.error.file.too.large=\u56FE\u7247\u592A\u5927\uFF0C\u8BF7\u52FF\u8D85\u8FC7500k\uFF01\uFF01
struts.messages.error.content.type.not.allowed=\u8BF7\u4E0A\u4F20\u56FE\u7247\u6587\u4EF6\uFF01
 
其中等号左侧为上传文件的错误类型,右侧就是出现该错误时要显示的提示信息,因为右侧提示信息为中文,经过unicode编码后就是以上形式(我的开发工具是eclipse,没有安装属性文件编辑插件,安装后就会显示中文)
根据错误类型可以看出第一个为文件上传错误,第二个为文件超出允许的大小,第三个为不去允许的文件类型。
 
2.配置完属性文件后我们需要告诉Struts出现错误时去哪里寻找错误提示信息,因此需要在struts.xml(该文件也在WEB工程的src目录中)文件中进行配置,加入以下代码:
 
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.devMode" value="false"></constant>
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
    <!-- 文件上传错误提示信息配置文件 -->
<constant name="struts.custom.i18n.resources" value="mess"></constant>
<!-- 整个表单允许的上传大小5M -->
<constant name="struts.multipart.maxSize" value="5242880"/> 
 
其中第一行红色代码就是配置出错提醒信息的国际化资源,其中mess是提示信息所在的属性文件。
第二行红色代码就是整个表单允许的文件大小,如果不配置的话默认为2M,单位为字节,有的表单会有多个文件域,此时文件总的小不能超过配置值,否则将拦截。
 
 
3.配置完属性文件的位置后,我们还需要在struts.xml文件中对Action进行配置,代码如下:
 
 <!-- 广告管理 -->
    <action name="insertAd" class="adminAdProviderAction" method="insertAd">
        <interceptor-ref name="fileUpload">
                <!-- 文件过滤 -->
                <param name="allowedTypes">image/bmp,image/png,image/gif,image/jpeg</param>
                <!-- 文件大小以字节为单位                              -->
                <param name=" maximumSize ">512000</param> 
            </interceptor-ref>
            <!-- 默认拦截器必须放在fileUpload之后,否则无效 -->
            <interceptor-ref name="defaultStack" />
    <result name="ok">/fruit_page/adAdmin.jsp</result>
     <result name="fail">/fruit_page/adAdmin.html</result>
     <result name="error">/fruit_page/adAdmin.html</result>
     <!-- 错误信息展示页面 -->
     <result name="input">/fruit_page/adAdmin.jsp</result>
    </action>
 
接下来我们对红色代码进行依次解释:
因为该代码配置在insertAD 这个Action中,因此只对这个请求有效,第一个配置就是对文件上传进行拦截,参数maximumSize 属性为文件的限制大小,单位为字节,在这里有一个需要大家注意的问题,在上一步骤中我们配置了表单总的上传大小,所以要注意,在这里配置的大小一定要小于上一步骤中配置的表单总的大小,否则文件超出限制大小的设置失效,仍然会按照默认大小进行拦截,同时自定义错误信息也不会再页面出现,会出现在控制台中。
举个例子:假如你要限制上传文件的大小为500k,那么在上一个步骤中配置的大小一定要大于500k,也可以不配置,因为默认是2M;假如限制是3M,那么在这里要配置为3M,此时必须在上一步骤中进行配置且必须大于3M
 <interceptor-ref name="defaultStack" /> 指的是默认的拦截器,要配置在限制条件的最后面,否则不会拦截。
最后一个参数name属性的值一定要为”input”,这个就是配置错误信息展示的位置,我是将其设置为文件上传的页面,这样一旦出现错误在文件上传页面就可以立马看到,不用跳转。
 
4.配置错误信息展示页面,我是将其设置为文件上传的页面,这样一旦出现错误在文件上传页面就可以立马看到,不用跳转,其代码为:
 
<p>
<s:fielderror name="file">
    </s:fielderror>
</p>
 
只需要加入 <s:fielderror name="file"> </s:fielderror>即可,出现错误struts会自动获取进行显示。
 
5.最在Spring的配置文件中(一般在项目的WEB-INF文件夹下)对beanscope属性进行配置,代码如下:
<!-- 广告管理 -->
<bean id="adminAdProviderAction" class="com.fruit.controller.AdminAdProviderAction" scope="prototype">
<property name="adminAdService" ref="adminAdService"></property>
</bean>
Scope指的是bean的作用域,scope="prototype" 每一次请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean()方法)都会产生一个新的bean实例,相当与一个new的操作。
通俗的解释如下:每一次文件上传都会发送到相应的Action中,以上的配置就是使每一次请求Spring都会创建新的Action实例来接受请求。(为什么这么设置,看继续看此文注意事项)。
 
到此,我们的自定义文件上传错误提示信息的配置就完成了,当然文件上传的实现不是本文的重点,struts已经集成了apache的开源文件上传组件,所以struts可以自动识别文件域,代码相对简单不少。以上配置是我将一些注意的问题全部解决后的正确配置,它已经避免了一次常见错误的发送,大功告成我们来测试一把吧:

上传了一个txt文件后页面显示如下:


上传一个大于设置值的图片后的页面:


原始提示信息:


相对于自定义错误提示信息这种方式对于用户来说太不友好了,用户体验比较差,到此我们的任务算是完成了。


接下来我将对注意的问题进行总结,以便给遇到这些问题的朋友们提供一个参考,其实这些注意事项在文章中我以及提到了而且也解决了,不知道细心的读者有没有发现。

 

1.限制文件大小的问题一定要注意,如果设置时没有考虑到可能会出现拦截失败,拦截的错误信息无法在页面显示等问题,详细解释请参考文章中的说明。

 

2.错误信息重复显示问题,我们来看实际效果:

第一次上传一个非图片文件:



然后我再次上传一个大于限制值的图片文件:


有没有发现问题存在,上一次文件上传的错误提示并没有消失,根据网上的说明,我明白了原因所在,因为Spring配置bean的时候如果不设置beanscope属性,则默认是单例模式,也就是说多次上传文件请求的是同一个Action实例,那么第一次文件上传的错误信息还保留着,因此第二次文件上传的时候也显示在了页面上。因此我们需要将scope属性改为prototype,也就是我文章中设置的那样。

 

1.先提交超过限制的图片文件给出错误提示后,无法在上传正常文件:我们需要重新启动服务器,此时scope的属性值依旧没有设置。

第一次上传一个超过大小的图片文件:

 

然后再上传一个正常的图片文件,页面刷新一下依旧没有变化,问题何在呢?




打开ie的开发者工具,没有找到一些有用的信息,然后我关掉浏览器并清空历史记录缓存等等,问题依旧,此时我觉得就是服务器端的问题了。仔细思考一下,再次回到上一个问题中,两次的错误信息都保存了,那么是否struts的拦截器记录了拦截信息呢,于是我我将scope属性设置为prototype,问题解决,既不会出现错误信息重复显示,也不会出现无法提交的问题,但是这个问题的细节我还是没能明白,不知道struts内部如何处理,这是我遇到的一些常见问题,可能还有别的问题没有列出。

 

感谢参考此文,有什么问题欢迎大家提出来(QQ 409273291),本人水平有限,文中难免出现纰漏,望见谅。


0 0
原创粉丝点击