第一篇:Struts2中的拦截器与过滤器学习
拦截器是在面向切面编程的就是在你的service或者一个方法,前调用一个方法,或者在方法后调用一个方法,比如动态代理就是拦截器的简单实现,过滤器是在java web中,你传入的request,response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者struts的 action进行业务逻辑,比如过滤掉非法url(不是login.do的地址请求,如果用户没有登陆都过滤掉),或者在传入servlet或者 struts的action前统一设置字符集,或者去除掉一些非法字符。
拦截器与过滤器的区别:
1、拦截器是基于java的反射机制的,而过滤器是基于函数回调
2、过滤器依赖与servlet容器,而拦截器不依赖与servlet容器
3、拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用
4、拦截器可以访问action上下文、值栈里的对象,而过滤器不能
5、在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次
过滤器
也就是写一个自己的类,让这个类实现于Filter这个接口,这个接口里有三个方法。
init(),doFilter(),destroy();主要是对doFilter()进行操作,你可以在这个方法里写你想进行的操作.写完这些之后,就是在web.xml里的配置了
在
1、定义拦截器
a.方法一:实现Interceptor接口
public class MyInterceptor implements Interceptor { private String hello;//定义带参数的拦截器 public String getHello(){ return hello;} public void setHello(String hello){ this.hello = hello;} public void destroy(){ // TODO Auto-generated method stub System.out.println(“destroy”);} @Override public void init(){ //服务器启动时自动加载一次 System.out.println(“init”);System.out.println(“hello”);} @Override public String intercept(ActionInvocation arg0)throws Exception { System.out.println(“inercept”);String result=arg0.invoke();System.out.println(“finish”);return result;} } b.方法二:继承AbstractInterceptor类
public class MyInterceptor2 extends AbstractInterceptor { @Override public String intercept(ActionInvocation arg0)throws Exception { System.out.println(“intercept2”);String result=arg0.invoke();System.out.println(“finish2”);return result;} } c.方法三:继承MethodFilterInterceptor类,定义过滤方法的拦截器 public class MyInterceptor3 extends MethodFilterInterceptor { //过滤方法的拦截器 @Override protected String doIntercept(ActionInvocation arg0)throws Exception { arg0.addPreResultListener(new MyListener());//将监听器注册到里面
System.out.println(“myinterceptor3”);String result=arg0.invoke();System.out.println(“after myinterceptor3 ”);return result;} }
2、配置拦截器
一旦实现了上面的拦截器,就可以在所有需要实现控制的Action中复用上面的拦截器。为了使用该拦截器,首先在struts.xml文件中定义该拦截器,定义拦截器的配置片段如下: world
3、应用拦截器
第二篇:Struts2核心拦截器---学习笔记
Struts2的核心——拦截器
在struts2中,拦截器(Interceptor)是其核心的组件,当我们访问一个action时,我们可以通过拦截器的配置,做一些需要的操作。
我们可以写我们自己的拦截器,但是要实现或继承struts2给我们提供的接口或类。
①.我们实现Interceptor接口,该接口是struts2提供的拦截器接口,位于com.opensymphony.xwork2.interceptor包下,其提供了类似与filter的一些方法,我们必须实现它的方法:destroy()、init()、intercept(ActionInvocation)。
public class MyInterceptor implements Interceptor {
public void destroy(){
System.out.println(“destroy”);} public void init(){ } public String intercept(ActionInvocation invocation)throws System.out.println(“init”);Exception {
System.out.println(“intercept”);
String resultString= invocation.invoke();System.out.println(“finish”);return resultString;}
②.我们可以继承AbstractInterceptor类,该类是一个抽象类,它位于com.opensymphony.xwork2.interceptor包下,它实现了Interceptor接口,并完成了对destroy()方法和init()方法的实现,但保留了抽象方法interceptor(),以供自定义的拦截器来重写其方法,完成特定的需求。
public class MyInterceptor1 extends AbstractInterceptor {
} @Override
public String intercept(ActionInvocation invocation)throws
System.out.println(“intercept1”);
String result=invocation.invoke();
System.out.println(“finish1”);Exception { return result;}
③.上面两个是对action进行的拦截,粒度比较粗,当然struts2也给我们提供了对action中方法的拦截。这时,我们自己写的类就要继承struts
2给我们提供的方法过滤类,该
类
同
样
位
于MethodFilterInterceptor com.opensymphony.xwork2.interceptor包下,但该类已经完成了对interceptor()方法的简单实现,而提供了一个doIntercept()方法。
public class MyInterceptor2 extends MethodFilterInterceptor { @Override
protected String doIntercept(ActionInvocation invocation)throws Exception {
System.out.println(“methodFilterInterceptor2”);String result=invocation.invoke();System.out.println(“finish2”);
return result;} }
写好了我们自己的拦截器类,还需要在struts.xml文件进行配置来告诉struts2框架,我们的拦截器要拦截的action、方法。
首先,我们要在package包下增加一个新的元素标签 class=“com.test.interceptor.MyInterceptor”>
定义了一个name是myInterceptor的拦截器(即实现了Interceptor接口的那个拦截器),类似的,我们定义了上面我们已写的3个拦截器。
name=“myInterceptor” class=“com.test.interceptor.MyInterceptor”>
请注意下面代码,我们定义了
name=“myInterceptor”>
name=“myInterceptor1”>
defaultStack这个拦截器栈是struts2,提供的一个默认拦截器栈,其中实现了一些常用功能,如:struts2的检验框架,当我们在声明package时候会有extends属性,其值为struts-default,而defaultStack就定义在struts-default包类,进而就被我们的package所继承。
name=“defaultStack”>
在拦截器的配置中,我们可以为package配置一个默认的拦截器或拦截器栈,如果我们不指定,其值就为父包继承下来的defaultStack。
name=“myStack”>
标签,可以对拦截器类中定义的属性赋值,这里是告诉拦截器,只拦截abc()方法。
abc
第三篇:struts2拦截器--将用户操作日志存入数据库
struts2拦截器--将用户操作日志存入数据库
1.建表,如下所示:
2.新建OperationLogModel.java,其具有上述属性。3.自动生成PO 4.在struts.xml中配置拦截器:
5.如下例子中的用户登录和修改密码,要在相应xml文件中加入
6.在项目中新建文件夹log,在其下新建类LogInterceptor.java,如下: package com.bfw.crms.log;import java.util.Map;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpSession;import org.apache.commons.lang.StringUtils;import org.apache.log4j.Logger;import org.apache.struts2.ServletActionContext;import com.bfw.crms.action.BulletinAction;import com.bfw.crms.action.SystemAction;import com.bfw.crms.model.EmployeeModel;import com.bfw.crms.model.OperationLogModel;import com.bfw.crms.po.OperationLog;import com.bfw.crms.util.BeanUtil;import com.bfw.crms.util.DateTimeUtil;import com.ninetowns.framework.dao.ObjectDao;import com.opensymphony.xwork2.Action;import com.opensymphony.xwork2.ActionInvocation;import com.opensymphony.xwork2.interceptor.AbstractInterceptor;@SuppressWarnings(“serial”)
public class LogInterceptor extends AbstractInterceptor{
private String logName;
private String logContent;
protected Logger log = Logger.getLogger(getClass());
protected HttpSession getSession()
{
return getRequest().getSession();
}
protected HttpServletRequest getRequest()
{
return ServletActionContext.getRequest();
}
public void init(){
}
private ObjectDao objectDao = null;
public ObjectDao getObjectDao()
{
return objectDao;
}
public void setObjectDao(ObjectDao objectDao)
{
this.objectDao = objectDao;
}
@Override
public String intercept(ActionInvocation ai)throws Exception
{
Object action= ai.getAction();
String method= ai.getProxy().getMethod();
try{
if(StringUtils.isBlank(method))method = “method”;
EmployeeModel sysUser(EmployeeModel)this.getSession().getAttribute(“employee”);
String userName = “";
if(sysUser!=null)userName = sysUser.getName();
=
String currentTime = DateTimeUtil.getDateTime();
String logContentHead = ”用户“+userName+currentTime;
ai.invoke();//执行被拦截action
if(action instanceof BulletinAction){
if(method.equals(”save“)){
logName = ”保存部门“;
logContent = logContentHead
+”保存部门:“+ai.getStack().findValue(”sysOrg.orgName“);
log.info(logContent);
addSysLog(logName,logContent);
}
if(method.equals(”delete“)){
logName = ”删除部门“;
logContent = logContentHead +”“+((String[])(ai.getStack().findValue(”flag_id“))).length+”条部门信息“;
log.info(logContent);
addSysLog(logName,logContent);
}
}
if(actioninstanceof SystemAction){
if(method.equals(”login“)){
logName = ”登录系统“;
logContent = logContentHead;
log.info(logContent);
addSysLog(logName,logContent);
}
if(method.equals(”changePassword“)){
logName = ”修改密码“;
logContent = logContentHead +”删除1条单位信息";
log.info(logContent);
addSysLog(logName,logContent);
}
}
}catch(Exception e){
e.printStackTrace();
}
return Action.SUCCESS;
}
/**
* 插入系统日志 model2po()
* @param logName
* @param logContent
*/
删除
private void addSysLog(String logName,String logContent){
OperationLogModel operationModel = new OperationLogModel();
OperationLog operationPO = new OperationLog();
operationModel.setOperation(logContent);
BeanUtil.model2po(operationModel, operationPO);
this.getObjectDao().saveObject(operationPO);
}
} OK
第四篇:经典文章学习——“过滤器理论”
经典文章学习——“过滤器理论”
本公众号将会陆续推出郝胖老师一系列经典专栏(原文),希望大家能从中受益。本期推出交易的理想模型系列。“过滤器理论”(2012.10.18)1—————上周笔者提示了中期风险,并没有明确提出反弹何时终结,本周走势先抑后扬,关键看周五走势能否放量突破2164,一旦突破2164,短期可看2234点。至于股票可以选择江泉实业、星湖科技等这种底部扎实,向上突破有河宽的股票少量参与。
2—————接下来继续理想模型系列,本系列一发不可收拾,既是给大家讲解技术分析,也是对自己多年交易经验的总结。今天讲的是交易中的“过滤器”,这是关于选择入场时机的理论。《新市场奇才》最先提出“过滤器理论”,他认为任何技术分析方法都是根据价格来的,所有交易方法对价格的过滤相当于不同颜色的玻璃对价格的过滤。加里.斯密斯则在此基础上提出“知觉过滤器”是各种情绪指标和技术指标,然而他没有公布自己所钟爱的指标。今天我将重点谈谈我所知道的那些“过滤器”。3—————技术分析者并非一介武夫,成功的技术分析大师多为具有哲学底蕴的艺术家,他们只是恰巧以交易谋生而已。索罗斯自创反身性理论,能够洞悉人性的偏执,尽管他自称为失败的哲学家;江恩大师博学多才,试图写出价格走势的数学原理,尽管他后来误入神秘时空的怪圈。“量价时空”是技术分析的基本要素,很多过滤器也均以此展开。最常用的防范假突的过滤器就是时间过滤器和价格过滤器,“突破关键点位2到3个百分点”、“2到3天不回到关键点一下”则认确突破的有效性。当然今天要说的并非这些简单的小技巧,而是一些交易大师的过滤器系统。
4—————马丁.舒华兹被认为是当代的杰西.利佛莫尔,这个天才的操盘手在9年的失败交易生涯之后明白了交易的本质。在认识到自己短线交易的性格之后,他选择了以7个指标为组合的过滤器系统,其中“腾落线”也是史丹温斯坦常用的指标。当所有这些指标都健康时则入场交易,当其中一个与其它发生背离,则时刻警惕可能发生的不利情况,做好出场准备。你可能认为7个指标太多了,但据我了解还有用40个的。
5—————马丁的方法是由上而下,他更多是一个帽客,依靠手动计算每30分钟重新评估一次市场的短线趋势,他使用的指标大多是道琼斯工业平均指数、纽约证券交易所股价净变动、标普500等等宏观指数。与此不同,亚历山大·埃尔德的《以交易为生》(Trading for a living)则明确提出简单易行的“三层过滤网”交易系统,三重滤网的第一层是利用趋势跟踪指标来判断长期趋势。他最初设计的系统是用周线MACD柱来判断趋势,这个我不表态,因为我个人就是依靠“123”法则来判断趋势,Macd不是可靠的技术。三重滤网的第二层滤网——市场波浪,利用震荡指标来观察日线图。当周线趋势向上时,利用日线下跌来寻找买点;当周线趋势向下时,利用日线上涨来寻找放空点。三重滤网的第三层滤网——盘中突破,当周线趋势上升而日线震荡指标下降时,运用追踪型买进技术。当周线趋势下跌而日线振荡指标上升时运用追踪型卖出技术。说直白一点,他的思考来源于对周期与级别的思考,周线级别决定日线级别,日线级别决定30分钟级别。国内的朋友如果读过缠师的遗著,对此不会陌生,缠师的《市场哲学的数学原理》浓墨重彩地描写了如何通过级别来寻找安全买点。笔者在此提醒各位,没有一定的市场经验不要看,因为对市场的判断不是光靠技术就可以掌握的。
6—————笔者曾经根据史丹.温斯坦和威廉.欧尼尔共同钟爱的相对强度指标设计出“五级买卖点”理论,并根据它来就行交易。直到我以期货交易为主才慢慢放弃这些市场跟踪指标,因为期货要求更加主动和积极,根据价格走势直观判断即可。当然在文章的结尾我依然没有透露自己的过滤器,因为我深深知道,交易没有圣杯,它是不确定性的游戏。当你在心理上把它变为确定性,并且试图通过学习来避免发生错误的时候,你已经犯了一个最大的错误。切记法家集大成者韩非子所言“人主之患,莫与信人;信与人,则制与人。”在此希望各位寻找适合自己性格的过滤器。
第五篇:struts2配置文件中参数的传递
struts2配置文件中参数的传递
在Action中我们经常会从这个Action跳转到另一个Action中,如果只是简单的跳转那么很容易,只需在struts配置文件中添加一个result,如: