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方法中调用ActionInvocation的invoke方法。在这个方法内部递归执行一组拦截器(完成部分功能),如果没有下一个拦截器,就会执行目标Action,根据Action的返回的结果进行页面跳转。

1.4 拦截器入门
1.4.1 环境搭建
新建工程,导入需要的
jar包。在
web.xml中配置配置核心过滤器。新建
Action类com.itzhouq.web.action.ActionDemo1package 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_拦截器_标签库的更多相关文章
- struts2第四天——拦截器和标签库
一.拦截器(interceptor)概述 struts2是个框架,里面封装了很多功能,封装的很多功能都是在拦截器里面. (属性封装.模型驱动等都是封装在拦截器里面) struts2里面封装了很多功能, ...
- [原创]java WEB学习笔记74:Struts2 学习之路--自定义拦截器,struts内建的拦截器
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- struts2框架之自定义拦截器和配置
struts框架中也存在拦截器,只不过系统自动调用.框架自带的拦截器的配置文件所在的位置为: java Resources--->Libraries--->struts2-core-2.3 ...
- java自定义注解知识实例及SSH框架下,拦截器中无法获得java注解属性值的问题
一.java自定义注解相关知识 注解这东西是java语言本身就带有的功能特点,于struts,hibernate,spring这三个框架无关.使用得当特别方便.基于注解的xml文件配置方式也受到人们的 ...
- 框架学习之Struts2(四)---拦截器和标签
一.拦截器概述 1.1 在struts2框架中封装了很多功能,struts2里面封装的功能都是在拦截器里面,struts2里面又很多拦截器,但不是每次这些拦截器都执行,每次执行型默认的拦截器. 默认拦 ...
- Struts2笔记——自定义拦截器
需要两个步骤,自定义类实现拦截器接口和在struts.xml注册拦截器 =============================== 1.自定义类实现com.opensymphony.xwork2. ...
- Struts 2知识回顾----拦截器(Intercept)总结
什么是Struts 2拦截器? 从软件构架上来说,拦截器是实现了面向方面编程的组件.它将影响了多个业务对象的公共行为封装到一个个可重用的模块,减少了系统的重复代码,实现功能的高度内聚,确保了业务对象的 ...
- Struts学习之自定义拦截器
* 所有的拦截器都需要实现Interceptor接口或者继承Interceptor接口的扩展实现类 * 要重写init().intercept().destroy()方法 * in ...
- Struts2拦截器和标签
一.struts2拦截器 1.struts2是框架,封装了很多的功能,struts2里面封装的功能都是在拦截器里面. 2 struts2里面封装了很多的功能,有很多拦截器,不是每次这些拦截器都执行,每 ...
随机推荐
- linux环境中,openssl升级及openresty中nginx基于新版本openssl重新编译
需求说明: 最近在对系统进行安全扫描的时候,出现了openssl版本的问题,建议对openssl版本进行升级,在此记录下升级过程. 环境说明: 操作系统:RHEL 6.6 升级操作过程: 1.下载最新 ...
- sqlserver表被锁了,解锁方法,删除锁的方法
-- 查询死锁select request_session_id spid, OBJECT_NAME(resource_associated_entity_id) table ...
- 【Git】The authenticity of host '192.168.1.1 (192.168.1.1)' can't be established.
背景,在服务器用www用户身份 执行拉取命令报错 sudo -u www git pull 原因分析: 在新生成密钥之后,在.ssh文件夹中少了known_hosts文件 解决办法: Are you ...
- 10分钟完成一个最最简单的BLE蓝牙接收数据的DEMO
这两天在研究蓝牙,网上有关蓝牙的内容非常有限,Github上的蓝牙框架也很少很复杂,为此我特地写了一个最最简单的DEMO,实现BLE蓝牙接收数据的问题, 不需要什么特定的UUID, 不需要什么断开重连 ...
- [LeetCode] 73. Set Matrix Zeroes 矩阵赋零
Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in-place. Exampl ...
- 浅谈Java中的Condition条件队列,手摸手带你实现一个阻塞队列!
条件队列是什么?可能很多人和我一样答不出来,不过今天终于搞清楚了! 什么是条件队列 条件队列:当某个线程调用了wait方法,或者通过Condition对象调用了await相关方法,线程就会进入阻塞状态 ...
- 日志收集系统ELK搭建
一.ELK简介 在传统项目中,如果在生产环境中,有多台不同的服务器集群,如果生产环境需要通过日志定位项目的Bug的话,需要在每台节点上使用传统的命令方式查询,这样效率非常低下.因此我们需要集中化的管理 ...
- 问题一:使用AndroidDriver而非原来的AppiumDriver的原因
AppiumDriver升级到2.0.0版本引发的问题--Cannot instantiate the type AppiumDriver 1. 问题描述和起因在使用Appium1.7.0及其以下版本 ...
- Oracle和Mysql中的字符串的拼接
SQL允许两个或者多个字段之间进行计算,字符串类型的字段也不例外.比如我们需要 以"工号+姓名"的方式在报表中显示一个员工的信息,那么就需要把工号和姓名两个字符 串类型的字段拼接计 ...
- Centos7挂载新硬盘
1.查看系统是否检测到新的硬盘设备 ls /dev/ |grep sd linux 中所有外设都会在这个目录下,对应一个文件,其中第一块硬盘是sda,第二块硬盘是sdb,第三块硬盘是sdc.其中sda ...