您的位置:首页 > 编程语言 > Java开发

struts.valueStack (Action 中属性存放的原理)

2015-10-24 13:21 405 查看
Java代码  


//获取封装输出信息的 ValueStack 对象  

ValueStack vs = (ValueStack)request.getAttribute("struts.valueStack");  

  

//调用ValueStack的fineValue方法获取books属性值  

    String[] books = (String[])vs.findValue("books");  

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

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

 

 web.xml

Xml代码  


<?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代码  


<?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>  

 

GetBooksAction.java

Java代码  


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;  

        }  

    }  

}  

 

BookService.java

Java代码  


public class BookService  

{  

    //以一个数组模拟从持久存储设备(数据库)中取出的数据  

    private String[] books =   

        new String[] {  

            "疯狂Java讲义" ,  

            "轻量级Java EE企业应用实战",  

            "疯狂Ajax讲义",  

            "疯狂XML讲义",  

            "Struts 2权威指南"  

        };  

    //业务逻辑方法,该方法返回全部图书  

    public String[] getLeeBooks()  

    {  

        return books;  

    }  

}  

 

showBooks.jsp

Html代码  


<%@ 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>  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: