Struts2

使用Struts2框架實現用登陸的功能,使用struts2標籤和ognl表達式簡化了試圖的開發,而且利用struts2提供的特性對輸入的數據進行驗證,以及訪問ServletAPI時實現用戶會話跟蹤,其簡單的程序運行流程圖以下java

 

Struts2的Action類頗有意思,你可使用3種方式來實現具體的Action類:編程

  1. 讓你的Action類繼承自ActionSupport類(項目中最經常使用這種方式,由於ActionSupport類中定義了不少幫助方法)
  2. 讓你的Action類實現Action接口
  3. 使用POJO的方式來實現,只要Action類中有一個返回值爲String的execute方法就行了(這種方式使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)等數據。

相關文章
相關標籤/搜索