1. 程式人生 > >【Java】Struts2筆記I

【Java】Struts2筆記I

目錄

6.值棧

1.Struts2執行過程

2.核心配置檔案struts.xml標籤以及屬性

<struts>
	<package name="hellodemo" extends="struts-defalut" namespace="/">
		<action name="hello" class="com.action.Action">
			<result name="ok">/hell.jsp</result>
		</action>
	</package>
</struts>

constant 

用於修改常量

name:struts.i18n.encoding

value:UTF-8

還有兩種方式(瞭解)

- 在src下面建立 struts.properties,進行修改

- 在web.xml進行配置

package 

package裡面才能配置action

name:只是為了區分不同package,和功能本身沒有關係

extends:屬性值固定->struts-defalut,寫了這個屬性之後package才具有action功能

namespace:要和action標籤裡面的name屬性值構成訪問路徑   比如 /(namespace) + hello(action)  不過預設為/

action

配置action的訪問路徑,指定通過什麼路徑來訪問哪個類 

可以有多個action但是name不能相同

name:和namespace構成訪問路徑

class:要訪問的那個類的全路徑

method:action預設執行execute方法,但可以用method來讓action的多個方法執行

result

根據呼叫action的class指定的類的方法返回值 配置到不同的路徑(頁面)中去

name:同方法的返回值

type:配置如何到路徑(轉發or重定向)

           預設為轉發(dispatcher),重定向(redirect)

           -chain:轉發到action,一般不用,有快取問題

          -redirectAction:重定向到action

3.action方法訪問的三種方式

3.1 用action標籤的method屬性值指定方法

沒有指定method的話 則執行execute()方法

3.2 萬用字元方式實現

{1}代表第一個*   比如訪問book_add.action,此時{1}就代表add

可以有多個*

3.3 動態訪問實現(不用)

4.結果頁面配置

4.1全域性結果頁面配置

如果多個action,返回值是相同的,指向的頁面也是相同的(多行相同的<result></result>)

在<package>標籤裡面配置

<global-results>
	<result name="success">/hello.jsp</result>
</global-results>

配置完之後就不用寫result了 對當前package內所有action(全域性)生效

4.2區域性結果頁面

就是一般地用<result>標籤(一個action對應一個result)

5.獲取表單提交資料

5.1原始方式request

5.1.1ActionContext類

ActionContext context = ActionContext.getContext();
Map<String, Object> map = context.getParameters();

5.1.2ServletActionContext類

HttpServletRequest request = ServletActionContext.getRequst();
String username = request.getParameter("username");

5.1.3介面注入(一般不用)

讓action實現介面-->為了得到request物件

ServletRequestAware介面

5.2 Struts封裝方法

5.2.1屬性封裝(繼承ActionSupport)

步驟:

1)將表單會提交的資料,定義在action裡面

     -變數名稱和表單輸入項的name屬性值一樣

2)生成變數的set方法(get/set)

原理:內省

缺點:不能把資料直接封裝到實體類的物件

5.2.2模型驅動封裝(重點)

步驟:

1)action實現介面ModelDriven

2)實現介面方法getModel   -將建立物件返回 (也需要變數名稱和表單輸入項的name一樣)

3)在action裡面建立實體類物件

5.2.3表示式封裝

步驟:

1)宣告實體類

2)生成實體類變數的set和get方法

3)表單輸入想的name屬性值用表示式形式(eg: name="user.username")

6.值棧

6.0如何得到值棧

actionContext.getValueStack()

6.1什麼是值棧

值棧:Struts2裡面自己的儲存機制(類似於web中的request域)

每次訪問action都會建立action物件,每個action物件都會有且只有一個值棧物件

6.2值棧的內部結構

主要的兩部分:rootcontext

6.2.1 root (list集合)

操作的是root裡面的資料

6.2.2 context (map集合)

value中儲存的是物件的引用

6.3三種方式向值棧中存取資料

6.3.1 set方法

stack.set("username", "hello");

少:在jsp中用<s:property value="username"/>可以獲取"hello"

6.3.2 push方法

stack.push("hello");

少:<s:property value="[0].top"/> 取到棧頂的值  

6.3.3 在action中定義變數,生成變數的get方法(常用)

eg:①定義一個變數name,設定對應的②get方法,在action中③賦值name="abcdefgh";

優點:直接在action中儲存資料,不會造成儲存空間的浪費

6.4 從值棧中取list集合

6.4.1

6.4.2 遍歷list集合

6.4.3 遍歷list集合

注意:遍歷list出來的user物件是放到context裡面的!!

EL表示式也可以取到值棧資料

原因:

底層增強request物件裡面的方法getAttribute方法

1)先從request域獲取值,如果獲取到就直接返回

2)如果獲取不到值,就從值棧中把值獲取再存到域物件裡面

6.5 用OGNL操作值棧

作用:和Struts標籤一起使用來操作值棧

6.5.1 #的使用

6.5.2 %的使用

在struts2標籤裡面使用ognl表示式,如果直接在struts2表單標籤裡面使用ognl表示式不識別,只有%之後才會識別。

7.攔截器(interceptor)

*位置

struts2-core-xxxx.jar內的struts-default.xml中

*執行時間

action物件建立之後,action方法執行之前

*底層原理

1)aop思想

不修改原始碼(不是通過呼叫攔截器的方法)

而是通過配置檔案,來建立和攔截器的關係

2)責任鏈模式

java中的設計模式之一,和過濾鏈相似

過濾鏈:一個請求有可以有多個過濾器進行過濾,而只有過濾器進行放行之後才能進行下一個過濾器

責任鏈中就是進行 不是過濾的操作 但之後要放行 才能向下執行

*執行原理

主刀醫生  --  遞工具的護士

*和過濾器區別

1)過濾器:過濾器理論上可以過濾任何內容,html、jsp、servlet、圖片路徑

2)攔截器:攔截器只可以攔截action

*Servlet和action區別

1)Servlet預設第一次訪問的時候建立,建立一次,單例項物件

2)action每次訪問時建立,建立多次,多例項物件

*自定義攔截器功能

1)建立類,繼承MethodFilterInterceptor類(好處:可以讓某個方法不進行攔截)

2)重寫裡面的方法,攔截器的邏輯,(放行 return invocation.invoke()

3)配置action和攔截器的關係(註冊攔截器)

>>>在攔截的action的package宣告攔截器<interceptors>...</interceptors>

>>>在具體的action裡面使用攔截器  <interceptor-ref name=""></interceptor-ref>

>>>配置了自定義攔截器之後,預設的攔截器就不會執行了,所以要再手動使用預設攔截器<interceptor-stack name="defaultStack"></interceptor-stack>

4)配置不需要攔截的方法:在interceptor-ref標籤中<param name="excludeMethods">方法名</param>

8.Struts2的標籤庫

常用標籤

s:property:和ognl表示式在jsp頁面獲取值棧資料

s:iterator:獲取值棧list集合資料,表示list集合

s:debug:檢視值棧結構和資料