【struts2】struts2的一些常用高级应用
==============================================
一、獲取request、response
==============================================
struts2的action拋棄了request、response等servlet API,是業(yè)務(wù)層更加獨(dú)立。但是有時(shí)候需要使用request、response。例如從request中獲取session、往response里面寫cookie等。從struts2中獲取request、response有兩種途徑。
1、利用ServletActionContext的靜態(tài)方法
struts2利用ServletActionContext類來維護(hù)servlet對(duì)象,把servlet對(duì)象(如request、response、application、session等)放到了ServletActionContext中。ServletActionContext利用ThreadLocal來維護(hù)不同線程的servlet對(duì)象,因此可以使用ServletActionContext來獲取servlet對(duì)象。這種方式也可以叫做非注射方式(非IoC方式),舉例如下:
LoginAction.java
package com.lmb.struts2.action; import java.io.File; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession;import org.apache.struts2.ServletActionContext;import com.opensymphony.xwork2.ActionSupport;public class LoginAction extends ActionSupport{private String account;//賬號(hào)private String password;//密碼public String login() throws Exception{//登陸方法HttpServletRequest request=ServletActionContext.getRequest();//獲取requestHttpServletResponse response=ServletActionContext.getResponse();//獲取response對(duì)象HttpSession session=request.getSession();//獲取sessionsession.setAttribute("account", account);//將帳戶名放到session中ServletContext context=ServletActionContext.getServletContext();//獲取上下文File uploadFile=new File(context.getRealPath("upload"));//獲取upload文件夾return execute();}}雖然是使用靜態(tài)方法獲取的request、response,但仍然能保證獲取到當(dāng)前用戶以及當(dāng)前線程的request、response,不會(huì)發(fā)生混淆。因?yàn)閟truts2使用ThreadLocal來維護(hù)當(dāng)前線程的request、response等數(shù)據(jù)。
2、利用相關(guān)的Aware接口
struts2提供了Aware接口。Aware接口是“感知”的意思,實(shí)現(xiàn)了Aware接口的action能夠感知相應(yīng)的資源。struts在實(shí)例化action實(shí)例時(shí),如果發(fā)現(xiàn)它實(shí)現(xiàn)了相應(yīng)的Aware接口,會(huì)把相應(yīng)的資源通過Aware接口方法注射進(jìn)去。這種方法也叫做注射方式(IoC方式)。
servlet API中常用對(duì)象有request、response、application、session,對(duì)應(yīng)的Aware接口分別為ServletRequestAware、ServletResponseAware、ServletContextAware、SessionAware。舉例如下:
ServletAwareAction.java
package com.lmb.struts2.action; import java.util.Map; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;import com.opensymphony.xwork2.Action; import com.opensymphony.xwork2.ActionSupport;public class ServletAwareAction extends ActionSupport ` implements ServletRequestAware,ServletResponseAware,ServletContextAware, SessionAware(){private ServletContext application;//Servlet上下文對(duì)象private HttpServletRequest request;//request對(duì)象private HttpServletResponse response;//response對(duì)象private Map session;//session對(duì)象public void setServletContext(ServletContext application) {this.application = application;}public void setServletRequest(HttpServletRequest request) {this.request = request;}public void setServletResponse(HttpServletResponse response) {this.response = response;}public void setSession(Map session) {this.session = session;}public String execute(){String upload=application.getRealPath("upload");//使用applicationrequest.getRemoteAddr();//使用requestresponse.getContentType();//使用responsesession.get("account");//使用sessionreturn Action.SUCCESS;}}實(shí)現(xiàn)了ServletRequestAware接口便會(huì)有一個(gè)setServletRequest()方法來獲取request對(duì)象。
實(shí)現(xiàn)了ServletResponseAware接口便會(huì)有一個(gè)setServletResponse()方法來獲取response對(duì)象。
實(shí)現(xiàn)了ServletContextAware接口便會(huì)有一個(gè)setServletContext()方法來獲取ServletContext的applic對(duì)象。
實(shí)現(xiàn)了SessionAware接口便會(huì)有一個(gè)setSession()方法來獲取session對(duì)象。要注意的是,SessionAware接口的setSession()方法的參數(shù)是Map類型,該Map代表session內(nèi)存儲(chǔ)的各種數(shù)據(jù)。
Aware接口其實(shí)是一種攔截器,攔截器代碼會(huì)在執(zhí)行action之前執(zhí)行,將相關(guān)的servlet對(duì)象設(shè)置進(jìn)來。
==============================================
二、使用Validator校驗(yàn)數(shù)據(jù)
==============================================
跟struts1一樣,struts2也提供了數(shù)據(jù)校驗(yàn)。這種數(shù)據(jù)校驗(yàn)是配置式的,既可用XML配置,也可以用、java注解(@Annotation)配置。struts2提供了許多默認(rèn)的校驗(yàn)器,例如:數(shù)字校驗(yàn)器、電子郵件校驗(yàn)器等,配置一下即可用。
1、使用XML配置數(shù)據(jù)校驗(yàn)Validator
使用XML配置時(shí),需要在action類所在的package內(nèi)添加一個(gè)XML文件,文件名格式為action類名-validation.xml或者action類名-action別名-validation.xml。如果action中有多個(gè)方法,一般使用后者。例如:BookAction-addBook-validation.xml、BookAction-initAddBook-validation.xml等。支持校驗(yàn)的action必須實(shí)現(xiàn)Validateable接口,一般繼承ActionSupport就可以了。
下面對(duì)addBook.action進(jìn)行校驗(yàn),首先將BookAction繼承ActionSupport以支持校驗(yàn)。校驗(yàn)配置XML文件名應(yīng)為BookAction-addBook-validation.xml,位置與BookAction.class位于同一包下。校驗(yàn)內(nèi)容為:添加書籍時(shí),書籍名稱與作者必須填寫,如果填寫了日期,日期格式必須正確,并位于指定的格式內(nèi)。校驗(yàn)配置代碼如下:
BookAction-addBook-validation.xml
<validators><field name="book.name"> <!-- 檢查書名 --><field-validator type="requiredString"> <!-- 必需的 --><param name="trim">true</param><!-- 檢查時(shí)去掉前后空格 --><message>請(qǐng)輸入書籍名稱</message> <!-- 提示信息 --></field-validator></field><field name="book.author"> <!-- 檢查作者,必須非空 --><field-validator type="requiredString"> <!-- 必需的 --><message>請(qǐng)輸入書籍作者</message> <!-- 提示信息 --></field-validator></field><field name="book.publishedDate"><field-validator type="Date"> <!-- 必需的 --><param name="min">1900-01-01</param><!-- 最小值 --><param name="max">2200-01-01</param><!-- 最大值 --><message><![CDATA[日期格式必須位于100-01-01與2200-01-01之間]]></message> <!-- 提示信息 --></field-validator></field></validators>配置完畢后不需要更改任何的JSP代碼。struts2的表單標(biāo)簽支持校驗(yàn)錯(cuò)誤信息顯示(而不用像struts1那樣還需要用<html:error />顯式的調(diào)用)。如果數(shù)據(jù)校驗(yàn)失敗,會(huì)轉(zhuǎn)到input頁面顯示錯(cuò)誤信息,因此action配置中要配置名為input的JSP頁面。
2、配置客戶端Validator
以上的校驗(yàn)是在服務(wù)器端完成的。**struts2也支持客戶端javascript校驗(yàn)。方法很簡(jiǎn)單,再將JSP的<struts:form>標(biāo)簽加上validate=”true”屬性即可。**struts2的客戶端校驗(yàn)與struts1不同,struts1使用了提示框顯示錯(cuò)誤信息,struts2拋棄了煩人的提示框,顯示錯(cuò)誤的方式與服務(wù)器端校驗(yàn)完全一樣,直接在頁面內(nèi)進(jìn)行顯示。客戶端校驗(yàn)是通過javascript實(shí)現(xiàn)的,因此struts2會(huì)自動(dòng)加載相應(yīng)的javascript類庫。
3、常用的Validator
4、使用@Java注解配置Validator
struts2也支持使用java注解配置數(shù)據(jù)校驗(yàn)。Action類同樣需要繼承自ActionAupport類,并用@Validation注解,表示該Action需要數(shù)據(jù)校驗(yàn)。然后在方法上配置@Validations。@Validations可指定多條校驗(yàn)規(guī)則,具體實(shí)例如下:
BookAction.java
package com.lmb.struts2.action;@Validation public class BookAction extends ActionAupport{public static List<Book> bookList=new ArrayList<Book>();private Book book;private String title;//增加書籍頁面@Validations(requiredStrings={@RequiredStringValidator(type=ValidatorType.SIMPLE,trim=true,fieldName="book.name",message="請(qǐng)輸入書名.*"),@RequiredStringValidator(type=ValidatorType.SIMPLE,trim=true,fieldName="book.author",message="請(qǐng)輸入書籍作者.*"),},dateRangeFields={@DateRangeFieldValidator(type=Validator.SIMPLE,fieldName="book.publishedDate",min="1900-01-01",max="2200-01-01",message="日期必須大于${min}小于${max},當(dāng)前值為${book.publishedDate}.")})public String add(){bookList.add(book);title="<br/><br/>添加書籍成功<br/><br/>";}@SkipValidation //書籍列表,@SkipValidation跳過校驗(yàn)public String list(){return "lis t"; } }該配置與上面的XML配置是等價(jià)的。因?yàn)橹粚?duì)addBook.action進(jìn)行校驗(yàn),因此只要在方法add()上添加@Validation以及校驗(yàn)規(guī)則。其他不需要校驗(yàn)的方法需要加上@SkipValidation,否則也會(huì)被校驗(yàn)。
另外,Validator時(shí)struts2默認(rèn)的校驗(yàn)方式是全局驗(yàn)證模式。因此只能配置一種驗(yàn)證方式。如果要如果要對(duì)同一個(gè)Action的兩個(gè)方法配置兩種不同的驗(yàn)證方式,需要重寫struts2的默認(rèn)攔截器。
注意:被校驗(yàn)的Action類要繼承ActionSupport類,并要在action配置中指定名為input的JSP,因此struts2在校驗(yàn)失敗后會(huì)自動(dòng)返回input頁面。
總結(jié)
以上是生活随笔為你收集整理的【struts2】struts2的一些常用高级应用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【struts2】struts2实现自定
- 下一篇: OGNL基础