Struts2第三节

ActionSupport

1). com.opensymphony.xwork2.ActionSupport 类是默认的 Action 类: 若某个 action 节点没有配置 class 属性, 则 ActionSupport 即为待执行的 Action 类. 而 execute 方法即为要默认执行的 action 方法,在编写 Action 类时, 通常会对这个类进行扩展。

<action name="testActionSupport">

           <result>/testActionSupport.jsp</result>

</action>

等价于

<action name="testActionSupport" 

            class="com.opensymphony.xwork2.ActionSuppor" 

           method="execute" >                                  

              <result>/testActionSupport.jsp</result>                        

</action>

ActionSupport

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

result

1). result 是 action 节点的子节点

2). result 代表 action 方法执行后, 可能去的一个目的地

3). 一个 action 节点可以配置多个 result 子节点. 

4). result 的 name 属性值对应着 action 方法可能有的一个返回值.

     <result name="index" >/index.jsp</result>

5). result 一共有 2 个属性, 还有一个是 type: 表示结果的响应类型

6). result 的 type 属性值在 struts-default 包的 result-types 节点的 name 属性中定义.        

 常用的有    

 > dispatcher(默认的): 转发. 同 Servlet 中的转发.   

 > redirect: 重定向   

 > redirectAction: 重定向到一个 Action  

> chain:转发到一个 Action

 注意: 通过 redirect 的响应类型也可以便捷的实现 redirectAction 的功能!

重定向

重定向

请求转发只能是:

<result name="test" type="chain">

<param name="actionName"> testAction</param>

<param name="namespace">/atguigu</param>

不能是:

<result name="test">/atguigu/testAction.do</result>

通配符映射

      struts 通配符映射应用程序越大,它里面action mapping的数量也越多,通过使用通配符,我们可以将一些相似的mapping绑在一起,用一个比较通用的mapping来表示,在前面关于action配置的那章里面也提到了这个通配符的使用,这里再系统的说一下。

如下所示,有一个配置好了的action mapping:

<action name="/edit*" class="org.apache.struts.webapp.example.Edit{1}Action">

       <result name="failure"path="/mainMenu.jsp">

        <result path="/{1}.jsp">

</action>


通配符

       这个action mapping可以用匹配所有以/edit开头的对action名称,例如/editSubscription,editRegistration等等,但是/editSubscription/add不会被匹配上。被通配符所匹配的内容将会被替换到action mapping以及result的各个属性中去,去取代{1}。比方说/editSubscription匹配上了,那么其中一个result的path属性就会被框架认为是Subscription.jsp。要注意的是,如果一个请求的url和多个action mapping匹配上了,那么选择最后面的那个执行,也就是说按照从后往前的顺序进行匹配查找,有一个例外就是精确匹配优先,如果有一个action mapping没用通配符和url给匹配上了,那么优先选择精确匹配,折合servlet中的匹配原则是一样的。

通配符中几个特殊的标记,如下所述:

*:可以匹配0个或多个任意字符,但是不包括正斜杠”/”;

**:可以匹配0个或多个任意字符,包括正斜杠’’/”在内

/:反斜杠,转义字符。

因为*不能匹配正斜杠,所以前面/editSubscription/add不会被匹配上。在action mapping中,被通配符所匹配上的值可以用符号{N}来访问,其中N是一个1到9之间的数,用来表示代替第N个被匹配上的值,说通俗点就是第N个*号所表示的内容,比方说通配符表达式是/edit*/add*/confirm*,它匹配上了/editOrder/addItem/confirmResult,那么{1}就代表Order,{2}就代表Item,{3}就代表Result,依此类推

动态方法调用

动态方法调用: 通过 url 动态调用 Action 中的方法,既改变已有的url加载action中的方法。

               <!--打开允许动态方法调用的开关, 默认是 false-->

              <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>

  URI:

            /struts-app2/Product.action: Struts 调用 Product 类的 execute

            /struts-app2/Product!save.action: Struts 调用 Product 类的 save() 方法

默认情况下, Struts 的动态方法调用处于禁用状态


关于值栈

