使用Struts2框架實現用登陸的功能,使用struts2標籤和ognl表達式簡化了試圖的開發,而且利用struts2提供的特性對輸入的數據進行驗證,以及訪問ServletAPI時實現用戶會話跟蹤,其簡單的程序運行流程圖以下java
Struts2的Action類頗有意思,你可使用3種方式來實現具體的Action類:編程
以上三種Action的實現方式均可以被struts2框架自動識別,若是你在struts.xml裏面配置了一個action塊可是沒有配置action類的路徑,這樣框架默認使用ActionSupport來處理請求。瀏覽器
可是在實際使用struts2的過程當中我發現了一個問題,一個Action只有一個execute方法來處理一類請求,若是我開發的某塊功能有100個不一樣的請求那我豈不是要寫100個Action類,每一個類實現一個execute方法,這樣雖然知足了一個類一個責任的設計原則,可是會不會形成「類爆炸」?後來看了struts2的文檔才知道,其實咱們可使用struts2靈活的通配符配置來達到減小action類的目的:服務器
方式一:數據結構
繼承ActionSupport類,若是使用了數據校驗功能,則必須繼承ActionSupport。上面那個Action類就是繼承了ActionSupport類。框架
方式二:jsp
實現Action接口,實現execute()方法編程語言
package lps.servletAPI; import com.opensymphony.xwork2.Action; import javax.xml.registry.infomodel.User; public class LoginThirdActionContextAction implements Action { private User user; @Override public String execute() throws Exception { return null; } }
方式三:ide
:既不繼承ActionSupport也不實現Action接口.(ActionSupport實現了Action接口)測試
public class UserAction3 { private String userName; public void setUserName(String userName) { this.userName = userName; } public String login(){ System.out.println("UserAction3.login()"+":"+userName); return "success"; } }
Struts2的result結果集
Struts2的Action處理用戶請求後,返回一個普通字符串-------邏輯視圖名,必須在Struts.xml文件中完成邏輯圖
和物理視圖資源的映射,纔可讓系統轉到實際的視圖資源。
結果就是告訴Struts2框架,當Action處理結果時,系統下一步作什麼。當Action返回一個普通的字符串時,系統下一步作什麼。
Struts2經過在struts.xml文件中使用<result…/>元素來配置結果。根據<result…/>元素所在位置的不一樣,struts2提供了兩種結果:
(1) 局部結果:將<result…/>做爲<action…/>元素的子元素配置。
(2) 全局結果:將<result…/>做爲<global-result…/>元素的子元素配置。
首先來介紹一下局部結果,局部結果是經過在<action../>元素中指定<result…/>元素來配置的,一個<action…/>元素能夠有多個<result…/>元素。這表示一個Action能夠對應多個結果。
<!--登錄的action--> <action name="login" class="lps.demo.LoginAction"> <result name="success"> /success.jsp </result> <result name="login"> /login.jsp </result> </action>
(1) location:該參數指定了該邏輯視圖對應的實際視圖資源。
(2) parse:該參數指定是否容許在實際視圖名字中使用OGNL表達式,該參數默認值爲true。若是設置該參數值爲false,則不容許在實際視圖名中使用表達式。一般無需修改該屬性值。由於一般無需指定parse參數的值。
<action name="login" class="lps.demo.LoginAction"> <result name="login"> /login.jsp </result> </action>
如下Struts2支持處理結果類型爲轉載☞:https://blog.csdn.net/fujiakai/article/details/51897533
struts2支持的處理結果類型
Struts2內建支持結果類型以下:
(1) chain結果類型:Action鏈式處理的結果類型。
(2) chart結果類型:用於整合JFreeChart的結果類型。
(3) dispatcher結果類型:用於FreeMarker整合的結果類型。
(4) httpheader結果類型:用於控制特殊的HTTP行爲的結果類型。
(5) jasper結果類型:用於JasperReports整合的結果類型。
(6) jsf結果類型:用於與JSF整合的結果類型。
(7) redirect結果類型:用於直接跳轉到其餘URL的結果類型。
(8) redirect-action結果類型:用於制直接跳轉到其餘Action的結果類型。
(9) stream結果類型:用於向瀏覽器返回一個InputStream(通常用於文件下載)。
(10) tiles結果類型:用於與Tiles整合的結果類型。
(11) velocity結果類型:用於與Velicity整合的結果類型。
(12) xslt結果類型:用於與XML/XSLT整合的結果類型。
(13) plaintext結果類型:用於顯示某個頁面的原始代碼的結果類型。
---------------------
堆棧ValueStack
valueStack是struts2的值棧空間,是struts2存儲數據的空間
Strut2的Action類經過屬性能夠得到全部請求相關的值,要在Action類中聲明與參數同名的屬性或者以類名小寫加屬性名如:user.name,就能夠得到這些參數值,在Struts2調用Action類的Action方法(默認是execute方法)以前,就會爲相應的Action屬性賦值。這項功能Struts2要依賴於ValueStack對象來實現,每一個Action類的對象實例會擁有一個ValueStack對象,這個對象貫穿整個Action的生命週期,
當Struts2接收到一個請求後,會先創建Action類的對象實例,但並不會當即調用Action方法,而是先將Action類的相應屬性放到ValueStack實現類ONGLValueStack對象root對象的頂層節點。只是全部的屬性值都是默認的值,如String類型的屬性值爲null,int類型的屬性值爲0等。在處理完上述工做後,Struts 2就會調用攔截器鏈中的攔截器,這些攔截器會根據用戶請求參數值去更新ValueStack對象頂層節點的相應屬性的值,最後會傳到Action對象,並將ValueStack對象中的屬性值,賦給Action類的相應屬性。當調用完全部的攔截器後,纔會調用Action類的Action方法。ValueStack會在請求開始時被建立,請求結束時消亡
值棧ValueStack
在基於HTTP協議的Web應用中
客戶端請求的全部內容都以文本編碼方式傳輸到服務器端,服務器端的編程語言卻有着豐富的數據類型
Servlet中,類型轉換工做由開發者本身完成,eg
3.valueStack底層相關的數據結構
CompoundRoot是繼承了Arraylist的集合,裏面存放Action的實例、代理對象、自定義對象(Student)等數據。