Struts2学习教程之 * 机制与自定义 *
作者:果冻想 发布时间:2021-10-27 13:02:56
前言
* 体系是Struts2框架的重要组成部分,不夸张的说,没有 * 体系,也就没有这么好用的Struts2框架了。在Struts2框架中,大量的 * 完成了很多基础的功能,比如,params * 负责解析HTTP请求的参数,并设置Action的属性;servlet-config * 直接将HTTP请求中的HttpServletRequest实例和HttpServletResponse实例传给Action;fileUpload * 则负责解析请求参数中的文件域,并将一个文件域设置成Action的三个属性......这一切的一切都是由内建的 * 来完成的。所以,掌握了Struts2中 * 的使用原理与方式,也就把握住了Struts2框架的“命脉”。
但是学习Struts2到现在,除了在web.xml中配置了一个StrutsPrepareAndExecuteFilter过滤器外,还没有接触其它的什么 * ,那为什么我们的应用能够很好的运行呢?实际上,Struts2已经默认启用了大量通用的 * ,只要配置Action的package继承了struts-default包,这些 * 就会起作用。下面来看看Struts2内建的 * 。
Struts2内建的 *
在Struts2框架中有很多内建的 * ,这些 * 几乎完成了Struts2框架70%的工作,包括解析请求参数,将请求参数赋值给Action属性等,Struts2这种灵巧的设计,很大程度上得益于 * 的设计;当需要扩展Struts2功能时,只需要提供对应 * ,并将它配置在Struts2容器中即可。
这些内建的 * 以name-class对的形式配置在struts-default.xml文件中,其中name是 * 名字,就是以后使用该 * 的唯一标识;class则指定了该 * 的实现类。对于这些内建的 * 的详细介绍,请参见官方文档。
配置 *
在Struts.xml文件中定义 * 只需为 * 类指定一个 * 名,就完成了 * 定义。定义 * 使用<interceptor.../>,例如:
<!-- 通过指定 * 名和 * 实现类来定义 * -->
<interceptor name=" * 名" class=" * 实现类">
<param name="参数名">参数值</param>
</interceptor>
除此之外,还可以把多个 * 连在一起组成 * 栈,在 * 中使用<interceptor-ref .../>来定义 * 引用。例如:
<interceptor-stack name=" * 栈一">
<interceptor-ref name=" * 一"/>
<interceptor-ref name=" * 二"/>
...
</interceptor-stack>
从程序结构上来看, * 栈由多个 * 组成;但是从程序功能上来说, * 栈和 * 是一样的,它们包含的方法都会在Action的execute方法执行之前自动执行。所以,我们完全可以把 * 栈当成一个更大的 * 。
由于 * 栈和 * 是一致的,所以 * 栈中又可以包含 * 栈,例如:
<interceptor-stack name=" * 栈二">
<interceptor-ref name="modelDriven"/>
<interceptor-ref name=" * 栈一"/>
</interceptor-stack>
使用 *
一旦定义了 * 栈和 * 后,就可以使用这个 * 栈或 * 来拦截Action了, * 的拦截行为将会在Action的execute方法执行之前被执行。
通过使用<interceptor-ref .../>元素可以在Action内使用 * ,在Action中使用 * 的配置语法与配置 * 栈时引用 * 的语法完全一样。例如:
<action name="login" class="com.jellythink.practise.LoginAction">
<result name="error">/error.jsp</result>
<result name="success">/welcome.jsp</result>
<!-- * 栈 -->
<interceptor-ref name="defaultStack"/>
<!-- * -->
<interceptor-ref name="test1"/>
<!-- 带参数的 * -->
<interceptor-ref name="test2">
<param name="key">动态参数</param>
</interceptor-ref>
</action>
这样配置完成以后,在执行DownloadAction之前,这三个 * 都会起作用。
配置默认 *
当配置一个包时,可以为其指定默认 * 。一旦为某个包指定了默认的 * ,如果该包中的Action没有显式指定 * ,则默认的 * 将会起作用。但是,一旦我们为该包中的Action显式应用了某个 * ,则默认的 * 不会起作用;如果该Action需要使用该默认 * ,则必须手动配置该 * 的引用。
只有当Action中没有显式应用 * 时,该Action所在包的默认 * 才会生效。
配置默认 * 使用<default-interceptor-ref.../>元素,该元素作为<package.../>元素的子元素使用,为该包下的所有Action配置默认的 * 。例如:
<default-interceptor-ref name="默认 * "/>
也可以为默认 * 指定参数,例如:
<default-interceptor-ref name="默认 * ">
<param name="参数名">参数值</param>
</default-interceptor-ref>
在struts-default.xml文件中,配置了一个名为struts-default的抽象包,在该包中定义了名为defaultStack的默认 * 引用。当我们定义的包继承struts-default包时,也继承了它的默认 * 栈:defaultStack,这也意味着,如果我们不为Action显式地应用 * ,则defaultStack * 栈会自动生效。
自定义 *
1>.添加一个类,让它继承AbstractInterceptor类,或者实现Interceptor接口
public class TimeInterceptor extends AbstractInterceptor {
/**
* * 的核心方法intercept的返回值是一个字符串
*/
@Override
public String intercept(ActionInvocation invocation) throws Exception {
// TODO Auto-generated method stub
return "login";
}
}
2>.在struts.xml的package中添加interceptors子节点,并在它下面添加Interceptor节点
<package name="goods" namespace="/goods" extends="common-pkg">
<interceptors>
<interceptor name="timeInterceptor" class="com.wskj.struts2.interceptor.TimeInterceptor"></interceptor>
</interceptors>
</package>
3>.在想被拦截的action节点下添加子节点interceptor-ref
<action name="list_Category" class="com.wskj.struts2.controller.CategoryAction" method="list">
<interceptor-ref name="timeInterceptor"></interceptor-ref>
<result name="list" type="dispatcher">/pages/Category/list.jsp</result>
</action>
总结
这篇文章对Stuts2中的核心—— * 进行了一个初步的总结,在后面的文章中,我们会实现一个我们自己的 * ,并将这篇文章中总结的知识点进行运用。
好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。
来源:https://www.jellythink.com/archives/303


