Struts2基础知识(二)
生活随笔
收集整理的這篇文章主要介紹了
Struts2基础知识(二)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本文主要包括以下內容
文件上傳
- 將頭設置為enctype=”multipart/form-data”
- 寫接收處理的方法,有兩種,一種是自己實現IO流,一種是使用FileUtils
多文件上傳實現
package cn.itcast.action;import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.io.Serializable;import javax.servlet.ServletContext;import org.apache.commons.io.FileUtils; import org.apache.struts2.ServletActionContext;import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport;public class UploadAction2 extends ActionSupport implements Serializable {private File[] images;//對應的就是表單中文件上傳的那個輸入域的名稱,Struts2框架會封裝成File類型的private String[] imagesFileName;// 上傳輸入域FileName 文件名private String[] imagesContentType;// 上傳文件的MIME類型public File[] getImages() {return images;}public void setImages(File[] images) {this.images = images;}public String[] getImagesFileName() {return imagesFileName;}public void setImagesFileName(String[] imagesFileName) {this.imagesFileName = imagesFileName;}public String[] getImagesContentType() {return imagesContentType;}public void setImagesContentType(String[] imagesContentType) {this.imagesContentType = imagesContentType;}public String execute(){try {if(images!=null&&images.length>0){ServletContext sc = ServletActionContext.getServletContext();String storePath = sc.getRealPath("/files");for(int i=0;i<images.length;i++)FileUtils.copyFile(images[i], new File(storePath,imagesFileName[i]));}ActionContext.getContext().put("message", "上傳成功!");return SUCCESS;} catch (Exception e) {e.printStackTrace();return ERROR;}} }自定義攔截器
1、編寫一個類,實現 com.opensymphony.xwork2.interceptor.Interceptor
2、主要實現public String intercept(ActionInvocation invocation) throws Exception{}方法
該方法的返回值就相當于動作的返回值如果調用了String result = invocation.invoke();得到了動作類的返回的值。public String intercept(ActionInvocation invocation) throws Exception {//判斷用戶是否登錄HttpSession session = ServletActionContext.getRequest().getSession();Object obj = session.getAttribute("user");if(obj==null){return "login";}else{return invocation.invoke();//調用動作方法}}3、攔截器定義好后,一定要在配置文件中進行注冊:
<interceptors> 只是定義攔截器,并沒有起作用 <interceptor name="permissionInterceptor" class="cn.itcast.interceptor.PermissionInterceptor"></interceptor></interceptors>4、配置文件中的動作,要通過
<interceptor-ref name="permissionInterceptor"></interceptor-ref>使用該攔截器注意:一旦動作中使用了自定義的攔截器,那么默認的就不起作用了。一般應該采用如下的做法:
<interceptor-ref name="defaultStack"></interceptor-ref><interceptor-ref name="permissionInterceptor"></interceptor-ref>多個動作類都要使用的話,可以通過package來進行組合。
<package name="mypackage" extends="struts-default"><interceptors> <!-- 只是定義攔截器,并沒有起作用 --><interceptor name="permissionInterceptor" class="cn.itcast.interceptor.PermissionInterceptor"></interceptor><interceptor-stack name="mydefaultstack"><interceptor-ref name="defaultStack"></interceptor-ref><interceptor-ref name="permissionInterceptor"></interceptor-ref></interceptor-stack></interceptors><!-- 配置全局錯誤結果 :范圍只是本包--><global-results><result type="dispatcher" name="error">/customer/error.jsp</result></global-results></package><package name="interceptor" extends="mypackage"><action name="visitIndex" class="cn.itcast.action.VisitAction" method="execute"><interceptor-ref name="mydefaultstack"></interceptor-ref><result name="success">/index.jsp</result><result name="login">/login.jsp</result></action></package>用戶輸入驗證
1、編程方式:
動作類中的所有方法進行驗證:步驟:a、動作類繼承ActionSupportb、覆蓋調用public void validate()方法c、在validate方法中,編寫不符合要求的代碼判斷,并調用父類的addFieldError(String fieldName,String errorMessage)如果fieldError(存放錯誤信息的Map)有任何的元素,就是驗證不通過,動作方法不會執行。Struts2框架會返回到name=input的resultd、在name=input指定的頁面上使用struts2的標簽顯示錯誤信息。<s:fielderror/>動作類中指定的方法進行驗證:編寫步驟與上面相同驗證方法書寫有要求:public void validateXxx() Xxx代表的是要驗證的動作方法名,其中要把動作方法名的首字母變為大寫。2、基于XML配置文件的方式:
動作類中的所有方法進行驗證:在動作類的包中,建立一個名稱為:動作簡單類名-validation.xml ,比如要驗證的動作類名是UserAction UserAction-validation.xml內容如下:<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE 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"><!-- 內置驗證器都是定義好的,在xwork-core.jar com.opensymphony.xwork2.validator.validators包中的default.xml文件中 --><field-validator type="requiredstring"><!-- 不能為null或者""字符串,默認會去掉前后的空格 --><message>用戶名不能為空</message></field-validator></field></validators>動作類中指定的方法進行驗證:配置文件的名稱書寫有一定要求。動作類名-動作名(配置文件中的動作名)-validation.xmlUserAction-user_add-validation.xml3、自定義基于XML的驗證器
a、編寫一個類,繼承FieldValidatorSupport類。b、在public void validate(Object object)編寫你的驗證邏輯不符合要求的就向fieldErrors中放消息c、一定注冊你的驗證器才能使用在WEB-INF/classes目錄下建立一個名稱為validators.xml的配置文件,內容如下:<validators><validator name="strongpassword" class="cn.itcast.validators.StrongPasswordValidator"/></validators>d、日后就可以像使用Struts2提供的16個驗證器方式去使用了。實例
package cn.itcast.validators;import com.opensymphony.xwork2.validator.ValidationException; import com.opensymphony.xwork2.validator.validators.FieldValidatorSupport;public class StrongPasswordValidator extends FieldValidatorSupport {public void validate(Object object) throws ValidationException {String fieldName = getFieldName();//取得字段名String filedValue = (String)getFieldValue(fieldName, object);//取得用戶輸入的當前字段的值if(!isPasswordStrong(filedValue)){addFieldError(fieldName, object);}}private static final String GROUP1 = "abcdefghijklmnopqrstuvwxyz";private static final String GROUP2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";private static final String GROUP3 = "0123456789";protected boolean isPasswordStrong(String password) {boolean ok1 = false;boolean ok2 = false;boolean ok3 = false;int length = password.length();for(int i=0;i<length;i++){if(ok1&&ok2&&ok3)break;String character = password.substring(i,i+1);if(GROUP1.contains(character)){ok1 = true;continue;}if(GROUP2.contains(character)){ok2 = true;continue;}if(GROUP3.contains(character)){ok3 = true;continue;}}return ok1&&ok2&&ok3;} }Struts2對于i18n的支持
全局資源文件/包范圍資源文件/動作類的資源文件全局資源文件:放到WEB-INF/classes目錄下包范圍資源文件:服務于Java類中的包下的動作類的。 取名:package_語言_國家.properties動作類的資源文件:放到與動作類相同的包中取名:動作類名_語言_國家.propertiesjsp中如何讀取國際化的消息
<body><s:i18n name="itcast"><s:text name="welcome"><s:param>yr</s:param><s:param>study</s:param></s:text></s:i18n><s:i18n name="cn/itcast/action/package"><s:text name="welcome"><s:param>wxy</s:param><s:param>find boy friend</s:param></s:text></s:i18n></body>動作類中如何讀取國際化的消息
public class I18nAction extends ActionSupport implements Serializable {public String execute(){//取出資源文件中的welcome的值 // String value = getText("welcome");String value = getText("welcome", new String[]{"朱巧玲","學習"});//封裝到請求范圍中ActionContext.getContext().put("message", value);return SUCCESS;} }完成
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的Struts2基础知识(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java之代理设计模式
- 下一篇: 冈萨雷斯《数字图像处理》读书笔记(九)—