Struts2------拦截器和标签库和注解开发
一、解析Struts2源码中拦截器的执行
客户端请求Action,执行前端控制器,在前端控制器内部创建了Action的代理类,调用代理类的execute方法,在execute方法内部执行ActionInvocation的invoke方法。
在invoke方法内部递归调用拦截器的拦截的方法。如果没有下一个拦截器执行目标Action,Action执行结束后根据Result进行页面跳转,最后由response对象生成响应。
- 流程图


二、自定义拦截器
方式一:实现Interceptor接口
方式二:继承AbstractInterceptor
方式三:继承MethodFilterInterceptor
步骤(方式三:)
1)创建一个类,继承MethodFilterInterceptor,复写doInterceptor方法
public class Interceptor03 extends MethodFilterInterceptor {
@Override
protected String doIntercept(ActionInvocation invocation) throws Exception {
System.out.println("Interceptor03 执行了...");
//放行
invocation.invoke();
return null;
}
}
2) 在struts.xml配置拦截器(声明和使用)
<package name="test" extends="struts-default" namespace="/">
<!-- 声明拦截器 -->
<interceptors>
<interceptor name="interceptor03" class="com.itheima.web.interceptor.Interceptor03"> </interceptor>
</interceptors>
</package> <action name="demo_*" class="com.itheima.web.action.ActionDemo" method="{1}">
<interceptor-ref name="interceptor03">
<!--不拦截fun02()方法 -->
<param name="excludeMethods">fun02</param>
</interceptor-ref>
</action>
备注:MethodFilterInterceptor是AbstractInterceptor的一个子类,可以精确控制拦截或者不拦截哪一个方法
三、关于自定义拦截器的一些操作
- 拦截器处理结果
1)放行:这里放行的意思是是否放行通道给下一个拦截器,语句:xx.invoke()。这时候,CPU执行完这个拦截器后,将会执行下一个拦截器
2)拦截:这里拦截的意思是,是说不执行下一个拦截器。这时候会执行return 的内容,也需要返回到一个具体的页面。因此需要在struts.xml配置result标签。例如该拦截器return "success",则在struts.xml中配置<result name="success">/success.jsp</result>,这时候会跳转到success.jsp页面
- 自定义拦截器的问题
一旦定义了自己的拦截器,struts2默认的那一套拦截器就不会执行,可以参考有参构造和无参构造方法来理解。
因此defaultStack的这个拦截器包的功能会失效,但在action里重新引用即可启动这些功能
<action name="actionDemo_*" class="com.itheima.action.ActionDemo" method="{1}">
<!-- 执行这个action,就必然要走名字叫做myInterceptor02的拦截器 -->
<!-- 使用默认的拦截器 -->
<interceptor-ref name="defaultStack"></interceptor-ref>
<!-- 使用自定义的拦截器 -->
<interceptor-ref name="myInterceptor"></interceptor-ref>
<result name="login">/index.jsp</result>
</action>
四、标签库
- 介绍
Struts2的标签库一个字概括,多。它功能比较完善,另外还提供了主题和模板的支持。这些标签都在 docs/docs/tag-reference.html 里面可以找到
以下为标签库分类图:

