Struts2框架框架使用OGNL語言和值棧技術實現數據的流轉處理。值棧就相當于一個容器,用來存放數據,而OGNL是一種快速查詢數據的語言。
值棧:ValueStack一種數據結構,操作數據的方式為:先進后出
OGNL : Object-GraphNavigation Language(對象圖形導航語言)將多個對象的關系使用一種樹形的結構展現出來,更像一個圖形,那么如果需要對樹形結構的節點數據進行操作,那么可以使用 對象.屬性 的方式進行操作,OGNL技術底層采用反射實現。
一:數據的提交方式
1
2
3
4
5
6
|
,<form>表單提交 <form action= "/user/login_Login.action" method= "post" > 用戶代碼:<inputnameinputname= "usercode" type= "text" ><br> 用戶密碼:<inputnameinputname= "userpswd" type= "password" ><br> <inputtypeinputtype= "submit" value= "登錄" > </form> |
2,url的方式
http://localhost.egov.com/user/login_Login.action?usercode=admin&userpswd=admin
3,超鏈接
1
|
<a href= "/user/delete.action?usercode=admin" rel= "external nofollow" >刪除</a> |
4,異步提交
ajax異步提交數據
二:數據存儲
數據的存儲依賴于框架提供的攔截器功能,攔截器可以對請求進行攔截,獲取所有的請求參數,循環遍歷設置到值棧中。框架默認將被請求的Action對象存放到值棧的棧頂。Struts2框架提供三種方式將參數存入值棧
1,屬性驅動模式
Action中需要提供參數名稱的set方法,框架會通過攔截器將請求參數獲取到之后,會循環遍歷將參數設置到值棧(棧頂對象)中。
1
2
|
<input name= "usercode" type= "text" > Ognl.setValue( "usercode" ,action, "admin" ); //此時根對象是action |
2,模型驅動模式
必須要實現模型驅動接口,屬于侵入性開發方式,不推薦使用
需要定義數據模型的類,將屬性封裝到數據模型類中,Action中只需要定義模型對象的類型屬性(必須創建對象賦值),模型對象的get/set屬性并不是必須的。
Action類需要實現ModelDriven接口,重寫getModel()方法。
1
2
|
<inputnameinputname= "usercode" type= "text" ><br>表單依然是模型對象的屬性名稱作為參數名稱 Ognl.setValue( "usercode" ,user, "admin" ); //此時根(棧頂)對象是user對象 |
3,域驅動模式
與屬性驅動的原理是類似,也是通過參數攔截器,將請求參數獲取后循環設置到值棧中。
在Action對象中定義模型對象屬性,并提供get/set方法;
在表單元素中增加模型對象屬性的名稱;
1
2
|
<inputnameinputname= "user.usercode" type= "text" > Ognl.setValue( "user.usercode" ,action, "admin" ); //此時根對象是action |
三:數據的傳遞
框架將Http對象和包裝后的Map集合對象都存放到ActionContext上下文對象集合中。所以可以根據ActionContext來獲取想要使用的對象。
1,獲取HTTP對象
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
ActionContext ac = ActionContext.getContext(); //上下文對象相當于request范圍 HttpServletRequest request =(HttpServletRequest)ac.get(StrutsStatics.HTTP_REQUEST); HttpSession session = request.getSession( false ); ServletContext application = session.getServletContext(); ServletContext application = ac.get(StrutsStatics.SERVLET_CONTEXT); HttpServletRequest request = ServletActionContext.getRequest(); (推薦使用) HttpServletResponse response =ServletActionContext.getResponse(); Action類實現ServletRequestAware,或ServletResponseAware (屬于侵入性開發方式,不推薦使用) private HttpServletRequest request ; //set注入 private HttpServletResponse response ; @Override public void setServletRequest(HttpServletRequest request) { //實現該方法,該方法由框架調用,傳遞參數。 this .request= request ; } @Override public void setServletResponse(HttpServletResponse response) { this .response= response ; } |
2,獲取Map集合
1
2
3
4
5
6
7
|
ActionContext ac = ActionContext.getContext(); Mapsession = ac.getSession(); Mapsession2 =(Map)ac.get( "session" ); Mapsession3=(Map)ac.get(ActionContext.SESSION); Mapapplication = ac.getApplication() Mapapplication = ac.get(ActionContext.APPLICATION); Mapapplication = ac.get( "application" ); |
3, 獲取值棧對象以及參數集合對象
1
2
3
|
ActionContext ac = ActionContext.getContext(); ValueStack vs = ac.getValueStack(); Map paramts = ac.getParameters(); |
四:數據的顯示
用El表達式的形式,取request對象中的值
1
|
${requestScope.username } |
而這種表達式的方式可以表示成java代碼的方式:
1
2
3
4
|
<% Stringusername =(String)request.getAttribute( "username" ); //被重寫的方法,底層是通過ognl查詢值棧中的數據 out.print(username); %> |
從request返回取數據,實質上底層是通過Ognl語言操作值棧中的數據。 ActionContext對象的集合和OgnlValueStack值棧的集合為同一個集合對象,所以從值棧的Map集合中取數據,就相當于從ActionContext上下文中取數據。
總結
以上所述是小編給大家介紹的struts2數據處理_動力節點Java學院整理,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!