Struts的拦截器
Struts的拦截器
1.什么是拦截器
Struts的拦截器和Servlet过滤器类似,在执行Action的execute方法之前,Struts会首先执行Struts.xml中引用的拦截器,在执行完所有引用拦截器的intercept方法后,才会执行Action的execute方法.
- 1.在struts中,把每一个功能都用一个个的拦截器实现;用户想用struts的哪个功能的时候,可以自由组装使用
- 2.在Struts中,为了方法用户对拦截器的引用,提供了拦截栈的定义,里面可以包含多个拦截器。拦截栈就像一个文件夹,这个文件夹里面有很多的拦截器
- 3.在Struts中,如果用户没有指定执行哪些拦截器,Struts有一个默认执行的defaultStack,一旦如果用户有指定执行哪些拦截器,默认的拦截器栈就不会被执行
拦截器的设计,就是基于组件设计的应用!
2.拦截器的配置举例
struts-default.xml文件中,定义了Struts提供的所有拦截器!
<!--拦截器的配置-->
<!--一、拦截器的配置,用<interceptors>标签括起来-->
<interceptors>
<!--1.一个拦截器,有name和调用的类class的引用-->
<interceptor name="alias" class="com.opensymphony.xwork2.interceptor.AliasInterceptor"/>
<!--2.拦截栈,定义一个拦截栈的名字,然后用<interceptor-stack>标签包裹栈里的拦截器-->
<interceptor-stack name="basicStack">
<interceptor-ref name="exception"/>
</interceptor-stack>
</interceptors>
<!--二、设置默认执行的拦截器栈-->
<default-interceptor-ref name="defaultStack"/>
3.拦截器开发的api
Struts2中拦截器继承com.opensymphony.xwork2.interceptor.Interceptor的Interceptor拦截器接口,如果要开发拦截器,需要实现这个接口,一般用户可以继承AbstractInterceptor 拦截器默认实现的抽象类
拦截器中一定要实现三个方法:
void init();
启动时执行
String intercept(ActionInvocation invocation)throws Exception;
:拦截业务处理方法,在action之前执行
void destory();
:销毁方法
4.自定义一个拦截器案例:
步骤:
1.实现接口Interceptor的方法
package inter;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
/**
* 自定义拦截器
*/
public class HelloInterceptor implements Interceptor{
//构造器启动时候就执行了
public HelloInterceptor() {
System.out.println("创建了拦截器对象");
}
//初始化方法,服务器启动时候执行
public void init() {
System.out.println("执行了拦截器的初始化方法");
}
//拦截器处理方法,先创建Action实例,拦截器再进行业务处理,然后执行action的方法,再返回到拦截器中
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println("2.拦截器,业务处理开始");
//调用下一个拦截器或执行Action,相当与过滤器的chain.doFilter()
//获取execute方法的返回值
String resultFlag = invocation.invoke();
System.out.println("4.拦截器,业务处理-结束"+resultFlag);
return resultFlag;
}
//服务器关闭时执行
public void destroy() {
System.out.println("拦截器销毁");
}
}
2.通过struts配置该拦截器
<?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>
<package name="helloInterceptor" extends="struts-default" namespace="/">
<!--拦截器配置-->
<interceptors>
<!--配置用户自定义的拦截器-->
<interceptor name="hello" class="inter.HelloInterceptor"/>
<!--自定义一个栈:要引用默认栈,自定义的拦截器-->
<interceptor-stack name="helloStack" >
<!-- 引用默认栈 (一定要放到第一行)-->
<interceptor-ref name="defaultStack"/>
<!-- 引用自定义拦截器 -->
<interceptor-ref name="hello"/>
</interceptor-stack>
</interceptors>
<!--执行拦截器-->
<default-interceptor-ref name="helloStack"/>
<!--Action配置-->
<action name="hello" class="inter.HelloAction">
<result name="success">/index.jsp</result>
</action>
</package>
</struts>
配合使用的action处理类:
package inter;
import com.opensymphony.xwork2.ActionSupport;
/**
* 测试自定义拦截器的action
*/
public class HelloAction extends ActionSupport {
public HelloAction() {
System.out.println("1.Action实例创建了");
}
@Override
public String execute() throws Exception {
System.out.println("3.执行了请求处理的方法:execute");
return super.execute();
}
}
注意:过滤器执行的顺序
1.在服务器启动时,创建过滤器和初始化inti()过滤器
2.拦截器的处理方法开始工作
3.拦截器遇到String resultFlag = invocation.invoke();
时放行,执行action类,并接收action的返回结果
4.继续执行拦截器的处理方法
5.关闭服务器,销毁拦截器
5.拦截器执行时序图
启动:
创建所有拦截器,执行init()
用户访问:
先创建Action
再执行拦截器
最后,拦截器放行,执行execute()
6.拦截器的一个使用案例
Struts已经内建了一些拦截器,这里根据上面所学,并根据拦截器的执行顺序和功能,举一个案例:
Struts的执行流程图
请求-->过滤器(web.xml)-->拦截器(Struts)-->Action
1.jsp实现下载超链接
2.action中提供下载方法
3.如何在执行下载方法之前判断用户是否已经登录
此案例中就可以在过滤器或者拦截器中实现用户的登录判断
7.Struts的国际化
Struts的国际化与Servlet中国际化的区别:
Servlet中国际化的使用方法:
1.写资源文件
基础名.properties【默认的语言环境配置】
基础名_语言简称_国家简称.properties
2.读取资源文件,再使用
程序:ResocrceBundle
jsp:jstl提提供的格式化与国家化标签库
Struts中的国际化使用方法
1.写资源文件(同servlet)
2.读取资源文件
程序:ResourceBundle(同servlet)
jsp:jstl标签(同servlet),或struts标签获取资源文件内容
区别:
Struts2加载资源文件更加简单,通过常量加载即可,在jsp页面直接使用!
Struts国际化的使用案例:
1.写资源文件
msg.properties[默认的语言环境,找不到配置就找他]
msg_en_US.properties【英文资源文件】
pwd=密码
submit=提交
title=标题
username=用户名
2.配置,在struts.xml中使用常量配置
<!--通过常量加载资源文件-->
<!--常量是固定的,value是资源包,同一个包下基础名就可以了,可以加载多个资源包,用逗号隔开-->
<constant name="struts.custom.i18n.resources" value="msg"/>
上面是在xml配置文件中加载,也可以在jsp页面中在中通过下面的加载方式加载,但是不推荐,原因是放在jsp中加载,jsp页面加载东西过重
<s:i18n name="cn.itcast.config.msg">
<s:text> 标签必须放到标签体中。
</s:i18n>
3.使用Struts标签来引用配置文件中的key
使用标签之前要看引用struts-tags,如下:
<%@taglib prefix="s" uri="/struts-tags" %>
然后通过<s:text>标签来加载资源文件
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title><s:text name="title"/></title>
</head>
<body>
<form method="post" action="${pageContext.request.contextPath}/user_login">
<s:text name="username"/>:<input type="text" name="">
<s:text name="pwd"/>:<input type="text" name="">
<input type="submit" value="<s:text name="submit"/>">
</form>
</body>
</html>
Struts的拦截器的更多相关文章
- Struts 2 拦截器
什么是Struts 2 拦截器 拦截器就是当用户请求后台Action类时在Action的Excute()方法执行前和Result返回魔板试图之后(将页面(数据)发送给浏览器渲染之前)所需要的一些通用 ...
- struts自定义拦截器配置
配置自己的拦截器可以先参照下系统的拦截器是怎么配置的,首先打开struts-default.xml搜索下interceptor:系统里的拦截器有很多,拦截器都是放在堆栈里的,系统引用的是默认堆栈, & ...
- struts 用拦截器进行用户权限隔离,未登录用户跳到登录界面 *** 最爱那水货
一般,我们的web应用都是只有在用户登录之后才允许操作的,也就是说我们不允许非登录认证的用户直接访问某些页面或功能菜单项.对于个别页面来说,可能不需要进行拦截,此时,如果项目采用struts view ...
- struts自定义拦截器
第01步:配置web.xml,启动struts框架 <?xml version="1.0" encoding="UTF-8"?> <web-a ...
- (转)关于Struts 2 拦截器参数丢失问题
from:http://www.cnblogs.com/huzx/archive/2011/06/09/2076328.html 今天在做用户的登陆认证的时候出现的问题. 在传参数的时候,发现参数丢失 ...
- struts之拦截器
拦截器是为了让一些自己不希望发生的事情进行预防.以下我说一下struts自己定义拦截器. 以下我贴下struts.xml里的自定义的拦截器: <package name="my&quo ...
- Struts加入拦截器后取不到页面参数
在Struts2的demo项目中添加了一个简单的拦截器,突然发现,Action中取不到页面的参数了 这也是很蛋疼的事情,还好这个比较简单,稍微一查就发现问题: Struts2中很多的功能是用拦截器实现 ...
- java struts学习-拦截器
引言: Struts2拦截器,每个拦截器类只有一个对象实例,即采用单例模式,所有引用这个拦截器的Action都共享这一拦截器类的实例,因此,在拦截器中如果使用类变量,要注意同步问题. • ...
- Struts自定义拦截器&拦截器工作原理
0.拦截器的调用原理: 拦截器是一个继承了序列化接口的普通接口.其工作原理是讲需要被拦截的对象作为参数传到intercept()方法内,在方法内部对此对象进行处理之后再执行原方法.intercept( ...
随机推荐
- CoreCLR源码探索(一) Object是什么
.Net程序员们每天都在和Object在打交道 如果你问一个.Net程序员什么是Object,他可能会信誓旦旦的告诉你"Object还不简单吗,就是所有类型的基类" 这个答案是对的 ...
- 【AR实验室】OpenGL ES绘制相机(OpenGL ES 1.0版本)
0x00 - 前言 之前做一些移动端的AR应用以及目前看到的一些AR应用,基本上都是这样一个套路:手机背景显示现实场景,然后在该背景上进行图形学绘制.至于图形学绘制时,相机外参的解算使用的是V-SLA ...
- 一步一步使用ABP框架搭建正式项目系列教程
研究ABP框架好多天了,第一次看到这个框架的名称到现在已经很久了,但由于当时内功有限,看不太懂,所以就只是大概记住了ABP这个名字.最近几天,看到了园友@阳光铭睿的系列ABP教程,又点燃了我内心要研究 ...
- Redis数据库
Redis是k-v型数据库的典范,设计思想及数据结构实现都值得学习. 1.数据类型 value支持五种数据类型:1.字符串(strings)2.字符串列表(lists)3.字符串集合(sets)4.有 ...
- [原] KVM 环境下MySQL性能对比
KVM 环境下MySQL性能对比 标签(空格分隔): Cloud2.0 [TOC] 测试目的 对比MySQL在物理机和KVM环境下性能情况 压测标准 压测遵循单一变量原则,所有的对比都是只改变一个变量 ...
- 开发者的利器:Docker 理解与使用
困扰写代码的机器难免会被我们安装上各种各样的开发工具.语言运行环境和引用库等一大堆的东西,长久以来不仅机器乱七八糟,而且有些相同的软件还有可能会安装不同的版本,这样又会导致一个项目正常运行了,却不小心 ...
- Hadoop学习之旅二:HDFS
本文基于Hadoop1.X 概述 分布式文件系统主要用来解决如下几个问题: 读写大文件 加速运算 对于某些体积巨大的文件,比如其大小超过了计算机文件系统所能存放的最大限制或者是其大小甚至超过了计算机整 ...
- BPM应用开发解决方案分享
一.需求分析企业整体管理是一个完整的体系,如果 把这个体系比做一个拼图,企业信息化通过各个业务系统覆盖了一部分业务. 企业通过采购实施通用软件的方式,覆盖了企业的核心业务和专业化业务然而系统只满足了部 ...
- APP并非一个人在战斗,还有API—Xamarin.Android回忆录
前言 一般来说,一个客户端APP并非独立存在的,很多时候需要与服务器交互.大体可分为两方面的数据,常规字符串数据和文件数据,因为这两种数据很可能传输方式不一样,比如字符串之类的数据,使用HTTP协议, ...
- 在 Linux 上使用 Jexus + Mono 建立 Asp.Net 网站.
godaddy 买了个net空间,一点也不好用. 几个G的数据, 上传数据只有几kb , 想用 ssh 登录上去用 wget 下载,也不行 windows的主机貌似没有 ssh 功能... 后来实在忍 ...