亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

關于Struts2文件上傳與自定義攔截器

2019-11-26 16:12:22
字體:
來源:轉載
供稿:網友

一、訪問或添加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" class="cn.csdn.aop.PermissionInterceptor" />
           <interceptor-stack name="permissionStack">
    <interceptor-ref name="defaultStack" />
   <interceptor-ref name=" permission " />
            </interceptor-stack>
  </interceptors>
 <action name="helloworld_*" class="cn.csdn.action.HelloWorldAction" 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 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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美国产视频| 日韩美女视频中文字幕| 精品久久久久国产| 伊人久久综合97精品| 日本不卡免费高清视频| 欧美一级成年大片在线观看| 欧美日韩免费在线观看| 亚洲精品v天堂中文字幕| 久久伊人精品天天| 久久影视电视剧免费网站清宫辞电视| 国产精品电影久久久久电影网| 国产91对白在线播放| 欧美激情xxxx| 国产香蕉一区二区三区在线视频| 精品久久中文字幕久久av| 中文字幕日韩综合av| 亚洲aⅴ日韩av电影在线观看| 国产不卡av在线免费观看| 久久精品国产亚洲一区二区| 疯狂做受xxxx高潮欧美日本| 欧美激情视频一区| 国产精品网站入口| 欧美一级免费视频| zzijzzij亚洲日本成熟少妇| 精品激情国产视频| 亚洲免费伊人电影在线观看av| 欧美超级乱淫片喷水| 久久精品影视伊人网| 国产亚洲人成a一在线v站| 伊人久久久久久久久久久久久| 亚洲xxxx做受欧美| 奇米影视亚洲狠狠色| 色无极亚洲影院| 欧美激情xxxxx| 成人久久久久久| 欧美激情va永久在线播放| 国产精品丝袜白浆摸在线| 国内揄拍国内精品| 国产精品第二页| 欧美精品在线观看| 欧美专区福利在线| 91av在线播放视频| 国内精品400部情侣激情| 成人黄色av网| 欧美激情综合色| 欧美噜噜久久久xxx| 国产精品亚洲激情| 久久久av电影| 久久精品久久久久电影| 日韩欧美aaa| 欧美日韩一区二区免费在线观看| 亚洲福利视频网| 亚洲视频免费一区| 精品成人久久av| 日韩中文字幕网址| 久久久国产精品x99av| 欧美日韩美女视频| 国产精品日韩欧美综合| 伊人av综合网| 97精品国产97久久久久久| 91香蕉嫩草神马影院在线观看| 韩国v欧美v日本v亚洲| 1769国内精品视频在线播放| 91人人爽人人爽人人精88v| 色青青草原桃花久久综合| 亚洲人成网站在线播| 国产精品福利在线| 欧美极品少妇xxxxx| 亚洲欧美激情四射在线日| 国产精品免费视频久久久| 国产精品国产三级国产专播精品人| 高跟丝袜欧美一区| 国产精品第一区| 91啪国产在线| 久久久久久久久中文字幕| 亚洲精品福利免费在线观看| 97精品一区二区三区| 久久影视电视剧凤归四时歌| 成人激情视频小说免费下载| 国产精品久久久久久久久久三级| 欧美午夜xxx| 国产性色av一区二区| 日本高清视频一区| 日韩欧美在线看| 欧美另类69精品久久久久9999| 欧美综合一区第一页| 国产亚洲一区二区在线| 欧美孕妇与黑人孕交| 日韩欧美在线观看| 国产精品日韩在线一区| xxxxxxxxx欧美| 青草热久免费精品视频| 亚洲最大激情中文字幕| 久久视频中文字幕| 亚洲国产日韩欧美在线99| 亚洲女人天堂网| 91av免费观看91av精品在线| 成人免费在线视频网址| 超碰日本道色综合久久综合| 亚洲一区二区三区777| 亚洲3p在线观看| 美女精品久久久| 日韩欧美在线中文字幕| 亚洲一区二区国产| 欧美成人亚洲成人日韩成人| 日韩精品免费一线在线观看| 一区二区三区 在线观看视| 亚洲第一天堂av| 国产脚交av在线一区二区| 宅男66日本亚洲欧美视频| 亚洲国产私拍精品国模在线观看| 亚洲国产精品久久91精品| 欧美黄色性视频| 亚洲欧美日韩精品| 九九视频这里只有精品| 成人www视频在线观看| 欧美一级淫片videoshd| 91禁外国网站| 国产精品羞羞答答| 九九热在线精品视频| 亚洲人成欧美中文字幕| 97视频免费观看| 国产精品美女午夜av| 国产精品永久免费在线| 久久男人的天堂| 狠狠色狠狠色综合日日五| 欧美精品情趣视频| 国产精品久久久久久久久久尿| 国产一区二区三区在线视频| 欧美日韩第一页| 日韩精品欧美国产精品忘忧草| 日韩精品亚洲精品| 日韩大片在线观看视频| 在线观看国产欧美| 色播久久人人爽人人爽人人片视av| 国产精品 欧美在线| 亚洲第一福利网站| 色先锋资源久久综合5566| 尤物99国产成人精品视频| 精品国产一区二区三区久久狼黑人| 久久亚洲欧美日韩精品专区| 欧美精品一本久久男人的天堂| 欧美在线欧美在线| 国产日韩精品入口| 精品国产91久久久久久老师| www.日本久久久久com.| 久久久久久久久久久国产| 久久在线免费观看视频| 久久视频国产精品免费视频在线| 久久久精品久久久久| 在线观看精品自拍私拍| 91精品视频在线播放| 国产91精品最新在线播放| 国产精品成人va在线观看| 最近2019中文字幕大全第二页| 国产91精品最新在线播放| 亚洲欧美一区二区三区在线| 欧美专区在线播放| 国产精品视频网站| 国产精品成人免费视频| 九九九久久国产免费| 中文字幕日韩欧美精品在线观看| 欧洲成人在线观看| 日本一本a高清免费不卡|