struts2中页面取值的原理以及valueStack的应用
struts2中页面取值的原理以及valueStack的应用
- //获取封装输出信息的 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 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>
GetBooksAction.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
- public class BookService
- {
- //以一个数组模拟从持久存储设备(数据库)中取出的数据
- private String[] books =
- new String[] {
- "疯狂Java讲义" ,
- "轻量级Java EE企业应用实战",
- "疯狂Ajax讲义",
- "疯狂XML讲义",
- "Struts 2权威指南"
- };
- //业务逻辑方法,该方法返回全部图书
- public String[] getLeeBooks()
- {
- return books;
- }
- }
showBooks.jsp
- <%@ 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>
评论暂时关闭