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 的名字。

web.xml

  1. <?xml version="1.0" encoding="GBK"?>  
  2. <!-- 配置Web应用配置文件的根元素,并指定配置文件的Schema信息 -->  
  3. <web-app xmlns="http://java.sun.com/xml/ns/javaee"  
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  5.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
  6.     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">  
  7.     <!-- 定义Struts 2的核心控制器:FilterDispatcher -->  
  8.     <filter>  
  9.         <!-- 定义核心Filter的名字 -->  
  10.         <filter-name>struts2</filter-name>  
  11.         <!-- 定义核心Filter的实现类 -->  
  12.         <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>  
  13.     </filter>  
  14.     <!-- FilterDispatcher用来初始化Struts 2并且处理所有的HTTP请求 -->  
  15.     <filter-mapping>  
  16.         <filter-name>struts2</filter-name>  
  17.         <url-pattern>/*</url-pattern>  
  18.     </filter-mapping>  
  19. </web-app>  

Struts.xml

  1. <?xml version="1.0" encoding="GBK"?>  
  2. <!-- 指定Struts 2配置文件的DTD信息 -->  
  3. <!DOCTYPE struts PUBLIC   
  4.     "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"   
  5.     "http://struts.apache.org/dtds/struts-2.1.dtd">  
  6. <!-- struts是Struts 2配置文件的根元素 -->  
  7. <struts>  
  8.     <!-- Struts 2的Action必须放在指定的包空间下定义 -->  
  9.     <package name="strutsqs" extends="struts-default">  
  10.         <!-- 定义login的Action,该Action的实现类为lee.LoginAction类 -->  
  11.         <action name="login" class="lee.LoginAction">  
  12.             <!-- 定义处理结果和视图资源之间映射关系 -->  
  13.             <result name="error">/error.jsp</result>  
  14.             <result name="success">/welcome.jsp</result>  
  15.         </action>  
  16.         <!-- 定义获取图书的Action,对应实现类为lee.GetBooksAction -->  
  17.         <action name="getBooks" class="lee.GetBooksAction">  
  18.             <!-- 如果处理结果返回login,进入login.jsp页面 -->  
  19.             <result name="login">/login.jsp</result>  
  20.             <!-- 如果处理结果返回success,进入showBook.jsp页面 -->  
  21.                 <result name="success">/showBook.jsp</result>    
  22.         </action>  
  23.   
  24.     </package>  
  25. </struts>  

GetBooksAction.java

  1. import com.opensymphony.xwork2.Action;   
  2. import com.opensymphony.xwork2.ActionContext;   
  3.   
  4. public class GetBooksAction implements Action   
  5. {   
  6.     //该属性并不用于封装用户请求参数,而用于封装Action需要输出到JSP页面的信息   
  7.     private String[] books;   
  8.     //books属性的setter方法   
  9.     public void setBooks(String[] books)   
  10.     {   
  11.         this.books = books;   
  12.     }   
  13.     //books属性的getter方法   
  14.     public String[] getBooks()   
  15.     {   
  16.         return books;   
  17.     }   
  18.     //处理用户请求的execute方法   
  19.     public String execute() throws Exception   
  20.     {   
  21.         //获取Session中的user属性   
  22.         String user = (String)ActionContext.getContext()   
  23.             .getSession().get("user");   
  24.         //如果user属性不为空,且该属性值为crazyit   
  25.         if (user != null && user.equals("crazyit"))   
  26.         {   
  27.             //创建BookService实例   
  28.             BookService bs = new BookService();   
  29.             //将业务逻辑组件的返回值设置成该Action的属性   
  30.             setBooks(bs.getLeeBooks());   
  31.             return SUCCESS;   
  32.         }   
  33.         else  
  34.         {   
  35.             return LOGIN;   
  36.         }   
  37.     }   
  38. }  

BookService.java

  1. public class BookService   
  2. {   
  3.     //以一个数组模拟从持久存储设备(数据库)中取出的数据   
  4.     private String[] books =    
  5.         new String[] {   
  6.             "疯狂Java讲义" ,   
  7.             "轻量级Java EE企业应用实战",   
  8.             "疯狂Ajax讲义",   
  9.             "疯狂XML讲义",   
  10.             "Struts 2权威指南"  
  11.         };   
  12.     //业务逻辑方法,该方法返回全部图书   
  13.     public String[] getLeeBooks()   
  14.     {   
  15.         return books;   
  16.     }   
  17. }  

showBooks.jsp

  1. <%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>  
  2. <%@ page import="java.util.*,com.opensymphony.xwork2.util.*"%>  
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"   
  4.     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  5. <html xmlns="http://www.w3.org/1999/xhtml">  
  6. <head>  
  7.     <title>图书</title>  
  8.     <meta name="website" content="http://www.crazyit.org" />  
  9. </head>  
  10. <body>  
  11. <table border="1" width="360">  
  12.     <caption>图书</caption>  
  13.     <%   
  14.     //获取封装输出信息的ValueStack对象   
  15.     ValueStack vs = (ValueStack)request   
  16.         .getAttribute("struts.valueStack");   
  17.     //调用ValueStack的fineValue方法获取books属性值   
  18.     String[] books = (String[])vs.findValue("books");   
  19.     //迭代输出全部图书信息   
  20.     for (String book : books)   
  21.     {      
  22.     %>  
  23.     <tr>  
  24.         <td>书名:</td>  
  25.         <td><%=book%></td>  
  26.     </tr>  
  27.     <%}%>  
  28. </table>  
  29. </body>  
  30. </html>  

相关内容