Struts2学习笔记——02

ActionSupport

  1.ActionSupport是默认的action类,若某个action节点没有设置class属性,则actionsupport即为待执行的action类,而execute方法即为默认执行默认执行execute()方法

  2.在手工完成字段验证,显示错误消息,国际化等情况下,推荐继承actionSupport,

通配符映射

  1.
 
 
OGNL:

首先了解下OGNL的概念

OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者调用对象的方法,能够遍历整个对象的结构图,实现对象属性类型的转换等功能。

此外,还得先需弄懂OGNL的一些知识:

 

1.OGNL表达式的计算是围绕OGNL上下文进行的。
OGNL上下文实际上就是一个Map对象,由ognl.OgnlContext类表示。它里面可以存放很多个JavaBean对象。它有一个上下文根对象。
上下文中的根对象可以直接使用名来访问或直接使用它的属性名访问它的属性值。否则要加前缀“#key”。

 

 

2.Struts2的标签库都是使用OGNL表达式来访问ActionContext中的对象数据的。如:

 

 

3.Struts2将ActionContext设置为OGNL上下文,并将值栈作为OGNL的根对象放置到ActionContext中。

 

 

4.值栈(ValueStack) :
可以在值栈中放入、删除、查询对象。访问值栈中的对象不用“#”。
Struts2总是把当前Action实例放置在栈顶。所以在OGNL中引用Action中的属性也可以省略“#”。
 
5.调用ActionContext的put(key,value)放入的数据,需要使用#访问。

OGNL中重要的3个符号:#、%、$:

#、%和$符号在OGNL表达式中经常出现,而这三种符号也是开发者不容易掌握和理解的部分,需要时间的积累才渐渐弄清楚……
1.#符号

#符号的用途一般有三种。

—    访问非根对象属性,例如#session.msg表达式,由于Struts 2中值栈被视为根对象,所以访问其他非根对象时,需要加#前缀。实际上,#相当于ActionContext. getContext();#session.msg表达式相当于ActionContext.getContext().getSession(). getAttribute("msg") 。

