增长logo的技术点:文件上传,国际化java
文件上传的功能在struts2中是使用文件上传拦截器完成的。数据库
1.首先须要在页面上添加一个文件上传的超连接。apache
点击该超连接可以跳转到文件上传页面。我给该表单页面中的field字段使用了logo做为名字,即name=logo。服务器
2.在SurveyAction中进行表单的接收。接收的类型包括文件名、文件类型和文件自己,以方便处理,给每一个字段都提供了set/get方法。dom
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工做流项目实战中),可是上一个工具类返回的是文件自己。eclipse
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中书写上传逻辑。jsp
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中的配置文件使其支持静态调用才行。this
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显示出来。