技術(shù)分析之在Struts2框架中使用Servlet的API
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶,將通過(guò)不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:國(guó)際域名空間、網(wǎng)站空間、營(yíng)銷軟件、網(wǎng)站建設(shè)、烏審網(wǎng)站維護(hù)、網(wǎng)站推廣。
1. 在Action類中也可以獲取到Servlet一些常用的API
需求:提供JSP的表單頁(yè)面的數(shù)據(jù),在Action中使用Servlet的API接收到,然后保存到三個(gè)域?qū)ο笾?,最后再顯示到JSP的頁(yè)面上。
提供JSP注冊(cè)的頁(yè)面,演示下面這三種方式
<h4>注冊(cè)頁(yè)面</h4> <form action="${ pageContext.request.contextPath }/xxx.action" method="post"> 姓名:<input type="text" name="username" /><br/> 密碼:<input type="password" name="password" /><br/> <input type="submit" value="注冊(cè)" /> </form>
2. 完全解耦合的方式
如果使用該種方式,Struts2框架中提供了一個(gè)類,ActionContext類,該類中提供一些方法,通過(guò)方法獲取Servlet的API
一些常用的方法如下
3. 使用原生Servlet的API的方式(常用到)
Struts2框架提供了一個(gè)類,ServletActionContext,該類中提供了一些靜態(tài)的方法
具體的方法如下
技術(shù)分析之結(jié)果頁(yè)面的跳轉(zhuǎn)
1. 結(jié)果頁(yè)面存在兩種方式
全局結(jié)果頁(yè)面
> 條件:如果<package>包中的一些action都返回success,并且返回的頁(yè)面都是同一個(gè)JSP頁(yè)面,這樣就可以配置全局的結(jié)果頁(yè)面。
> 全局結(jié)果頁(yè)面針對(duì)的當(dāng)前的包中的所有的Action,但是如果局部還有結(jié)果頁(yè)面,會(huì)優(yōu)先局部的。使用的標(biāo)簽是
<global-results> <result>/demo3/suc.jsp</result> </global-results>
局部結(jié)果頁(yè)面
<result>/demo3/suc.jsp</result>
2. 結(jié)果頁(yè)面的類型
結(jié)果頁(yè)面使用<result>標(biāo)簽進(jìn)行配置,包含兩個(gè)屬性
> name -- 邏輯視圖的名稱
> type -- 跳轉(zhuǎn)的類型,值一些,需要掌握一些常用的類型。常見(jiàn)的結(jié)果類型去struts-default.xml中查找。
技術(shù)分析之Struts2框架的數(shù)據(jù)封裝
1. 為什么要使用數(shù)據(jù)的封裝呢?
2. Struts2中提供了兩類數(shù)據(jù)封裝的方式?
第一種方式:屬性驅(qū)動(dòng)
> 提供對(duì)應(yīng)屬性的set方法進(jìn)行數(shù)據(jù)的封裝。
表單的哪些屬性需要封裝數(shù)據(jù),那么在對(duì)應(yīng)的Action類中提供該屬性的set方法即可。
表單中的數(shù)據(jù)提交,最終找到Action類中的setXxx的方法,最后賦值給全局變量。
注意0:Struts2的框架采用的攔截器完成數(shù)據(jù)的封裝。
注意1:這種方式不是特別好:因?yàn)閷傩蕴貏e多,提供特別多的set方法,而且還需要手動(dòng)將數(shù)據(jù)存入到對(duì)象中.
注意2:這種情況下,Action類就相當(dāng)于一個(gè)JavaBean,就沒(méi)有體現(xiàn)出MVC的思想,Action類又封裝數(shù)據(jù),又接收請(qǐng)求處理,耦合性較高。
> 在頁(yè)面上,使用OGNL表達(dá)式進(jìn)行數(shù)據(jù)封裝。
在頁(yè)面中使用OGNL表達(dá)式進(jìn)行數(shù)據(jù)的封裝,就可以直接把屬性封裝到某一個(gè)JavaBean的對(duì)象中。
在頁(yè)面中定義一個(gè)JavaBean,并且提供set方法:例如:private User user;
頁(yè)面中的編寫(xiě)發(fā)生了變化,需要使用OGNL的方式,表單中的寫(xiě)法:<input type="text" name="user.username">
注意:只提供一個(gè)set方法還不夠,必須還需要提供user屬性的get和set方法!!!
> 先調(diào)用get方法,判斷一下是否有user對(duì)象的實(shí)例對(duì)象,如果沒(méi)有,調(diào)用set方法把攔截器創(chuàng)建的對(duì)象注入進(jìn)來(lái),
/** 屬性驅(qū)動(dòng)方式,把數(shù)據(jù)封裝到JavaBean的對(duì)象中 @author Administrator */ public class Regist2Action extends ActionSupport{ private static final long serialVersionUID = 6556880331550390473L; // 注意二:屬性驅(qū)動(dòng)的方式,現(xiàn)在,要提供是get和set方法 private User user; public User getUser() { System.out.println("getUser..."); return user; } public void setUser(User user) { System.out.println("setUser..."); this.user = user; } public String execute() throws Exception { System.out.println(user); return NONE; } }
第二種方式:模型驅(qū)動(dòng)
> 使用模型驅(qū)動(dòng)的方式,也可以把表單中的數(shù)據(jù)直接封裝到一個(gè)JavaBean的對(duì)象中,并且表單的寫(xiě)法和之前的寫(xiě)法沒(méi)有區(qū)別!
> 編寫(xiě)的頁(yè)面不需要任何變化,正常編寫(xiě)name屬性的值
> 模型驅(qū)動(dòng)的編寫(xiě)步驟:
手動(dòng)實(shí)例化JavaBean,即:private User user = new User();
必須實(shí)現(xiàn)ModelDriven<T>接口,實(shí)現(xiàn)getModel()的方法,在getModel()方法中返回user即可!!
/** 模型驅(qū)動(dòng)的方式 實(shí)現(xiàn)ModelDriven接口 必須要手動(dòng)實(shí)例化對(duì)象(需要自己new好) @author Administrator */ public class Regist3Action extends ActionSupport implements ModelDriven<User>{ private static final long serialVersionUID = 6556880331550390473L; // 必須要手動(dòng)實(shí)例化 private User user = new User(); // 獲取模型對(duì)象 public User getModel() { return user; } public String execute() throws Exception { System.out.println(user); return NONE; } }
技術(shù)分析之Struts2把數(shù)據(jù)封裝到集合中
1. 封裝復(fù)雜類型的參數(shù)(集合類型 Collection 、Map接口等)
2. 需求:頁(yè)面中有可能想批量添加一些數(shù)據(jù),那么現(xiàn)在就可以使用上述的技術(shù)了。把數(shù)據(jù)封裝到集合中
3. 把數(shù)據(jù)封裝到Collection中
因?yàn)镃ollection接口都會(huì)有下標(biāo)值,所有頁(yè)面的寫(xiě)法會(huì)有一些區(qū)別,注意:
<input type="text" name="products[0].name" />
在Action中的寫(xiě)法,需要提供products的集合,并且提供get和set方法。
4. 把數(shù)據(jù)封裝到Map中
Map集合是鍵值對(duì)的形式,頁(yè)面的寫(xiě)法
<input type="text" name="map['one'].name" />
Action中提供map集合,并且提供get和set方法
代碼:
/** 屬性驅(qū)動(dòng)的方式,把數(shù)據(jù)封裝到map集合中 @author Administrator */ public class Regist5Action extends ActionSupport{ private static final long serialVersionUID = 6556880331550390473L; private Map<String, User> map; public Map<String, User> getMap() { return map; } public void setMap(Map<String, User> map) { this.map = map; } public String execute() throws Exception { System.out.println(map); return NONE; } }
案例總結(jié)之Struts2的攔截器技術(shù)
1. 攔截器的概述
攔截器就是AOP(Aspect-Oriented Programming)的一種實(shí)現(xiàn)。(AOP是指用于在某個(gè)方法或字段被訪問(wèn)之前,進(jìn)行攔截然后在之前或之后加入某些操作。)
過(guò)濾器:過(guò)濾從客服端發(fā)送到服務(wù)器端請(qǐng)求的
攔截器:攔截對(duì)目標(biāo)Action中的某些方法進(jìn)行攔截
2. 攔截器和過(guò)濾器的區(qū)別
1)攔截器是基于JAVA反射機(jī)制的,而過(guò)濾器是基于函數(shù)回調(diào)的
2)過(guò)濾器依賴于Servlet容器,而攔截器不依賴于Servlet容器
3)攔截器只能對(duì)Action請(qǐng)求起作用(Action中的方法),而過(guò)濾器可以對(duì)幾乎所有的請(qǐng)求起作用(CSS JSP JS)
攔截器 采用 責(zé)任鏈 模式
> 在責(zé)任鏈模式里,很多對(duì)象由每一個(gè)對(duì)象對(duì)其下家的引用而連接起來(lái)形成一條鏈
> 責(zé)任鏈每一個(gè)節(jié)點(diǎn),都可以繼續(xù)調(diào)用下一個(gè)節(jié)點(diǎn),也可以阻止流程繼續(xù)執(zhí)行
在struts2 中可以定義很多個(gè)攔截器,將多個(gè)攔截器按照特定順序 組成攔截器棧 (順序調(diào)用 棧中的每一個(gè)攔截器 )
3. Struts2的核心是攔截器,看一下Struts2的運(yùn)行流程
自定義攔截器和配置
1. 編寫(xiě)攔截器,需要實(shí)現(xiàn)Interceptor接口,實(shí)現(xiàn)接口中的三個(gè)方法
protected String doIntercept(ActionInvocation invocation) throws Exception { // 獲取session對(duì)象 User user = (User) ServletActionContext.getRequest().getSession().getAttribute("existUser"); if(user == null){ // 說(shuō)明,沒(méi)有登錄,后面就不會(huì)執(zhí)行了 return "login"; } return invocation.invoke(); }
2. 需要在struts.xml中進(jìn)行攔截器的配置,配置一共有兩種方式
<!-- 定義了攔截器 第一種方式 <interceptors> <interceptor name="DemoInterceptor" class="com.itheima.interceptor.DemoInterceptor"/> </interceptors> --> <!-- 第二種方式:定義攔截器棧 --> <interceptors> <interceptor name="DemoInterceptor" class="com.itheima.interceptor.DemoInterceptor"/> <!-- 定義攔截器棧 --> <interceptor-stack name="myStack"> <interceptor-ref name="DemoInterceptor"/> <interceptor-ref name="defaultStack"/> </interceptor-stack> </interceptors> <action name="userAction" class="com.itheima.demo3.UserAction"> <!-- 只要是引用自己的攔截器,默認(rèn)棧的攔截器就不執(zhí)行了,必須要手動(dòng)引入默認(rèn)棧 <interceptor-ref name="DemoInterceptor"/> <interceptor-ref name="defaultStack"/> --> <!-- 引入攔截器棧就OK --> <interceptor-ref name="myStack"/> </action>
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。
本文名稱:Struts2之Action接收請(qǐng)求參數(shù)和攔截器詳解
鏈接URL:http://bm7419.com/article18/gipodp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器、標(biāo)簽優(yōu)化、自適應(yīng)網(wǎng)站、移動(dòng)網(wǎng)站建設(shè)、網(wǎng)站策劃、微信小程序
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
網(wǎng)頁(yè)設(shè)計(jì)公司知識(shí)