Strust2 的OGNL和s標籤的用法
在之前的學習中,我們在頁面上訪問Action物件的時候,都是用EL表示式來實現的如${productName}
為什麼我們通過EL表示式就可以取到物件呢?
我一直以為是從request、session、application域中獲取的;
我們知道struts2就是相當於servlet,但是在servlet物件中,需要用到request.setAttribute("name",name);來設定屬性的話,在頁面上就可以通過EL表示式取值;
而Action物件裡,沒有用到request,session.application的情況下仍然可以通過EL表示式取到值
demo如下
<form action="for.action"> 使用者名稱:<input type="text" name="name"/><br> 密碼: <input type="password" name="password"/><br> <input type="submit" value="submit"> </form>
<action name="for" class="cn.com.action.Info" method="save">
<result>/one.jsp</result>
</action>
package cn.com.action; public class Info { private String name; private String password; //這個是Action類,能夠處理struts2請求的類; //action:struts2的一個請求就是一個action /*1、Action類必須有無參建構函式 *2、 而且屬性名必須與前端的表單的屬性名一致 *3、一個Action類可以有多個方法 *4、一個Action類至少有多個可以供請求的方法 *5、每一次請求都建立一個例項,執行緒安全的 */ public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String save(){ return "success"; } }
<body>
使用者名稱:${name }<br>
密碼:${password }
</body>
結果頁面如下:
這是為什麼呢?
其實所有的都是從valuestrack中取得的;
vlaueStrack主要有map棧和list棧
ognlcontext:map棧,主要是屬性的對映關係
root:list棧,主要是儲存物件,這個才是真正的值棧;
第一部分:
怎麼從list棧也就是物件棧中取值
1、在jsp頁面上引入s標籤
<%@ taglib uri="/struts-tags" prefix="s" %>
2、語法格式
<s:property value="Object.propertyName"/>
如:
<s:property value="[0].name"/>
[0]是位置,堆疊都是先進後出的,0代表是堆疊的第一個屬性
demo2
test類
package cn.com.action;
public class Test {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
info類
package cn.com.action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.util.ValueStack;
public class Info {
private String name;
private String password;
//這個是Action類,能夠處理struts2請求的類;
//action:struts2的一個請求就是一個action
/*1、Action類必須有無參建構函式
*2、 而且屬性名必須與前端的表單的屬性名一致
*3、一個Action類可以有多個方法
*4、一個Action類至少有多個可以供請求的方法
*5、每一次請求都建立一個例項,執行緒安全的
*/
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String save(){
//1.獲取堆疊
ValueStack vs=ActionContext.getContext().getValueStack();
//2.獲取test物件
Test test=new Test();
test.setName("hahah");
//3.把test物件放入堆疊中
vs.push(test);
return "success";
}
}
表單:
<form action="for.action">
使用者名稱:<input type="text" name="name"/><br>
密碼: <input type="password" name="password"/><br>
<input type="submit" value="submit">
</form>
顯示頁面
<body>
<s:debug></s:debug>
使用者名稱:${name }<br>
<s:property value="[0].name"/>
密碼:${password }
<s:property value="[0].password"/>
</body>
頁面 效果圖
在表單頁面我輸入ttt,111,但是顯示頁面卻是hahah 111
原因如下:
由於之前test中有一個name的屬性,和info中的name屬性同名,我在info類中堆疊加入了test物件,先進後出,第一個取到的自然是test的name屬性
第二部分:
怎麼從map棧中取值
一模一樣的,就是格式不一樣
<s:property value="#request/application/session.物件.屬性名"/>
如:
<s:property value="#request.Info.name"/>
demo如下:
package cn.com.action;
import java.util.Map;
import com.opensymphony.xwork2.ActionContext;
public class RequestTest {
/*
* author:命運的信徒 date:2018/12/11 arm:ognl+s標籤獲取map棧
*/
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String execute() {
ActionContext context = ActionContext.getContext();
Map<String, Object> sessionmap = context.getSession();
RequestTest rt=new RequestTest();
rt.setName("yecunwanzhai");
sessionmap.put("RequestTest", rt);
return "success";
}
}
struts.xml
<action name="map" class="cn.com.action.RequestTest" >
<result>/one.jsp</result>
</action>
連線頁面
<a href="map.action">map棧</a>
顯示頁面
<s:property value="#session.RequestTest.name"/>
各位有沒有懂呢?
我是沒有懂。
關於#session.RequestTest.name
1.格式是不是#session.物件.屬性?
2.session.屬性行麼?
3.物件是Action類名麼?
解答:
1、我把sessionmap.put("RequestTest", rt);改成了sessionmap.put("rt", rt);
在jsp頁面 <s:property value="#session.rt.name"/>,結果顯示正常
證實了,#session.key名稱.屬性
2、session.屬性是可以的;
當sessionmap.put("RequestTest", rt);中的rt是屬性的時候就是#session.屬性對應的key名稱;
當sessionmap.put("RequestTest", rt);中的rt是物件的時候,#session.物件對應的key名稱.屬性名稱
3.物件不是Action類名,是key名稱