詳解Java的Struts框架中上傳文件和客戶端驗證的實現(xiàn)
文件上傳
Struts 2框架提供了內(nèi)置支持處理文件上傳使用基于HTML表單的文件上傳。上傳一個文件時,它通常會被存儲在一個臨時目錄中,他們應(yīng)該由Action類進(jìn)行處理或移動到一個永久的目錄,以確保數(shù)據(jù)不丟失。
請注意,服務(wù)器有一個安全策略可能會禁止寫到目錄以外的臨時目錄和屬于web應(yīng)用的目錄。
在Struts中的文件上傳是通過預(yù)先定義的攔截文件上傳攔截器這是可通過org.apache.struts2.interceptor.FileUploadInterceptor類的defaultStack中的一部分。仍然可以使用在struts.xml中設(shè)置各種參數(shù),我們將在下面看到。
創(chuàng)建視圖文件:
讓我們開始創(chuàng)建我們認(rèn)為這將需要瀏覽和上傳選定的文件。因此,讓我們創(chuàng)建一個純HTML上傳表單,允許用戶上傳文件 index.jsp:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ taglib prefix="s" uri="/struts-tags"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>File Upload</title> </head> <body> <form action="upload" method="post" enctype="multipart/form-data"> <label for="myFile">Upload your file</label> <input type="file" name="myFile" /> <input type="submit" value="Upload"/> </form> </body> </html>
在上面的例子中值得注意幾點說明。首先,表單的enctype屬性設(shè)置為multipart/ form-data。這應(yīng)該是設(shè)置為使得處理文件上傳文件上傳。下一個點值得注意的是表單的 action方法上傳和文件上傳字段的名稱 - myFile。我們需要這些信息創(chuàng)建操作方法和struts配置。
接下來讓我們創(chuàng)建一個簡單的 jsp 文件的success.jsp 結(jié)果顯示我們的文件上傳的情況下成功。
<%@ page contentType="text/html; charset=UTF-8" %> <%@ taglib prefix="s" uri="/struts-tags" %> <html> <head> <title>File Upload Success</title> </head> <body> You have successfully uploaded <s:property value="myFileFileName"/> </body> </html>
下面將結(jié)果文件error.jsp 可能會有一些錯誤,在上傳文件:
<%@ page contentType="text/html; charset=UTF-8" %> <%@ taglib prefix="s" uri="/struts-tags" %> <html> <head> <title>File Upload Error</title> </head> <body> There has been an error in uploading the file. </body> </html>
創(chuàng)建action類:
接下來讓我們創(chuàng)建一個Java類稱為 uploadFile.java 這會處理上傳文件,該文件存儲在一個安全的位置:
package com.yiibai.struts2; import java.io.File; import org.apache.commons.io.FileUtils; import java.io.IOException; import com.opensymphony.xwork2.ActionSupport; public class uploadFile extends ActionSupport{ private File myFile; private String myFileContentType; private String myFileFileName; private String destPath; public String execute() { /* Copy file to a safe location */ destPath = "C:/apache-tomcat-6.0.33/work/"; try{ System.out.println("Src File name: " + myFile); System.out.println("Dst File name: " + myFileFileName); File destFile = new File(destPath, myFileFileName); FileUtils.copyFile(myFile, destFile); }catch(IOException e){ e.printStackTrace(); return ERROR; } return SUCCESS; } public File getMyFile() { return myFile; } public void setMyFile(File myFile) { this.myFile = myFile; } public String getMyFileContentType() { return myFileContentType; } public void setMyFileContentType(String myFileContentType) { this.myFileContentType = myFileContentType; } public String getMyFileFileName() { return myFileFileName; } public void setMyFileFileName(String myFileFileName) { this.myFileFileName = myFileFileName; } }
uploadFile.java是一個非常簡單的類。重要的是要注意的是使用FileUpload攔截器隨著參數(shù)Intercetpor 確實為我們解決所有繁重工作。文件上傳攔截器,使三個參數(shù),默認(rèn)情況下提供。它們被命名為以下模式:
[your file name parameter] - 這是實際的文件的上載。在這個例子中是 "myFile"
[your file name parameter]ContentType - 這是被上傳的文件,該文件的內(nèi)容類型。在這個例子中是 "myFileContentType"
[your file name parameter]FileName - 這是被上傳的文件的名稱。在這個例子中是 "myFileFileName"
這三個參數(shù)是為我們提供的,這要歸功于Struts的攔截器。所有我們需要做的是在我們的Action類,這些變量是自動連線我們以正確的名稱創(chuàng)建三個參數(shù)。所以,在上面的例子中,我們有三個參數(shù)的操作方法簡單地返回“success”,如果一切順利,否則返回“error”。
配置文件:
以下是Struts2的配置屬性可以控制文件上傳過程:
為了改變這些設(shè)置,可以使用恒定的標(biāo)簽在應(yīng)用程序 struts.xml文件,像我一樣改變要上傳的文件的最大大小。讓我們有我們的在struts.xml如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <constant name="struts.devMode" value="true" /> <constant name="struts.multipart.maxSize" value="1000000" /> <package name="helloworld" extends="struts-default"> <action name="upload" class="com.yiibai.struts2.uploadFile"> <result name="success">/success.jsp</result> <result name="error">/error.jsp</result> </action> </package> </struts>
由于FileUpload攔截器是攔截器defaultStack的一部分,我們并不需要明確地配置。但可以添加<interceptor-ref>標(biāo)簽到<action>里面。文件上傳攔截器需要兩個參數(shù):(a)maximumSize及(b)allowedTypes。maximumSize參數(shù)設(shè)置允許的最大文件大?。J(rèn)為約2MB)。allowedTypes參數(shù)接受的內(nèi)容是一個逗號分隔的列表(MIME)類型,如下所示:
<action name="upload" class="com.yiibai.struts2.uploadFile"> <interceptor-ref name="basicStack"> <interceptor-ref name="fileUpload"> <param name="allowedTypes">image/jpeg,image/gif</param> </interceptor-ref> <result name="success">/success.jsp</result> <result name="error">/error.jsp</result> </action>
以下是web.xml文件中的內(nèi)容:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>Struts 2</display-name> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <filter> <filter-name>struts2</filter-name> <filter-class> org.apache.struts2.dispatcher.FilterDispatcher </filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
現(xiàn)在右鍵點擊項目名稱,并單擊 Export > WAR File 創(chuàng)建一個WAR文件。然后部署此WAR在Tomcat 的webapps目錄下。最后,啟動Tomcat服務(wù)器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/upload.jsp。這會給出以下畫面:
現(xiàn)在選擇一個文件的“Contacts.txt”使用“瀏覽”按鈕,然后點擊上傳按鈕,將文件上傳,應(yīng)該看到頁面。可以檢查上傳的文件保存在 C:apache-tomcat-6.0.33work.
請注意,使用FileUpload攔截刪除上傳的文件自動所以需要編程在一些位置上保存上傳的文件被刪除之前。
錯誤消息:
fileUplaod攔截器使用幾個默認(rèn)的錯誤消息鍵:
驗證框架
現(xiàn)在,我們將看看如何的Struts驗證框架。在Struts的核心有驗證框架,協(xié)助應(yīng)用程序的運行規(guī)則來執(zhí)行驗證執(zhí)行之前的操作方法。
通常是使用Javascript來實現(xiàn)客戶端驗證。但不應(yīng)單獨依賴于客戶端驗證。最佳實踐表明,驗證應(yīng)引入各級應(yīng)用程序框架?,F(xiàn)在,讓我們來看看兩種方式添加驗證我們的Struts項目。
在這里,我們將采取一個例子,Employee 將被捕獲的姓名和年齡使用一個簡單的頁面,我們將會把兩個驗證,以確保使用總是進(jìn)入一個名字和年齡應(yīng)該是在28和65之間。所以,讓我們先從主JSP頁面的例子。
創(chuàng)建主頁面:
讓我們寫主JSP頁面文件的index.jsp,這將被用來收集上述員工的相關(guān)信息。
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ taglib prefix="s" uri="/struts-tags"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>Employee Form</title> </head> <body> <s:form action="empinfo" method="post"> <s:textfield name="name" label="Name" size="20" /> <s:textfield name="age" label="Age" size="20" /> <s:submit name="submit" label="Submit" align="center" /> </s:form> </body> </html>
在index.jsp使用Struts的標(biāo)簽,我們還沒有涉及,但我們將研究這些標(biāo)簽相關(guān)的章節(jié)。但現(xiàn)在,假設(shè) s:textfield 標(biāo)簽打印一個輸入字段s:submit打印一個提交按鈕。我們已經(jīng)使用label屬性標(biāo)簽,每個標(biāo)簽每個標(biāo)簽創(chuàng)建。
創(chuàng)建視圖:
我們將使用JSP文件的success.jsp將調(diào)用的情況下定義的動作返回SUCCESS。
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ taglib prefix="s" uri="/struts-tags"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>Success</title> </head> <body> Employee Information is captured successfully. </body> </html>
創(chuàng)建動作:
因此,讓我們定義一個小小的動作類Employee,然后添加一個方法稱為validate(),如下所示在Employee.java文件。請確保操作類擴(kuò)展ActionSupport類,否則validate方法將不會被執(zhí)行。
package com.yiibai.struts2; import com.opensymphony.xwork2.ActionSupport; public class Employee extends ActionSupport{ private String name; private int age; public String execute() { return SUCCESS; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public void validate() { if (name == null || name.trim().equals("")) { addFieldError("name","The name is required"); } if (age < 28 || age > 65) { addFieldError("age","Age must be in between 28 and 65"); } } }
如在上面的例子所示,“Name”字段的驗證方法檢查是否有一個值,或不。如果沒有值已經(jīng)提供,我們添加一個帶有自定義錯誤消息“Age”字段的字段錯誤。其次,我們檢查,如果輸入的值是在28和65之間或不為“Age”字段,如果這個條件不符合我們以上驗證字段添加一個錯誤。
配置文件:
最后,讓我們把所有東西一起使用struts.xml的配置文件如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <constant name="struts.devMode" value="true" /> <package name="helloworld" extends="struts-default"> <action name="empinfo" class="com.yiibai.struts2.Employee" method="execute"> <result name="input">/index.jsp</result> <result name="success">/success.jsp</result> </action> </package> </struts>
以下是web.xml文件中的內(nèi)容:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>Struts 2</display-name> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <filter> <filter-name>struts2</filter-name> <filter-class> org.apache.struts2.dispatcher.FilterDispatcher </filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
現(xiàn)在,右鍵點擊項目名稱,并單擊Export > WAR File創(chuàng)建一個WAR文件。然后部署此WAR在Tomcat的webapps目錄下。最后,啟動Tomcat服務(wù)器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/index.jsp。這會給出以下畫面:
現(xiàn)在不輸入任何所需信息,只需點擊“Submit ”按鈕。將看到以下結(jié)果:
輸入所需的信息,但輸入了錯誤的From字段,讓我們說“test”和年齡為30,最后點擊“Submit ”按鈕。將看到以下結(jié)果:
此驗證是如何工作的?
當(dāng)用戶按下提交按鈕時,Struts2會自動執(zhí)行的驗證方法,如果任何一個if語句里面的方法列出,Struts 2調(diào)用addFieldError方法。如果有任何錯誤已加入Struts 2將不會進(jìn)行調(diào)用execute方法。而Struts 2框架將返回輸入作為調(diào)用該行動的結(jié)果。
因此,驗證失敗時Struts2返回輸入,Struts 2框架將重新顯示index.jsp文件。因為我們使用了Struts 2的表單標(biāo)簽,Struts2中會自動添加錯誤消息,只是上面的形式提交。
這些錯誤消息是我們addFieldError方法調(diào)用中指定的。addFieldError方法有兩個參數(shù)。首先是表單字段名錯誤,第二個是錯誤信息,上面顯示該表單字段。
addFieldError("name","The name is required");
要處理的返回值輸入,我們需要添加以下的結(jié)果,以我們的動作節(jié)點在struts.xml。
<result name="input">/index.jsp</result>
基于XML的驗證:
在進(jìn)行驗證的第二個方法是通過將一個xml文件的動作類。Struts2的基于XML驗證的驗證提供了更多的選擇,如電子郵件驗證,整數(shù)范圍驗證,表單驗證字段,表達(dá)式驗證,正則表達(dá)式驗證,需要驗證,驗證所需的字符串,字符串長度的驗證等。
XML文件需要被命名為'[action-class]'-validation.xml。所以,在我們的例子中,我們創(chuàng)建一個文件,名為 Employee-validation.xml包含以下內(nèi)容:
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd"> <validators> <field name="name"> <field-validator type="required"> <message> The name is required. </message> </field-validator> </field> <field name="age"> <field-validator type="int"> <param name="min">29</param> <param name="max">64</param> <message> Age must be in between 28 and 65 </message> </field-validator> </field> </validators>
上面的XML文件會被保存在CLASSPATH 沿著類文件。讓我們有我們的雇員動作類沒有validate()方法如下:
package com.yiibai.struts2; import com.opensymphony.xwork2.ActionSupport; public class Employee extends ActionSupport{ private String name; private int age; public String execute() { return SUCCESS; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
其余的設(shè)置將保持,因為它是我前面的例子,現(xiàn)在,如果運行應(yīng)用程序,它會產(chǎn)生相同的結(jié)果是什么,我們在前面的例子:
xml文件來存儲配置的優(yōu)點是允許的驗證從應(yīng)用程序代碼的分離。可以讓開發(fā)人員編寫的代碼和業(yè)務(wù)分析師建立驗證xml文件。要注意的是另一件事是默認(rèn)提供的驗證類型。有大量的驗證,默認(rèn)情況下,使用Struts。常見的驗證包括驗證日期,正則表達(dá)式驗證字符串長度的驗證。檢查以下鏈接更多細(xì)節(jié) Struts - 基于XML的校驗.
相關(guān)文章
TraceIdPatternLogbackLayout日志攔截源碼解析
這篇文章主要為大家介紹了TraceIdPatternLogbackLayout日志攔截源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11java中的FileReader和FileWriter讀寫流
這篇文章主要介紹了java中的FileReader和FileWriter讀寫流,在java中對數(shù)據(jù)輸入輸出的操作陳作為流我們對不同的文件進(jìn)行操作,或者對操作文件進(jìn)行輸入和輸出時所用的流都是不同的,因此在java.io的包下存在很多流的類或者接口提供給我們對應(yīng)的操作,需要的朋友可以參考下2023-10-10關(guān)于IDEA使用jsp可以訪問頁面轉(zhuǎn)換為html彈出頁面為404的問題
這篇文章主要介紹了關(guān)于IDEA使用jsp可以訪問頁面轉(zhuǎn)換為html彈出頁面為404的問題及解決方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12Spring3 整合MyBatis3 配置多數(shù)據(jù)源動態(tài)選擇SqlSessionFactory詳細(xì)教程
這篇文章主要介紹了Spring3 整合MyBatis3 配置多數(shù)據(jù)源動態(tài)選擇SqlSessionFactory詳細(xì)教程,需要的朋友可以參考下2017-04-044位吸血鬼數(shù)字的java實現(xiàn)思路與實例講解
今天小編就為大家分享一篇關(guān)于4位吸血鬼數(shù)字的java實現(xiàn)思路與實例講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-03-03有關(guān)ServletConfig與ServletContext的訪問
下面小編就為大家?guī)硪黄嘘P(guān)ServletConfig與ServletContext的訪問。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-01-01