spring的AOP拦截器应用于Struts动作

爱莲说 2010-12-16

通过将Struts动作委托给Spring框架而整合Struts和Spring的一个主要的优点是:您可以将Spring的AOP拦截器应用于您的Struts动作。通过将Spring拦截器应用于Struts动作,您可以用最小的代价处理横切关注点。

现在向大家介绍一下如果创建自己的拦截器并把它应用于Struts的动作。为了使用拦截器,需要做下面的工作。

1,创建一个日志拦截器

Java代码

/**

*一个简单的日志记录拦截器

*/

packagecn.dip.struts.filter;

importjava.lang.reflect.Method;

importorg.springframework.aop.MethodBeforeAdvice;

publicclassLoggingInterceptorimplementsMethodBeforeAdvice{

publicvoidbefore(Methodmethod,Object[]args,Objecttarget)

throwsThrowable{

System.out.println("Loggingbefore!");

System.out.println("method.getName():"+method.getName());

System.out.println("method.toString():"+method.toString());

System.out.println("args.length:"+args.length);

System.out.println("args[0].getClass().getName():"+args[0].getClass().getName());

System.out.println("target.getClass().getName():"+target.getClass().getName());

}

}

/**

*一个简单的日志记录拦截器

*/

packagecn.dip.struts.filter;

importjava.lang.reflect.Method;

importorg.springframework.aop.MethodBeforeAdvice;

publicclassLoggingInterceptorimplementsMethodBeforeAdvice{

publicvoidbefore(Methodmethod,Object[]args,Objecttarget)

throwsThrowable{

System.out.println("Loggingbefore!");

System.out.println("method.getName():"+method.getName());

System.out.println("method.toString():"+method.toString());

System.out.println("args.length:"+args.length);

System.out.println("args[0].getClass().getName():"+args[0].getClass().getName());

System.out.println("target.getClass().getName():"+target.getClass().getName());

}

}

2,注册日志拦截器

在Spring的配置文件中添加下面的代码

Java代码

<!--注册Struts的动作-->

<beanname="/register"class="cn.dip.struts.action.UserAction"scope="prototype">

<propertyname="userManager"ref="userManager"/>

</bean>

<beanname="/admin"class="cn.dip.struts.action.AdminAction"scope="prototype">

<propertyname="userManager"ref="userManager"/>

</bean>

<!--注册了这个拦截器(1)-->

<beanname="logger"

class="cn.dip.struts.filter.LoggingInterceptor"/>

<!--创建了一个bean名称自动代理,它描述如何应用拦截器。还有其他的方法定义拦截点,但是这种方法常见而简便。-->

<beanname="loggingAutoProxy"

class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">

<propertyname="beanNames">

<!--将Struts动作注册为将被拦截的bean。如果您想要拦截其他的Struts动作,则只需要在"beanNames"下面创建附加的<value>标记。-->

<list>

<value>/register</value>

<value>/admin</value>

</list>

</property>

<propertyname="interceptorNames">

<!--当拦截发生时,执行了在(1)处创建的拦截器bean的名称。这里列出的所有拦截器都应用于"beanNames"。-->

<list>

<value>logger</value>

</list>

</property>

</bean>

<!--注册Struts的动作-->

<beanname="/register"class="cn.dip.struts.action.UserAction"scope="prototype">

<propertyname="userManager"ref="userManager"/>

</bean>

<beanname="/admin"class="cn.dip.struts.action.AdminAction"scope="prototype">

<propertyname="userManager"ref="userManager"/>

</bean>

<!--注册了这个拦截器(1)-->

<beanname="logger"

class="cn.dip.struts.filter.LoggingInterceptor"/>

<!--创建了一个bean名称自动代理,它描述如何应用拦截器。还有其他的方法定义拦截点,但是这种方法常见而简便。-->

<beanname="loggingAutoProxy"

class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">

<propertyname="beanNames">

<!--将Struts动作注册为将被拦截的bean。如果您想要拦截其他的Struts动作,则只需要在"beanNames"下面创建附加的<value>标记。-->

<list>

<value>/register</value>

<value>/admin</value>

</list>

</property>

<propertyname="interceptorNames">

<!--当拦截发生时,执行了在(1)处创建的拦截器bean的名称。这里列出的所有拦截器都应用于"beanNames"。-->

<list>

<value>logger</value>

</list>

</property>

</bean>到这里,日志记录拦截器的准备工作都已经做好了,接下来看执行了Struts动作后会得到什么样的结果。

在这个例子中,将Struts动作管理委托给Spring,通过在struts-config动作映射中注册一个代理来实现。代理负责在Spring环境中查找Struts动作。由于动作在Spring的控制之下,所以它可以填充动作的JavaBean属性,并为应用诸如Spring的AOP拦截器之类的特性带来了可能。

struts-config.xml

Java代码

<?xmlversion="1.0"encoding="UTF-8"?>

