您好,欢迎访问三七文档
当前位置:首页 > 办公文档 > 工作范文 > struts2-工作流程
Struts2工作流程:1.Servlet容器接收HTTP请求后交给Struts2的StrutsPrepareAndExecuteFilter过滤器处理,2.过滤器查询ActionMapper是否请求有可调用的Aciton,如有则由Dispatcher实例获取ActionProxyFactory,创建ActionProxy及ActionInvocation,并把请求交给ActionProxy处理;3.ActionProxy调用ActionInvocation实例;(ActionInvocation是Xwork中Action、Interceptor调度的核心。它保存了整个拦截器栈、ActionContext、Result等信息,由invoke()发起对拦截器及action的调用)4.ActionInvocation会根据配置加载Action相关的一系列Interceptor,并按照顺序一个个通过代理模式执行Interceptor,最后调用Action;5.Action执行完毕,Dispatcher负责根据struts.xml中的配置找到对应的返回结果;6.然后又按相反的顺序执行Interceptor,最后回到过滤器,返回响应完成HTTP请求过程。拦截器模拟实现:示例参见org.struts2.ch9.interceptor.simulation示意图:Struts2___拦截器主要内置拦截器AliasInterceptor在不同请求之间将请求参数在不同名字件转换,请求内容不变ActionAutowiringInterceptorStruts2IOC实现自动装配功能invoke()ActionInvocationFirstInterceptorSecondInterceptorAction之前的代码intercept()之后的代码之前的代码intercept()之后的代码execute()ChainingInterceptor和chain类型的result结合使用完成Action之间的转发StrutsConversionErrorInterceptor类型转换处理CookieInterceptor操作cookieClearSessionInterceptor清除SessionCreateSessionInterceptor创建SessionDebuggingInterceptor在页面显示调试数据ExecuteAndWaitInterceptor在后台执行Action,同时将用户带到一个中间的等待页面ExceptionMappingInterceptor异常处理FileUploadInterceptor用于文件上传I18nInterceptor用于国际化LoggingInterceptor日志记录ModelDrivenInterceptor如果一个类实现了ModelDriven,将getModel得到的结果放在ValueStack中ScopedModelDrivenInterceptor如果一个Action实现了ScopedModelDriven,则从相应的Scope中取出model调用Action的setModel方法将其放入Action内部。ParametersInterceptor将请求中的参数设置到Action中ActionMappingParametersInteceptor处理配置文件Action元素中的参数PrepareInterceptor如果Acton实现了Preparable,则该拦截器调用Action类的prepare方法。StaticParametersInterceptor从struts.xml文件中将的内容设置到对应的Action中ScopeInterceptor将Action状态存入session和applicationServletConfigInterceptor提供Map方式访问ServletAPITimerInterceptor输出Action执行的时间TokenInterceptor表单重复提交处理TokenSessionStoreInterceptor表单重复提交处理并把请求的数据存储在Session中AnnotationValidationInterceptor支持验证框架DefaultWorkflowInterceptorvalidate()验证表单,一旦有错误返回,重新定位到INPUT画面MessageStoreInterceptor存储或者访问实现ValidationAware接口的Action类出现的消息,错误,字段错误等JSONValidationInterceptorJSON数据格式校验拦截器栈拦截器栈就是将拦截器按一定的顺序联结成一条链,由一系列的拦截器按顺序组成。Struts2默认拦截器栈为defaultStack自定义拦截器步骤:1..直接或间接实现接口Interceptor或者继承类AbstractInterceptor例1:/**模拟xworkTimerInterceptor,输出Action执行花费时间的拦截器*/publicclassTimeInterceptorimplementsInterceptor{publicTimeInterceptor(){System.out.println(创建TimeInterceptor实例);}/**init()在创建拦截器实例后,intercept()之前执行,*通常用于初始化拦截器只执行一次*/@Overridepublicvoidinit(){System.out.println(init());}/**destory()在拦截器实例被消耗之前调用,用于释放init()中分配的资源*只执行一次*/@Overridepublicvoiddestroy(){System.out.println(destory());}/**intercept()在Action执行之前被调用**ActionInvocation是Xwork中Action、Interceptor调度的核心。*它保存了整个拦截器栈、ActionContext、Result等信息,*由invoke()发起对拦截器及action的调用*/@OverridepublicStringintercept(ActionInvocationinvocation)throwsException{longstartTime=System.currentTimeMillis();Stringresult=invocation.invoke();//继续往下执行System.out.println(result:+result);//Action执行之后被执行的代码longendTime=System.currentTimeMillis();System.out.println(执行+((ActionContext)invocation.getInvocationContext()).getName()+花费时间:+(endTime-startTime)+ms);returnresult;}}例2:publicclassLoggerInterceptorextendsAbstractInterceptor{privateLoggerlogger=Logger.getLogger(this.getClass());@OverridepublicStringintercept(ActionInvocationinvocation)throwsException{logger.info((1)Action和Result还没有开始执行);invocation.addPreResultListener(newPreResultListener(){//PreResultListener接口的beforeResult()在Action执行之后,Result执行之前被调用@OverridepublicvoidbeforeResult(ActionInvocationinvocation,StringresultCode){logger.info((3)beforeResult()方法调用,Action已经执行完毕,Result还未执行);}});StringresultCode=invocation.invoke();logger.info((4)Action和Result已经执行完毕,控制权重新交给LoggerInterceptor);returnresultCode;}}例3:/**MethodFilterInterceptor可以使用拦截器的方法过滤功能**excludeMethods参数指定排除拦截的方法名*includeMethods参数指定需要拦截的方法名*/publicclassAuthorityInterceptorextendsMethodFilterInterceptor{privateStringname;//配置属性属性值可以在配置文件中指定publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}@OverrideprotectedStringdoIntercept(ActionInvocationinvocation)throwsException{ActionContextctx=ActionContext.getContext();MapString,Objectsession=ctx.getSession();Objectuser=session.get(user);Stringresult=null;System.out.println(name+拦截器在aciton前拦截);if(user==null){ActionSupportaction=(ActionSupport)invocation.getAction();//用户名没有登录,调用Action的addActionError()方法添加Action错误action.addActionError(你还没有登录,不能访问资源!请先登录);result=Action.LOGIN;}else{//如果用户已经登录,则继续执行余下的拦截器、Action和Resultresult=invocation.invoke();System.out.println(name+拦截器在aciton后拦截);}returnresult;}}2..通过interceptors元素来定义拦截器或拦截器栈interceptors!--声明自定义拦截器--interceptorname=timeInterceptorclass=org.struts2.ch9.interceptor.TimeInterceptor/interceptorname=loggerInterceptorclass=org.struts2.ch9.interceptor.LoggerInterceptor/!--继承MethodFilterInterceptor的拦截器可以使用拦截方法过滤功能excludeMethods参数指定排除拦截的方法名includeMethods参数指定需要拦截的方法名--interceptorname=authorityInterceptorclass=org.struts2.ch9.interceptor.AuthorityInterceptorparamname=excludeMethodsinput,login/paramparamname=includeMethodsshowResource/paramparamname=name权限拦截器/param/interceptor!--定义我们自己的拦截器栈,在Action的配置中,可以直
本文标题:struts2-工作流程
链接地址:https://www.777doc.com/doc-5946100 .html