一、解析Struts2源码中拦截器的执行

  客户端请求Action,执行前端控制器,在前端控制器内部创建了Action的代理类,调用代理类的execute方法,在execute方法内部执行ActionInvocation的invoke方法。

  在invoke方法内部递归调用拦截器的拦截的方法。如果没有下一个拦截器执行目标Action,Action执行结束后根据Result进行页面跳转,最后由response对象生成响应。

  • 流程图

 

二、自定义拦截器

  • 方式一:实现Interceptor接口
  • 方式二:继承AbstractInterceptor
  • 方式三:继承MethodFilterInterceptor

  步骤(方式三:)

  1)创建一个类,继承MethodFilterInterceptor,复写doInterceptor方法

  1. public class Interceptor03 extends MethodFilterInterceptor {
  2.  
  3. @Override
  4. protected String doIntercept(ActionInvocation invocation) throws Exception {
  5. System.out.println("Interceptor03 执行了...");
  6. //放行
  7. invocation.invoke();
  8. return null;
  9. }
  10.  
  11. }

  2) 在struts.xml配置拦截器(声明和使用)

  1. <package name="test" extends="struts-default" namespace="/">
  2. <!-- 声明拦截器 -->
  3. <interceptors>
  4. <interceptor name="interceptor03" class="com.itheima.web.interceptor.Interceptor03"> </interceptor>
  5. </interceptors>
  6. </package>
  7.  
  8. <action name="demo_*" class="com.itheima.web.action.ActionDemo" method="{1}">
  9. <interceptor-ref name="interceptor03">
  10. <!--不拦截fun02()方法 -->
  11. <param name="excludeMethods">fun02</param>
  12. </interceptor-ref>
  13. </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里重新引用即可启动这些功能

  1. <action name="actionDemo_*" class="com.itheima.action.ActionDemo" method="{1}">
  2. <!-- 执行这个action,就必然要走名字叫做myInterceptor02的拦截器 -->
  3. <!-- 使用默认的拦截器 -->
  4. <interceptor-ref name="defaultStack"></interceptor-ref>
  5.  
  6. <!-- 使用自定义的拦截器 -->
  7. <interceptor-ref name="myInterceptor"></interceptor-ref>
  8. <result name="login">/index.jsp</result>
  9. </action>

四、标签库

  • 介绍

  Struts2的标签库一个字概括,多。它功能比较完善,另外还提供了主题和模板的支持。这些标签都在 docs/docs/tag-reference.html 里面可以找到

  以下为标签库分类图:

  • 使用步骤

  先导库<%@taglib uri="/struts-tags" prefix="s" %>,然后根据语法书写

  • 例子
  1. 取值:
    if else标签
  2. <s:property value="#request.a"/><br/>
  3.  
  4. <s:if test="#request.a > 10">
  5. a 大于10
  6. </s:if>
  7. <s:else>
  8. a 小于或者等于10
  9. </s:else>
  1. <s:iterator value="list" var="u">
  2. <s:property value="username"/>
  3. <s:property value="password"/>
  4. </s:iterator>

