[原创]java WEB学习笔记58:Struts2学习之路---Result 详解 type属性,通配符映射
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用
内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系。
本人互联网技术爱好者,互联网技术发烧友
微博:伊直都在0221
QQ:951226918
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
每个 action 方法都将返回一个 String 类型的值, Struts 将根据这个值来决定响应什么结果.
每个 action 声明都必须包含有数量足够多的 result 元素, 每个 result 元素分别对应着 action 方法的一个返回值
result 元素可以有下面两个属性 name: 结果的名字, 必须与 Action 方法的返回值相匹配, 默认值为 success type: 响应结果的类型. 默认值为 dispatcher
1.result 简介 及 type属性
1)result 是action 节点的子节点
2)result 代表 action 方法执行后,可能去的一个目的地
3)一个 action节点可以配置多个 result 子节点
4)result 的name 属性对应着action 方法可能的返回值
5)result 的type 属性:表示结果的响应类型
6)result 的type 属性值在struts- default 包的result-types 节点中的name属性中定义
1 <package name="struts-default" abstract="true">
2 <result-types>
3 <result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/>
4 <result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult" default="true"/>
5 <result-type name="freemarker" class="org.apache.struts2.views.freemarker.FreemarkerResult"/>
6 <result-type name="httpheader" class="org.apache.struts2.dispatcher.HttpHeaderResult"/>
7 <result-type name="redirect" class="org.apache.struts2.dispatcher.ServletRedirectResult"/>
8 <result-type name="redirectAction" class="org.apache.struts2.dispatcher.ServletActionRedirectResult"/>
9 <result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/>
10 <result-type name="velocity" class="org.apache.struts2.dispatcher.VelocityResult"/>
11 <result-type name="xslt" class="org.apache.struts2.views.xslt.XSLTResult"/>
12 <result-type name="plainText" class="org.apache.struts2.dispatcher.PlainTextResult" />
13 </result-types>
> dispatcher(默认):转发 同servlet中的转发是一致的。结果类型将把控制权转发给应用程序里的指定资源.
结果类型不能把控制权转发给一个外部资源. 若需要把控制权重定向到一个外部资源, 应该使用 redirect 结果类型
> redirect:重定向
redirect 结果类型将把响应重定向到另一个资源, 而不是转发给该资源.
redirect 结果类型接受下面这些参数: location: 用来给出重定向的目的地.它是默认属性 parse: 用来表明是否把 location 参数的值视为一个 OGNL 表达式来解释. 默认值为 true
redirect 结果类型可以把响应重定向到一个外部资源
> redirectActoin:重定向到一个action中
通过redirect 的响应类型也可以便捷的实现 redirectAcion 的功能
redirectAction 结果类型把响应重定向到另一个 Action
redirectAction 结果类型接受下面这些参数: actionName: 指定 “目的地” action 的名字. 它是默认属性
namespace: 用来指定 “目的地” action 的命名空间. 如果没有配置该参数, Struts 会把当前 Action 所在的命名空间作为 “目的地” 的命名空间
> chain:转发到一个Action
chain 结果类型的基本用途是构成一个 action 链: 前一个 action 把控制权转发给后一个 action, 而前一个 action 的状态在后一个 action 中依然保持
chain 结果类型接受下面这些参数: actionName: 指定目标 action 的名字. 它是默认属性
namespace: 用来指定 “目的地” action 的命名空间. 如果没有配置该参数, Struts 会把当前 action 所在的命名空间作为 “目的地” 的命名空间 method: 指定目标 action 方法. 默认值为 execute
<package name="testAction" namespace="/" extends="struts-default">
<action name="TestResult" class="com.jason.struts.action.TestResultAction">
<!-- 转发-->
<result name="success" type="dispatcher">/success.jsp</result>
<!-- 重定向 -->
<result name="login" type="redirect">/login.jsp</result>
<!-- 重定向到一个action -->
<!-- <result name="index" type="redirectAction">
<param name="actionName">testAction</param>
<param name="namespace">/jason</param>
</result> -->
<!-- 通过 redirect 的响应类型也可以便捷的实现redirectAction 的功能 -->
<result name="index" type="redirect">/jason/testAction.do</result>
<!-- 转发到一个 Action -->
<result name="test" type="chain">
<param name="actionName">testAction</param>
<param name="namespace">/jason</param>
</result>
</action>
</package>
<package name="testPackage" namespace="/jason" extends="struts-default">
<action name="testAction" class="com.jason.struts.action.TestAction">
<result name="success">/success.jsp</result>
</action>
</package>
2.通配符映射
1)一个 Web 应用可能有成百上千个 action 声明. 可以利用 struts 提供的通配符映射机制把多个彼此相似的映射关系简化为一个映射关系
2)通配符映射规则
① 若找到多个匹配, 没有通配符的那个将胜出 :即,当
② 若指定的动作不存在, Struts 将会尝试把这个 URI 与任何一个包含着通配符 * 的动作名及进行匹配
③ 被通配符匹配到的 URI 字符串的子串可以用 {1}, {2} 来引用. {1} 匹配第一个子串, {2} 匹配第二个子串…
④ {0} 匹配整个 URI
⑤ 若 Struts 找到的带有通配符的匹配不止一个, 则按先后顺序进行匹配
⑥ * 可以匹配零个或多个字符, 但不包括 / 字符. 如果想把 / 字符包括在内, 需要使用 **. 如果需要对某个字符进行转义, 需要使用 \.
1 <action name="UserAction-*" class="com.jason.struts.action.UserAction" method="{1}"> 2 <result name="{1}-success">/success.jsp</result> 3 </action> 4 5 6 <!-- 7 8 <action name="UserAction-save" class="com.jason.struts.action.UserAction" method="save"> 9 <result name="save-success">/success.jsp</result> 10 </action> 11 12 <action name="UserAction-update" class="com.jason.struts.action.UserAction" method="update"> 13 <result name="update-success">/success.jsp</result> 14 </action> 15 <action name="UserAction-delete" class="com.jason.struts.action.UserAction" method="delete"> 16 <result name="delete-success">/success.jsp</result> 17 </action> 18 <action name="UserAction-query" class="com.jason.struts.action.UserAction" method="query"> 19 <result name="query-success">/success.jsp</result> 20 </action> --> 21
UserAction.java
1 package com.jason.struts.action;
2
3 public class UserAction {
4
5 public String save(){
6 System.out.println("save ...");
7 return "save-success";
8 }
9 public String update(){
10 System.out.println("update ...");
11 return "update-success";
12 }
13 public String delete(){
14 System.out.println("delete ...");
15 return "delete-success";
16 }
17 public String query(){
18 System.out.println("query ... ");
19 return "query-success";
20 }
21
22 }
index.jsp
1 <%@ page language="java" contentType="text/html; charset=UTF-8"
2 pageEncoding="UTF-8"%>
3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
4 <html>
5 <head>
6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
7 <title>Insert title here</title>
8 </head>
9 <body>
10 <br><br>
11 <a href="UserAction-save.do">User Save</a>
12
13 <br><br>
14 <a href="UserAction-update.do">User Update</a>
15
16 <br><br>
17 <a href="UserAction-delete.do">User Delete</a>
18
19 <br><br>
20 <a href="UserAction-query.do">User Query</a>
21
22 </body>
23 </html>
3.动态方法调用:了解
动态方法调用:
通过 url 动态调用 Action 中的方法 action 声明:
URI:
/struts-app2/Product.action: Struts 调用 Product 类的 execute
/struts-app2/Product!save.action: Struts 调用 Product 类的 save() 方法
默认情况下, Struts 的动态方法调用处于禁用状态
开关:struts-core/org.apache.struts2/default.properties 中struts.enable.DynamicMethodInvocation