struts理解

    找工作的时候老是会被问java框架熟悉吗,用哪个框架等等。表示我没用到过,趁现在闲着来粗粗学习下。
    struts源码重要的两个部分是core和xwork-core,前者依赖后者。使用struts有两个配置文件很重要,struts.xml和web-inf/web.xml。struts.xml配置struts的package/action等。org.apache.struts2.config.StrutsXmlConfigurationProvider读struts.xml,解析,加载各个package、constant等。web.xml中配置filter过滤器(FilterDispatcher被废弃,可用org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter)、filter-mapping(url-pattern:/*,当客户请求的URL和该指定的URL相匹配时,就会触发过滤器)。

    StrutsPrepareAndExecuteFilter是一个Servlet过滤器类。该类实现了接口StrutsStatics和Filter。前者定义了Struts的一些常量类路径,对常用的接口进行了重新封装,比如HttpServletRequest、HttpServletResponse、HttpServletContext等。后者是javax.servlet包的功能,它操纵客户端的请求或响应,在请求到达要访问的资源前或响应发送到客户端前截获之。
    StrutsPrepareAndExecuteFilter类中实现Filter接口中的init、doFilter(chain.doFilter方法将该请求向后续过滤器传递,或者进行跳转等)、destroy方法。

    init参数为FilterConfig,FilterConfig是servlet的类,通过getInitParameter方法读取web.xml配置文件中过滤器初始化参数。init方法中定义prepare和execute对象,分别表示过滤器请求准备和执行的过程,也创建Dispatcher对象。Dispatcher是一个重要的类,进行一系列初始化工作,如保存FilterConfig读取的配置初始化参数,调用StrutsXmlConfigurationProvider读struts.xml等,以及执行一些重要的代码,如serviceAction等。

    doFilter是过滤的具体过程。
    首先是prepare的工作,创建ActionContext(action执行环境,存储session、parameter、ServletContext等信息,ValueStack);调用Dispatcher.wrapRequest将请求和响应重新包装,例如针对请求类型是否为multipart/form-data,生成不同的request子类对象;之后根据requestUrl生成ActionMapping[name,namespace,method,extension,parameter]。
    这之后就是execute的工作了。若当前强求不是一个action(如其他非.action为后缀),以静态资源方式处理,或交给chain.doFilter往下传递;若是个action请求,根据action配置生成执行相应的action。
    首先是由ActionProxyFactory根据actionMapping的属性生成ActionProxy,ActionProxy只是个代理,真正完成创建、执行action工作的是ActionInvocation,在ActionProxyFactory生成ActionProxy的同时,生成ActionInvocation,该对象初始化时createAction->buildAction->buildBean->创建action的类实例。
    随后便是执行相应的action,如DefaultActionInvocation.invoke()方法。Action被一个或者多个拦截器所包围,所有的用户请求都会被拦截器所拦截,所有拦截器处理完后交给Action处理,处理结果以逻辑视图方式返回给用户。用户可以自己配置拦截器,即在struts.xml中定义如package/interceptors/interceptor,同时在package/action/interceptor-ref中引用。invoke方法实现了截拦器的递归调用,即调用Interceptor.intercept,intercept方法又调用invoke(),就会往下找到下一个拦截器。直到拦截器全部调用完毕,执行invokeAction,根据class、method,利用反射机制执行方法

猜你喜欢

转载自goofyan.iteye.com/blog/2000359