<!DOCTYPEstruts-configPUBLIC"-//ApacheSoftwareFoundation//DTDStrutsConfiguration1.3//EN""http://struts.apache.org/dtds/struts-config_1_3.dtd">

<struts-config>

<form-beans>

<form-beanname="userForm"type="cn.dip.struts.form.UserForm"/>

</form-beans>

<global-exceptions/>

<global-forwards/>

<action-mappings>

<action

attribute="userForm"

input="register.jsp"

name="userForm"

path="/register"

scope="request"

parameter="method"

type="org.springframework.web.struts.DelegatingActionProxy">

<forwardname="error"path="/register.jsp"/>

<forwardname="success"path="/success.jsp"/>

</action>

</action-mappings>

<message-resourcesparameter="cn.dip.struts.ApplicationResources"/>

</struts-config>

<?xmlversion="1.0"encoding="UTF-8"?>

<!DOCTYPEstruts-configPUBLIC"-//ApacheSoftwareFoundation//DTDStrutsConfiguration1.3//EN""http://struts.apache.org/dtds/struts-config_1_3.dtd">

<struts-config>

<form-beans>

<form-beanname="userForm"type="cn.dip.struts.form.UserForm"/>

</form-beans>

<global-exceptions/>

<global-forwards/>

<action-mappings>

<action

attribute="userForm"

input="register.jsp"

name="userForm"

path="/register"

scope="request"

parameter="method"

type="org.springframework.web.struts.DelegatingActionProxy">

<forwardname="error"path="/register.jsp"/>

<forwardname="success"path="/success.jsp"/>

</action>

</action-mappings>

<message-resourcesparameter="cn.dip.struts.ApplicationResources"/>

</struts-config>

UserAction的代码如下

Java代码

packagecn.dip.struts.action;

importjavax.servlet.http.HttpServletRequest;

importjavax.servlet.http.HttpServletResponse;

importorg.apache.struts.action.ActionForm;

importorg.apache.struts.action.ActionForward;

importorg.apache.struts.action.ActionMapping;

importorg.apache.struts.actions.DispatchAction;

importcn.dip.model.User;

importcn.dip.service.impl.UserManager;

importcn.dip.struts.form.UserForm;

importcn.dip.utils.DateUtil;

publicclassUserActionextendsDispatchAction{

/**

*Methodexecute

*@parammapping

*@paramform

*@paramrequest

*@paramresponse

*@returnActionForward

*/

privateUserManageruserManager;

publicActionForwardregister(ActionMappingmapping,ActionFormform,

HttpServletRequestrequest,HttpServletResponseresponse){

System.out.println("................");

UserFormuserForm=(UserForm)form;

Useruser=newUser();

try{

org.apache.commons.beanutils.BeanUtils.copyProperties(user,userForm);

}catch(Exceptione){

e.printStackTrace();

}

userManager.save(user);

returnmapping.findForward("success");

}

/**

*@paramuserManagertheuserManagertoset

*/

publicvoidsetUserManager(UserManageruserManager){

this.userManager=userManager;

}

}

packagecn.dip.struts.action;

importjavax.servlet.http.HttpServletRequest;

importjavax.servlet.http.HttpServletResponse;

importorg.apache.struts.action.ActionForm;

importorg.apache.struts.action.ActionForward;

importorg.apache.struts.action.ActionMapping;

importorg.apache.struts.actions.DispatchAction;

importcn.dip.model.User;

importcn.dip.service.impl.UserManager;

importcn.dip.struts.form.UserForm;

importcn.dip.utils.DateUtil;

publicclassUserActionextendsDispatchAction{

/**

*Methodexecute

*@parammapping

*@paramform

*@paramrequest

*@paramresponse

*@returnActionForward

*/

privateUserManageruserManager;

publicActionForwardregister(ActionMappingmapping,ActionFormform,

HttpServletRequestrequest,HttpServletResponseresponse){

System.out.println("................");

UserFormuserForm=(UserForm)form;

Useruser=newUser();

try{

org.apache.commons.beanutils.BeanUtils.copyProperties(user,userForm);

}catch(Exceptione){

e.printStackTrace();

}

userManager.save(user);

returnmapping.findForward("success");

}

/**

*@paramuserManagertheuserManagertoset

*/

publicvoidsetUserManager(UserManageruserManager){

this.userManager=userManager;

}

}

当页面的请求的URL为http://localhost:8080/onlinexam/register.do?method=register时,将会执行UserAction中的register的方法。在register方法执行之前,定义的拦截器拦截到Struts的动作,执行before方法。

具体的输出结果如下

Java代码

Loggingbefore!

method.getName():execute

method.toString():publicorg.apache.struts.action.ActionForwardorg.apache.struts.actions.DispatchAction.execute(org.apache.struts.action.ActionMapping,org.apache.struts.action.ActionForm,javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)throwsjava.lang.Exception

args.length:4

args[0].getClass().getName():org.apache.struts.action.ActionMapping

target.getClass().getName():cn.dip.struts.action.UserAction

................

相关推荐