第一篇:Struts2中的攔截器與過濾器學習
攔截器是在面向切面編程的就是在你的service或者一個方法,前調(diào)用一個方法,或者在方法后調(diào)用一個方法,比如動態(tài)代理就是攔截器的簡單實現(xiàn),過濾器是在java web中,你傳入的request,response提前過濾掉一些信息,或者提前設置一些參數(shù),然后再傳入servlet或者struts的 action進行業(yè)務邏輯,比如過濾掉非法url(不是login.do的地址請求,如果用戶沒有登陸都過濾掉),或者在傳入servlet或者 struts的action前統(tǒng)一設置字符集,或者去除掉一些非法字符。
攔截器與過濾器的區(qū)別:
1、攔截器是基于java的反射機制的,而過濾器是基于函數(shù)回調(diào)
2、過濾器依賴與servlet容器,而攔截器不依賴與servlet容器
3、攔截器只能對action請求起作用,而過濾器則可以對幾乎所有的請求起作用
4、攔截器可以訪問action上下文、值棧里的對象,而過濾器不能
5、在action的生命周期中,攔截器可以多次被調(diào)用,而過濾器只能在容器初始化時被調(diào)用一次
過濾器
也就是寫一個自己的類,讓這個類實現(xiàn)于Filter這個接口,這個接口里有三個方法。
init(),doFilter(),destroy();主要是對doFilter()進行操作,你可以在這個方法里寫你想進行的操作.寫完這些之后,就是在web.xml里的配置了
在
1、定義攔截器
a.方法一:實現(xiàn)Interceptor接口
public class MyInterceptor implements Interceptor { private String hello;//定義帶參數(shù)的攔截器 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());//將監(jiān)聽器注冊到里面
System.out.println(“myinterceptor3”);String result=arg0.invoke();System.out.println(“after myinterceptor3 ”);return result;} }
2、配置攔截器
一旦實現(xiàn)了上面的攔截器,就可以在所有需要實現(xiàn)控制的Action中復用上面的攔截器。為了使用該攔截器,首先在struts.xml文件中定義該攔截器,定義攔截器的配置片段如下: world
3、應用攔截器
第二篇:Struts2核心攔截器---學習筆記
Struts2的核心——攔截器
在struts2中,攔截器(Interceptor)是其核心的組件,當我們訪問一個action時,我們可以通過攔截器的配置,做一些需要的操作。
我們可以寫我們自己的攔截器,但是要實現(xiàn)或繼承struts2給我們提供的接口或類。
①.我們實現(xiàn)Interceptor接口,該接口是struts2提供的攔截器接口,位于com.opensymphony.xwork2.interceptor包下,其提供了類似與filter的一些方法,我們必須實現(xiàn)它的方法: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包下,它實現(xiàn)了Interceptor接口,并完成了對destroy()方法和init()方法的實現(xiàn),但保留了抽象方法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包下,但該類已經(jīng)完成了對interceptor()方法的簡單實現(xiàn),而提供了一個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的攔截器(即實現(xiàn)了Interceptor接口的那個攔截器),類似的,我們定義了上面我們已寫的3個攔截器。
name=“myInterceptor” class=“com.test.interceptor.MyInterceptor”>
請注意下面代碼,我們定義了
name=“myInterceptor”>
name=“myInterceptor1”>
defaultStack這個攔截器棧是struts2,提供的一個默認攔截器棧,其中實現(xiàn)了一些常用功能,如:struts2的檢驗框架,當我們在聲明package時候會有extends屬性,其值為struts-default,而defaultStack就定義在struts-default包類,進而就被我們的package所繼承。
name=“defaultStack”>
在攔截器的配置中,我們可以為package配置一個默認的攔截器或攔截器棧,如果我們不指定,其值就為父包繼承下來的defaultStack。
name=“myStack”>
標簽,可以對攔截器類中定義的屬性賦值,這里是告訴攔截器,只攔截abc()方法。
abc
第三篇:struts2攔截器--將用戶操作日志存入數(shù)據(jù)庫
struts2攔截器--將用戶操作日志存入數(shù)據(jù)庫
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();//執(zhí)行被攔截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 = ”登錄系統(tǒng)“;
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;
}
/**
* 插入系統(tǒng)日志 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
第四篇:經(jīng)典文章學習——“過濾器理論”
經(jīng)典文章學習——“過濾器理論”
本公眾號將會陸續(xù)推出郝胖老師一系列經(jīng)典專欄(原文),希望大家能從中受益。本期推出交易的理想模型系列?!斑^濾器理論”(2012.10.18)1—————上周筆者提示了中期風險,并沒有明確提出反彈何時終結,本周走勢先抑后揚,關鍵看周五走勢能否放量突破2164,一旦突破2164,短期可看2234點。至于股票可以選擇江泉實業(yè)、星湖科技等這種底部扎實,向上突破有河寬的股票少量參與。
2—————接下來繼續(xù)理想模型系列,本系列一發(fā)不可收拾,既是給大家講解技術分析,也是對自己多年交易經(jīng)驗的總結。今天講的是交易中的“過濾器”,這是關于選擇入場時機的理論?!缎率袌銎娌拧纷钕忍岢觥斑^濾器理論”,他認為任何技術分析方法都是根據(jù)價格來的,所有交易方法對價格的過濾相當于不同顏色的玻璃對價格的過濾。加里.斯密斯則在此基礎上提出“知覺過濾器”是各種情緒指標和技術指標,然而他沒有公布自己所鐘愛的指標。今天我將重點談談我所知道的那些“過濾器”。3—————技術分析者并非一介武夫,成功的技術分析大師多為具有哲學底蘊的藝術家,他們只是恰巧以交易謀生而已。索羅斯自創(chuàng)反身性理論,能夠洞悉人性的偏執(zhí),盡管他自稱為失敗的哲學家;江恩大師博學多才,試圖寫出價格走勢的數(shù)學原理,盡管他后來誤入神秘時空的怪圈?!傲績r時空”是技術分析的基本要素,很多過濾器也均以此展開。最常用的防范假突的過濾器就是時間過濾器和價格過濾器,“突破關鍵點位2到3個百分點”、“2到3天不回到關鍵點一下”則認確突破的有效性。當然今天要說的并非這些簡單的小技巧,而是一些交易大師的過濾器系統(tǒng)。
4—————馬?。嫒A茲被認為是當代的杰西.利佛莫爾,這個天才的操盤手在9年的失敗交易生涯之后明白了交易的本質(zhì)。在認識到自己短線交易的性格之后,他選擇了以7個指標為組合的過濾器系統(tǒng),其中“騰落線”也是史丹溫斯坦常用的指標。當所有這些指標都健康時則入場交易,當其中一個與其它發(fā)生背離,則時刻警惕可能發(fā)生的不利情況,做好出場準備。你可能認為7個指標太多了,但據(jù)我了解還有用40個的。
5—————馬丁的方法是由上而下,他更多是一個帽客,依靠手動計算每30分鐘重新評估一次市場的短線趨勢,他使用的指標大多是道瓊斯工業(yè)平均指數(shù)、紐約證券交易所股價凈變動、標普500等等宏觀指數(shù)。與此不同,亞歷山大·埃爾德的《以交易為生》(Trading for a living)則明確提出簡單易行的“三層過濾網(wǎng)”交易系統(tǒng),三重濾網(wǎng)的第一層是利用趨勢跟蹤指標來判斷長期趨勢。他最初設計的系統(tǒng)是用周線MACD柱來判斷趨勢,這個我不表態(tài),因為我個人就是依靠“123”法則來判斷趨勢,Macd不是可靠的技術。三重濾網(wǎng)的第二層濾網(wǎng)——市場波浪,利用震蕩指標來觀察日線圖。當周線趨勢向上時,利用日線下跌來尋找買點;當周線趨勢向下時,利用日線上漲來尋找放空點。三重濾網(wǎng)的第三層濾網(wǎng)——盤中突破,當周線趨勢上升而日線震蕩指標下降時,運用追蹤型買進技術。當周線趨勢下跌而日線振蕩指標上升時運用追蹤型賣出技術。說直白一點,他的思考來源于對周期與級別的思考,周線級別決定日線級別,日線級別決定30分鐘級別。國內(nèi)的朋友如果讀過纏師的遺著,對此不會陌生,纏師的《市場哲學的數(shù)學原理》濃墨重彩地描寫了如何通過級別來尋找安全買點。筆者在此提醒各位,沒有一定的市場經(jīng)驗不要看,因為對市場的判斷不是光靠技術就可以掌握的。
6—————筆者曾經(jīng)根據(jù)史丹.溫斯坦和威廉.歐尼爾共同鐘愛的相對強度指標設計出“五級買賣點”理論,并根據(jù)它來就行交易。直到我以期貨交易為主才慢慢放棄這些市場跟蹤指標,因為期貨要求更加主動和積極,根據(jù)價格走勢直觀判斷即可。當然在文章的結尾我依然沒有透露自己的過濾器,因為我深深知道,交易沒有圣杯,它是不確定性的游戲。當你在心理上把它變?yōu)榇_定性,并且試圖通過學習來避免發(fā)生錯誤的時候,你已經(jīng)犯了一個最大的錯誤。切記法家集大成者韓非子所言“人主之患,莫與信人;信與人,則制與人?!痹诖讼M魑粚ふ疫m合自己性格的過濾器。
第五篇:struts2配置文件中參數(shù)的傳遞
struts2配置文件中參數(shù)的傳遞
在Action中我們經(jīng)常會從這個Action跳轉(zhuǎn)到另一個Action中,如果只是簡單的跳轉(zhuǎn)那么很容易,只需在struts配置文件中添加一個result,如: