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-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 文件的更多相关文章

  1. (二)Struts.xml文件详解

    一.Struts.xml文件 Struts.xml文件构成 如图,<Struts>标签内共有5个子标签. 1.1 struts-default.xml 查看Struts的内容可知,Stru ...

  2. 完整的struts.xml文件骨架

    完整的struts.xml文件骨架可以直接拿来用,修改一下就可以啦. <?xml version="1.0" encoding="UTF-8"?> ...

  3. struts2——配置struts.xml文件

    在struts2框架中struts.xml是应当放到src的根目录,程序编译后会将struts.xml放到WEB-INF/classes目录下. Struts2在web.xml中的一般配置如下: &l ...

  4. 分享非常有用的Java程序 (关键代码)(六)---解析/读取XML 文件(重要)

    原文:分享非常有用的Java程序 (关键代码)(六)---解析/读取XML 文件(重要) XML文件 <?xml version="1.0"?> <student ...

  5. struts.xml文件中配置tiles.xml

    Apache Tiles是一个JavaEE应用的页面布局框架.Tiles框架提供了一种模板机制,可以为某一类页面定义一个通用的模板,该模板定义了页面的整体布局.布局由可以复用的多个块组成,每个页面可以 ...

  6. struts.xml 文件添加DTD文件

    在编辑struts.xml 文件时,“alt + /”无提示信息,需要在myeclipse 中添加消息头中的文件,步骤如下: 1. 选中该段复制 2. Preferences——>XML Cat ...

  7. struts.xml文件:

    struts.xml文件中包含的配置信息,你将修改所采取的措施的开发.这个文件可以被用来覆盖默认设置的应用程序,例如struts.devMode=false和其他设置中定义的属性文件.这个文件可以创建 ...

  8. Struts2 学习笔记——struts.xml文件之Bean的配置

    Struts2的大部分核心组件不是以硬编码的形式写在代码中,而是通过自身的IoC容器来管理的. Struts2以可配置的形式来管理核心组件,所以开发者可以很容易的扩展框架的核心组件.当开发者需要扩展或 ...

  9. Struts2 | struts.xml文件中使用method属性和通配符简化action标签和Action处理类的编写

    转自:https://www.jianshu.com/p/310e89ee762d 在Struts2框架中,我们知道基本的Action标签只能实现一个url请求对应一个Action处理类.那么我们如果 ...

随机推荐

  1. ASP.NET Aries 入门开发教程6:列表数据表格的格式化处理及行内编辑

    前言: 为了赶进度,周末也写文了! 前几篇讲完查询框和工具栏,这节讲表格数据相关的操作. 先看一下列表: 接下来我们有很多事情可以做. 1:格式化 - 键值的翻译 对于“启用”列,已经配置了格式化 # ...

  2. C语言 · 奇偶判断

    问题描述 能被2整除的数称为偶数,不能被2整除的数称为奇数.给一个整数x,判断x是奇数还是偶数. 输入格式 输入包括一个整数x,0<=x<=100000000. 输出格式 如果x是奇数,则 ...

  3. 深入.NET平台和C#编程总结大全

    对于初学者的你,等到你把这个看完之后就更清楚地认知.NET和C#编程了,好了废话不多说,开始吧!                                                     ...

  4. 调用微信退款接口或发红包接口时出现System.Security.Cryptography.CryptographicException: 出现了内部错误 解决办法

    我总结了一下出现证书无法加载的原因有以下三个 1.证书密码不正确,微信证书密码就是商户号 解决办法:请检查证书密码是不是和商户号一致 2.IIS设置错误,未加载用户配置文件 解决办法:找到网站使用的应 ...

  5. App 审核由于 IPv6 网络问题被拒

    昨天 提交App Store 的时候被拒了 We discovered one or more bugs in your app when reviewed on iPhone running iOS ...

  6. App解读

    一直不懂别人口中说的原生开发.混合式开发.今天突然看了一篇文章讲解的是什么叫做原生App?移动 Web App?混合APP?分享给大家. 原生App是专门针对某一类移动设备而生的,它们都是直接安装到设 ...

  7. MySQL 数据库双向同步复制

    MySQL 复制问题的最后一篇,关于双向同步复制架构设计的一些设计要点与制约. 问题和制约 数据库的双主双写并双向同步场景,主要考虑数据完整性.一致性和避免冲突.对于同一个库,同一张表,同一个记录中的 ...

  8. ubuntu安装mysql

    好记性不如烂笔头,记录一下,ubuntu安装mysql的指令. 安装MySQL: sudo apt-get install mysql-server sudo apt-get install mysq ...

  9. PHP5.4~7.1新特性总结

    http://note.youdao.com/noteshare?id=7273b858fc12873ad092979e4ba173a7&sub=WEB334fdcf50b507ad93549 ...

  10. EMD分析 Matlab 精华总结 附开源工具箱(全)

    前言: 本贴写于2016年12与15日,UK.最近在学习EMD(Empirical Mode Decomposition)和HHT(Hilbert-Huang Transform)多分辨信号处理,FQ ...