和HTML标签对比例子

  1. <h1>一,HTML的表单标签</h1>
  2. <form action="${pageContext.request.contextPath }/demo03_fun03" method="post">
  3. 用户名:<input type="text" name="username"/><br/>
  4. 密码: <input type="password" name="password"/><br/>
  5. 性别:<input type="radio" name="sex" value="1"/><input type="radio" name="sex" value="0"/><br/>
  6. 爱好:
  7. <input type="checkbox" name="hobby" value="lq"/>篮球
  8. <input type="checkbox" name="hobby" value="zq"/>足球
  9. <input type="checkbox" name="hobby" value="ppq"/>乒乓球
  10. <input type="checkbox" name="hobby" value="qdm"/>敲代码<br/>
  11. 籍贯:<select name="address">
  12. <option value="-1">-请选择-</option>
  13. <option value="0">北京</option>
  14. <option value="1">上海</option>
  15. <option value="2">深圳</option>
  16. </select><br/>
  17. 自我介绍:<textarea rows="2" cols="8" name="introduce">哈哈哈</textarea><br/>
  18. <input type="submit" />
  19. </form>
  20.  
  21. <h1>二,Struts2的表单标签</h1>
  22. <!--默认请求方式就是post,action不用写项目路径 -->
  23. <s:form action="/demo03_fun03">
  24. <s:textfield name="username" label="用户名" />
  25. <s:password name="password" label="密码"/>
  26. <%-- <s:radio list="{'男','女'}" name="sex" label="性别"/> --%>
  27. <s:radio list="#{'1':'男','0':'女' }" name="sex" label="性别" value="1"></s:radio>
  28. <s:checkboxlist list="{'篮球','足球','乒乓球','敲代码'}" label="爱好" name="hobby"/>
  29. <s:select list="#{'0':'北京','1':'上海','2':'深圳' }" label="籍贯" name="address" headerKey="-1" headerValue="请选择" value="1"></s:select>
  30. <s:textarea cols="8" rows="2" name="introduce" label="籍贯" value="哈哈"></s:textarea>
  31. <s:submit value="注册" align="left"/>
  32. </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

  1. <constant name="struts.ui.theme" value="simple"></constant>

  或者通过UI标签的theme属性修改

  1. <s:form action="..." theme="simple">

五、Struts2里的注解开发

    • 步骤;  1)先导入Jar包:struts2-convention-plugin-x.x.x.jar    2)在action类中配置注解标签

     struts.xml

  1. <package name="test" extends="struts-default" namespace="/">
  2. <action name="demo_fun01" class="com.itheima.web.action.ActionDemo01"
  3. method="fun01">
  4. <result name="success">/demo01.jsp</result>
  5. </action>
  6. </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. boost的内存管理

    smart_ptr raii ( Resource Acquisition Is Initialization ) 智能指针系列的都统称为smart_ptr.包含c++98标准的auto_ptr 智能 ...

  2. Apache Hadoop 和Hadoop生态圈

    Apache Hadoop 和Hadoop生态圈 Hadoop是一个由Apache基金会所开发的分布式系统基础架构. 用户能够在不了解分布式底层细节的情况下.开发分布式程序.充分利用集群的威力进行快速 ...

  3. 设置清除html5页面缓存

    设置清除html5页面缓存 html5端设置 meta 标签: <meta http-equiv="Pragma" content="no-cache" ...

  4. 2016/05/23 thinkphp M方法和D方法的区别

    M方法和D方法的区别 ThinkPHP 中M方法和D方法都用于实例化一个模型类,M方法 用于高效实例化一个基础模型类,而 D方法 用于实例化一个用户定义模型类. 使用M方法 如果是如下情况,请考虑使用 ...

  5. 2016/2/24 1,css有几种引入方式 2,div除了可以声明id来控制,还可以声明什么控制? 3,如何让2个div,并排显示。4,清除浮动 clear:left / right / both

    1,css有几种引入方式 使用HTML标签的STYLE属性 将STYLE属性直接加在单个的HTML元素标签上,控制HTML标签的表现样式.这种引入CSS的方式是分散灵活方便,但缺乏整体性和规划性,不利 ...

  6. Django框架之路由

    1,路由系统就是url系统,整个url系统就是请求进入Django项目的入口,每一个请求的种类由url分析完毕并再去返回相应的响应,它的本质是url与要为该url调用的视图函数之间的映射关系表(当项目 ...

  7. Responsive Nav

    引入文件 <!-- 引入这些文件至 <head> 中 --> <link rel="stylesheet" href="responsive ...

  8. CMMI Institute Conference 2014中国大会

    我在大会上做SPD(Strategic Policy Deployment战略部署策略)的演讲,和来自各个公司的高管进行了热烈的讨论.获得好评. 有兴趣的朋友能够点击下面链接:Stratehttp:/ ...

  9. shell网络管理

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

  10. Map dependencies with code maps

    https://docs.microsoft.com/en-us/visualstudio/modeling/map-dependencies-across-your-solutions Instal ...