【Java EE 学习 72 上】【数据采集系统第四天】【增加调查logo】【文件上传】【动态错误页指定】【上传限制】【国际化】
增加logo的技术点:文件上传,国际化
文件上传的功能在struts2中是使用文件上传拦截器完成的。
1.首先需要在页面上添加一个文件上传的超链接。
点击该超链接能够跳转到文件上传页面。我给该表单页面中的field字段使用了logo作为名字,即name=logo。
2.在SurveyAction中进行表单的接收。接收的类型包括文件名、文件类型和文件本身,以方便处理,给每个字段都提供了set/get方法。
1 //上传的logo图片 2 private File logo; //上传的logo的文件 3 private String logoFileName ; //上传的文件的名称 4 private String logoContentType ; //上传的文件的类型 5 public String getLogoFileName() { 6 return logoFileName; 7 } 8 public void setLogoFileName(String logoFileName) { 9 this.logoFileName = logoFileName; 10 } 11 public String getLogoContentType() { 12 return logoContentType; 13 } 14 public void setLogoContentType(String logoContentType) { 15 this.logoContentType = logoContentType; 16 } 17 public File getLogo() { 18 return logo; 19 } 20 public void setLogo(File logo) { 21 this.logo = logo; 22 }
3.书写文件上传的工具类该工具类能够将文件上传之后将服务器中该文件的相对路径以字符串的形式返回,曾经写过一个类似的文件上传工具类(在jbpm工作流项目实战中),但是上一个工具类返回的是文件本身。
1 public static String saveUploadFileToDestDir(File sourceFile, String infactFileName){ 2 SimpleDateFormat sdf=new SimpleDateFormat("/yyyy/MM/dd"); 3 Date date=new Date(); 4 String aimPath=ServletActionContext.getServletContext().getContextPath()+"/upload"+sdf.format(date); 5 String dirPath=ServletActionContext.getServletContext().getRealPath("/upload")+sdf.format(date); 6 File dir=new File(dirPath); 7 if(!dir.exists()){ 8 dir.mkdir(); 9 } 10 String []arrFileNames=infactFileName.split("\\."); 11 12 String lastFileName=arrFileNames[arrFileNames.length-1]; 13 File destFile=new File(dir,UUID.randomUUID().toString().replaceAll("-", "")+"."+lastFileName); 14 try { 15 FileUtils.copyFile(sourceFile, destFile); 16 } catch (IOException e) { 17 System.out.println("保存文件失败!"); 18 } 19 return "/upload"+sdf.format(date)+"/"+destFile.getName(); 20 }
4.在Action中书写上传逻辑。
1 //实施上传logo动作的方法 2 public String doUploadLogo() throws Exception{ 3 //首先需要保存住上传的文件! 4 String fileName=FileUploadUtils.saveUploadFileToDestDir(logo, logoFileName); 5 //接着需要将保存住的文件和Survey对象关联起来 6 model=this.surveyService.getModelById(model.getSurveyId()); 7 model.setLogoPath(fileName); 8 System.out.println(fileName); 9 this.surveyService.updateSurvey(model); 10 return "toDesignSurveyPageAction"; 11 }
从上面的代码中能够看出来,上传文件之后,保存到数据库中的是文件路径,而且是相对路径。
5.在设计调查页面上使用相对应的代码将图片显示出来。
<!-- 在这里加上一个logo标识 --> <s:if test="isLogoImageExists()"> <img width="40px" alt="这是logo标识" src="<s:url value='%{logoPath}'/>"/> </s:if> <s:else> <!-- 如果图片不存在,则什么都不显示 --> </s:else>
这里调用了SurveyAction中的一个方法isLogoImageExists(),要注意,这个方法必须写在SurveyAction中,在struts2中支持直接调用Action中的方法,但是如果想要调用自定义工具类中的方法,就需要换一种写法,而且必须配置struts2中的配置文件使其支持静态调用才行。
6.SurveyAction中的判断logo是否存在的方法。
1 //一个方法专门判断上传的文件是否存在! 2 public boolean isLogoImageExists() throws Exception{ 3 String fileName=this.model.getLogoPath(); 4 File file=new File(sc.getRealPath(fileName)); 5 return file.exists(); 6 }
当然这里并没有指定默认的logo,在参与调查页面中我指定了一个默认的logo,否则太难看了。
7.文件上传的要点在上面已经差不多说完了,但是上面说的只是没有异常情况发生一切正常的情况下才能正常运行,必须采取一定的措施防止异常情况的发生。
(1)通过修改文件上传拦截器对文件的上传类型、文件上传扩展名、文件上传大小进行限制。因为在struts.xml文件中已经重新制定了新默认拦截器栈,所以如果想要修改文件上传拦截器,一定要是新的拦截器栈,而不是之前的默认的拦截器栈,完整配置文件内容如下。
1 <?xml version="1.0" encoding="utf-8" ?> 2 <!-- <!DOCTYPE struts SYSTEM "file:\\\D:\程序\java\struts2\dtd\struts-2.3.dtd"> --> 3 <!DOCTYPE struts PUBLIC 4 "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN" 5 "file:\\\D:\程序\java\struts2\dtd\struts-2.3.dtd"> 6 <struts> 7 <package name="surveyPackage" namespace="/" extends="surveyparkPackage"> 8 <action name="SurveyAction_*" class="com.kdyzm.struts.action.SurveyAction" method="{1}"> 9 <result name="toMySurveyPageAction" type="redirectAction"> 10 <param name="actionName">SurveyAction_toMySurveyPage.action</param> 11 <param name="namespace">/</param> 12 </result> 13 <result name="toMySurveyPage">/survey/showMySurveyPage.jsp</result> 14 <result name="designSurveyPage">/survey/designSurveyPage.jsp</result> 15 <result name="toEditSurveyPage">/survey/eidtSurveyPage.jsp</result> 16 <result name="toUploadLogoPage">/survey/updateLogoPage.jsp</result> 17 <result name="input">/survey/updateLogoPage.jsp</result> 18 <interceptor-ref name="surveyparkStack"> 19 <!-- <param name="fileUpload.maximumSize">60000</param> --> 20 <param name="fileUpload.allowedExtensions">.jpg,.jpeg,.png,.gif,.bmp</param> 21 <param name="fileUpload.allowedTypes">image/jpg,image/jpeg,image/pjpeg,image/bmp,image/gif,image/png</param> 22 <param name="fileUpload.useActionMessageBundle">true</param><!--这个是告诉拦截器需要到Action所在目录找资源文件--> 23 </interceptor-ref> 24 </action> 25 </package> 26 </struts>
(2)指定错误页
<result name="input">/survey/updateLogoPage.jsp</result>
这样在文件上传不满足指定条件的时候就会自动跳转到指定的错误页上去了。
8.虽然通过7已经完成了对异常情况的处理,但是错误页上显示的信息都是英文,一般人看不懂,需要对信息进行国际化处理。
国际化的步骤:
打开struts2-core-2.3.1.2.jar
|---org.apache.struts2
|---struts-messages.properties
文件,在该文件中保存了所有的默认提示信息,将文件上传的几个重要信息拷贝出来。
我们只需要用到上面的三条信息。
在和SurveyAction同目录下创建一个SurveyAciton_zh_CN.properties文件,将上面的三条信息拷贝进去。然后重写写值部分,由于是中文,所以如果直接写会直接被编码,被编码是正确的,否则还要手动编码。网上有很多是编码失败的,我也不明白为什么直接写中文之后会直接被正确编码,但是在jsp页面中显示的时候就是中文了,我也没有使用其它方式手动编码,大概是我用的eclipse是比较新的版本的缘故吧。
当然千万不能忘了需要修改文件上传拦截器让其和Action所在的文件夹中找和Action名字匹配的资源文件,配置方式:
<param name="fileUpload.useActionMessageBundle">true</param>
这个实际上在之前的配置文件中已经显示出来了,但是之前没有提为什么要这么配置。
9.上传logo全部细节已经搞定,下面是测试的界面
(1)单击增加logo按钮
(2)选择文件
当然,上面的文件学则错误了,看看有什么提示
(3)错误提示
当然,是文件类型和扩展名都不允许,但是文件类型不允许的配置提示在前,所以首先显示这条信息。
(4)如果上传成功直接跳转到设计调查的页面并将logo显示出来。