—    用于过滤和投影(projecting)集合,如persons.{?#this.age>25},persons.{?#this.name=='pla1'}.{age}[0]。

—    用来构造Map,例如示例中的#{'foo1':'bar1', 'foo2':'bar2'}。

2.%符号

%符号的用途是在标志的属性为字符串类型时,计算OGNL表达式的值,这个类似js中的eval,很暴力。

3.$符号

$符号主要有两个方面的用途。

—    在国际化资源文件中,引用OGNL表达式,例如国际化资源文件中的代码:reg.agerange=国际化资源信息:年龄必须在${min}同${max}之间


—    在Struts 2框架的配置文件中引用OGNL表达式,例如:

 

  1. <validators>    
  2.     <field name="intb">    
  3.             <field-validator type="int">    
  4.             <param name="min">10param>    
  5.             <param name="max">100param>    
  6.             <message>BAction-test校验:数字必须为${min}为${max}之间!message>    
  7.         field-validator>    
  8.     field>    
  9. validators>   

 

下面通过代码对OGNL有更深的了解:

action类OgnlAction.java:
  1. package com.tjcyjd.test.action;  
  2.   
  3. import java.util.Date;  
  4. import java.util.LinkedList;  
  5. import java.util.List;  
  6.   
  7. import javax.servlet.http.HttpServletRequest;  
  8.   
  9. import org.apache.struts2.ServletActionContext;  
  10. import org.apache.struts2.convention.annotation.Action;  
  11. import org.apache.struts2.convention.annotation.Namespace;  
  12. import org.apache.struts2.convention.annotation.ParentPackage;  
  13. import org.apache.struts2.convention.annotation.Result;  
  14. import org.apache.struts2.convention.annotation.Results;  
  15. import org.springframework.stereotype.Controller;  
  16.   
  17. import com.opensymphony.xwork2.ActionContext;  
  18. import com.opensymphony.xwork2.ActionSupport;  
  19.   
  20. @Controller  
  21. @Namespace("/test")  
  22. @ParentPackage("struts-default")  
  23. @Results( { @Result(name = "success", location = "/other_test/showognl.jsp"),  
  24.         @Result(name = "fail", location = "/bbs/admin_login.jsp"),  
  25.         @Result(name = "input", location = "/bbs/admin_login.jsp") })  
  26. public class OgnlAction extends ActionSupport {  
  27.     private static final long serialVersionUID = -1494290883433357310L;  
  28.     private List persons;  
  29.   
  30.     @Action("ognlTest")  
  31.     public String ognlTest() throws Exception {  
  32.         // 获得ActionContext实例,以便访问Servlet API  
  33.         ActionContext ctx = ActionContext.getContext();  
  34.         // 存入application  
  35.         ctx.getApplication().put("msg""application信息");  
  36.         // 保存session  
  37.         ctx.getSession().put("msg""seesion信息");  
  38.         // 保存request信息  
  39.         HttpServletRequest request = ServletActionContext.getRequest();  
  40.         request.setAttribute("msg""request信息");  
  41.         // 为persons赋值  
  42.         persons = new LinkedList();  
  43.         Person person1 = new Person();  
  44.         person1.setName("pla1");  
  45.         person1.setAge(26);  
  46.         person1.setBirthday(new Date());  
  47.         persons.add(person1);  
  48.   
  49.         Person person2 = new Person();  
  50.         person2.setName("pla2");  
  51.         person2.setAge(36);  
  52.         person2.setBirthday(new Date());  
  53.         persons.add(person2);  
  54.   
  55.         Person person3 = new Person();  
  56.         person3.setName("pla3");  
  57.         person3.setAge(16);  
  58.         person3.setBirthday(new Date());  
  59.         persons.add(person3);  
  60.   
  61.         return SUCCESS;  
  62.   
  63.     }  
  64.   
  65.     public List getPersons() {  
  66.         return persons;  
  67.     }  
  68.   
  69.     public void setPersons(List persons) {  
  70.         this.persons = persons;  
  71.     }  
  72. }  

jsp页面showognl.jsp:
  1. <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>    
  2.     
  3. <%@ taglib prefix="s" uri="/struts-tags" %>    
  4. >    
  5.     
  6. <html xmlns="http://www.w3.org/1999/xhtml">    
  7.     
  8. <head>    
  9.     
  10.     <title>Struts2 OGNL 演示title>    
  11.     
  12. head>    
  13.     
  14. <body>        
  15.     
  16.     <h3>访问OGNL上下文和Action上下文h3>    
  17.     
  18.     >    
  19.     
  20.     <p>parameters: <s:property value="#parameters.msg" />p>    
  21.     
  22.     <p>request.msg: <s:property value="#request.msg" />p>    
  23.     
  24.     <p>session.msg: <s:property value="#session.msg" />p>    
  25.     
  26.     <p>application.msg: <s:property value="#application.msg" />p>    
  27.     
  28.     <p>attr.msg: <s:property value="#attr.msg" />p>    
  29.     
  30.     <hr />    
  31.     
  32.     <h3>用于过滤和投影(projecting)集合h3>    
  33.     
  34.     <p>年龄大于20p>    
  35.     
  36.     <ul>    
  37.     
  38.     >    
  39.     
  40.         <s:iterator value="persons.{?#this.age>20}">    
  41.     
  42.             <li><s:property value="name" /> - 年龄:<s:property value="age" />li>    
  43.     
  44.         s:iterator>    
  45.     
  46.     ul>    
  47.     
  48.     <p>姓名为pla1的年龄: <s:property value="persons.{?#this.name=='pla1'}.{age}[0]"/>p>    
  49.     
  50.     <hr />    
  51.     
  52.     <h3>构造Maph3>    
  53.     
  54.     <s:set name="foobar" value="#{'foo1':'bar1', 'foo2':'bar2'}" />    
  55.     
  56.     <p>The value of key "foo1" is <s:property value="#foobar['foo1']" />p>    
  57.       
  58.     <hr />   
  59.       
  60.     <h4>%符号的用法h4>    
  61.     
  62.     <s:set name="foobar" value="#{'foo1':'bar1', 'foo2':'bar2'}" />    
  63.     
  64.     <p>The value of key "foo1" is <s:property value="#foobar['foo1']" />p>    
  65.     
  66.     <p>不使用%:<s:url value="#foobar['foo1']" />p>    
  67.     
  68.     <p>使用%:<s:url value="%{#foobar['foo1']}" />p>    
  69.     
  70.     <hr />  
  71.         <%    
  72.             request.setAttribute("req", "request scope");    
  73.             request.getSession().setAttribute("sess", "session scope");    
  74.             request.getSession().getServletContext().setAttribute("app",    
  75.                     "aplication scope");    
  76.         %>    
  77.         1.通过ognl表达式获取 属性范围中的值    
  78.         <br>    
  79.         <s:property value="#request.req" />    
  80.         <br />    
  81.         <s:property value="#session.sess" />    
  82.         <br />    
  83.         <s:property value="#application.app" />    
  84.         <br />    
  85.         <hr>    
  86.     
  87.        2.通过<span style="background-color: #fafafa;">ognl表达式创建list 集合 ,并且遍历出集合中的值    
  88.         <br>    
  89.         <s:set name="list" value="{'eeeee','ddddd','ccccc','bbbbb','aaaaa'}">s:set>    
  90.         <s:iterator value="#list" var="o">    
  91.                 
  92.             <s:property />    
  93.             <br />    
  94.         s:iterator>    
  95.         <br />    
  96.         <hr>    
  97.     
  98.        3.通过ognl表达式创建Map 集合 ,并且遍历出集合中的值    
  99.         <br>    
  100.         <s:set name="map"    
  101.             value="#{'1':'eeeee','2':'ddddd','3':'ccccc','4':'bbbbb','5':'aaaaa'}">s:set>    
  102.         <s:iterator value="#map" var="o">    
  103.                 
  104.                 
  105.             <s:property value="key" />-><s:property value="value" />    
  106.             <br />    
  107.         s:iterator>    
  108.         <br />    
  109.         <hr>    
  110.       4.通过ognl表达式 进行逻辑判断    
  111.         <br>    
  112.         <s:if test="'aa' in {'aaa','bbb'}">    
  113.             aa 在 集合{'aaa','bbb'}中;    
  114.         s:if>    
  115.         <s:else>    
  116.             aa 不在 集合{'aaa','bbb'}中;    
  117.         s:else>    
  118.         <br />    
  119.         <s:if test="#request.req not in #list">    
  120.                 不 在 集合list中;    
  121.         s:if>    
  122.         <s:else>    
  123.              在 集合list中;    
  124.         s:else>    
  125.         <br />    
  126.         <hr>    
  127.           
  128.        5.通过ognl表达式 的投影功能进行数据筛选    
  129.         <br>    
  130.         <s:set name="list1" value="{1,2,3,4,5}">s:set>    
  131.         <s:iterator value="#list1.{?#this>2}" var="o">    
  132.                 
  133.             ${o }<br />    
  134.         s:iterator>    
  135.         <br />    
  136.         <hr>    
  137.        6.通过ognl表达式 访问某个类的静态方法和值    
  138.         <br>    
  139.         <s:property value="@java.lang.Math@floor(32.56)" />    
  140.     
  141.         <s:property value="@com.rao.struts2.action.OGNL1Action@aa" />    
  142.         <br />    
  143.         <br />    
  144.         <hr>    
  145.       7.ognl表达式 迭代标签 详细    
  146.         <br>    
  147.         <s:set name="list2"    
  148.             value="{'aa','bb','cc','dd','ee','ff','gg','hh','ii','jj'}">s:set>    
  149.         <table border="1">    
  150.             <tr>    
  151.                 <td>索引 td>    
  152.                 <td>td>    
  153.                 <td>奇?td>    
  154.                 <td> 偶?td>    
  155.                 <td>首?td>    
  156.                 <td> 尾?td>    
  157.                 <td>当前迭代数量td>    
  158.             tr>    
  159.             <s:iterator value="#list2" var="o" status="s">    
  160.                 <tr bgcolor="#s.even">pinks:if>">    
  161.                     <td>    
  162.                         <s:property value="#s.getIndex()" />    
  163.                     td>    
  164.                     <td>    
  165.                         <s:property />    
  166.                     td>    
  167.                     <td>    
  168.                         <s:if test="#s.odd">Ys:if>    
  169.                         <s:else>Ns:else>    
  170.                     td>    
  171.                     <td>    
  172.                         <s:if test="#s.even">Ys:if>    
  173.                         <s:else>Ns:else>    
  174.                     td>    
  175.                     <td>    
  176.                         <s:if test="#s.first">Ys:if>    
  177.                         <s:else>Ns:else>    
  178.                     td>    
  179.                     <td>    
  180.                         <s:if test="#s.isLast()">Ys:if>    
  181.                         <s:else>Ns:else>    
  182.                     td>    
  183.                     <td>    
  184.                     <s:property value="#s.getCount()"/>    
  185.                 td>    
  186.                 tr>    
  187.             s:iterator>    
  188.         table>    
  189.         <br>    
  190.         <hr>         
  191.           
  192.           
  193.        8.ognl表达式:  if/else if/else 详细<br>    
  194.         <% request.setAttribute("aa",0); %>    
  195.         <s:if test="#request.aa>=0 && #request.aa<=4">    
  196.                 在0-4之间;    
  197.         s:if>    
  198.         <s:elseif test="#request.aa>=4 && #request.aa<=8">    
  199.                 在4-8之间;    
  200.         s:elseif>    
  201.         <s:else>    
  202.              大于8;    
  203.         s:else>    
  204.         <br>    
  205.         <hr>    
  206.     9.ognl表达式: url 详细<br>    
  207.         <% request.setAttribute("aa","sss"); %>    
  208.         <s:url action="testAction" namespace="/aa/bb">    
  209.             <s:param name="aa" value="#request.aa">s:param>    
  210.             <s:param name="id">100s:param>    
  211.         s:url>    
  212.         <br/>    
  213.         <s:set name="myurl" value="'http://www.baidu.com'">s:set>    
  214.         value以字符处理:   <s:url value="#myurl">s:url><br>    
  215.         value明确指定以ognl表达式处理:    <s:url value="%{#myurl}">s:url>    
  216.         <br>    
  217.         <hr>    
  218.     10.ognl表达式: checkboxlist 详细<br>    
  219.         1> .list 生成;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br>    
  220.         name:checkboxlist的名字<br>    
  221.         list:checkboxlist要显示的列表<br>    
  222.         value:checkboxlist默认被选中的选项,checkedchecked=checked<br>    
  223.         <s:checkboxlist name="checkbox1" list="{'上网','看书','爬山','游泳','唱歌'}" value="{'上网','看书'}" >s:checkboxlist>    
  224.         <br>    
  225.          以上生成代码:<br>    
  226.         <xmp>    
  227.             <input type="checkbox" name="checkbox1" value="上网" id="checkbox1-1" checked="checked"/>    
  228.             <label for="checkbox1-1" class="checkboxLabel">上网label>    
  229.             <input type="checkbox" name="checkbox1" value="看书" id="checkbox1-2" checked="checked"/>    
  230.             <label for="checkbox1-2" class="checkboxLabel">看书label>    
  231.             <input type="checkbox" name="checkbox1" value="爬山" id="checkbox1-3"/>    
  232.             <label for="checkbox1-3" class="checkboxLabel">爬山label>    
  233.             <input type="checkbox" name="checkbox1" value="游泳" id="checkbox1-4"/>    
  234.             <label for="checkbox1-4" class="checkboxLabel">游泳label>    
  235.             <input type="checkbox" name="checkbox1" value="唱歌" id="checkbox1-5"/>    
  236.             <label for="checkbox1-5" class="checkboxLabel">唱歌label>"    
  237.         xmp>    
  238.         2> .Map 生成;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br>    
  239.         name:checkboxlist的名字<br>    
  240.         list:checkboxlist要显示的列表<br>    
  241.         listKey:checkbox 的value的值<br>    
  242.         listValue:checkbox 的lablel(显示的值)<br>    
  243.         value:checkboxlist默认被选中的选项,checkedchecked=checked<br>    
  244.         <s:checkboxlist name="checkbox2" list="#{1:'上网',2:'看书',3:'爬山',4:'游泳',5:'唱歌'}" listKey="key" listValue="value" value="{1,2,5}" >s:checkboxlist>    
  245.         <br>    
  246.                        以上生成代码:<br>    
  247.         <xmp>    
  248.             <input type="checkbox" name="checkbox2" value="1" id="checkbox2-1" checked="checked"/>    
  249.             <label for="checkbox2-1" class="checkboxLabel">上网label>    
  250.             <input type="checkbox" name="checkbox2" value="2" id="checkbox2-2" checked="checked"/>    
  251.             <label for="checkbox2-2" class="checkboxLabel">看书label>    
  252.             <input type="checkbox" name="checkbox2" value="3" id="checkbox2-3"/>    
  253.             <label for="checkbox2-3" class="checkboxLabel">爬山label>    
  254.             <input type="checkbox" name="checkbox2" value="4" id="checkbox2-4"/>    
  255.             <label for="checkbox2-4" class="checkboxLabel">游泳label>    
  256.             <input type="checkbox" name="checkbox2" value="5" id="checkbox2-5" checked="checked"/>    
  257.             <label for="checkbox2-5" class="checkboxLabel">唱歌label>    
  258.         xmp>    
  259.         <hr>    
  260. body>    
  261. html>    

总结OGNL的使用方法:

访问属性

名字属性获取:

地址属性获取:

访问方法

调用值栈中对象的普通方法:

访问静态属性和方法

调用Action中的静态方法:

调用JDK中的类的静态方法:

调用JDK中的类的静态方法(同上):

调用JDK中的类的静态方法:

调用普通类中的静态属性:

访问构造方法

调用普通类的构造方法:

 

1.5. 访问数组

获取List:

获取List中的某一个元素(可以使用类似于数组中的下标获取List中的内容):


获取Set:

获取Set中的某一个元素(Set由于没有顺序,所以不能使用下标获取数据):


 ×

获取Map:

获取Map中所有的键:

获取Map中所有的值:

获取Map中的某一个元素(可以使用类似于数组中的下标获取List中的内容):


获取List的大小:

 

访问集合 – 投影、选择(? ^ $)

利用选择获取List中成绩及格的对象:

利用选择获取List中成绩及格的对象的username:


利用选择获取List中成绩及格的第一个对象的username:


利用选择获取List中成绩及格的第一个对象的username:


利用选择获取List中成绩及格的最后一个对象的username:


利用选择获取List中成绩及格的第一个对象然后求大小:


集合的伪属性

OGNL能够引用集合的一些特殊的属性,这些属性并不是JavaBeans模式,例如size(),length()等等. 当表达式引用这些属性时,OGNL会调用相应的方法,这就是伪属性.

集合

伪属性

Collection(inherited by Map, List & Set)

size ,isEmpty

List

iterator

Map

keys , values

Set

iterator

Iterator

next , hasNext

Enumeration

next , hasNext , nextElement , hasMoreElements

 

 Lambda   :[…]

格式::[…]

使用Lambda表达式计算阶乘:


OGNL中#的使用

#可以取出堆栈上下文中的存放的对象.

名称

作用

例子

parameters

包含当前HTTP请求参数的Map

#parameters.id[0]作用相当于

request.getParameter("id")

request

包含当前HttpServletRequest的属性(attribute)的Map

#request.userName相当于

request.getAttribute("userName")

session

包含当前HttpSession的属性(attribute)的Map

#session.userName相当于

session.getAttribute("userName")

application

包含当前应用的ServletContext的属性(attribute)的Map

#application.userName相当于

application.getAttribute("userName")

attr

用于按request > session > application顺序访问其属性(attribute)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

获取Paraments对象的属性:

OGNL中%的使用

用%{}可以取出存在值堆栈中的Action对象,直接调用它的方法.

例如你的Action如果继承了ActionSupport .那么在页面标签中,用%{getText('key')}的方式可以拿出国际化信息.

 OGNL中$的使用

“$”有两个主要的用途

l         用于在国际化资源文件中,引用OGNL表达式

l         在Struts 2配置文件中,引用OGNL表达式

 值栈回顾

ValueStack对象。这个对象贯穿整个Action的生命周期(每个Action类的对象实例会拥有一个ValueStack对象)。当 Struts 2接收到一个.action的请求后,会先建立Action类的对象实例,但并不会调用Action方法,而是先将Action类的相应属性放到 ValueStack对象的顶层节点(ValueStack对象相当于一个栈)。

在Action中获得ValueStack对象:ActionContext.getContext().getValueStack()

l         Top语法

使用Top获取值栈中的第二个对象:

l         N语法

使用N获取值栈中的第二个对象:

l         @语法

调用action中的静态方法: vs:值栈 1:表示第一个。


关于值站:${name}读取name值,实际上该属性并不在request等与对象中,而是从值站中读取的

ValueStack:

1)可以从ActionContext中读取值站对象

