Work hard

[原创]Struts2 拦截器浅析

上一篇 / 下一篇  2008-05-12 00:01:57 / 个人分类:Web Framework

查看( 13 ) / 评论( 0 )

EFz8\vtr W0Struts2的拦截器采用的是AOP的思想,但是有人说拦截器能完成的工作servletfilter也能完成。其实,struts2的拦截器更能显示出软件复用的思想。海岸线网络聚合~ WEr E:Vxd{4yJ
struts2的配置文件struts.xml中,每个package都有一个默认的拦截器,在默认的情况下会引用此拦截器。如果我们需要采用自己定义的拦截器时必须先引用默认的拦截器,因为,自己定义的拦截器会覆盖默认的拦截器,如果不引用的话会出现错误,不如下面的代码片断先引用了默认的拦截器:
海岸线网络聚合#o:c| c0^x
           <interceptor-ref name="defaultStack"/>
G5Z px)i l-x$|0           <interceptor-ref name="authority"/>海岸线网络聚合5h3Y%n{4k5|+Wa

;C:k9yK J6X0多个拦截器可以组成一个拦截器链,拦截器链的使用就如同一个拦截器一样,这体现了复用的思想。
w3@!FL#[0如果在某个package中的每个Action都需要调用同一个拦截器,则可以将此拦截器与默认的拦截器组合成一个拦截器链,方便调用,因为使用自己定义的拦截器可以覆盖默认的拦截器。
/z+M |}0}0海岸线网络聚合r(yrMWN
下面举一个简单的例子:
7kq4M5J9i0登陆的LoginAction海岸线网络聚合\dilK
package com.hopeteam.struts.actions;
D"ZCz[g ]+a3\4] p C0海岸线网络聚合U _(J$y:|t ?Y0C
import com.opensymphony.xwork2.Action;
+o$ZhY)ETt'?Vz|0import com.opensymphony.xwork2.ActionContext;海岸线网络聚合 eM-g[ qxBX
海岸线网络聚合e(\;n)u6H7Uy0aER
public class LoginAction implements Action{海岸线网络聚合?2G mN?.?%n-`3Z
    private String username;海岸线网络聚合,W{uq'_ z7l!^%T;?
    private String password;
;eC1al{%x1x0    海岸线网络聚合v }?&pa9o
    public String getUsername() {海岸线网络聚合L xN N1_
       return username;海岸线网络聚合 vO~6R W Us
    }海岸线网络聚合.b|W |2~;\ C\d
    public void setUsername(String username) {海岸线网络聚合{5`x([H:E&F
       this.username = username;
`|\q3t3l0    }
~Xv*y {/u@5I0    public String getPassword() {
y7@1`5@`0       return password;
siW1E#pd`0    }
EB I^W.@J0    public void setPassword(String password) {海岸线网络聚合.Jo|B vI
       this.password = password;海岸线网络聚合DI'x;Y L2r
    }海岸线网络聚合3u'`.HhVw7k
    海岸线网络聚合rT`4?5w{'K"^
    public String execute() throws Exception海岸线网络聚合 F8H7}9ztC
    {
J~M'@JFC0       if (getUsername().equals("fengzhizi")
z `#^;D CE0              && getPassword().equals("123456"))
]*m9W*Ky0       {
3F~bPa1d0           ActionContext.getContext().getSession().put("user", getUsername());
/nB$U!\r1{0Wo"A~C0           return SUCCESS;
7gA1W0B p.w0       }
+t0W5S4BrB#O0       else
Q W3P2N7{"t*EsP0           return ERROR;
cD\h%\5|PFV0    }
ts7\'O*qww~e%N D0}海岸线网络聚合q2c:{T']^
海岸线网络聚合L m^y}NAq,aB
权限拦截器海岸线网络聚合Va*J#kT;P
package com.hopeteam.struts.Interceptor;
s*Q8Y@e8gVl4d0
@'H k:B+X4ZH0import java.util.Map;海岸线网络聚合 BB:w Th J{
海岸线网络聚合-_ ` ILX
import com.opensymphony.xwork2.Action;海岸线网络聚合Yl0? |mKg
import com.opensymphony.xwork2.ActionContext;海岸线网络聚合5QG"S2]M4t
import com.opensymphony.xwork2.ActionInvocation;
@]Q-@]%nb0import com.opensymphony.xwork2.interceptor.AbstractInterceptor;海岸线网络聚合a^Pm'_u*O

;]5N.dk1q:M3Z0public class AuthorityInterceptor extends AbstractInterceptor{
&aWr.G"[+U4vR9\ g0    public String intercept(ActionInvocation invocation)throws Exception
t,E#k;yx5N D%?0    {海岸线网络聚合yMBy4k%E
       ActionContext ctx = invocation.getInvocationContext();
GLbSP!}H D0       Map session = ctx.getSession();海岸线网络聚合ZDZ QK8O5~*s
      
e6Q_FE#oL^0       String user =(String)session.get("user");
z[3L iv'O0       if(user!=null && user.equals("fengzhizi"))海岸线网络聚合NJu+pa[xg
       {
DN3|;w {9n@0           return invocation.invoke();
.P4T0L.f/s'FS l0       }
An-[*Fa0       ctx.put("tip", "您还没登陆,请输入正确的用户名和密码!");海岸线网络聚合+mO@ L@-]6C c
      
:h#LdB.v | \b0       return Action.LOGIN;海岸线网络聚合 Xx-ZSxu
    }
iJb7Gto$Jb0}海岸线网络聚合5oM3~HD:nM7g?

u6yv3t1`C/i1`\0? ?^0
3?2r8_ jKR A0n0在struts.xml中的配置:
6g'o/?/gq)Un2D0<?xml version="1.0" encoding="UTF-8"?>
Q2D`;rE$|4^J0<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 海岸线网络聚合@)hF^ b:nG
"http://struts.apache.org/dtds/struts-2.0.dtd">
2MJ4V9p_6u0海岸线网络聚合;Z4YK:n%uv
<struts>
U a V+` mN%X z|0    <package name="fengzhizi" extends="struts-default">
9a*[6T|T])`*J6e0Q0       <interceptors>海岸线网络聚合,s Lt.wBF:b
           <interceptor name="authority" class="com.hopeteam.struts.Interceptor.AuthorityInterceptor"/>