1). helloWorld 时, ${productName} 读取 productName 值, 实际上该属性并不在 request 等域对象中, 而是从值栈中获取的.

2). ValueStack:

I.  可以从 ActionContext 中获取值栈对象

II. 值栈分为两个逻辑部分

> Map 栈: 实际上是 OgnlContext 类型, 是个 Map, 也是对 ActionContext 的一个引用. 里边保存着各种 Map:

requestMap, sessionMap, applicationMap, parametersMap, attr

> 对象栈: 实际上是 CompoundRoot 类型, 是一个使用 ArrayList 定义的栈. 里边保存各种和当前 Action 实例相关的对象.

是一个数据结构意义的栈.

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

1). 值栈中的属性值:

> 对于对象栈: 对象栈中某一个对象的属性值

> Map 栈: request, session, application 的一个属性值 或 一个请求参数的值.

2). 读取对象栈中对象的属性:

> 若想访问 Object Stack 里的某个对象的属性. 

        可以使用以下几种形式之一:  object.propertyName ; object['propertyName'] ; object["propertyName"]

> ObjectStack 里的对象可以通过一个从零开始的下标来引用. ObjectStack 里的栈顶对象可以用 [0] 来引用,      它下面的那个对象可以用 [1] 引用.   

   [0].message       

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

> 若从栈顶对象开始搜索, 则可以省略下标部分: message > 结合 s:property 标签:

3). 默认情况下, Action 对象会被 Struts2 自动的放到值栈的栈顶.

4).读取 Context Map 里的对象的属性:


读取 Context Map 里的对象的属性

调用字段和方法

1、可以利用 OGNL 调用:

       任何一个 Java 类里的静态字段或方法.

       被压入到 ValueStack 栈的对象上的公共字段和方法.

2、默认情况下, Struts2 不允许调用任意 Java 类静态方法,  需要重新设置 struts.ognl.allowStaticMethodAccess 标记变量的值为 true.

<constant name="struts.ognl.allowStaticMethodAccess"  value="true"></constant>

<s:property value="@java.lang.Math@cos(0)">

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

获取对象栈属性

<s:property value=“ProductName”/>==>CPU

为对象栈的方法为一个属性赋值

<s:property value=”setProductName(“atguigu”)”/>

再次获取对象栈属性

<s:property value=“ProductName”/>==>atguigu

访问数组类型的属性

<%

       String [] names=new String[]{“aa”,”bb”,”cc”,”dd”}

       request.setAttribute(“names”,names);

%>

length:<s:property value=”#attr.names.length”/>==>4

name[2]:<s:property value=”#attr.names[2]”/>==>cc

访问 Map 类型的属性

<%    Mapletters = new HashMap();   

          request.setAttribute(“letters ”,letters );   

          letters.put(“AA”,”a”);   

          letters.put(“BB”,”b”);    

          letters.put(“CC”,”c”);

%>

Size:<s:property value=”#attr.letters .size”/>==>3

AA:<s:property value=”#attr.letters ['AA']”/>==>a

异常处理: exception-mapping 元素

配置局部:<exception-mapping result=”input”exception=”异常全类名”></exception-mapping>

<result name=”input”>/input.jsp</result>

配置全局:

<global-exception-mappings >

          <exception-mapping result=”input”exception=”异常全类名”></exception-mapping>

</global-exception-mappings >

<global-results> 

         <result name=”input”>/input.jsp</result>

</global-results>

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容

  • 概述 什么是Struts2的框架Struts2是Struts1的下一代产品,是在 struts1和WebWork的...
    inke阅读 2,236评论 0 50
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,560评论 18 399
  • 概述 Struts就是基于mvc模式的框架!(struts其实也是servlet封装,提高开发效率!) Strut...
    奋斗的老王阅读 2,916评论 0 51
  • 本文包括: 1、Struts 2 概述2、Struts 2 快速入门3、Struts 2 的执行流程4、配置 st...
    廖少少阅读 2,946评论 3 13
  • include<iostream> include <cstring> include <algorithm> i...
    未来不是梦而是汗水阅读 167评论 0 1