1. Struts2的拦截器

1.1 拦截器概述

  • 拦截器,在AOP中用于在某个方法或某个字段被访问之前,进行拦截然后再之前或之后加入某些操作。拦截是AOP的一种实现策略。
  • 拦截器是动态拦截Action调用对象。它提供了一种机制可以使开发者定义一个action执行的前后的代码,也可以在一个action执行前阻止其执行。同时也是提供了一种可以提取action中可重用的部分的方式。
  • 拦截器和过滤器的区别
    • 拦截器:Interceptor,拦截客户端对Action的访问。是一种更加细粒度化的拦截,可以拦截Action中具体的方法。
    • 过滤器:Filter,用于过滤客户端向服务器端发送的请求。
  • Struts2框架核心的功能都是依赖拦截器实现的。

1.2 拦截器的实现原理

  • 不部分的时候,拦截器方法都是通过代理的方式来调用的。Struts2的拦截器实现相对简单。当请求到达Struts2的ServletDispathce时,Struts2会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表,最后一个一个地调用列表中地拦截器。
  • Struts2拦截器时可插拔地,拦截器时AOP地以一种实现。Struts2拦截器栈就是将拦截器按一定地顺序联结成一条链。在访问被拦截地方法或字段时,Struts2拦截器链中的拦截器就会按其之前定义的顺序被调用。

1.3 Struts的执行流程

  • 客户端向服务器发送一个Action的请求,执行核心过滤器(doFilter)方法。在这个方法中,调用executeAction()方法,在这个方法内部调用dispatcher.serviceAction();在这个方法内部创建一个Action代理,最终执行的是Action代理中的execute(),在代理中执行的execute方法中调用ActionInvocationinvoke方法。在这个方法内部递归执行一组拦截器(完成部分功能),如果没有下一个拦截器,就会执行目标Action,根据Action的返回的结果进行页面跳转。

1.4 拦截器入门

1.4.1 环境搭建

  • 新建工程,导入需要的jar包。

  • web.xml中配置配置核心过滤器。

  • 新建Actioncom.itzhouq.web.action.ActionDemo1

    1. package com.itzhouq.web.action;
    2. import com.opensymphony.xwork2.ActionSupport;
    3. public class ActionDemo1 extends ActionSupport {
    4. @Override
    5. public String execute() throws Exception {
    6. System.out.println("ActionDemo1执行了......");
    7. return super.execute();
    8. }
    9. }
  • 在主配置文件struts.xml中配置Action

    1. <?xml version="1.0" encoding="UTF-8" ?>
    2. <!DOCTYPE struts PUBLIC
    3. "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    4. "http://struts.apache.org/dtds/struts-2.3.dtd">
    5. <struts>
    6. <!-- 开启静态方法 -->
    7. <constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>
    8. <package name="demo1" extends="struts-default" namespace="/">
    9. <action name="actionDemo1" class="com.itzhouq.web.action.ActionDemo1">
    10. <result>/demo1/test.jsp</result>
    11. </action>
    12. </package>
    13. </struts>
  • 编写跳转页面../WebContent/demo1/test.jsp

    1. <%@ page language="java" contentType="text/html; charset=UTF-8"
    2. pageEncoding="UTF-8"%>
    3. <!DOCTYPE html>
    4. <html>
    5. <head>
    6. <meta charset="UTF-8">
    7. <title>Insert title here</title>
    8. </head>
    9. <body>
    10. <h1>test.jsp</h1>
    11. <%
    12. System.out.println("test.jsp执行了.......");
    13. %>
    14. </body>
    15. </html>
  • 测试

    • 在浏览器访问工程下的../actionDemo1.action
    • 页面打印了test.jsp
    • 后台控制台打印了ActionDemo1执行了......test.jsp执行了.......
    • 环境搭建成功。

1.4.2 编写拦截器

  • com.itzhouq.web.interceptor下编写两个拦截器

    1. package com.itzhouq.web.interceptor;
    2. import com.opensymphony.xwork2.ActionInvocation;
    3. import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
    4. /**
    5. * 自定义拦截器一:
    6. * @author itzhouq
    7. *
    8. */
    9. public class InterceptorDemo1 extends AbstractInterceptor {
    10. @Override
    11. public String intercept(ActionInvocation invocation) throws Exception {
    12. System.out.println("InterceptorDemo1执行了......");
    13. String str = invocation.invoke();
    14. System.out.println("InterceptorDemo1执行结束了......");
    15. return str;
    16. }
    17. }