`4v iM(DG8V0       </interceptors>
*G o}-X/li3Q0      
X#CRxe#@0       <global-results>海岸线网络聚合&z w5t1U-Tab
            <result name="login">/login.jsp</result>海岸线网络聚合4lsd&k{0k w6J]&h
       </global-results>海岸线网络聚合%FGy^1NhI&]9G|
       海岸线网络聚合 RG2~ Yx*l
       <action name="Login"
M_$yn^t"XA0           class="com.hopeteam.struts.actions.LoginAction">海岸线网络聚合~6|0flp Y3s)o;l
           <result name="error">/error.jsp</result>海岸线网络聚合5^`3uc*Hn1f
           <result name="success">/welcome.jsp</result>
i%A*R2C8{n(T)L0
!N(k k o O;vC0       </action>
|^.z4['` N'ah$^0       <action name="interceptorAction">海岸线网络聚合2~"hye-|Cafxm q
海岸线网络聚合4xWq n1GR4yN;x+U(u
            <result>/WEB-INF/jsp/test.jsp</result>
)j#IQA3~1}0           <!-- 拦截器一般配置在result元素之后! -->
,q;[K%W5ex ~0           <interceptor-ref name="defaultStack"/>海岸线网络聚合+o&G)uw%V QTL6F
           <interceptor-ref name="authority"/>
2DPnP U;Z(j0a0        </action>海岸线网络聚合3q r7P |J.^|
    </package>海岸线网络聚合*T |e zo,`
</struts>
4a-qEW~,j-u0
9s#P jQtDE0来看一下运行的效果图,这是没登陆之前,想访问“测试Struts2拦截器”

G0i:N!l GFk+{0 海岸线网络聚合7pW3vb EN{1B y

海岸线网络聚合 P,cx |l OR1bI7zj

海岸线网络聚合'u8E kPZOr:_+u0})`

这是登陆以后的界面
I;{D&T:A.q:S MK&ke0海岸线网络聚合v}\q*E`7A&]

海岸线网络聚合&Q+p"a.jf

这是访问“测试Struts2拦截器”的界面海岸线网络聚合0Q W!W"~i@

S V$a fzKlxNN0

TAG: 原创 拦截器 浅析

我来说两句

(可选)

日历

« 2008-11-21  
      1
2345678
9101112131415
16171819202122
23242526272829
30      

数据统计

  • 访问量: 931
  • 日志数: 23
  • 建立时间: 2007-05-21
  • 更新时间: 2008-05-18

RSS订阅

Open Toolbar