Struts2框架中有很多值得学习的地方,本文讲述Aware接口的使用。
在Struts2和Spring框架中,为了在运行时获得某个对象,可以采用实现某个Aware接口的方式来获得。
例如,使用ServletRequestAware、ServletResponseAware等Aware接口与外部环境交互。
publicclassServletConfigInterceptorextendsAbstractInterceptorimplementsStrutsStatics{
publicStringintercept(ActionInvocationinvocatiothrowsException{finalObjectaction=invocatiogetAction();finalActionContextcontext=invocatiogetInvocationContext();
/***8个可能实现的接口,8个if,而不是ifelse,因为可能需要同时接收8个参数*/if(actioninstanceofServletRequestAwar{HttpServletRequestrequest=(HttpServletRequest)context.get(HTTP_REQUEST);((ServletRequestAwaractio.setServletRequest(request);}
if(actioninstanceofServletResponseAwar{HttpServletResponseresponse=(HttpServletResponscontext.get(HTTP_RESPONS;((ServletResponseAwaractio.setServletResponse(respons;}
//省略了很多代码returninvocatioinvoke();}}
逐次扫描Action是否实现了某个Aware接口,然后将Action强制转化成这个Aware接口并调用其方法完成交互对象的设置。实际上,ServletConfigInterceptor这个拦截器为我们打造了一个对Action进行扩展的范例。
这个范例的打造分为三个过程:
定义一个接口;
让Action实现接口;
在拦截器中将Action强制转化为接口,完成接口方法的调用逻辑。
这三个过程的代码逻辑调用蕴含了两种不同的Action扩展结果:其通过Action实现的接口,向Action传递外部信息;
其通过Action实现的接口,完成功能扩展。这里所采用的交互方式,其主要依据实际上是面向对象概念中类与接口之间的关系。-----------------------------------------------------------------------------------------------------------------------------------------------------------------如果,我们将Action和拦截器换成自己代码中的定义或实现,就可以获得这种设计方法所带来的好处。下面是模仿ServletConfigInterceptor改编而来的例子。
StringgetName();}
//MyAction实现了ApplicationAware和SessionAware两个接口publicclassMyActionimplementsApplicationAware,SessionAware{
publicStringgetName(){returnapp+''+session+getClass();}
importorleiwestrutsawarimpDefaultApplication;importorleiwestrutsawarimpDefaultSession;
//也可以在运行时注入Applicationapp=newDefaultApplication();//也可以在运行时注入Sessionsession=newDefaultSession();
publicvoidintercept(MyActionProxyactionProxy){Objectaction=actionProxy.getAction();//如果传入的action实现了ApplicationAware接口,就向action中传入Application实例。if(actioninstanceofApplicationAwar{((ApplicationAwaractio.setApplication(app);}
//如果传入的action实现了SessionAware接口,就向action中传入Session实例。if(actioninstanceofSessionAwar{((SessionAwaractio.setSession(sessio;}
@OverridepublicvoidsetAttribute(Stringname,Objectvalu{context.put(name,valu;}
//测试publicstaticvoidmain(String[]args){//构造action和actionProxyMyActionaction=newMyAction();MyActionProxyactionProxy=newMyActionProxy();actionProxy.setAction(actio;
//构造拦截器,调用拦截器的intercept方法MyInterceptorinterceptor=newMyInterceptor();interceptor.intercept(actionProxy);Systeout.println('MyAction的name:'+actiogetName());}
一共4个接口,6个类。
文章为作者独立观点,不代表股票配资公司观点
量化数据免费接口2023-05-07
那些自己股票赔钱的人,认为原因是自己没专职,原因是资金量太少。要么就是借口要么是真糊涂。资金量大小、是不是全职,和你收益率关系不大,甚至对于有的人,越是天天盯盘越亏的多!买卖量化策略2023-01-24
我买了四支基金,去年,最少亏百分之二其中还有两个赫赫有名的景林私募基金;最可悲的是,我自己操盘的股票账户,2022年,还赚了百分之2023年,我又赚了百分之六了,投资无需多元化,相信自己才能更加强大……