struts2流程以及源码解析

上传人:桔**** 文档编号:475078972 上传时间:2023-05-26 格式:DOCX 页数:14 大小:451.56KB
返回 下载 相关 举报
struts2流程以及源码解析_第1页
第1页 / 共14页
struts2流程以及源码解析_第2页
第2页 / 共14页
struts2流程以及源码解析_第3页
第3页 / 共14页
struts2流程以及源码解析_第4页
第4页 / 共14页
struts2流程以及源码解析_第5页
第5页 / 共14页
点击查看更多>>
资源描述

《struts2流程以及源码解析》由会员分享,可在线阅读,更多相关《struts2流程以及源码解析(14页珍藏版)》请在金锄头文库上搜索。

1、1.1Struts2 请求处理1. 一个请求在 Struts2 框架中的处理步骤:a) 客户端初始化一个指向 Servlet 容器的请求;b) 根据 Web.xml 配置,请求首先经过 ActionContextCleanUp 过滤器,其为可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助(SiteMeshPlugin ),主要清理当前线程的 ActionContext 和 Dispatcher;c) 请求经过插件过滤器,如:SiteMesh、etc等过滤器;d) 请求经过核心过滤器FilterDispatcher,执行doFilter方法,在该方法中, 询问ActionMapp

2、er来决定这个请求是否需要调用某个Action ;e) 如果ActionMapper决定需要调用某个Action,则ActionMapper会返回个 ActionMapping实例(存储Action的配置信息),并创建ActionProxy( Action 代理)对象,将请求交给代理对象继续处理;f) ActionProxy 对象根据 ActionMapping 和 ConfigurationManager 询问框 架的配置文件,找到需要调用的 Action 类;g) ActionProxy对象创建时,会同时创建一个ActionInvocation的实例;h) ActionInvocation

3、 实例使用命名模式来调用,在调用 Action 的过程前后, 涉及到相关拦截器(Intercepter )的调用;i)旦Action执行完毕,Actioninvocation实例负责根据struts.xml中的配 置创建并返回Result。Result通常是一个需要被表示的JSP或者FreeMarker 的模版,也可能是另外的一个Action链;j)如果要在返回Result之前做些什么,可以实现PreResultListener接口, PreResultListener可以在Interceptor中实现,也可以在Action中实现;k)根据Result对象信息,生成用户响应信息response

4、,在生成响应过程中可 以使用Struts2框架中继承的标签 在此过程中仍会再次涉及到ActionMapper ;2.Struts2 请求处理示意图:Co nif lg uratlon MnnEigorH it pSar w 1 1 口萱Aat ionto mlt F i-IEiorisHttpiSiBrvrOTRiftiaipgn 毎酸Aataon ActionInvocsHEoo J書C Rsu ItTmplnw1.2Struts2 请求处理源码分析 当用户向Struts2发送请求时,FilterDispatcher的doFilter()方法自动调用, doFilter()方法处理请求过程,

5、如下:1. 创建值栈对象 stack;2. 创建Action上下文对象;3. 对请求进行重新封装,此次封装根据请求内容的类型不同,返回不同的对象:如果为 multipart/form-data 类型,则返回 MultiPartRequestWrapper 类型 的对象,该对象服务于文件上传,否则返回 StrutsRequestWrapper 类型的对 象,MultiPartRequestWrapper 是 StrutsRequestWrapper 的子类/而这两个 类都是HttpServletRequest接口的实现。4. 通过 actionMapper.getMapping()获得 Acti

6、onMapping 对象,Action 的 配置信息存储在ActionMapping对象中(Action的配置信息Action的name、 namespace和要调用的方法method)。相关代码如下图所示:public ActionMapping gtMapprng(HttpervletReqliest request, ConfigurationManager config ManagersActionMapping nriappEng = new Acti&niVlJppingQ;fj 1.彳孚穿腾爭搭迳卸 UKI , & : lesiAtcfoti onWOfSem icclon a

7、-=) ? urL-substri ng(C. indeicOfSemi co Ion) : uri; / 2.図降ST辰名.恣认IT雇窖为Adfdn uri - dropExtension(ujL mapping):if (uri = = nuN) r*turn twH:/工JAurESfcfi中翼常出山icn的n白制m储口.mypareNameAndNamespaee(urir mappirtq, onffgManaorJH 4,将胡学碁魏中釣靈StJE曲*handlespecialParamtersirquest, mapping);/ S. ifl黑Act泊n的c吕ee陆画蝕奇出来固挺

