struts2中页面取值的原理以及valueStack的应用

  1. //获取封装输出信息的 ValueStack 对象   
  2. ValueStack vs = (ValueStack)request.getAttribute("struts.valueStack");   
  3.   
  4. //调用ValueStack的fineValue方法获取books属性值   
  5.     String[] books = (String[])vs.findValue("books");  

       上面代码返回一个 ValueStack 对象,该对象封装了 Action 全部的输出信息。该对象是 Struts 2 使用的一个 ValueStack对象,可以通过 OGNL 表达式非常方便的访问该对象封装的信息。

         ValueStack 有点类似于 Map 结构,但它比 Map 结构更加强大(因为它可以根据表达式来查询值)。Action 所以的属性都被封装到了 ValueStack 对象中,Action 中的属性名可以理解为 ValueStack 中 value 的名字

    <?xml version="1.0" encoding="GBK"?>  
    <!-- 配置Web应用配置文件的根元素,并指定配置文件的Schema信息 -->  
    <web-app xmlns="http://java.sun.com/xml/ns/javaee"  
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
        http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">  
        <!-- 定义Struts 2的核心控制器:FilterDispatcher -->  
        <filter>  
            <!-- 定义核心Filter的名字 -->  
            <filter-name>struts2</filter-name>  
            <!-- 定义核心Filter的实现类 -->  
            <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>  
        </filter>  
        <!-- FilterDispatcher用来初始化Struts 2并且处理所有的HTTP请求 -->  
        <filter-mapping>  
            <filter-name>struts2</filter-name>  
            <url-pattern>/*</url-pattern>  
        </filter-mapping>  
    </web-app>  
    Struts.xml
    <?xml version="1.0" encoding="GBK"?>  
    <!-- 指定Struts 2配置文件的DTD信息 -->  
    <!DOCTYPE struts PUBLIC   
        "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"   
        "http://struts.apache.org/dtds/struts-2.1.dtd">  
    <!-- struts是Struts 2配置文件的根元素 -->  
    <struts>  
        <!-- Struts 2的Action必须放在指定的包空间下定义 -->  
        <package name="strutsqs" extends="struts-default">  
            <!-- 定义login的Action,该Action的实现类为lee.LoginAction类 -->  
            <action name="login" class="lee.LoginAction">  
                <!-- 定义处理结果和视图资源之间映射关系 -->  
                <result name="error">/error.jsp</result>  
                <result name="success">/welcome.jsp</result>  
            </action>  
            <!-- 定义获取图书的Action,对应实现类为lee.GetBooksAction -->  
            <action name="getBooks" class="lee.GetBooksAction">  
                <!-- 如果处理结果返回login,进入login.jsp页面 -->  
                <result name="login">/login.jsp</result>  
                <!-- 如果处理结果返回success,进入showBook.jsp页面 -->  
                    <result name="success">/showBook.jsp</result>    
            </action>  
      
        </package>  
    </struts>  

    import com.opensymphony.xwork2.Action;   
    import com.opensymphony.xwork2.ActionContext;   
      
    public class GetBooksAction implements Action   
    {   
        //该属性并不用于封装用户请求参数,而用于封装Action需要输出到JSP页面的信息   
        private String[] books;   
        //books属性的setter方法   
        public void setBooks(String[] books)   
        {   
            this.books = books;   
        }   
        //books属性的getter方法   
        public String[] getBooks()   
        {   
            return books;   
        }   
        //处理用户请求的execute方法   
        public String execute() throws Exception   
        {   
            //获取Session中的user属性   
            String user = (String)ActionContext.getContext()   
                .getSession().get("user");   
            //如果user属性不为空,且该属性值为crazyit   
            if (user != null && user.equals("crazyit"))   
            {   
                //创建BookService实例   
                BookService bs = new BookService();   
                //将业务逻辑组件的返回值设置成该Action的属性   
                setBooks(bs.getLeeBooks());   
                return SUCCESS;   
            }   
            else  
            {   
                return LOGIN;   
            }   
        }   
    }  

    <%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>  
    <%@ page import="java.util.*,com.opensymphony.xwork2.util.*"%>  
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"   
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
    <html xmlns="http://www.w3.org/1999/xhtml">  
    <head>  
        <title>图书</title>  
        <meta name="website" content="http://www.crazyit.org" />  
    </head>  
    <body>  
    <table border="1" width="360">  
        <caption>图书</caption>  
        <%   
        //获取封装输出信息的ValueStack对象   
        ValueStack vs = (ValueStack)request   
            .getAttribute("struts.valueStack");   
        //调用ValueStack的fineValue方法获取books属性值   
        String[] books = (String[])vs.findValue("books");   
        //迭代输出全部图书信息   
        for (String book : books)   
        {      
        %>  
        <tr>  
            <td>书名:</td>  
            <td><%=book%></td>  
        </tr>  
        <%}%>  
    </table>  
    </body>  
    </html>  


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值