2)值站分为两个逻辑部分,map站:实际上是ognlContext类型,是否map,也是对actioncon的一个引用,里边保存各种map

    requestMap,sessionMap,applicationMap,parametersMap,attr

    对象站:实际上是compoundRoot类型,是一个使用arrayList定义的站,里边保存各种和当前action实例相关,是一个数据结构意义的站。


Struts2利用s:property 标签和OGNL表达式来读取值站中的属性值

 1)值站中的属性值:对于对象站:对象站中某一个对象的属性值。map站:request,session,application的一个属性值或一个请求参数的值。

 2)读取对象站中对象的属性:若想访问object stack里的某个对象的属性,可以使用一下几种形式之一:

    object.propertyName;object['propertyName'];objedt["propertyName"]

objectStatck里的对象可以通过一个从零下标来引用,objectStack里的栈顶对象可以用[0]来引用,他下面的那个对象可以用[1]引用

    [0].message

   [n]的含义是从第n个开始搜索,而不是只搜索第n个对象

   若从栈顶对象开始搜索,则可以省略下标部分:message

   结合s:property标签

 

看值站的状态:

获取值站:ValueStack valueStack=ActionContext.getContext().getValueStatck();

创建Test对象,并为其属性赋值

Test object=new Test();

object.setProductDesc("ddd");

