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

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

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

    <%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    <h1>test.jsp</h1>
    <%
    System.out.println("test.jsp执行了.......");
    %>
    </body>
    </html>
  • 测试

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

1.4.2 编写拦截器

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

    package com.itzhouq.web.interceptor;
    
    import com.opensymphony.xwork2.ActionInvocation;
    import com.opensymphony.xwork2.interceptor.AbstractInterceptor; /**
    * 自定义拦截器一:
    * @author itzhouq
    *
    */
    public class InterceptorDemo1 extends AbstractInterceptor { @Override
    public String intercept(ActionInvocation invocation) throws Exception {
    System.out.println("InterceptorDemo1执行了......");
    String str = invocation.invoke();
    System.out.println("InterceptorDemo1执行结束了......");
    return str;
    }
    }

1.4.3 配置拦截器

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

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

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

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

    <struts>
    <!-- 开启静态方法 -->
    <constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>
    <package name="demo1" extends="struts-default" namespace="/">
    <!-- 定义拦截器 -->
    <interceptors>
    <interceptor name="interceptorDemo1" class="com.itzhouq.web.interceptor.InterceptorDemo1"/>
    <interceptor name="interceptorDemo2" class="com.itzhouq.web.interceptor.InterceptorDemo2"/>
    <!-- 定义拦截器栈 -->
    <interceptor-stack name="myStack">
    <interceptor-ref name="defaultStack"/>
    <interceptor-ref name="interceptorDemo1"/>
    <interceptor-ref name="interceptorDemo2"/>
    </interceptor-stack>
    </interceptors> <action name="actionDemo1" class="com.itzhouq.web.action.ActionDemo1">
    <result>/demo1/test.jsp</result> <!-- 引入拦截器(一旦引入自定义拦截器,默认拦截器栈的拦截器就不执行了) -->
    <interceptor-ref name="myStack"/>
    </action>
    </package>
    </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

    <%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ taglib uri="/struts-tags" prefix="s"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body> <s:set var="i" value="5" scope="request"/>
    <s:if test="#request.i > 3">
    i 大于 3
    </s:if>
    <s:elseif test="#request.i < 3">
    i 小于 3
    </s:elseif>
    <s:else>
    i 等于 3
    </s:else> <s:iterator var="i" value="{'aa','bb','cc'}">
    <s:property value="#i"/>
    </s:iterator>
    <hr>
    <s:iterator var="entry" value="#{'aaa':'111', 'bbb':'222','ccc':'333' }">
    <s:property value="#entry.key"/>--<s:property value="#entry.value"/><br>
    </s:iterator>
    <hr>
    <s:iterator var="i" begin="100" end="150" step="5" status="status">
    <s:if test="#status.count % 3 == 0">
    <font color="red"><s:property value="#i"/></font>
    </s:if>
    <s:else>
    <s:property value="#i"/>
    </s:else>
    </s:iterator>
    </body>
    </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. JAVA微信开发-如何保存包含特殊字符的微信昵称

    我们在做微信开发的时候,有一个很重要的就是通过openid获取用户的详细信息,包含昵称,头像,省,市,区的信息,但是现在移动时代,很多人追求个性,在名字当中大量使用火星文或者表情符.(本人实际测试过一 ...

  2. [转]JS - Promise使用详解2(ES6中的Promise)

    原文地址:https://www.hangge.com/blog/cache/detail_1638.html 2015年6月, ES2015(即 ECMAScript 6.ES6) 正式发布.其中  ...

  3. PAT 甲级 1080 Graduate Admission (30 分) (简单,结构体排序模拟)

    1080 Graduate Admission (30 分)   It is said that in 2011, there are about 100 graduate schools ready ...

  4. [LeetCode] 533. Lonely Pixel II 孤独的像素 II

    Given a picture consisting of black and white pixels, and a positive integer N, find the number of b ...

  5. (二)主板BIOS设置与硬盘分区、调整

    1.主板BIOS设置 前提,你得有一台电脑,台式机或笔记本电脑都行. BIOS负责开机时对系统中各个硬件进行初始化设置和测试,以确保系统能正常工作,是电脑硬件与软件程序之间的一座桥梁. 电脑在开机启动 ...

  6. 应用程序正常初始化(0xc0000135)失败。请单击“确定”,终止应用程序。

    应用程序正常初始化(0xc0000135)失败.请单击“确定”,终止应用程序. 没有安装对应版本的.NET FRAMEWORK.

  7. Java高级面试题整理(附答案)

    这是我收集的10道高级Java面试问题列表.这些问题主要来自 Java 核心部分 ,不涉及 Java EE 相关问题.你可能知道这些棘手的 Java 问题的答案,或者觉得这些不足以挑战你的 Java ...

  8. springboot统一返回json数据格式并配置系统异常拦截

    本文链接:https://blog.csdn.net/syystx/article/details/82870217通常进行前后端分离开发时我们需要定义统一的json数据交互格式并对系统未处理异常进行 ...

  9. web自动化测试笔记(二)

    如何使用selenium工具 上章节介绍了搭建web自动化的环境,这个章节介绍如何使用selenium写自动化脚本. 1.selenium selenium是一个用于web应用程序的测试工具.它可以帮 ...

  10. python实践项目六:正则表达式-强口令

    描述:写一个函数,它使用正则表达式,确保传入的口令字符串是强口令.强口令的定义是:长度不少于8 个字符,  同时包含大写和小写字符, 至少有一位数字. 代码: #!/usr/bin/python # ...