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


    结构图

    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的返回的结果进行页面跳转。

    Struts2的执行流程

    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标签库:方便数据回显

    UI标签库

  • 相关阅读:
    浅析电商防止恶意下单
    Dubbo与Hadoop RPC的区别
    中秋福利 | 10本技术图书(编程语言、数据分析等)免费送
    IOS渠道追踪方式
    数据迁移的应用场景与解决方案Hamal
    JVM锁实现探究2:synchronized深探
    网页设计简史看设计&代码“隔膜”
    知物由学 | 你真的了解网络安全吗?
    一行代码搞定Dubbo接口调用
    测试周期内测试进度报告规范
  • 原文地址:https://www.cnblogs.com/itzhouq/p/Struts2_4.html
Copyright © 2020-2023  润新知