一、存取或新增request/session/application屬性
public String scope() throws Exception{
ActionContext ctx = ActionContext.getContext();
ctx.getApplication().put("app", "應用範圍");//往ServletContext放入app
ctx.getSession().put("ses", "session範圍");//往session裡放入ses
ctx.put("req", "request範圍");//往request裡放入req
return "scope";
}
JSP:
<body>
${applicationScope.app} <br>
${sessionScope.ses}<br>
${requestScope.req}<br>
</body>
二、取得HttpServletRequest / HttpSession / ServletContext / HttpServletResponse對象
方法一,透過ServletActionContext.類別直接取得:
public String rsa() throws Exception{
HttpServletRequest request = ServletActionContext.getRequest();
ServletContext servletContext = ServletActionContext.getServletContext();
request.getSession()
HttpServletResponse response = ServletActionContext.getResponse();
return "scope";
}
方法二,實作指定接口,由struts框架運行時注入:
public class HelloWorldAction implements ServletRequestAware, ServletResponseAware, ServletContextAware{
private HttpServletRequest request;
private ServletContext servletContext;
private HttpServletResponse response;
public void setServletRequest(HttpServletRequest req) {
this.request=req;
}
public void setServletResponse(HttpServletResponse res) {
this.response=res;
}
public void setServletContext(ServletContext ser) {
this.servletContext=ser;
}
}
三、文件上傳
第一步:在WEB-INF/lib下加入commons-fileupload-1.2.1.jar、commons-io-1.3.2.jar。這兩個檔案可以從http://commons.apache.org/下載。
第二步:把form表的enctype設定為:「multipart/form-data“,如下:
<form enctype="multipart/form-data" action="${pageContext.request.contextPath}/xxx.action" method="post">
<input type="file" name="uploadImage">
</form>
第三步:在Action類別中加入以下屬性,屬性紅色部分對應表單中檔案欄位的名稱:
public class HelloWorldAction{
private File uploadImage;//得到上傳的文件
private String uploadImageContentType;//取得檔案的類型
private String uploadImageFileName;//取得檔案的名稱
//這裡略省了屬性的getter/setter方法
public String upload() throws Exception{
String realpath = ServletActionContext.getServletContext().getRealPath("/images");
File file = new File(realpath);
if(!file.exists()) file.mkdirs();
FileUtils.copyFile(uploadImage, new File(file, uploadImageFileName));
return "success";
}
}
四、多文件上傳
第一步:在WEB-INF/lib下加入commons-fileupload-1.2.1.jar、commons-io-1.3.2.jar。這兩個檔案可以從http://commons.apache.org/下載。
第二步:把form表的enctype設定為:「multipart/form-data“,如下:
<form enctype="multipart/form-data" action="${pageContext.request.contextPath}/xxx.action" method="post">
<input type="file" name="uploadImages">
<input type="file" name="uploadImages">
</form>
第三步:在Action類別中加入以下屬性,屬性紅色部分對應表單中檔案欄位的名稱:
public class HelloWorldAction{
private File[] uploadImages;//得到上傳的文件
private String[] uploadImagesContentType;//得到檔案的類型
private String[] uploadImagesFileName;//取得檔案的名稱
//這裡略省了屬性的getter/setter方法
public String upload() throws Exception{
String realpath = ServletActionContext.getServletContext().getRealPath("/images");
File file = new File(realpath);
if(!file.exists()) file.mkdirs();
for(int i=0 ;i<uploadImages.length; i++){ File uploadImage = uploadImages[i];
FileUtils.copyFile(uploadImage, new File(file, uploadImagesFileName[i]));
}
return "success";
}}
五、自訂攔截器
要自訂攔截器需要實作com.opensymphony.xwork2.interceptor.Interceptor介面:
public class PermissionInterceptor implements Interceptor {
private static final long serialVersionUID = -5178310397732210602L;
public void destroy() {
}
public void init() {
}
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println("進入攔截器");
if(session裡存在用戶){
String result = invocation.invoke();
}else{
return “logon”;
}
//System.out.println("傳回值:"+ result);
//return result;
}
}
<package name="csdn" namespace="/test" extends="struts-default">
<interceptors>
<interceptor name=“permission" />
<interceptor-stack name="permissionStack">
<interceptor-ref name="defaultStack" />
<interceptor-ref name=" permission " />
</interceptor-stack>
</interceptors>
<action name="helloworld_*" method="{1}">
<result name="success">/WEB-INF/page/hello.jsp</result>
<interceptor-ref name="permissionStack"/>
</action>
</package>
因為struts2中如檔案上傳,資料驗證,封裝請求參數到action等功能都是由系統預設的defaultStack中的攔截器實現的,所以我們定義的攔截器需要引用系統預設的defaultStack,這樣應用才可以使用struts2框架提供的眾多功能。
如果希望套件下的所有action都使用自訂的攔截器,可以透過<default-interceptor-ref name=「permissionStack」/>定義攔截器為預設攔截器。注意:每個包只能指定一個預設攔截器。另外,一旦我們為該包中的某個action明確指定了某個攔截器,則預設攔截器不會起作用。
六、輸入校驗
在struts2中,我們可以實作對action的所有方法進行校驗或對action的指定方法進行校驗。
對於輸入校驗struts2提供了兩種實作方法:
1. 採用手工編寫程式碼實作。
2. 基於XML配置方式實作。
七、手工編寫程式碼實作對action中所有方法輸入校驗
透過重寫validate() 方法實現,validate()方法會校驗action中所有與execute方法簽章相同的方法。當某個資料校驗失敗時,我們應該呼叫addFieldError()方法往系統的fieldErrors新增校驗失敗訊息(為了使用addFieldError()方法,action可以繼承ActionSupport ),如果系統的fieldErrors包含失敗訊息,struts2會將請求轉送到名為input的result。在input視圖中可以透過<s:fielderror/>顯示失敗訊息。
validate()使用範例:
public void validate() {
if(this.mobile==null || "".equals(this.mobile.trim())){ this.addFieldError("username", "手機號碼不能為空");
}else{ if(!Pattern.compile("^1[358]//d{9}").matcher(this.mobile.trim()).matches()){
this.addFieldError(“mobile", "手機號碼的格式不正確"); }
}
}
驗證失敗後,請求轉送至input視圖:
<result name="input">/WEB-INF/page/addUser.jsp</result>
在addUser.jsp頁面中使用<s:fielderror/>顯示失敗訊息。
透過validateXxx()方法實現,validateXxx()只會校驗action中方法名為Xxx的方法。其中Xxx的第一個字母要大寫。當某個資料校驗失敗時,我們應該呼叫addFieldError()方法往系統的fieldErrors新增校驗失敗訊息(為了使用addFieldError()方法,action可以繼承ActionSupport ),如果系統的fieldErrors包含失敗訊息,struts2會將請求轉送到名為input的result。在input視圖中可以透過<s:fielderror/>顯示失敗訊息。
validateXxx()方法使用範例:
public String add() throws Exception{ return "success";}
public void validateAdd(){
if(username==null && "".equals(username.trim())) this.addFieldError("username", "使用者名稱不能為空");
}
驗證失敗後,請求轉送至input視圖:
<result name="input">/WEB-INF/page/addUser.jsp</result>
在addUser.jsp頁面中使用<s:fielderror/>顯示失敗訊息。
八、輸入校驗的流程
1.型別轉換器對請求參數執行型別轉換,並把轉換後的值賦給action中的屬性。
2.如果在執行類型轉換的過程中出現異常,系統會將異常訊息儲存到ActionContext,conversionError攔截器將異常訊息加入fieldErrors。不管類型轉換是否出現異常,都會進入第3步。
3.系統透過反射技術先呼叫action中的validateXxx()方法,Xxx為方法名稱。
4、再呼叫action中的validate()方法。
5.經過上面4步,如果系統中的fieldErrors存在錯誤訊息(即存放錯誤訊息的集合的size大於0),系統會自動將請求轉送至名稱為input的視圖。如果系統中的fieldErrors沒有任何錯誤訊息,系統將執行action中的處理方法。
九、基於XML配置方式實作對action的所有方法進行輸入校驗
使用基於XML設定方式實作輸入校驗時,Action也需要繼承ActionSupport,並且提供校驗文件,校驗文件和action類別放在同一個套件下,文件的取名格式為:ActionClassName-validation.xml,其中ActionClassName為action的簡單類別名,-validation為固定寫法。如果Action類別為cn.csdn.UserAction,那麼該檔案的取名應為:UserAction-validation.xml。下面是校驗檔的模版:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.3//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd">
<validators>
<field name="username">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>使用者名稱不能為空!</message>
</field-validator>
</field>
</validators>
<field>指定action中要校驗的屬性,<field-validator>指定校驗器,上面指定的校驗器requiredstring是由系統提供的,系統提供了能滿足大部分驗證需求的校驗器,這些校驗器的定義可以在xwork-2.x.jar中的com.opensymphony.xwork2.validator.validators下的default.xml中找到。
<message>為校驗失敗後的提示訊息,如果需要國際化,可以為message指定key屬性,key的值為資源檔案中的key。
在這個校驗檔案中,對action中字串類型的username屬性進行驗證,首先要求呼叫trim()方法去掉空格,然後判斷使用者名稱是否為空。
編寫校驗文件時,不能出現幫助資訊在編寫ActionClassName-validation.xml校驗文件時,如果出現不了幫助資訊,可以按下面方式解決:
windwos->preferences->myeclipse->files and editors->xml->xmlcatalog
點「add」,在出現的視窗中的location中選「File system」,然後在xwork-2.1.2解壓縮目錄的src/java目錄中選擇xwork-validator-1.0.3.dtd,回到設定視窗的時候不要急著關閉視窗,應把視窗中的Key Type改為URI 。 Key改為http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd