增長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顯示出來。