object.setName("ddd");

把Test对象压入到值站的栈顶

valueStack.push(object);


可以用OGNL调用public 静态类型静态的方法和字段


配置文件必须打开
 
 

调用对象站的方法为一个属性赋值


ognl可以范围数组类型的属性

调用数组对象的属性<%

   String[] names=new String[]{"ss","bb"}

request.setAttribute("names",names);

%>

length:

names[2]:

访问list和数组一样


访问map类型的属性:map[key],size,isEmpty()

<%

   Map letters=nwe HashMap();

request.setAttribut("letters",letters);

letters.put("ss","ss");

%>

ss:


配置全局异常:   
    
   
          /input.jsp
   

    
   
        
   

    
   
jsp显示:
  
  

  


Struts2把action对象自动放入到值站中:

     1)放入的时间点为:struts2中将调用aciton类的aciton方法,单在调用该方法之前:

      ---》先创建一个strutsActionProxy对象,

  ---》在创建stutsActionProxy之后,对其进行初始化时候,吧action对象放入到值站中

s:property 打印值站中属性值的:对应对象站,打印值站中对象的属性值


对应map站,打印request,session,application.属性值或某个请求参数的值

 test tag

<%

   session.setAttribut("date",new Date());

%>


s:url:创建一个url字符串

 

