3. 解析 struts.xml 文件
1. struts.xml 文件基本配置:
- 主要放在资源路径下,配置 sturts2相关的 Action , 拦截器等配置
<struts>
<!-- 设置常量 -->
<constant name="struts.enable.DynamicMethodInvocation" value="false"/>
<constant name="struts.devMode" value="true"/>
<!-- 修改默认的扩展名 -->
<constant name="struts.action.extension" value="action,,do"/>
<!--
1、package: 包. struts2 使用 package 来组织模块.
2、name 属性: 必须. 用于其它的包应用当前包.
3、extends: 当前包继承哪个包, 继承的, 即可以继承其中的所有的配置. 通常情况下继承 struts-default
struts-default 这个包在 struts-default.xml 文件中定义.
4、namespace 可选, 如果它没有给出, 则以 / 为默认值.
若 namespace 有一个非默认值, 则要想调用这个包里的Action,
就必须把这个属性所定义的命名空间添加到有关的 URI 字符串里
-->
<package name="default" namespace="/" extends="struts-default">
<!--
1、配置一个action 一个Struts请求就是一个action
2、name:一个请求的名字(或者一个ServletPath,但是去除"/"和扩展名)
3、class: 指定处理请求的Action, 如果没有填写,默认值为 struts-default.xml 中配置的 com.opensymphony.xwork2.ActionSupport
4、method: 1)、处理请求的Action 的 method, 如果不设置,默认调用的是 execute 方法
2)、没有该方法就会抛出 NoSuchMethodException 异常
3)、如果有继承 ActionSupport ,并且没有配置 method,就会调用 ActionSupport 的 execute,返回一个常量 SUCCESS = "success"; 根据常量去result不同的结果
-->
<action name="helloworld" class="org.pan.struts2.UserAction">
<!--
name: 和action中的class方法返回的字符串相匹配(默认为success,可不写)
type: 表示结果类型,默认为dispatcher(转发到结果路径,可不写), 其他相关类型,在package 继承的struts-default.xml 中
result中填写要转发到的路径
-->
<result name="success" type="dispatcher">/WEB-INF/views/success.jsp</result>
</action>
</package>
<!-- 如果包含多个 struts.xml, 可以包含到一个总的配置文件中 -->
<include file="struts-user.xml"/>
</struts>
2. result-type 结果类型
- Struts2 中我们已经不再需要手动跳转到的指定资源,而是 Struts2 在框架内部替我们完成。
- 我们可以在 action 标签配置多个 result,并为 result 指定一个 name 属性
- 我们只需要在 action 方法中返回一个 result 的那么,则 Struts2 会自动调到对应 result 指定资源。
- Struts2 默认以转发的形式跳转到目标资源,我们也可以通过 type属性 来指定跳转的方式。
- 在 struts-default.xml 中定义了所有的 result-types:
<result-types>
<result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/>
<result-type name="dispatcher" class="org.apache.struts2.result.ServletDispatcherResult" default="true"/>
<result-type name="freemarker" class="org.apache.struts2.views.freemarker.FreemarkerResult"/>
<result-type name="httpheader" class="org.apache.struts2.result.HttpHeaderResult"/>
<result-type name="redirect" class="org.apache.struts2.result.ServletRedirectResult"/>
<result-type name="redirectAction" class="org.apache.struts2.result.ServletActionRedirectResult"/>
<result-type name="stream" class="org.apache.struts2.result.StreamResult"/>
<result-type name="velocity" class="org.apache.struts2.result.VelocityResult"/>
<result-type name="xslt" class="org.apache.struts2.views.xslt.XSLTResult"/>
<result-type name="plainText" class="org.apache.struts2.result.PlainTextResult" />
<result-type name="postback" class="org.apache.struts2.result.PostbackResult" />
</result-types>
常用的有四种结果类型
- dispatcher (请求转发)
- chain (请求到一个 Action)
- redirect (重定向, 也可以重定向到一个 Action)
- redirectAction (重定向到一个 Action)
dispatcher 通过转发的形式跳转到目标资源,默认值
- dispatcher需要指定一个location属性,指向一个目标资源的地址,
- location 是默认属性,可以直接在result标签中配置,也可以通过param标签单独配置
<!-- 这两个等价 -->
<result name="success" type="dispatcher">/WEB-INF/views/success.jsp</result>
<result name="success" type="dispatcher">
<param name="location">/WEB-INF/views/success.jsp</param>
</result>
- redirect 通过重定向的形式跳转到目标资源
- redirect 结果类型将把响应重定向到另一个资源, 而不是转发给该资源.
- redirect 结果类型接受下面这些参数:
- location: 用来给出重定向的目的地.它是默认属性
- parse: 用来表明是否把 location 参数的值视为一个 OGNL 表达式来解释. 默认值为 true
- redirect 结果类型只能把响应重定向到一个外部资源
- 使用 redirect 同样也可以重定向到一个Action
<!-- redirect 只能重定向到外部资源,不能到内部资源 -->
<result name="success" type="redirect">/redirect.jsp</result>
<!-- 重定向到一个Action /NameSpace/actionName-->
<result name="success" type="redirect">/pan/add</result>
- redirectAction 通过重定向的形式跳转到一个Action
- redirectAction 结果类型把响应重定向到另一个 Action
- redirectAction 结果类型接受下面这些参数:
- actionName: 指定 “目的地” action 的名字. 它是默认属性
- namespace: 用来指定 “目的地” action 的命名空间. 如果没有配置该参数, Struts 会把当前 Action 所在的命名空间作为 “目的地” 的命名空间
<package name="testType" namespace="/pan" extends="struts-default">
<action name="add" class="org.pan.struts2.action.HelloAction" method="add">
<result name="success">/WEB-INF/views/success.jsp</result>
</action>
</package>
<!-- redirectAction:重定向到一个Action,需要指定两个参数,actionName、namespace -->
<result name="success" type="redirectAction">
<param name="actionName">add</param>
<param name="namespace">/pan</param>
</result>
- chain 将请求直接转发到一个Action(通过转发的形式跳转的一个Action)
- chain 结果类型的基本用途是构成一个 action 链: 前一个 action 把控制权转发给后一个 action, 而前一个 action 的状态在后一个 action 中依然保持
- chain 结果类型接受下面这些参数:
- actionName: 指定目标 action 的名字. 它是默认属性
- namespace: 用来指定 “目的地” action 的命名空间. 如果没有配置该参数, Struts 会把当前 action 所在的命名空间作为 “目的地” 的命名空间
- method: 指定目标 action 方法. 默认值为 execute
<!-- chain 转发到一个Action 形成一个 Action 链 -->
<result name="success" type="chain">
<param name="actionName">update</param>
<param name="namespace">/pan</param>
<param name="method">update</param>
</result>
- 不要使用 type=dispatcher 的方式转发到一个 Action,但是我们可以通过配置 struts2 的 filter-mapping 的拦截方式来实现
- filter-mapping,默认情况下,只能直接访问(
<dispatcher>REQUEST</dispatcher>)目标资源才会执行过滤器,而 forward 执行目标资源,不会执行过滤器! - 所以我们首先需要先配置 struts2 的filter-mapping
- filter-mapping,默认情况下,只能直接访问(
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>FORWARD</dispatcher>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
<!--
1、使用 dispatcher 进行请求转发到一个 Action,需要在 struts2的 filter-mapping 中配置请求的方式
添加 <dispatcher>FORWARD</dispatcher>, 但是默认的 <dispatcher>REQUEST</dispatcher>我们也需要添加上去
2、否则不会去拦截我们的清秀资源
-->
<result name="success" type="dispatcher">/pan/update</result>
3. 在 package 标签中来映射全局的result
global-results标签配置到package标签,它可以 对当前package中的所有action起作用。- 但是,如果 action 中有和global-results相同名字的result,则会优先使用当前action中配置的result。
<global-results>
<result name="success" type="dispatcher">/WEB-INF/views/success.jsp</result>
</global-results>
<!-- result name相同,优先返回 action 中的 result -->
<action name="helloworld" class="org.pan.struts2.action.HelloAction" method="execute">
<result name="success" type="dispatcher">/WEB-INF/views/input.jsp</result>
</action>
4. 通配符映射
- 一个 Web 应用可能有成百上千个 action 声明. 可以利用 struts 提供的通配符映射机制把多个彼此相似的映射关系简化为一个映射关系
- 通配符映射规则
- 若找到多个匹配, 没有通配符的那个将胜出
- 若指定的动作不存在, Struts 将会尝试把这个 URI 与任何一个包含着通配符 * 的动作名及进行匹配
- 被通配符匹配到的 URI 字符串的子串可以用 {1}, {2} 来引用. {1} 匹配第一个子串, {2} 匹配第二个子串…
{0} 匹配整个 URI - 若 Struts 找到的带有通配符的匹配不止一个, 则按先后顺序进行匹配 ,在 package 中的顺序,最上边的action。
*可以匹配零个或多个字符, 但不包括 / 字符. 如果想把 / 字符包括在内, 需要使用 **. 如果需要对某个字符进行转义, 需要使用\.
<a href="study-add.do">Study Add</a><br/>
<a href="study-delete.do">Study Delete</a><br/>
<a href="study-update.do">Study Update</a><br/>
<a href="study-query.do">Study Query</a><br/>
<action name="study-*" class="org.pan.struts2.action.TestTongPeiFu" method="{1}">
<result name="{1}">/success.jsp</result>
</action>
public String add() {
System.out.println("add........");
return "add";
}
public String delete() {
System.out.println("delete........");
return "delete";
}
public String update() {
System.out.println("update........");
return "update";
}
public String query() {
System.out.println("query........");
return "query";
}
5. 动态方法调用(DMI)
- 动态方法调用: 通过 url 动态调用 Action 中的方法
- 调用方式:actionName!methodName
- URI:
- /struts-app2/Product.action: Struts 调用 Product 类的 execute
- /struts-app2/Product!save.action: Struts 调用 Product 类的 save() 方法
- 默认情况下, Struts 的动态方法调用处于禁用状态 在struts.xml 中修改
<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
6. Struts2 异常处理
- 一个成熟的MVC框架中还需要有一个完善的异常处理机制,也就是说框架内部应该可以替我们完成出现异常以后的处理。
Struts2 提供了一种声明式的异常处理方式。可以将异常交给Struts2处理,Struts2捕获到指定异常后会返回浏览器一个指定页面。 - 异常映射有两种方式,一种是局部异常映射、一种是全局异常映射。
- 局部的异常映射:
- exception-mapping 元素: 配置当前 action 的声明式异常处理
- exception-mapping 元素中有 2 个属性
- exception: 指定需要捕获的的异常类型。异常的全类名
- result: 指定一个响应结果, 该结果将在捕获到指定异常时被执行, 既可以来自当前 action 的声明, 也可以来自 global-results 声明
- 全局异常映射
- 可以通过 global-exception-mappings 元素为应用程序提供一个全局性的异常捕获映射.
- 但在 global-exception-mappings 元素下声明的任何 exception-mapping 元素最好只引用在 global-results 元素下声明的某个 result 元素
- 声明式异常处理机制由 ExceptionMappingInterceptor 拦截器负责处理,
- 当某个 exception-mapping 元素声明的异常被捕获到时, ExceptionMappingInterceptor 拦截器就会向 ValueStack 中添加两个对象:
- exception: 表示被捕获异常的 Exception 对象
- exceptionStack: 包含着被捕获异常的栈
- 可以在视图上通过
<s:property>标签, 或者<s:debug></s:debug>显示异常消息
<!-- 局部映射 -->
<action name="testException" class="org.pan.struts2.action.UserAction" method="testException">
<!-- 局部的异常映射 -->
<exception-mapping exception="java.lang.ArithmeticException" result="exception"></exception-mapping>
<result name="success" type="dispatcher">/WEB-INF/views/success.jsp</result>
<result name="exception" type="dispatcher">/WEB-INF/views/exception.jsp</result>
</action>
<!-- 全局映射 -->
<global-results>
<result name="error">/WEB-INF/views/exception.jsp</result>
</global-results>
<global-exception-mappings>
<!-- 全局的异常映射,如果返回一个局部的result, 会查找该package下所有对应的 -->
<!--<exception-mapping exception="java.lang.ArithmeticException" result="exception"></exception-mapping>-->
<!--所以最好引用配置的全局的 result -->
<exception-mapping exception="java.lang.ArithmeticException" result="error"></exception-mapping>
</global-exception-mappings>
3. 解析 struts.xml 文件的更多相关文章
- (二)Struts.xml文件详解
一.Struts.xml文件 Struts.xml文件构成 如图,<Struts>标签内共有5个子标签. 1.1 struts-default.xml 查看Struts的内容可知,Stru ...
- 完整的struts.xml文件骨架
完整的struts.xml文件骨架可以直接拿来用,修改一下就可以啦. <?xml version="1.0" encoding="UTF-8"?> ...
- struts2——配置struts.xml文件
在struts2框架中struts.xml是应当放到src的根目录,程序编译后会将struts.xml放到WEB-INF/classes目录下. Struts2在web.xml中的一般配置如下: &l ...
- 分享非常有用的Java程序 (关键代码)(六)---解析/读取XML 文件(重要)
原文:分享非常有用的Java程序 (关键代码)(六)---解析/读取XML 文件(重要) XML文件 <?xml version="1.0"?> <student ...
- struts.xml文件中配置tiles.xml
Apache Tiles是一个JavaEE应用的页面布局框架.Tiles框架提供了一种模板机制,可以为某一类页面定义一个通用的模板,该模板定义了页面的整体布局.布局由可以复用的多个块组成,每个页面可以 ...
- struts.xml 文件添加DTD文件
在编辑struts.xml 文件时,“alt + /”无提示信息,需要在myeclipse 中添加消息头中的文件,步骤如下: 1. 选中该段复制 2. Preferences——>XML Cat ...
- struts.xml文件:
struts.xml文件中包含的配置信息,你将修改所采取的措施的开发.这个文件可以被用来覆盖默认设置的应用程序,例如struts.devMode=false和其他设置中定义的属性文件.这个文件可以创建 ...
- Struts2 学习笔记——struts.xml文件之Bean的配置
Struts2的大部分核心组件不是以硬编码的形式写在代码中,而是通过自身的IoC容器来管理的. Struts2以可配置的形式来管理核心组件,所以开发者可以很容易的扩展框架的核心组件.当开发者需要扩展或 ...
- Struts2 | struts.xml文件中使用method属性和通配符简化action标签和Action处理类的编写
转自:https://www.jianshu.com/p/310e89ee762d 在Struts2框架中,我们知道基本的Action标签只能实现一个url请求对应一个Action处理类.那么我们如果 ...
随机推荐
- 【小程序分享篇 一 】开发了个JAVA小程序, 用于清除内存卡或者U盘里的垃圾文件非常有用
有一种场景, 手机内存卡空间被用光了,但又不知道哪个文件占用了太大,一个个文件夹去找又太麻烦,所以我开发了个小程序把手机所有文件(包括路径下所有层次子文件夹下的文件)进行一个排序,这样你就可以找出哪个 ...
- ASP.NET Core应用的错误处理[2]:DeveloperExceptionPageMiddleware中间件如何呈现“开发者异常页面”
在<ASP.NET Core应用的错误处理[1]:三种呈现错误页面的方式>中,我们通过几个简单的实例演示了如何呈现一个错误页面,这些错误页面的呈现分别由三个对应的中间件来完成,接下来我们将 ...
- 在ASP.NET Core中使用百度在线编辑器UEditor
在ASP.NET Core中使用百度在线编辑器UEditor 0x00 起因 最近需要一个在线编辑器,之前听人说过百度的UEditor不错,去官网下了一个.不过服务端只有ASP.NET版的,如果是为了 ...
- x:bind不支持样式文件 或 此Xaml文件必须又代码隐藏类才能使用{x:Bind} 解决办法
这两天学习UWP开发,发现一个很有趣的问题,就是我题目中的描述的. 我习惯了在ResourceDictionary中写样式文件,但是发现用x:Bind时会有问题 如果是写在Style里,则提示 “x: ...
- inline-block元素间距问题的几种解决方案
不知道大家有没有碰到过设置了display:inline-block;的几个相邻元素之间有几px间距的问题,这里提供几种简单实用的解决方法,希望能够帮到大家! 方法1. 将<li>标签 ...
- MFC中如何画带实心箭头的直线
工作中遇到话流程图的项目,需要画带箭头的直线,经过摸索,解决:思路如下: (1) 两个点(p1,p2)确定一个直线,以直线的一个端点(假设p2)为原点,设定一个角度 (2)以P2为原点得到向量P2P1 ...
- Git小技巧 - 指令别名及使用Beyond Compare作为差异比较工具
前言 本文主要写给使用命令行来操作Git的用户,用于提高Git使用的效率.至于使用命令还是GUI(Tortoise Git或VS的Git插件)就不在此讨论了,大家根据自己的的喜好选择就好.我个人是比较 ...
- Java进击C#——前言
本章简言 记得三年前笔者来到现在的公司的时候,公司人口不出十个人.那个时候笔者刚从日本回来,想在福州.厦门.青岛找一个合适自己发展的机会.最后我的一个福州的朋友打电话希望我能过去帮他,跟他一起创业.这 ...
- 【Linux大系】Linux的概念与体系
感谢原作者:Vamei 出处:http://www.cnblogs.com/vamei 我在这一系列文章中阐述Linux的基 本概念.Linux操作系统继承自UNIX.一个操作系统是一套控制和使用计算 ...
- 【Java学习系列】第3课--Java 高级教程
本文地址 可以拜读: 从零开始学 Java 分享提纲: 1. Java数据结构 2. Java 集合框架 3. Java泛型 4. Java序列化 5. Java网络编程 6. Java发送Email ...