值栈的存储结构:
临时对象。该对象是在程序执行过程中,由容器自动创建并存储到值栈中。该对象的值并不固定,会随着应用不同而发生变化,当应用结束的时候,对象会被清空。(struts2标签输出迭代的值的时候,这些值都将以临时对象的形式放到值栈中)
模型对象。在action使用模型驱动方式传值的时候被用到。当jsp页面需要用到这些对象所携带的数据时,也会到值栈中去找对应的模型对象,获取数值。
Action对象:当每个action请求到来时候,容器会先创建一个此action的对象并存入值栈中,该对象携带所有与action执行过程有关的信息。
命名对象:主要包括servlet作用范围内相关的对象信息,比如request,session,application。
值栈中对象的遍历顺序
栈顶--临时对象--模型对象--action对象--命名对象
值栈的应用实例:
首先创建book.jsp页面
<s:form action="show.action">
<s:textfield name="book.name" label="输入书名"></s:textfield>
<s:textfield name="book.price" label="输入价格"></s:textfield>
<s:textfield name="book.page" label="输入页数"></s:textfield>
<s:submit value="确定"/>
</s:form>
创建show.jsp页面
<s:debug></s:debug> //创建调试
书名:<s:property value="%{book.name}"/><br/>
价格:<s:property value="book.price"/><br/>
页数:<s:property value="book.page"/><br/>
创建Book实体类:
public class Book {
public Stringname;//发现一个很有趣的事情,这里需要声明为公有的才行,私有的不能访问。
public int price;
public int page;
public String getname() {
return name;
}
public void setname(String name) {
this.name = name;
}
public int getprice() {
return price;
}
public void setprice(int price) {
this.price = price;
}
public int getpage() {
return page;
}
public void setpage(int page) {
this.page = page;
}
}
创建action类
public class BookAction extends ActionSupport {
private Bookbook; //必须要get这个对象,否则报错。同理,在debug调试的时候,有看到已经拿到值,但是就是不能提取出来。
public Book getBook() {
return book;
}
public void setBook(Book book) {
this.book = book;
}
public String execute()throws Exception{
//System.out.println("book.name:"+book.getName());
//System.out.println("book.price:"+book.getPrice());
return SUCCESS;
}
}
修改struts.xml文件
<package name="show" extends="struts-default" namespace="/">
<action name="show" class="com.neusoft.action.BookAction" >
<result>/show.jsp</result>
</action>
</package>
结果如图:
<s:property value = "userPassword" />
该示例代码使用Struts 2 标签输出了Action实例的userPassword属性的值。
(Action的实例通常压入值栈中。因为Action在值栈中,并且值栈是ognl的根,所以访问Action的属性时可以省略#标记)
-----------------------------------------------------------------------------------------------------------------
而非根对象访问
<s:property value = "#session.mySessionPropKey" />
另外,还可以通过debug标签查看值栈的值