1. 程式人生 > >struts2中的值棧

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>