猜你喜欢
- 原则:1、垃圾回收机制,维护引用信息不维护指针信息2、引用类型的实例化对象在生存期内由垃圾回收机制处理,可能移动内存3、当一个类的实例化对象
- java.util.Arrays类能方便地操作数组,它提供的所有方法都是静态的。静态方法是属于类的,不是属于类的对象。所以可以直接使用类名加
- 本文实例讲述了C#中foreach原理以及模拟的实现方法,分享给大家供大家参考。具体如下:public class Person:IEnum
- 现有的热修复框架很多,尤以AndFix 和Tinker比较多具体的实现方式和项目引用可以参考网络上的文章,今天就不谈,也不是主要目的今天就来
- 一、材料准备1、jdk1.8的安装包2、maven安装包3、idea工具二、配置jdk1.8环境变量1.jdk下载jdk下载网址(点击此链接
- 本文实例为大家分享了Unity3D Shader实现镜子效果的具体代码,供大家参考,具体内容如下/p>Shader部分代码:Shade
- 简介这篇文章我一直在纠结到底要不要写,不想写一来因为定时器用法比较简单,二来是面试中也不常问。后来还是决定写了主要是想把自己分析问题思路分享
- 前言好久没有更新博客了,今天和大家分享一个关于emoji表情持久化问题,相信做web开发的都遇到过这样的问题,因为我们知道mysql的utf
- 前言:现在的手机品牌和型号越来越多,导致我们平时写布局的时候会在个不同的移动设备上显示的效果不同,比如我们的设计稿一个View的大小是300
- 本文实例讲述了C#读取csv格式文件的方法。分享给大家供大家参考。具体实现方法如下:一、CSV文件规则 1 开头是不留空,以行为单
- 下面是我自己收集整理的2017年Java岗位的面试题,可以用它来好好准备面试。一、Java基础1. String类为什么是final的。2.
- 本文实例介绍了手机号码归属地接口调用基于C#实现,分享给大家供大家参考,具体内容如下using System;using System.Co
- 本文实例为大家分享了java抓取邮箱号码的具体代码,供大家参考,具体内容如下java抓取文件中邮箱号码的具体代码package reg;im
- 介绍上图就是循环依赖的三种情况,虽然方式不同,但是循环依赖的本质是一样的,就A的完整创建要依赖与B,B的完整创建要依赖于A,相互依赖导致没办
- 把spring-boot项目按照平常的web项目一样发布到tomcat容器下一、修改打包形式在pom.xml里设置 <packagin
- 一、项目简述( +IW文档)功能:本系统分用户前台和管理员后台。 本系统用例模型有三种,分别是游客、注册用户和系统管 理员。下面分别对这三个
- 前言Guava是google公司开发的一款Java类库扩展工具包,内含了丰富的API,涵盖了集合、缓存、并发、I/O等多个方面。使用这些AP
- 本文实例讲解了统计文本中某个字符串出现的次数或字符串中指定元素出现的次数方法,分享给大家供大家参考,具体内容如下运行效果图:程序查找的上此文
- 这个系列我们看看C#中有哪些我们知道,但是又不知道怎么用,又或者懒得去了解的东西,比如这篇我们要介绍的toDictionary和ToLook
- 本文实例为大家分享了Java实现简易计算器的具体代码,供大家参考,具体内容如下程序的运行环境为Windows10 ,编译环境为IDEA。计算