一、解析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. js 变量、函数提升

    js 变量.函数提升 先简单理解下作用域的概念,方便对变量与函数提升的概念的理解 function foo() { var x = 1; if (x) { var x = 2; } console.l ...

  2. shell网络管理

    背景知识 联网就是通过网络将主机进行互联并采用不同的规范配置网络上的节点.我们以 TCP/IP 作为网络栈,所有的操作都是基于它进行的.网络是计算机系统中重要的部分.连接在网络上的每个节点都分配了一个 ...

  3. phpstorm更改sql文件匹配类型

    正常情况下,sql文件都有对应的文件类型.但是默认的sql文件只是关联普通的sql.很多语法都无法高亮,以及自动提醒.

  4. Resolve the error: an error occurred during local report processing

    Issue: an error occurred during local report processing.the definition of the report'Main Report'is ...

  5. 细数vue爬坑之路<坑路大集合>

    坑爹集锦一: npm出现Newline required at end of file but not found错误 原因:eslint语法错误(vue为后缀名的组件结尾没有换行) 解决办法:在结尾 ...

  6. css3 vw -----解决页面滚动出现跳动的bug

    100vw相对于浏览器的window.innerWidth,是浏览器的内部宽度,注意,滚动条宽度也计算在内!而100%是可用宽度,是不含滚动条的宽度. demo: h1{font-size:8vw;} ...

  7. 腾讯微博 JS-SDK接入

    官方文档: open.js api查询 api调试接口 1.接口初始化 加载openjs源代码. <script type="text/javascript" src=&qu ...

  8. 2. Ext中关于Ext.QuickTips.init()的使用

    转自:http://www.cnblogs.com/jianglan/archive/2011/08/26/2154120.html 在extJS的例子中,大部分都在程序第一行使用了如下语句:Ext. ...

  9. Jmeter测试接口

    文主要针对http接口进行测试,使用Jmeter工具实现. Jmter工具设计之初是用于做性能测试的,它在实现对各种接口的调用方面已经做的比较成熟,因此,本次直接使用Jmeter工具来完成对Http接 ...

  10. java中static,super,final关键字辨析

    1:static关键字 利:1)对对象的共享数据提供单独的空间存储. 2)修饰的方法可以直接被类名调用 弊:1)生命周期长. 2)访问出现限制(只能访问静态) 它可以有静态方法,静态类,静态变量 2: ...