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>
//获取封装输出信息的 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>
相关文章推荐
- Java学习日记-7 抽象类和接口
- Java学习日记-6 继承
- JAVA基础学习day27--反射机制
- Ehcache 整合Spring 使用页面、对象缓存
- spring aop切面动态代理xml配置实现
- Java中String.equals()方法的实现代码
- 2015 最简单的 Spring MVC 入门教程
- Java通过URL获取资源
- Java System性能监控
- java连接ms sql server各类问题解析
- 静心,理清java知识结构
- Java设计模式7:适配器模式
- SpringMVC @RequestParam 注解
- 通过反射了解泛型的本质
- Java String课堂例子验证
- sqlDeveloper打不开 找不到适配的jdk
- Java jvm 原理
- MyEclipse 2014 破解图文详细教程
- JAVA 基础知识入门
- Eclipse远程调试出现“JDWP Transport dt_socket failed to initialize”的解决方案