關(guān)于Struts2文件上傳與自定義攔截器
一、訪問(wèn)或添加request/session/application屬性
public String scope() throws Exception{
ActionContext ctx = ActionContext.getContext();
ctx.getApplication().put("app", "應(yīng)用范圍");//往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對(duì)象
方法一,通過(guò)ServletActionContext.類直接獲取:
public String rsa() throws Exception{
HttpServletRequest request = ServletActionContext.getRequest();
ServletContext servletContext = ServletActionContext.getServletContext();
request.getSession()
HttpServletResponse response = ServletActionContext.getResponse();
return "scope";
}
方法二,實(shí)現(xiàn)指定接口,由struts框架運(yùn)行時(shí)注入:
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。這兩個(gè)文件可以從http://commons.apache.org/下載。
第二步:把form表的enctype設(shè)置為:“multipart/form-data“,如下:
<form enctype="multipart/form-data" action="${pageContext.request.contextPath}/xxx.action" method="post">
<input type="file" name="uploadImage">
</form>
第三步:在Action類中添加以下屬性,屬性紅色部分對(duì)應(yīng)于表單中文件字段的名稱:
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。這兩個(gè)文件可以從http://commons.apache.org/下載。
第二步:把form表的enctype設(shè)置為:“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類中添加以下屬性,屬性紅色部分對(duì)應(yīng)于表單中文件字段的名稱:
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";
}}
五、自定義攔截器
要自定義攔截器需要實(shí)現(xiàn)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("進(jìn)入攔截器");
if(session里存在用戶){
String result = invocation.invoke();
}else{
return “l(fā)ogon”;
}
//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>
因?yàn)閟truts2中如文件上傳,數(shù)據(jù)驗(yàn)證,封裝請(qǐng)求參數(shù)到action等功能都是由系統(tǒng)默認(rèn)的defaultStack中的攔截器實(shí)現(xiàn)的,所以我們定義的攔截器需要引用系統(tǒng)默認(rèn)的defaultStack,這樣應(yīng)用才可以使用struts2框架提供的眾多功能。
如果希望包下的所有action都使用自定義的攔截器,可以通過(guò)<default-interceptor-ref name=“permissionStack”/>把攔截器定義為默認(rèn)攔截器。注意:每個(gè)包只能指定一個(gè)默認(rèn)攔截器。另外,一旦我們?yōu)樵摪械哪硞€(gè)action顯式指定了某個(gè)攔截器,則默認(rèn)攔截器不會(huì)起作用。
六、輸入校驗(yàn)
在struts2中,我們可以實(shí)現(xiàn)對(duì)action的所有方法進(jìn)行校驗(yàn)或者對(duì)action的指定方法進(jìn)行校驗(yàn)。
對(duì)于輸入校驗(yàn)struts2提供了兩種實(shí)現(xiàn)方法:
1. 采用手工編寫代碼實(shí)現(xiàn)。
2. 基于XML配置方式實(shí)現(xiàn)。
七、手工編寫代碼實(shí)現(xiàn)對(duì)action中所有方法輸入校驗(yàn)
通過(guò)重寫validate() 方法實(shí)現(xiàn), validate()方法會(huì)校驗(yàn)action中所有與execute方法簽名相同的方法。當(dāng)某個(gè)數(shù)據(jù)校驗(yàn)失敗時(shí),我們應(yīng)該調(diào)用addFieldError()方法往系統(tǒng)的fieldErrors添加校驗(yàn)失敗信息(為了使用addFieldError()方法,action可以繼承ActionSupport ),如果系統(tǒng)的fieldErrors包含失敗信息,struts2會(huì)將請(qǐng)求轉(zhuǎn)發(fā)到名為input的result。在input視圖中可以通過(guò)<s:fielderror/>顯示失敗信息。
validate()使用例子:
public void validate() {
if(this.mobile==null || "".equals(this.mobile.trim())){ this.addFieldError("username", "手機(jī)號(hào)不能為空");
}else{ if(!Pattern.compile("^1[358]\\d{9}").matcher(this.mobile.trim()).matches()){
this.addFieldError(“mobile", "手機(jī)號(hào)的格式不正確"); }
}
}
驗(yàn)證失敗后,請(qǐng)求轉(zhuǎn)發(fā)至input視圖:
<result name="input">/WEB-INF/page/addUser.jsp</result>
在addUser.jsp頁(yè)面中使用<s:fielderror/>顯示失敗信息。
通過(guò)validateXxx()方法實(shí)現(xiàn), validateXxx()只會(huì)校驗(yàn)action中方法名為Xxx的方法。其中Xxx的第一個(gè)字母要大寫。當(dāng)某個(gè)數(shù)據(jù)校驗(yàn)失敗時(shí),我們應(yīng)該調(diào)用addFieldError()方法往系統(tǒng)的fieldErrors添加校驗(yàn)失敗信息(為了使用addFieldError()方法,action可以繼承ActionSupport ),如果系統(tǒng)的fieldErrors包含失敗信息,struts2會(huì)將請(qǐng)求轉(zhuǎn)發(fā)到名為input的result。在input視圖中可以通過(guò)<s:fielderror/>顯示失敗信息。
validateXxx()方法使用例子:
public String add() throws Exception{ return "success";}
public void validateAdd(){
if(username==null && "".equals(username.trim())) this.addFieldError("username", "用戶名不能為空");
}
驗(yàn)證失敗后,請(qǐng)求轉(zhuǎn)發(fā)至input視圖:
<result name="input">/WEB-INF/page/addUser.jsp</result>
在addUser.jsp頁(yè)面中使用<s:fielderror/>顯示失敗信息。
八、輸入校驗(yàn)的流程
1、類型轉(zhuǎn)換器對(duì)請(qǐng)求參數(shù)執(zhí)行類型轉(zhuǎn)換,并把轉(zhuǎn)換后的值賦給action中的屬性。
2、如果在執(zhí)行類型轉(zhuǎn)換的過(guò)程中出現(xiàn)異常,系統(tǒng)會(huì)將異常信息保存到ActionContext,conversionError攔截器將異常信息添加到fieldErrors里。不管類型轉(zhuǎn)換是否出現(xiàn)異常,都會(huì)進(jìn)入第3步。
3、系統(tǒng)通過(guò)反射技術(shù)先調(diào)用action中的validateXxx()方法,Xxx為方法名。
4、再調(diào)用action中的validate()方法。
5、經(jīng)過(guò)上面4步,如果系統(tǒng)中的fieldErrors存在錯(cuò)誤信息(即存放錯(cuò)誤信息的集合的size大于0),系統(tǒng)自動(dòng)將請(qǐng)求轉(zhuǎn)發(fā)至名稱為input的視圖。如果系統(tǒng)中的fieldErrors沒(méi)有任何錯(cuò)誤信息,系統(tǒng)將執(zhí)行action中的處理方法。
九、基于XML配置方式實(shí)現(xiàn)對(duì)action的所有方法進(jìn)行輸入校驗(yàn)
使用基于XML配置方式實(shí)現(xiàn)輸入校驗(yàn)時(shí),Action也需要繼承ActionSupport,并且提供校驗(yàn)文件,校驗(yàn)文件和action類放在同一個(gè)包下,文件的取名格式為:ActionClassName-validation.xml,其中ActionClassName為action的簡(jiǎn)單類名,-validation為固定寫法。如果Action類為cn.csdn.UserAction,那么該文件的取名應(yīng)為:UserAction-validation.xml。下面是校驗(yàn)文件的模版:
<?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中要校驗(yàn)的屬性,<field-validator>指定校驗(yàn)器,上面指定的校驗(yàn)器requiredstring是由系統(tǒng)提供的,系統(tǒng)提供了能滿足大部分驗(yàn)證需求的校驗(yàn)器,這些校驗(yàn)器的定義可以在xwork-2.x.jar中的com.opensymphony.xwork2.validator.validators下的default.xml中找到。
<message>為校驗(yàn)失敗后的提示信息,如果需要國(guó)際化,可以為message指定key屬性,key的值為資源文件中的key。
在這個(gè)校驗(yàn)文件中,對(duì)action中字符串類型的username屬性進(jìn)行驗(yàn)證,首先要求調(diào)用trim()方法去掉空格,然后判斷用戶名是否為空。
編寫校驗(yàn)文件時(shí),不能出現(xiàn)幫助信息
在編寫ActionClassName-validation.xml校驗(yàn)文件時(shí),如果出現(xiàn)不了幫助信息,可以按下面方式解決:
windwos->preferences->myeclipse->files and editors->xml->xmlcatalog
點(diǎn)“add”,在出現(xiàn)的窗口中的location中選“File system”,然后在xwork-2.1.2解壓目錄的src\java目錄中選擇xwork-validator-1.0.3.dtd,回到設(shè)置窗口的時(shí)候不要急著關(guān)閉窗口,應(yīng)把窗口中的Key Type改為URI 。Key改為http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd
- JS+Struts2多文件上傳實(shí)例詳解
- struts2實(shí)現(xiàn)多文件上傳
- java中struts2實(shí)現(xiàn)文件上傳下載功能實(shí)例解析
- struts2單個(gè)文件上傳的兩種實(shí)現(xiàn)方式
- Struts2+jquery.form.js實(shí)現(xiàn)圖片與文件上傳的方法
- JavaWeb中struts2實(shí)現(xiàn)文件上傳下載功能實(shí)例解析
- JavaEE中struts2實(shí)現(xiàn)文件上傳下載功能實(shí)例解析
- java中struts2實(shí)現(xiàn)簡(jiǎn)單的文件上傳與下載
- struts2實(shí)現(xiàn)多文件上傳的示例代碼
- Struts2+uploadify多文件上傳實(shí)例
相關(guān)文章
SpringCloud Finchley+Spring Boot 2.0 集成Consul的方法示例(1.2版本)
這篇文章主要介紹了SpringCloud Finchley+Spring Boot 2.0 集成Consul的方法示例(1.2版本),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-08-08Spring MVC 關(guān)于controller的字符編碼問(wèn)題
在使用springMVC框架構(gòu)建web應(yīng)用,客戶端常會(huì)請(qǐng)求字符串、整型、json等格式的數(shù)據(jù),通常使用@ResponseBody注解使 controller回應(yīng)相應(yīng)的數(shù)據(jù)而不是去渲染某個(gè)頁(yè)面。2017-03-03java并發(fā)編程之深入理解Synchronized的使用
文詳細(xì)講述了線程、進(jìn)程的關(guān)系及在操作系統(tǒng)中的表現(xiàn),這是多線程學(xué)習(xí)必須了解的基礎(chǔ)。本文將接著講一下Java線程同步中的一個(gè)重要的概念synchronized,希望能夠給你有所幫助2021-06-06spring集成httpclient配置的詳細(xì)過(guò)程
spring框架是一個(gè)非常強(qiáng)大的框架這里就不多說(shuō)了,那么主要是介紹spring與httpclient的整合集成過(guò)程,感興趣的朋友跟隨小編一起看看吧2021-07-07Java如何利用return結(jié)束方法調(diào)用
這篇文章主要介紹了Java如何利用return結(jié)束方法調(diào)用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02