${url}输出:


对应value值会自动的进行ognl解析

 

对应value值会自动的进行ognl解析 若不希望进行解析,使用单引号引起了

 

s:set想page,request,session,application放入属性值

request.setAttribute("person",person);

%>


${name}


s:if ,s:else,s:esleif可以直接使用值站中的属性

 

 kjljlkljk



s:iterator遍历集合的:并吧这个可遍历的对象每一个元素依次压入值站

List person =new ArrayList();

person.add(new Person("aa",10);

person.add(new Person("a32",10);

person.add(new Person("asdd",10);

request.setAttribute("persons",persons);

${name}-${age}


s:sort标签对一个可遍历对象里元素进行排序


s:date可以对date对象进行排版

date:${date2}

s:a可以使用%{}把属性包装起来,使其进行强制的ognl解析

 ${name}


表单标签:

1.使用和html的form标签差不多

2.strusts2的form标签会生成一个table,以进行自动的排版

3.可以对表单提交的值进行回显:从栈顶对象开始匹配属性,并吧匹配的属性值辅道对应的标签的value中,若栈顶对象没有对应的属性,则一次向下找相应的属性。


主要用于修改页面,从数据库取出来对象之后,push到值站中就ok了

 


list,listKey和listValue属性对radio,select,checkboxlist等标签废材重要


Struts2运行流程

1)ActionProxy是action的一个代理类,也就是说action的调用是通过actionProxy实现的,其实就是调用了actionProxy.execute()方法,而该方法又调用了actionInvocation.invoke()方法

2)ActionInvocation就是action的调用者。actionInvocation在action中执行过程中,负责Interceptor,action和result等以下列元素的调度







你可能感兴趣的:(SSH学习)