struts2中的值棧
1.向值棧中放資料
1. 向值棧放資料的多種方式
第一種:獲取值棧物件,呼叫值棧物件裡面的set方法
public class ValueStackDemo1Action extends ActionSupport { @Override public String execute() throws Exception { //1.獲取值棧物件 ActionContext context = ActionContext.getContext(); ValueStack stack = context.getValueStack(); //2.呼叫set方法 stack.set("username", "zzu"); return "success"; } }
第二種:獲取值棧物件,呼叫值棧物件裡面的push方法
public class ValueStackDemo1Action extends ActionSupport { @Override public String execute() throws Exception { //1.獲取值棧物件 ActionContext context = ActionContext.getContext(); ValueStack stack = context.getValueStack(); //3.呼叫push方法 stack.push("abcd"); return "success"; } }
第三種:在action定義變數,生成變數的get方法(資料直接在action種儲存,減少記憶體的開闢)
public class ValueStackDemo1Action extends ActionSupport { //1.定義一個變數 private String name; //2.生成一個get方法 public String getName() { return name; } @Override public String execute() throws Exception { //3.在具體的方法裡面給屬性設定值 name="abcd"; return "success"; } }
2.向值棧种放物件
步驟:
(1)定義一個成員物件
(2)生成物件的get方法
(3)在具體執行的方法裡面向物件中設定值
public class ObjectDemoAction extends ActionSupport {
//1.定義一個物件
private User user=new User();
//2.get方法
public User getUser() {
return user;
}
@Override
public String execute() throws Exception {
//放具體的資料
user.setUsername("lucy");
user.setPassword("12300");
user.setAddress("china");
return "success";
}
}
3.向值棧中放list集合
步驟:
(1)定義一個成員集合變數
(2)生成集合的get方法
(3)在具體的方法裡面向list集合中放置值
public class ListDemoAction extends ActionSupport {
//1.定義一個list
private List<User> list=new ArrayList<>();
//2.生成get方法
public List<User> getList() {
return list;
}
@Override
public String execute() throws Exception {
//3.放具體的資料
User user1=new User();
user1.setUsername("小米");
user1.setPassword("123");
user1.setAddress("日本");
User user2=new User();
user1.setUsername("小馬");
user1.setPassword("133");
user1.setAddress("美國");
list.add(user1);
list.add(user2);
return "success";
}
}
2.從值棧中獲取資料
使用struts2標籤和OGNL表示式來獲取資料
1.獲取字串
public class ValueStackAction extends ActionSupport {
private String username;
public String getUsername() {
return username;
}
@Override
public String execute() throws Exception {
username="zzu";
return "success";
}
}
<title>Insert title here</title>
</head>
<body>
<s:debug></s:debug>
<!-- 先獲取字串的值 -->
<s:property value="username"/>
</body>
</html>
2.獲取物件
<!-- 獲取值棧物件的值 -->
<s:property value="user.username"/>
<s:property value="user.password"/>
<s:property value="user.address"/>
private User user=new User();
public User getUser() {
return user;
}
@Override
public String execute() throws Exception {
//username="zzu";
user.setUsername("xx");
user.setPassword("1230");
user.setAddress("china");
return "success";
}
}
3.獲取list集合中的資料
<!-- 獲取list中的資料 -->
<!-- 第一種 太固定了-->
<s:property value="list[0].username"/>
<s:property value="list[0].password"/>
<s:property value="list[0].address"/>
<br/>
<s:property value="list[1].username"/>
<s:property value="list[1].password"/>
<s:property value="list[1].address"/>
<!-- 第二種 使用struts2標籤類似於jstl的foreach標籤
s:iterator遍歷值棧的list集合
-->
<s:iterator value="list">
<s:property value="username"/>
<s:property value="password"/>
<s:property value="address"/>
</s:iterator>
<!-- 第三種 -->
<s:iterator value="list" var="user">
<s:property value="#user.username"/>
<s:property value="#user.password"/>
<s:property value="#user.address"/>
</s:iterator>
4.其他的操作
1.使用set方法向值棧中放資料的值獲取
<!-- 獲取set方法獲取值 ,根據名稱獲取值
value的值是set放置的key
-->
<s:property value="username"/>
2.使用push方法放置的值獲取的方法
(1)使用push方法設定的值,沒有名稱,只有設定的值
(2)向值棧放資料,把向值棧放資料存到數組裡面,陣列名稱為top
<!-- 獲取push方法獲取值 -->
<s:property value="[0].top"/>
3.EL表示式獲取值棧資料(why)
1.EL表示式獲取域物件值
2。向域物件設定值使用setAttribute方法,獲取使用getAttribute
3.底層增強request物件裡面的方法getAttribute方法
(1)首先從request域裡面獲取值,如果獲取到,直接返回
(2)如果從request域物件娶不到之,到值棧裡面把值取出來放到域物件裡面
4.OGNL的#和%的使用
#的使用
1.使用#獲取context裡面的資料
(1)向request域放值
(2)在頁面使用ognl獲取
<body>
<s:property value="#request.req"/>
</body>
public class ContextAction extends ActionSupport {
@Override
public String execute() throws Exception {
HttpServletRequest request = ServletActionContext.getRequest();
request.setAttribute("req", "reqvalue");
return "success";
}
}
%的使用
1.在struts2標籤中表單標籤
(1)在struts2標籤裡面使用ognl表示式,如果直接在struts2表單標籤裡面使用ognl表示式不識別,只有使用%之後才會識別
<!-- 普通輸入項 -->
<s:textfield name="username" value="%{#request.req}"></s:textfield>