1.4.3 配置拦截器

  • 方式一:定义拦截器进行配置

  • 注意:一旦引入自定义拦截器,默认拦截器栈的拦截器就不执行了。所以,需要手动引入默认拦截器。

  • 在主配置文件做如下配置

    1. <?xml version="1.0" encoding="UTF-8" ?>
    2. <!DOCTYPE struts PUBLIC
    3. "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    4. "http://struts.apache.org/dtds/struts-2.3.dtd">
    5. <struts>
    6. <!-- 开启静态方法 -->
    7. <constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>
    8. <package name="demo1" extends="struts-default" namespace="/">
    9. <!-- 定义拦截器 -->
    10. <interceptors>
    11. <interceptor name="interceptorDemo1" class="com.itzhouq.web.interceptor.InterceptorDemo1"/>
    12. <interceptor name="interceptorDemo2" class="com.itzhouq.web.interceptor.InterceptorDemo2"/>
    13. </interceptors>
    14. <action name="actionDemo1" class="com.itzhouq.web.action.ActionDemo1">
    15. <result>/demo1/test.jsp</result>
    16. <!-- 引入拦截器(一旦引入自定义拦截器,默认拦截器栈的拦截器就不执行了) -->
    17. <interceptor-ref name="defaultStack"/>
    18. <interceptor-ref name="interceptorDemo1"/>
    19. <interceptor-ref name="interceptorDemo2"/>
    20. </action>
    21. </package>
    22. </struts>
  • 方式二:定义拦截器栈的方式

    1. <struts>
    2. <!-- 开启静态方法 -->
    3. <constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>
    4. <package name="demo1" extends="struts-default" namespace="/">
    5. <!-- 定义拦截器 -->
    6. <interceptors>
    7. <interceptor name="interceptorDemo1" class="com.itzhouq.web.interceptor.InterceptorDemo1"/>
    8. <interceptor name="interceptorDemo2" class="com.itzhouq.web.interceptor.InterceptorDemo2"/>
    9. <!-- 定义拦截器栈 -->
    10. <interceptor-stack name="myStack">
    11. <interceptor-ref name="defaultStack"/>
    12. <interceptor-ref name="interceptorDemo1"/>
    13. <interceptor-ref name="interceptorDemo2"/>
    14. </interceptor-stack>
    15. </interceptors>
    16. <action name="actionDemo1" class="com.itzhouq.web.action.ActionDemo1">
    17. <result>/demo1/test.jsp</result>
    18. <!-- 引入拦截器(一旦引入自定义拦截器,默认拦截器栈的拦截器就不执行了) -->
    19. <interceptor-ref name="myStack"/>
    20. </action>
    21. </package>
    22. </struts>
  • 测试:

    • 在浏览器访问工程下的../actionDemo1.action.
    • 页面打印了test.jsp.
    • 后台信息如下:

2. Struts2的标签库

2.1 通用标签库

  • 判断标签:<s:if><s:elseif><s:else>

  • 迭代标签:<s:iterator>

  • 其他标签:

    • <s:property/>
    • <s:debug>
    • <s:date>----在页面上进行日期格式化
  • 举例:编写../WebContent/demo2/test.jsp

    1. <%@ page language="java" contentType="text/html; charset=UTF-8"
    2. pageEncoding="UTF-8"%>
    3. <%@ taglib uri="/struts-tags" prefix="s"%>
    4. <!DOCTYPE html>
    5. <html>
    6. <head>
    7. <meta charset="UTF-8">
    8. <title>Insert title here</title>
    9. </head>
    10. <body>
    11. <s:set var="i" value="5" scope="request"/>
    12. <s:if test="#request.i > 3">
    13. i 大于 3
    14. </s:if>
    15. <s:elseif test="#request.i < 3">
    16. i 小于 3
    17. </s:elseif>
    18. <s:else>
    19. i 等于 3
    20. </s:else>
    21. <s:iterator var="i" value="{'aa','bb','cc'}">
    22. <s:property value="#i"/>
    23. </s:iterator>
    24. <hr>
    25. <s:iterator var="entry" value="#{'aaa':'111', 'bbb':'222','ccc':'333' }">
    26. <s:property value="#entry.key"/>--<s:property value="#entry.value"/><br>
    27. </s:iterator>
    28. <hr>
    29. <s:iterator var="i" begin="100" end="150" step="5" status="status">
    30. <s:if test="#status.count % 3 == 0">
    31. <font color="red"><s:property value="#i"/></font>
    32. </s:if>
    33. <s:else>
    34. <s:property value="#i"/>
    35. </s:else>
    36. </s:iterator>
    37. </body>
    38. </html>
  • 测试:访问工程下../demo2/test.jsp

