你的位置:首页 > Java教程

[Java教程]struts2的 result 通配符 OGNL


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        注意: 通过 redirect 的响应类型也可以便捷的实现 redirectAction 的功能!

<result name="index" type="redirectAction"><param name="actionName">testAction</param><param name="namespace">/atguigu</param></result>

   OR

<result name="index" type="redirect">/atguigu/testAction.do</result>

          > chain: 转发到一个 Action     注意: 不能通过 type=dispatcher 的方式转发到一个 Action.  只能是

<result name="test" type="chain"><param name="actionName">testAction</param><param name="namespace">/atguigu</param></result>

  不能是:

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

 通配符映射

  可以利用 struts 提供的通配符映射机制把多个彼此相似的映射关系简化为一个映射关系

通配符映射规则

  –若找到多个匹配, 没有通配符的那个将胜出

  –若指定的动作不存在, Struts 将会尝试把这个 URI 与任何一个包含着通配符 * 的动作名及进行匹配

  –被通配符匹配到的 URI 字符串的子串可以用 {1}, {2} 来引用. {1} 匹配第一个子串, {2} 匹配第二个子串…

  –{0} 匹配整个 URI

  –若 Struts 找到的带有通配符的匹配不止一个, 则按先后顺序进行匹配

  –* 可以匹配零个或多个字符, 但不包括 / 字符. 如果想把 / 字符包括在内, 需要使用 **. 如果需要对某个字符进行转义, 需要使用 \.

动态方法调用

  通过 url 动态调用 Action 中的方法

 URI:
  –/struts-app2/Product.action: Struts 调用 Product 类的 execute
  –/struts-app2/Product!save.action: Struts 调用 Product 类的 save() 方法
 默认情况下, Struts 的动态方法调用处于禁用状态(不建议使用)
	<!-- 打开允许动态方法调用的开关, 默认是 false -->	<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>

 OGNL

  在 JSP 页面上可以可以利用 OGNL(Object-Graph Navigation Language: 对象-图导航语言) 访问到值栈(ValueStack) 里的对象属性.

  若希望访问值栈中 ContextMap 中的数据, 需要给 OGNL 表达式加上一个前缀字符 #. 如果没有前缀字符 #, 搜索将在 ObjectStack 里进行.

1. 关于值栈:

  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] 引用.

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

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

    > 结合 s:property 标签: <s:property value="[0].message" />  <s:property value="message" />

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


 调用字段和方法

  可以利用 OGNL 调用

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

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

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

  调用静态字段或方法需要使用如下所示的语法:

    –@fullyQualifiedClassName@fieldName:  @java.util.Calendar@DECEMBER

    –@fullyQualifiedClassName@methodName(argumentList):  @app4.Util@now()

  调用一个实例字段或方法的语法, 其中 object 是 Object Stack 栈里的某个对象的引用:

    –.object.fieldName: [0].datePattern

    –.object.methodName(argumentList): [0].repeat(3, “Hello”);

访问数组类型的属性

  有些属性将返回一个对象数组而不是单个对象, 可以像读取任何其他对象属性那样读取它们. 这种数组型属性的各个元素以逗号分隔, 并且不带方括号

  可以使用下标访问数组中指定的元素: colors[0]

  可以通过调用其 length 字段查出给定数组中有多少个元素: colors.length

访问 List 类型的属性

  有些属性将返回的类型是 java.util.List, 可以像读取任何其他属性那样读取它们. 这种 List 的各个元素是字符串, 以逗号分隔, 并且带方括号

  可以使用下标访问 List 中指定的元素: colors[0]

  可以通过调用其 size 方法或专用关键字 size 的方法查出给定List 的长度: colors.size 或 colors.size()

  可以通过使用 isEmpty() 方法或专用关键字 isEmpty 来得知给定的 List 是不是空. colors.isEmpty 或 colors.isEmpty()

  还可以使用 OGNL 表达式来创建 List, 创建一个 List 与声明一个 Java 数组是相同的: {“Red”, “Black”, “Green”}

访问 Map 类型的属性

  若希望检索出某个 Map 的值, 需要使用如下格式: map[key]

  可以使用 size 或 size() 得出某个给定的 Map 的键值对的个数

  可以使用 isEmpty 或 isEmpty() 检查某给定 Map 是不是空.

  可以使用如下语法来创建一个 Map:

      去法国旅游攻略法国六日游行程安排参考去法国旅游跟团行程法国旅游护照签证法国旅游路线报价费用【娱乐咨询】—最适合修身养性的国内四大禅修静地 夏末秋初 西部旅游最佳时节(图) 从南到北探寻七处油菜花的圣地(图) 旅行看时尚:东京街头的潮人 绵阳平通漂流图片?平通漂流怎么样? 绵阳平通漂流门票2015-5-7月平通漂流门票价格 柳溪江二日游最佳路线?柳溪江风景区二日游安排? 柳溪江漂流好玩吗?临安柳溪江漂流能漂多长时间? 海口西站到美兰机场怎么走?有多远? 三亚火车站离市区远吗?离火车站最近的有哪些酒店? 北京哪些景区免费发放电子门票? 从海口火车站到海口汽车西站有多远? 张家界有哪些最独特的景点? 2015年元旦去三亚亚龙湾潜水怎么样? 2015年春节是几月几号? 2015年春节去哪好? D6RTB-HJD-U3U3S3 Datasheet D6RTB-HJD-U3U3S3 Datasheet D6RTB-HJD-U3V3R3 Datasheet D6RTB-HJD-U3V3R3 Datasheet D6RTB-HJD-U3V3S3 Datasheet D6RTB-HJD-U3V3S3 Datasheet 深圳至云南五天游 深圳至云南五天游 深圳至云南五天游 云南旅游旅行社报价 云南旅游旅行社报价 云南旅游旅行社报价 深圳到云南六日游价格 深圳到云南六日游价格 深圳到云南六日游价格