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拦截器学习网址整理 最近项目中遇到权限相关 ...
随机推荐
- VS类添加头文件注释
VS2015参考: http://blog.csdn.net/qq395537505/article/details/50853546 修改两个文件,详细信息 VS2010: 找到VS的安装目录 E ...
- myeclipse提示:Syntax error on tokens, delete these tokens怎么解决
有中文字符或者符号,包括空格. 上次遇到一个问题,检查了一遍语法没错误, 后来发现是拷贝代码的时候有一部分中文空格没删除,就出现这个问题了. 一个个删除就OK了.
- md5 js
js-md5 - npm https://www.npmjs.com/package/js-md5 var rotateLeft = function(lValue, iShiftBits) { re ...
- WebService注解汇总
Web Service 元数据注释(JSR 181) @WebService 1.serviceName: 对外发布的服务名,指定 Web Service 的服务名称:wsdl:service.缺省值 ...
- Deep Learning 30: 卷积理解
一.深度卷积神经网络学习笔记(一): 1. 这篇文章以贾清扬的ppt说明了卷积的实质,更说明了卷积输出图像大小应该为: 假设输入图像尺寸为W,卷积核尺寸为F,步幅(stride)为S(卷积核移动的步幅 ...
- RFC 在OA中创建PR
创建PR:BAPI_REQUISITION_CREATE BAPI_PR_CREATE "Create Enjoy Purchase Requisistion ...
- luogu 4720 【模板】扩展卢卡斯
题目大意: 求$C_n^m \mod p$,p不一定为质数 思路: 首先可以将$p$分解为$p1^{a1}*p2^{a2}*...*pk^{ak}$,对于这些部分可以使用$CRT$合并 对于每个$p_ ...
- [Codeforces 507E] Breaking Good
[题目链接] https://codeforces.com/contest/507/problem/E [算法] 首先BFS求出1到其余点的最短路 , N到其余点的最短路,记为distA[]和dist ...
- 【HDU 1520】 Anniversary Party
[题目链接] 点击打开链接 [算法] 树形DP 令f[i][0]表示 : 以i为根的子树中,若i不参加宴会,所能获得的最大愉悦值 f[i][1]表示 : 以i为根的子树中,若i参加宴会,所能获得的最大 ...
- AppDomain加载与释放dll
AppDomain加载与释放dll 几年前写过同名随笔,但今天应不大适用了.但还有几个朋友留言关注,我重新发布相关代码. 首先我们的目的就是运行期间更新dll,并应用dll.这个过程需要应用 AppD ...