8、底回if (mapping.getNameQ = null)( return riEI;fl 6.匙理书如怕ftA EP n! EG th Cd IS我的胥壊盜催pa nseAct tenpp i n g;return mapping;以上代码,活动图如下:Q WURI j仪収!左酬命件辭itkm君唧5. 如果 getMapping()方法返回 ActionMapping 对象为 null ,J则FilterDispatcher认为用户请求不是Action,此时FilterDispatcher会首先分析: 如果请求以/struts开头,会自动查找在web.xml文件中配置的packages初始

9、 化参数FilterDispatcher会将packages参数值包下的文件当作静态资源处理, 即直接在页面上显示文件内容。如果用户请求的资源不是以/struts开头一可能是.jsp文件也可能是.html文件, 则通过过滤器链继续往下传送,直到到达请求的资源为止。6.如果getMapping()方法返回有效的ActionMapping对象贝U被认为正在请 求某个 Action,将调用 Dispatcher.serviceAction(request,response, servletContext,mapping) 方法。以上六步,相关代码如下图所示:Hnp5eni-;eifieqjestiB

10、quKt = (HnpServIe 佩 qu 创 哋 只師矗丽卅苗阳唯儕w卩同二Http4w etRei|K?n5e)T; Seryl etfontert wrYlettanlort = getSeniIeiContextu:翩问 ti 昭 Key = FMD踊 tcher/oFi 愉:t叽#1脚備熱誡ValJeSlack staci 主血悶 KheugEtCont渝已如 etn$tdns(V咖眄Uckhctoryr 由斑阳悒四 ue噪灵嗣湫隔第例巴測OR捌; return手乱翌diHcs费三-孝器鳶豊号 ifl-ps-rfi一VJ-屠孟养“畐昙峑一一垦屯蛊1雲If 一-蛊ispa霑昼算ufw

11、n 国亠-=if籃RKM応官宴邕生smjal- 主賠營直睾加nlliM-rr白ssgi矍-3毎吕竄鬲京曇醫潯舒 - JSS算 sjR 當岳一.養-asg.H匡三agu 奁 p.至=茴-?倉冃&R霆;isu書蛊rSK一為融圣豈68嚳言盲P/S-氨祐諮鹉亠吕 -re=-?r裁垂艺三逵洱-餐擡翼gflgma屋gt d .S3-益議尝lis离换L 一螯囂蚩sns盘召s吕亠E0E吕邑圜昔3-一冑一三乂Hr6驴M&函合(ilV.HFwkeLkm|)诣攻贸SMt趙 InHE幵扁 、汨悅看摆從规町(jMWtgD+ AK雖下咨7. 请求进入dispatcher.serviceAction(request,res

12、ponse,servletContext,mapping)方法 中:a)将相关对象信息封装为 Map(如:HttpServletRequest、Httpparameters、 HttpServletResponse、HttpSession、ServletContext、ActionMapping 等 对象信息)并存入到执行上下文Map中返回执行上下文Map对象extraMap ;b)获取mapping对象中存储的action命名空间、name属性、method属性 等信息;c)加载并解析Struts2配置文件,如果没有人为配置,默认按顺序加载 struts-default.xml、struts-plugin.xml、struts.xml,将 action 酉己置、result 配置interceptor配置 解析并存入至config对象中返回文件配置对象config ;d) 根据执行上下文Map、action命名空间、name属性、method属性等创建用户 Action 的代理对象;e) 执行Action代理对象proxy.execute()方法,并转向结果;以上步骤相关代码,如图所示:public void sewiEeArtion-;HttpSefulelRequesi requki, HttpServlelRespcrKf response. 5erjTe(Con

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 建筑资料

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号