一、解析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------拦截器和标签库和注解开发的更多相关文章

  1. Struts2拦截器和标签

    一.struts2拦截器 1.struts2是框架,封装了很多的功能,struts2里面封装的功能都是在拦截器里面. 2 struts2里面封装了很多的功能,有很多拦截器,不是每次这些拦截器都执行,每 ...

  2. Struts框架笔记04_拦截器_标签库

    目录 1. Struts2的拦截器 1.1 拦截器概述 1.2 拦截器的实现原理 1.3 Struts的执行流程 1.4 拦截器入门 1.4.1 环境搭建 1.4.2 编写拦截器 1.4.3 配置拦截 ...

  3. struts2第四天——拦截器和标签库

    一.拦截器(interceptor)概述 struts2是个框架,里面封装了很多功能,封装的很多功能都是在拦截器里面. (属性封装.模型驱动等都是封装在拦截器里面) struts2里面封装了很多功能, ...

  4. Struts2 拦截器配置以及实现

    @(Java ThirdParty)[Struts|Interceptor] Struts2 拦截器配置以及实现 Struts2的拦截器应用于Action,可以在执行Action的方法之前,之后或者两 ...

  5. 基于SSH2框架Struts2拦截器的登录验证实现(转)

        大象在这里假设你已经弄清楚了Struts2拦截器的基本概念,可以进入实际运用了.那么我们在之前的基础上只需要做下小小的改变,就可以使用Struts2的拦截器机制实现登录的验证.     修改数 ...

  6. Struts2拦截器总结

    拦截器的本质: 拦截器就是一个类,一个实现了超级接口Interceptor的类.Interceptor接口里定义了三个方法 init(),destory(),intercept().其中inercep ...

  7. 从struts2拦截器到自定义拦截器

    拦截器可谓struts2的核心了,最基本的bean的注入就是通过默认的拦截器实现的,一般在struts2.xml的配置中,package内直接或间接继承了struts-default.xml,这样st ...

  8. Struts2拦截器配置实例

    拦截器介绍 拦截器 的使用 ,源自Spring AOP(面向切面编程)思想 拦截器 采用 责任链 模式 * 在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链. * 责任链每一个节 ...

  9. SpringMVC—Struts2拦截器学习网址整理

    引自:http://blog.csdn.net/wp1603710463/article/details/49982683 SpringMVC—Struts2拦截器学习网址整理 最近项目中遇到权限相关 ...

随机推荐

  1. Hibernate4之session核心方法

    在学习session的核心方法之前,我们先了解下hibernate中几种对象的状态: 暂时状态:这样的状态就好像咱们公司请的暂时员工一样,他在公司里没有相关的资料和id. 特点:在使用代理主键的情况下 ...

  2. TPC-H is a Decision Support Benchmark

    TPC-H is a Decision Support Benchmark http://www.dba-oracle.com/t_tpc_benchmarks.htm

  3. WEB 字体

    之前如果想在自己的网站使用某些好看的字体,总是迫不得已得在PS里先把字体图片做好.虽然这样做也能达到我们想要的效果,但是这样就增加了HTTP请求 (如果在多处使用的话),即使合并所有图片,也不好管理, ...

  4. JS Debug

    任何一个编程者都少不了要去调试代码,不管你是高手还是菜鸟,调试程序都是一项必不可少的工作.一般来说调试程序是在编写代码之后或测试期修改Bug 时进行的,往往在调试代码期间更加能够体现出编程者的水平高低 ...

  5. sqlserver主机名变更后的错误与处理办法

    sqlserver 服务器更改主机名后,须要做一些操作.不然维护计划 以及订阅公布都会有问题,详细过程例如以下:能够參考 有时改动计算机名后,运行select @@servername仍返回原来的计算 ...

  6. Day1 BFS算法的学习和训练

    ​ 因为自己的原因,之前没有坚持做算法的相应学习,总是觉得太难就半途而废,真的算是一个遗憾了,所以现在开始,定一个30天入门学习算法计划. ​ 我是根据<算法图解>的顺序进行安排的,自己对 ...

  7. POJ3159 Candies —— 差分约束 spfa

    题目链接:http://poj.org/problem?id=3159 Candies Time Limit: 1500MS   Memory Limit: 131072K Total Submiss ...

  8. math.floor()函数的用法

    floor() 返回数字的下舍整数. 语法 以下是 floor() 方法的语法: import math math.floor( x ) 注意:floor()是不能直接访问的,需要导入 math 模块 ...

  9. hdu 1480

    钥匙计数之二 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  10. js函数定义 参数只要写名称就可以了

    js函数定义  参数只要写名称就可以了 以下为标准: function add(type)  { } 不要写成下面这个样子 function add(var type)  { } 哎 妹的  老何ja ...