2.2 UI标签库:方便数据回显

Struts框架笔记04_拦截器_标签库的更多相关文章

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

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

  2. [原创]java WEB学习笔记74:Struts2 学习之路--自定义拦截器,struts内建的拦截器

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  3. struts2框架之自定义拦截器和配置

    struts框架中也存在拦截器,只不过系统自动调用.框架自带的拦截器的配置文件所在的位置为: java Resources--->Libraries--->struts2-core-2.3 ...

  4. java自定义注解知识实例及SSH框架下,拦截器中无法获得java注解属性值的问题

    一.java自定义注解相关知识 注解这东西是java语言本身就带有的功能特点,于struts,hibernate,spring这三个框架无关.使用得当特别方便.基于注解的xml文件配置方式也受到人们的 ...

  5. 框架学习之Struts2(四)---拦截器和标签

    一.拦截器概述 1.1 在struts2框架中封装了很多功能,struts2里面封装的功能都是在拦截器里面,struts2里面又很多拦截器,但不是每次这些拦截器都执行,每次执行型默认的拦截器. 默认拦 ...

  6. Struts2笔记——自定义拦截器

    需要两个步骤,自定义类实现拦截器接口和在struts.xml注册拦截器 =============================== 1.自定义类实现com.opensymphony.xwork2. ...

  7. Struts 2知识回顾----拦截器(Intercept)总结

    什么是Struts 2拦截器? 从软件构架上来说,拦截器是实现了面向方面编程的组件.它将影响了多个业务对象的公共行为封装到一个个可重用的模块,减少了系统的重复代码,实现功能的高度内聚,确保了业务对象的 ...

  8. Struts学习之自定义拦截器

    * 所有的拦截器都需要实现Interceptor接口或者继承Interceptor接口的扩展实现类    * 要重写init().intercept().destroy()方法        * in ...

  9. Struts2拦截器和标签

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

随机推荐

  1. Microsoft Office Excel不能访问文件*.xls的解决方案

    Microsoft Office Excel不能访问文件‘xxxx.xls“可能的原因有:·文件名称或路径不存在,文件正被其他程序使用:您正要保存的工作簿与当前打开的工作簿同名. 解决方案 1.首先检 ...

  2. [LeetCode] 12. Integer to Roman 整数转为罗马数字

    Roman numerals are represented by seven different symbols: I, V, X, L, C, D and M. Symbol Value I 1 ...

  3. 高级UI-高级渲染

    在使用了Panit画笔之后,可以对其进行渲染,从而达到更加人性化的方式 渲染分类 按常用渲染方式可以分为以下几种: BimapShader位图的图像渲染器 LinearGradient线性渲染 Rad ...

  4. 存储Flash--NOR flash和 Nand flash

    flash是存储芯片的一种,通过特定的程序可以修改里面的数据.FLASH在电子以及半导体领域内往往表示Flash Memory的意思,即平时所说的“闪存”,全名叫Flash EEPROM Memory ...

  5. php常用的验证

    <?php namespace Vendor\Func; /** * 常用的验证 * Class Verify * @package Vendor\Func */ class Verify { ...

  6. 01_Android入门

    Android系统文件目录结构 / 代表系统的根目录 /data/app/ 存放着第三方的apk文件 /system/app/ 其中是系统中的应用安装文件 /data/data/packagename ...

  7. Python Web开发技术栈

  8. hadoop 异常

    2019-09-20 22:49:51,955 WARN org.apache.hadoop.hdfs.server.datanode.DataNode: Problem connecting to ...

  9. golang ---调用window api函数执行程序

    package main import "syscall" import "unsafe" func main() { var hand uintptr = u ...

  10. java之初识hibernate

    1. 使用jdbc进行数据库操作:获取数据库连接,编写sql语句,执行sql操作,关闭连接. 比如:每次创建连接,释放资源----使的执行效率降低: 解决方案:连接池. 编写sql语句动作----简单 ...