- 使用步骤
先导库<%@taglib uri="/struts-tags" prefix="s" %>,然后根据语法书写
- 例子
取值:
if else标签
<s:property value="#request.a"/><br/> <s:if test="#request.a > 10">
a 大于10
</s:if>
<s:else>
a 小于或者等于10
</s:else>
<s:iterator value="list" var="u">
<s:property value="username"/>
<s:property value="password"/>
</s:iterator>
和HTML标签对比例子
<h1>一,HTML的表单标签</h1>
<form action="${pageContext.request.contextPath }/demo03_fun03" method="post">
用户名:<input type="text" name="username"/><br/>
密码: <input type="password" name="password"/><br/>
性别:<input type="radio" name="sex" value="1"/>男<input type="radio" name="sex" value="0"/>女<br/>
爱好:
<input type="checkbox" name="hobby" value="lq"/>篮球
<input type="checkbox" name="hobby" value="zq"/>足球
<input type="checkbox" name="hobby" value="ppq"/>乒乓球
<input type="checkbox" name="hobby" value="qdm"/>敲代码<br/>
籍贯:<select name="address">
<option value="-1">-请选择-</option>
<option value="0">北京</option>
<option value="1">上海</option>
<option value="2">深圳</option>
</select><br/>
自我介绍:<textarea rows="2" cols="8" name="introduce">哈哈哈</textarea><br/>
<input type="submit" />
</form> <h1>二,Struts2的表单标签</h1>
<!--默认请求方式就是post,action不用写项目路径 -->
<s:form action="/demo03_fun03">
<s:textfield name="username" label="用户名" />
<s:password name="password" label="密码"/>
<%-- <s:radio list="{'男','女'}" name="sex" label="性别"/> --%>
<s:radio list="#{'1':'男','0':'女' }" name="sex" label="性别" value="1"></s:radio>
<s:checkboxlist list="{'篮球','足球','乒乓球','敲代码'}" label="爱好" name="hobby"/>
<s:select list="#{'0':'北京','1':'上海','2':'深圳' }" label="籍贯" name="address" headerKey="-1" headerValue="请选择" value="1"></s:select>
<s:textarea cols="8" rows="2" name="introduce" label="籍贯" value="哈哈"></s:textarea>
<s:submit value="注册" align="left"/>
</s:form>
- Struts2的模板和主题
主题就是一种风格化标签,能够让所有UI标签能够产生同样的视觉效果而归集到一起的一组模板,即风格相近的模板被打包为一个主题. struts2提供了四种主题simple、xhtml、css_xhtml、ajax。
simple:把UI标签翻译成最简单的HTML对应元素,而且会忽视行标属性
xhtml:默认的主题。这个主题的模板通过使用一个布局表格提供了一种自动化的排版机制(默认)
css_xhtml:这个主题里的模板与xhtml主题里的模板很相似,但他们将使用css来进行布局和排版
ajax:这个主题里的模板以xhtml主题里的模板为基础,但增加了一些ajax功能。
做法:通过配置struts.xml的constant属性:struts.ui.theme
<constant name="struts.ui.theme" value="simple"></constant>
或者通过UI标签的theme属性修改
<s:form action="..." theme="simple">
五、Struts2里的注解开发
- 步骤; 1)先导入Jar包:struts2-convention-plugin-x.x.x.jar 2)在action类中配置注解标签
struts.xml
<package name="test" extends="struts-default" namespace="/">
<action name="demo_fun01" class="com.itheima.web.action.ActionDemo01"
method="fun01">
<result name="success">/demo01.jsp</result>
</action>
</package>
对应的注解
Namespace 注解
用来模拟package标签的
namespace属性的。 需要在Action的类上配置。
ParentPackage 注解
用来模拟package标签的
extends属性的。 需要在Action的类上配置。
Action注解
用来模拟
action标签的。需要在action类中的action方法上配置。 value属性用来模拟
action标签中的name属性 results属性用来模拟
action标签内的result标签Result注解
用来模拟result标签的。可以在action类上配置或者在action方法上配置。 action类上配置就是全局的。action方法上的配置是局部的。
name属性用来模拟
result标签的name属性 type属性用来模拟
result标签的type属性 locaction属性用来模拟
result标签的标签内容 params属性用来模拟
result标签的内部param标签
Struts2------拦截器和标签库和注解开发的更多相关文章
- Struts2拦截器和标签
一.struts2拦截器 1.struts2是框架,封装了很多的功能,struts2里面封装的功能都是在拦截器里面. 2 struts2里面封装了很多的功能,有很多拦截器,不是每次这些拦截器都执行,每 ...
- Struts框架笔记04_拦截器_标签库
目录 1. Struts2的拦截器 1.1 拦截器概述 1.2 拦截器的实现原理 1.3 Struts的执行流程 1.4 拦截器入门 1.4.1 环境搭建 1.4.2 编写拦截器 1.4.3 配置拦截 ...
- struts2第四天——拦截器和标签库
一.拦截器(interceptor)概述 struts2是个框架,里面封装了很多功能,封装的很多功能都是在拦截器里面. (属性封装.模型驱动等都是封装在拦截器里面) struts2里面封装了很多功能, ...
- Struts2 拦截器配置以及实现
@(Java ThirdParty)[Struts|Interceptor] Struts2 拦截器配置以及实现 Struts2的拦截器应用于Action,可以在执行Action的方法之前,之后或者两 ...
- 基于SSH2框架Struts2拦截器的登录验证实现(转)
大象在这里假设你已经弄清楚了Struts2拦截器的基本概念,可以进入实际运用了.那么我们在之前的基础上只需要做下小小的改变,就可以使用Struts2的拦截器机制实现登录的验证. 修改数 ...
- Struts2拦截器总结
拦截器的本质: 拦截器就是一个类,一个实现了超级接口Interceptor的类.Interceptor接口里定义了三个方法 init(),destory(),intercept().其中inercep ...
- 从struts2拦截器到自定义拦截器
拦截器可谓struts2的核心了,最基本的bean的注入就是通过默认的拦截器实现的,一般在struts2.xml的配置中,package内直接或间接继承了struts-default.xml,这样st ...
- Struts2拦截器配置实例
拦截器介绍 拦截器 的使用 ,源自Spring AOP(面向切面编程)思想 拦截器 采用 责任链 模式 * 在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链. * 责任链每一个节 ...
- SpringMVC—Struts2拦截器学习网址整理
引自:http://blog.csdn.net/wp1603710463/article/details/49982683 SpringMVC—Struts2拦截器学习网址整理 最近项目中遇到权限相关 ...
随机推荐
- TestNg的工厂測试引用@DataProvider数据源----灵活使用工厂測试
之前说过@Factory更适合于同一类型的參数变化性的測试,那么假设參数值没有特定的规律时,我们能够採用@Factory和@DataProvider相结合的方式进行測试 注意要点:请注意測试方法将被一 ...
- Cocos2d-X-3.0 之后的版本的环境搭建
Cocos2d-X-3.0 之后的版本的环境搭建 由于cocos2d游戏开发引擎更新十分频繁,官方文档同步不够及时和完善.所以不要照着官方文档来照做生成工程. <点击图片就能进入网站> ...
- Python爬虫开发【第1篇】【机器视觉及Tesseract】
ORC库概述 在读取和处理图像.图像相关的机器学习以及创建图像等任务中,Python 一直都是非常出色的语言.虽然有很多库可以进行图像处理,但在这里我们只重点介绍:Tesseract 1.Tesser ...
- asp.net MVC 中呈现指定区域下的分部视图
Html.RenderAction() 可以呈现分部视图. asp.net MVC就是有这种好处,可以将多个子视图无缝合成到一个视图上再输出,那么开发的时候,能够进行模块化开发.看上去同属一个页面上的 ...
- 2016/05/19 thinkphp 3.2.2 文件上传
显示效果: 多文件上传. 这里是两个文件一起上传 上传到文件夹的效果: ①aa为调用Home下common文件夹下的function.php 中的rname方法 实现的 ②cc为调用与Home ...
- POI异步导入Excel兼容xsl和xlsx
项目架构:spring+struts2+hibernate4+oracle 需求:用户导入excel文件,导入到相应的数据表中,要求提供导入模板,支持xls和xlsx文件 思路分析: 1.提供一个下载 ...
- 内存转储文件 Memory.dmp
https://baike.sogou.com/v63435711.htm?fromTitle=内存转存文件 内存转储是用于系统崩溃时,将内存中的数据转储保存在转储文件中,供给有关人员进行排错分析用途 ...
- js闭包的本质
js之所以会有闭包,是因为js不同于其他规范的语言,js允许一个函数中再嵌套子函数,正是因为这种允许函数嵌套,导致js出现了所谓闭包. function a(){ function b(){ }; b ...
- 2.7 xargs和exec详解【转】
本文转载自:http://ask.apelearn.com/question/13323 常用在查找中exec主要是和find一起配合使用,而xargs就要比exec用的地方要多了. exec 应用 ...
- YTU 2555: 老大的烦恼
2555: 老大的烦恼 时间限制: 1 Sec 内存限制: 128 MB 提交: 176 解决: 47 题目描述 万恶的小黑,布置了一道题给老大做:给你一个n位的数,现在要求 你随意删除m位后,任 ...