﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-江城子-随笔分类-Struts2&amp;Webwork</title><link>http://www.blogjava.net/gkm422/category/27468.html</link><description>十年生死两茫茫，不思量，自难忘。千里孤坟，无处话凄凉。</description><language>zh-cn</language><lastBuildDate>Sun, 25 Nov 2007 03:41:12 GMT</lastBuildDate><pubDate>Sun, 25 Nov 2007 03:41:12 GMT</pubDate><ttl>60</ttl><item><title>webwork学习（一）</title><link>http://www.blogjava.net/gkm422/archive/2006/11/28/84160.html</link><dc:creator>哀伤血舞</dc:creator><author>哀伤血舞</author><pubDate>Tue, 28 Nov 2006 14:49:00 GMT</pubDate><guid>http://www.blogjava.net/gkm422/archive/2006/11/28/84160.html</guid><wfw:comment>http://www.blogjava.net/gkm422/comments/84160.html</wfw:comment><comments>http://www.blogjava.net/gkm422/archive/2006/11/28/84160.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gkm422/comments/commentRss/84160.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gkm422/services/trackbacks/84160.html</trackback:ping><description><![CDATA[
		<p>      WebWork发展到现在已经到了2.X版本，因为接触的晚，所以一开始就用上了WebWork2的版本，据说WebWork2.x+XWork1.x 的架构分离了与Servlet API的紧偶合，使系统结构更加清晰，因为工作的关系，我开始用上了WebWork2，现在就用的过程做一个总结，再把WebWork2过上一遍，以便我更深入的学习WebWork2。(本文参考了夏昕的&lt;&lt;Webwork2_Guide&gt;&gt;，以及CSDN上阿明的专栏，并非原创，只是自己写出来参考学习！)<br />      <br />在新的架构中WebWork2.x的作用是负责将用户的HTTP请求分离出来,使的请求完全的脱离Servlet API,然后将这些请求用Map的方式传入XWork1.x,且XWork1.x通过Interceptor 将Map中的数据传到我们的VO中,然后由对应的自定义Action来调用.</p>
		<p>       首先打开DispatcherUtils.java,它在com.opensymphony.webwork.dispatcher包下面。</p>
		<p>       找到serviceAction这个方法，它实例化了Map请求，从请求的服务中解析出对应的Action名称。<br />       HashMap <font style="BACKGROUND-COLOR: #ffffff" color="#ff1493">extraContext</font> = createContextMap(requestMap, params, session, application, request, response, context);<br />       OgnlValueStack stack = (OgnlValueStack) request.getAttribute(ServletActionContext.WEBWORK_VALUESTACK_KEY);<br />        if (stack != null) {<br />            <font color="#ff1493">extraContext</font>.put(ActionContext.VALUE_STACK, new OgnlValueStack(stack));<br />        }<br />       try {<br />            String <font color="#800080">namespace</font> = mapping.getNamespace();<br />            String <font color="#800080">name</font> = mapping.getName();<br />            String <font color="#800080">method</font> = mapping.getMethod();</p>
		<p>            String id = request.getParameter("continue");<br />            if (id != null) {<br />                <font color="#ff1493">extraContext</font>.put("__continue", id);<br />            }<br />       // if the ActionMapping says to go straight to a result, do it!<br />            if (mapping.getResult() != null) {<br />                Result result = mapping.getResult();<br />                result.execute(proxy.getInvocation());<br />            } else {<br />                proxy.execute();<br />            }</p>
		<p>            // If there was a previous value stack then set it back onto the request<br />            if (stack != null) {<br />                request.setAttribute(ServletActionContext.WEBWORK_VALUESTACK_KEY, stack);<br />            }<br />        } catch 。。。。。。。<br />       找到createContextMap这个方法，它遍历了HttpServletRequest,HttpSession,ServletContext中的数据，将他们复制到Map中从而内部结构与Servlet API相分离。<br />         public HashMap createContextMap(Map requestMap,<br />                                    Map parameterMap,<br />                                    Map sessionMap,<br />                                    Map applicationMap,<br />                                    HttpServletRequest request,<br />                                    HttpServletResponse response,<br />                                    ServletContext servletContext) {<br />        HashMap extraContext = new HashMap();<br />//存放HTTP中上传文件的request  session请求<br />        extraContext.put(ActionContext.PARAMETERS, new HashMap(parameterMap));<br />        extraContext.put(ActionContext.SESSION, sessionMap);<br />        extraContext.put(ActionContext.APPLICATION, applicationMap);<br />        extraContext.put(ActionContext.LOCALE, (locale == null) ? request.getLocale() : locale);<br />        extraContext.put(ActionContext.DEV_MODE, Boolean.valueOf(devMode));</p>
		<p>        extraContext.put(WebWorkStatics.HTTP_REQUEST, request);<br />        extraContext.put(WebWorkStatics.HTTP_RESPONSE, response);<br />        extraContext.put(WebWorkStatics.SERVLET_CONTEXT, servletContext);<br />        extraContext.put(ComponentInterceptor.COMPONENT_MANAGER, request.getAttribute(ComponentManager.COMPONENT_MANAGER_KEY));</p>
		<p>        // 这里用于存放HTTP中的request  session请求<br />        extraContext.put("request", requestMap);<br />        extraContext.put("session", sessionMap);<br />        extraContext.put("application", applicationMap);<br />        extraContext.put("parameters", parameterMap);</p>
		<p>        AttributeMap attrMap = new AttributeMap(extraContext);<br />        extraContext.put("attr", attrMap);</p>
		<p>        return extraContext;<br />    }<br />       创建Action，由ActionProxy来完成。<br />            ActionProxy proxy = ActionProxyFactory.getFactory().createActionProxy(<font color="#800080">namespace</font>, <font color="#800080">name</font>, <font color="#ff1493">extraContext</font>);<br />            proxy.setMethod(method);<br />            request.setAttribute(ServletActionContext.WEBWORK_VALUESTACK_KEY, proxy.getInvocation().getStack());</p>
<img src ="http://www.blogjava.net/gkm422/aggbug/84160.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gkm422/" target="_blank">哀伤血舞</a> 2006-11-28 22:49 <a href="http://www.blogjava.net/gkm422/archive/2006/11/28/84160.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>