﻿<?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-敬的世界-随笔分类-struts</title><link>http://www.blogjava.net/nikita/category/39788.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 09 Feb 2012 17:32:15 GMT</lastBuildDate><pubDate>Thu, 09 Feb 2012 17:32:15 GMT</pubDate><ttl>60</ttl><item><title>解决ServletUrlRenderer WARN警告</title><link>http://www.blogjava.net/nikita/archive/2012/02/09/369656.html</link><dc:creator>picture talk</dc:creator><author>picture talk</author><pubDate>Thu, 09 Feb 2012 04:42:00 GMT</pubDate><guid>http://www.blogjava.net/nikita/archive/2012/02/09/369656.html</guid><wfw:comment>http://www.blogjava.net/nikita/comments/369656.html</wfw:comment><comments>http://www.blogjava.net/nikita/archive/2012/02/09/369656.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/nikita/comments/commentRss/369656.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nikita/services/trackbacks/369656.html</trackback:ping><description><![CDATA[
<img src ="http://www.blogjava.net/nikita/aggbug/369656.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nikita/" target="_blank">picture talk</a> 2012-02-09 12:42 <a href="http://www.blogjava.net/nikita/archive/2012/02/09/369656.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts 2与AJAX（第一部分） </title><link>http://www.blogjava.net/nikita/archive/2011/08/07/355970.html</link><dc:creator>picture talk</dc:creator><author>picture talk</author><pubDate>Sun, 07 Aug 2011 14:36:00 GMT</pubDate><guid>http://www.blogjava.net/nikita/archive/2011/08/07/355970.html</guid><wfw:comment>http://www.blogjava.net/nikita/comments/355970.html</wfw:comment><comments>http://www.blogjava.net/nikita/archive/2011/08/07/355970.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/nikita/comments/commentRss/355970.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nikita/services/trackbacks/355970.html</trackback:ping><description><![CDATA[link to : <a href="/max/archive/2007/06/12/123682.html">http://www.blogjava.net/max/archive/2007/06/12/123682.html</a><img src ="http://www.blogjava.net/nikita/aggbug/355970.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nikita/" target="_blank">picture talk</a> 2011-08-07 22:36 <a href="http://www.blogjava.net/nikita/archive/2011/08/07/355970.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts 的MVC架构的基本原理</title><link>http://www.blogjava.net/nikita/archive/2008/10/04/232275.html</link><dc:creator>picture talk</dc:creator><author>picture talk</author><pubDate>Fri, 03 Oct 2008 16:07:00 GMT</pubDate><guid>http://www.blogjava.net/nikita/archive/2008/10/04/232275.html</guid><wfw:comment>http://www.blogjava.net/nikita/comments/232275.html</wfw:comment><comments>http://www.blogjava.net/nikita/archive/2008/10/04/232275.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/nikita/comments/commentRss/232275.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nikita/services/trackbacks/232275.html</trackback:ping><description><![CDATA[
		<p>
				<strong>1. 视图 VIEW<br /></strong>
				<br />   HTML + Struts Tag lib负责页面格式， 比如要输出一个报表，报表需要分几列，每列显示什么颜色。<br />   <br />   Form Bean 负责内容。 如报表每一项数据内容。<br /><br /><strong>2. 控制器(Controller)</strong><br /><br />   主要由 ActionServlet + Action Bean 组成。<br /><br />   ActionServlet 是Struts中核心的部分，其功能如下。<br /><br />      ActionServlet负责所有页面信息收集和页面之间的转换。<br />      系统通过web.xml的 &lt;servlet&gt;来配置ActionServlet<br />      系统通过web.xml 的&lt;init-param&gt;将Struts-config.xml 载入内存以备ActionServlet调用<br />      validation.xml以&lt;plug-in&gt;方法载入内存备ActionServlet调用。<br />         <br />   ActionBean 的性能如下：<br />      <br />      ActionServlet通过Struts-config.xm 的配置来调用相应的Action Bean.<br />      Action Bean 从Form Bean 取出相应的值。<br />      Action Bean 把相应的值付给Form Bean<br />      Action Bean 负责调用相应的Model,<br />      Action Bean 负责将页面向前传递到相应的页面。<br /><br /><strong>3. 模型 (Model)</strong><br /><br />      模型Model 主要负责业务逻辑实现，包括Web Service 、Session Bean 和 Entity Bean. 从数据流的角度来看，这一过程主要包括以下两个方面：<br /><br />        (1)将前端的From Bean 的数据传到后端，进行数据库的插入，更新和删除。<br /><br />        (2)根据前端的请求，选择数据库数据，将数据传到前端的Form Bean <br /><br /><br /><br />----------------------------------------------------------------------------------------------------------------------------------------------<br /><br /></p>
		<p>
				<font size="2">java.lang.Object<br />  |<br />  +--javax.servlet.GenericServlet<br />        |<br />        +--javax.servlet.http.HttpServlet<br />              |<br />              +--org.apache.struts.action.ActionServlet<br /><br />Struts提供了一个缺省版本的ActionServlet类，你可以继承这个类，覆盖其中的一些方法来达到你的特殊处理的需要。ActionServlet继承与javax.servlet.http.HttpServlet，所以在本质上它和一个普通的servlet没有区别，你完全可以把它当做一个servlet来看待，只是在其中完成的功能不同罢了。ActionServlet主要完成如下功能：<br /><br />将一个来自客户端的URI映射到一个相应的Action类<br /></font>
		</p>
		<ul>
				<li>
						<font size="2">如果是这个Action类是第一次被调用，那么实例化一个并放入缓存<br /></font>
				</li>
				<li>
						<font size="2">如果在配置文件(struts-config.xml)中指定了相应的ActionForm，那么从Request中抓取数据填充FormBean<br /></font>
				</li>
				<li>
						<font size="2">调用这个Action类的perform()方法，传入ActionMapping的一个引用，对应的ActionForm、以及由容器传给ActionServlet的HttpServletRequest、HttpServletResponse对象。</font>
				</li>
		</ul>
		<p>
				<br />
				<br />
				<font size="2">确省版本的ActionServlet会从配置文件web.xml中读取如下初始化参数：<br /></font>
		</p>
		<ul>
				<li>
						<font size="2">application<br />应用使用的资源包(resources bundle)的基类<br /></font>
				</li>
				<li>
						<font size="2">factory<br />用于创建应用的MessageResources对象的MessageResourcesFactory的类名。确省是org.apache.struts.util.PropertyMessageResourcesFactory。<br /></font>
				</li>
				<li>
						<font size="2">config<br />Struts的配置文件，确省是/WEB-INF/struts-config.xml。注意这儿是与应用Context关联的相对路径。<br /></font>
				</li>
				<li>
						<font size="2">content<br />定义了确省的内容类型和编码格式，它会被自动地被设置到每个response中，如果JSP/Servlet中没有明确的设置。确省是text/html。<br /></font>
				</li>
				<li>
						<font size="2">debug<br />调试信息的级别。默认为0，比当前级别高的调试信息会被log到日志文件中。<br /></font>
				</li>
				<li>
						<font size="2">detail<br />与debug的作用类似，只是这个detail是initMapping()时专用的。调试信息会被打印到System.out，而不是日志文件。<br /></font>
				</li>
				<li>
						<font size="2">formBean<br />ActionFormBean的实现类，确省为org.apache.struts.action.ActionFormBean<br /></font>
				</li>
				<li>
						<font size="2">forward<br />应用中使用的ActionForward类，确省是org.apache.struts.action.ActionForward。<br /></font>
				</li>
				<li>
						<font size="2">locale<br />指定了确省使用的Locale对象。设为true，当得到一个session时，会自动在session中存储一个以Action.LOCALE_KEY标示的Locale对象，如果session中还没有与Action.LOCALE_KEY绑定的Locale对象。<br /></font>
				</li>
				<li>
						<font size="2">mapping<br />应用中使用的ActionMapping类，确省是org.apache.struts.action.ActionMapping。<br /></font>
				</li>
				<li>
						<font size="2">multipartClass<br />文件上传使用的MutipartRequestHandler的实现类。确省为org.apache.struts.upload.DiskMultipartRequestHandler<br /></font>
				</li>
				<li>
						<font size="2">nocache<br />如果设为true，那么ActionServlet会自动在每个到客户端的响应中添加nocache的HTML头，这样客户端就不会对应用中的页面进行缓存。确省为false<br /></font>
				</li>
				<li>
						<font size="2">null<br />如果设置为true，那么应用在得到一个未定义的message资源时，会返回null，而不是返回一个错误信息。确省是true。<br /></font>
				</li>
				<li>
						<font size="2">maxFileSize<br />文件上传的大小上限，确省为250M<br /></font>
				</li>
				<li>
						<font size="2">bufferSize<br />文件上传时的缓冲区的大小，确省为4M<br /></font>
				</li>
				<li>
						<font size="2">tempDir<br />设置用于上传时的临时目录。工作目录会作为一个Servlet环境（Context）的属性提供。<br /></font>
				</li>
				<li>
						<font size="2">validate<br />Are we using the new configuration file format?确省为true。<br /></font>
				</li>
				<li>
						<font size="2">validating</font>
				</li>
		</ul>
		<p>
				<br />
				<font size="2">在解析配置XML文件是是否进行有效性的验证。确省为true<br /><br />ActionServlet中应用了命令设计模式。<br /><br />一个Servlet在由容器生成时，首先会调用init()方法进行初始化，在接到一个HTTP请求时，调用相应的方法进行处理；比如GET请求调用doGet()方法，POST请求调用doPost()方法。所以首先看看ActionServlet的init()方法，你就会很清楚为什么ActionServlet可以完成这些功能了。<br /></font>
		</p>
		<h3>
				<font size="2">init()</font>
		</h3>
		<p>
				<br />
				<font size="2">在它的init()方法中，ActionServlet依次调用如下protected的方法完成初始化：<br /></font>
		</p>
		<ul>
				<li>
						<font size="2">initActions() －     大家可能还曾有这个疑问：Struts为什么可以找到一个请求URI对应的action类呢？答案就在这儿，ActionServlet有一个actions属性，类型为org.apache.struts.util.FastHashMap，用于存储以类的全名为key的已实例化的Action类。在init()时首先调用的就是initActions()方法，在这个方法中只是简单的清除map中的所有的名值对，<br /></font>
						<div class="codeStyle">
								<ol>
										<li>
												<font size="2">
												</font>
										</li>
										<li>
												<font size="2">        <b><font color="#0000ff">synchronized</font></b> (actions) { </font>
										</li>
										<li>
												<font size="2">            actions.setFast(<b><font color="#0000ff">false</font></b>); </font>
										</li>
										<li>
												<font size="2">            actions.clear(); </font>
										</li>
										<li>
												<font size="2">            actions.setFast(<b><font color="#0000ff">true</font></b>); </font>
										</li>
										<li>
												<font size="2">        } </font>
										</li>
								</ol>
						</div>
						<br />
						<font size="2">首先把actions设为slow模式，这时对FastHashMap的访问是线程同步的，然后清除actions中的所有的已存在的名/值对，最后再把actions的模式设为fast。由于FastHashMap是struts在java.util.HashMap的基础上的一个扩展类，是为了适应多线程、并且对HashMap的访问大部分是只读的特殊环境的需要。大家知道java.util.HashMap是非线程安全的，所以HashMap一般适用于单线程环境下。org.apache.struts.FastHashMap就是继承于java.util.HashMap，在其中添加多线程的支持产生的。在fast模式下的工作方式是这样的：读取是非线程同步的；写入时首先克隆当前map，然后在这个克隆上做写入操做，完成后用这个修改后的克隆版本替换原来的map。那么在什么时候会把Actions类添加到这个map中呢？我们已经提到了struts是动态的生成Action类的实例的，在每次ActionServlet接收到一个GET或POST的HTTP请求时，会在这个map中查找对应的Action类的实例，如果不存在，那么就实例化一个，并放入map中。可见这个actions属性起到了对Action类实例的缓存的作用。<br /></font>
				</li>
				<li>
						<font size="2">initInternal() －     初始化ActionServlet内部使用的资源包MessageResources，使用MessageResources.getMessageResources(internalName)得到    internalName为"org.apache.struts.action.ActionResources"对应的ActionResources.properties文件。这个资源包主要用于ActionServlet处理过程中的用到的提示信息，这儿不展开讨论。<br /></font>
				</li>
				<li>
						<font size="2">initDebug() －     从web.xml中读取本应用的debug级别参数getServletConfig().getInitParameter("debug")，然后赋给debug属性。<br /></font>
				</li>
				<li>
						<font size="2">initApplication()－    初始化应用资源包，并放置入ServletContext中。<br /></font>
						<div class="codeStyle">
								<ol>
										<li>
												<font size="2">
												</font>
										</li>
										<li>
												<font size="2">        <b><a href="http://www.javaresearch.org/source/jdk142/java/lang/String.java.html" target="_blank"><font class="classLink" color="#002c99"><u>String</u></font></a></b> factory =getServletConfig().getInitParameter(“factory”);     </font>
										</li>
										<li>
												<font size="2">        <b><a href="http://www.javaresearch.org/source/jdk142/java/lang/String.java.html" target="_blank"><font class="classLink" color="#002c99"><u>String</u></font></a></b> oldFacory = MessageResourcesFactory.getFactoryClass(); </font>
										</li>
										<li>
												<font size="2">        <b><font color="#0000ff">if</font></b> (factory !=<b><font color="#0000ff">null</font></b>) </font>
										</li>
										<li>
												<font size="2">                MessageResourcesFactory.setFactoryClass(factory); </font>
										</li>
										<li>
												<font size="2">        <b><a href="http://www.javaresearch.org/source/jdk142/java/lang/String.java.html" target="_blank"><font class="classLink" color="#002c99"><u>String</u></font></a></b> value = getServletConfig().getInitParameter(<font color="#ff33ff">"application"</font>); </font>
										</li>
										<li>
												<font size="2">        MessageResourcesFactory factoryObject = </font>
										</li>
										<li>
												<font size="2">                MessageResourcesFactory.createFactory(); </font>
										</li>
										<li>
												<font size="2">        application = factoryObject.createResources(value); </font>
										</li>
										<li>
												<font size="2">        MessageResourcesFactory.setFactory(oldFactory);  </font>
										</li>
										<li>
												<font size="2">        getServletContext().setAttribute(<font color="#ff0000">Action</font>.MESSAGES_KEY, application); </font>
										</li>
								</ol>
						</div>
						<br />
						<font size="2">说明：文中引用的代码片断可能会省略了一些例外检查等非主线的内容，敬请注意。<br /><br />首先从配置文件中读取factory参数，如果这个参数不为空，那么就在MessageResourcesFactory中使用这个指定的Factory类；否则，使用默认的工厂类org.apche.struts.util.PropertyMessageResourceFactory。然后调用MessageResourcesFactory的静态createFactory()方法，生成一个具体的MessageResourceFactory对象（注意：MessageResourcesFactory是抽象类）。这样就可以调用这个具体的MessageResourceFactory的createResource()方法得到配置文件(web.xml)中定义的资源文件了。<br />上面的application对象类型为MessageResources。在web.xml中在配置ActionServlet时可以指定一个特定的工厂类。不能直接MessageResourcesFactory的createResources()方法，因为这个方法是abstract的。创建factoryObject的过程如下：<br /></font>
						<div class="codeStyle">
								<ol>
										<li>
												<font size="2">     </font>
										</li>
										<li>
												<font size="2">        MessageResourceFactory factoryObject= </font>
										</li>
										<li>
												<font size="2">                MessageResourcesFactory.createFactory(); </font>
										</li>
										<li>
												<font size="2">        application = factoryObject.createResources(value); </font>
										</li>
								</ol>
						</div>
						<br />
						<font size="2">&lt;li&gt;initMapping() －    为应用初始化mapping信息ActionServlet有一个protected的属性：mapping，封装了一个ActionMapping的对象集合，以便于管理、查找ActionMapping。mappings是org.apache.struts.action.ActionMappings类的实例。主要有两个方法：addMapping(ActionMapping mapping)和findMapping(String path)。ActionMapping也是使用上面提到的org.apache.struts.util.FastHashMap类来存储所有的ActionMapping对象。<br /></font>
						<div class="codeStyle">
								<ol>
										<li>
												<font size="2">
												</font>
										</li>
										<li>
												<font size="2">        mappings.setServlet(<b><font color="#0000ff">this</font></b>); </font>
										</li>
										<li>
												<font size="2">        …… </font>
										</li>
										<li>
												<font size="2">        <i><font color="#339900">// Initialize the name of our ActionFormBean implementation class</font></i></font>
										</li>
										<li>
												<font size="2">        value = getServletConfig().getInitParameter(<font color="#ff33ff">"formBean"</font>); </font>
										</li>
										<li>
												<font size="2">        <b><font color="#0000ff">if</font></b> (value != <b><font color="#0000ff">null</font></b>) </font>
										</li>
										<li>
												<font size="2">            formBeanClass = value; </font>
										</li>
										<li>
												<font size="2">     </font>
										</li>
										<li>
												<font size="2">        <i><font color="#339900">// Initialize the name of our ActionForward implementation class</font></i></font>
										</li>
										<li>
												<font size="2">        value = getServletConfig().getInitParameter(<font color="#ff33ff">"forward"</font>); </font>
										</li>
										<li>
												<font size="2">        <b><font color="#0000ff">if</font></b> (value != <b><font color="#0000ff">null</font></b>) </font>
										</li>
										<li>
												<font size="2">                forwardClass = value; </font>
										</li>
										<li>
												<font size="2">
												</font>
										</li>
										<li>
												<font size="2">        <i><font color="#339900">// Initialize the name of our ActionMapping implementation class</font></i></font>
										</li>
										<li>
												<font size="2">        value = getServletConfig().getInitParameter(<font color="#ff33ff">"mapping"</font>); </font>
										</li>
										<li>
												<font size="2">        <b><font color="#0000ff">if</font></b> (value != <b><font color="#0000ff">null</font></b>) </font>
										</li>
										<li>
												<font size="2">                mappingClass = value; </font>
										</li>
								</ol>
						</div>
						<br />
						<font size="2">在initMapping()中，首先链接mappings对象到本servlet实例。其实这句话的作用很简单，在ActionMappings中会有一个ActionServlet类型的属性，这个属性就界定了这个ActionMappings对象所属的ActionServlet。Struts的实现比较灵活，其中的ActionFormBean、ActionForward、ActionMapping类你完全可以使用自己实现的子类，来定制Struts的工作方式。上面的代码就从配置文件（web.xml）中读取formBean、forward、mapping参数，这些参数就是你定制的ActionFormBean、ActionForward、ActionMapping类名。<br /></font>
						<div class="codeStyle">
								<ol>
										<li>
												<font size="2">
												</font>
										</li>
										<li>
												<font size="2">        <i><font color="#339900">// Initialize the context-relative path to our configuration resources</font></i></font>
										</li>
										<li>
												<font size="2">        value = getServletConfig().getInitParameter(<font color="#ff33ff">"config"</font>); </font>
										</li>
										<li>
												<font size="2">        <b><font color="#0000ff">if</font></b> (value != <b><font color="#0000ff">null</font></b>) </font>
										</li>
										<li>
												<font size="2">                config = value; </font>
										</li>
										<li>
												<font size="2">                <i><font color="#339900">// Acquire an input stream to our configuration resource</font></i></font>
										</li>
										<li>
												<font size="2">        <font color="#ff0000">InputStream</font> input = getServletContext().getResourceAsStream(config); </font>
										</li>
										<li>
												<font size="2">        Digester digester = <b><font color="#0000ff">null</font></b>; </font>
										</li>
										<li>
												<font size="2">                digester = initDigester(detail); </font>
										</li>
										<li>
												<font size="2">        <b><font color="#0000ff">try</font></b> { </font>
										</li>
										<li>
												<font size="2">                formBeans.setFast(<b><font color="#0000ff">false</font></b>); </font>
										</li>
										<li>
												<font size="2">                forwards.setFast(<b><font color="#0000ff">false</font></b>); </font>
										</li>
										<li>
												<font size="2">                mappings.setFast(<b><font color="#0000ff">false</font></b>); </font>
										</li>
										<li>
												<font size="2">                digester.parse(input); </font>
										</li>
										<li>
												<font size="2">                mappings.setFast(<b><font color="#0000ff">true</font></b>); </font>
										</li>
										<li>
												<font size="2">                forwards.setFast(<b><font color="#0000ff">true</font></b>); </font>
										</li>
										<li>
												<font size="2">                formBeans.setFast(<b><font color="#0000ff">true</font></b>); </font>
										</li>
										<li>
												<font size="2">        } <b><font color="#0000ff">catch</font></b> (<font color="#ff0000">SAXException</font> e) { </font>
										</li>
										<li>
												<font size="2">                <b><font color="#0000ff">throw</font></b> <b><font color="#0000ff">new</font></b> ServletException </font>
										</li>
										<li>
												<font size="2">        (internal.getMessage(<font color="#ff33ff">"configParse"</font>, config), e); </font>
										</li>
										<li>
												<font size="2">        } <b><font color="#0000ff">finally</font></b> { </font>
										</li>
										<li>
												<font size="2">                input.close(); </font>
										</li>
										<li>
												<font size="2">        } </font>
										</li>
								</ol>
						</div>
						<br />
						<font size="2">从web.xml读取Struts的配置文件的位置。使用org.apache.struts.digester.Digester解析config参数标示的配置文件，通常为“/WEB-INF/struts-config.xml”，解析出所有的data-source、form-bean、action-mapping、forward。从上面的程序片断看到，Digester仅仅调用了一个parse()方法，那么，Digester是怎样把解析struts-config.xml文件并把解析的结果form-bean等信息存储到属性变量formBeans等中的呢？你可以注意到在调用digester.parse(InputStream)之前，首先调用了initDigester()方法：<br /></font>
						<div class="codeStyle">
								<ol>
										<li>
												<font size="2">
												</font>
										</li>
										<li>
												<font size="2">        Digester digester = <b><font color="#0000ff">new</font></b> Digester(); </font>
										</li>
										<li>
												<font size="2">        digester.push(<b><font color="#0000ff">this</font></b>); </font>
										</li>
										<li>
												<font size="2">        digester.addObjectCreate(<font color="#ff33ff">"struts-config/action-mappings/action"</font>, </font>
										</li>
										<li>
												<font size="2">                                 mappingClass, <font color="#ff33ff">"className"</font>); </font>
										</li>
										<li>
												<font size="2">        digester.addSetProperties(<font color="#ff33ff">"struts-config/action-mappings/action"</font>); </font>
										</li>
										<li>
												<font size="2">        digester.addSetNext(<font color="#ff33ff">"struts-config/action-mappings/action"</font>, </font>
										</li>
										<li>
												<font size="2">                            <font color="#ff33ff">"addMapping"</font>, </font>
										</li>
										<li>
												<font size="2">                            <font color="#ff33ff">"org.apache.struts.action.ActionMapping"</font>); </font>
										</li>
										<li>
												<font size="2">
												</font>
										</li>
										<li>
												<font size="2">        digester.addSetProperty </font>
										</li>
										<li>
												<font size="2">            (<font color="#ff33ff">"struts-config/action-mappings/action/set-property"</font>, </font>
										</li>
										<li>
												<font size="2">             <font color="#ff33ff">"property"</font>, <font color="#ff33ff">"value"</font>); </font>
										</li>
								</ol>
						</div>
						<br />
						<font size="2">在这个方法中首先生成一个Digester对象，然后设置解析的规则和回调，如果你对XML、SAX不是很熟，这儿不必纠缠太深。要注意的是addSetNext()方法，设置了每一个要解析元素的Set Next回调方法，而这个方法就是由digester解析器的父提供的。上面的片断中的“addMapping”就是ActionServlet本身定义的一个方法，将由Digester回调。Digester就是籍此把解析出的每一个FormBean、ActionForward、ActionMapping等存储到属性变量formBeans、forwards、mappings等中的。<br /></font>
				</li>
				<li>
						<font size="2">initUpload() －    初始化有关Upload的一些参数，比如：bufferSize、tempDir。<br /></font>
				</li>
				<li>
						<font size="2">initDataSource() －取出在initMapping()中从配置文件中读取的每一个DataSource，设置LogWriter，如果为GenericDataSource的实例，则打开数据源。然后，把每个dataSource放入Context中。<br />dataSource.setLogWriter(scw)；<br />((GenericDataSource)dataSource).open();<br />getServletContext().setAttribute(key,dataSource);<br /></font>
				</li>
				<li>
						<font size="2">initOther() －        设置其它尚未初始化的的参数（content、locale、nocache），并发布formBeans、forwards、mappings到Context：<br />getServletContext().setAttribute(Action.FORM_BEANS_KEY, formBeans);<br />getServletContext().setAttribute(Action.FORWARDS_KEY, forwards);<br />getServletContext().setAttribute(Action.MAPPINGS_KEY, mappings);<br /></font>
				</li>
				<li>
						<font size="2">initServlet() －    初始化Controller Servlet的Servlet Mapping。这儿也使用了Digester工具，扫描web.xml所有的&lt;web-app/servlet-mapping&gt;，寻找servlet-name与当前Servlet相同的mapping，置入Context。代码如下；<br /></font>
						<div class="codeStyle">
								<ol>
										<li>
												<font size="2">
												</font>
										</li>
										<li>
												<font size="2">        Digester digester = <b><font color="#0000ff">new</font></b> Digester(); </font>
										</li>
										<li>
												<font size="2">        digester.push(<b><font color="#0000ff">this</font></b>); </font>
										</li>
										<li>
												<font size="2">        digester.setDebug(debug); </font>
										</li>
										<li>
												<font size="2">        digester.setValidating(validating); </font>
										</li>
										<li>
												<font size="2">        digester.addCallMethod(“web-appservlet-mapping”,“addServletMapping”, 2); </font>
										</li>
										<li>
												<font size="2">        digester.addCallParm(“web-appservlet-mappingservlet-name”, 0); </font>
										</li>
										<li>
												<font size="2">        digester.addCallParm(“web-appservlet-mappingurl-pattern”, 1); </font>
										</li>
										<li>
												<font size="2">        <font color="#ff0000">InputStream</font> is = getServletContext().getResourceAsStream(“/WEB-INFweb.xml”); </font>
										</li>
										<li>
												<font size="2">        digester.parse(is);  </font>
										</li>
										<li>
												<font size="2">        getServletContext().setAttribute(<font color="#ff0000">Action</font>.SERVLET_KEY,servletMapping); </font>
										</li>
								</ol>
						</div>
						<br />
				</li>
		</ul>
<img src ="http://www.blogjava.net/nikita/aggbug/232275.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nikita/" target="_blank">picture talk</a> 2008-10-04 00:07 <a href="http://www.blogjava.net/nikita/archive/2008/10/04/232275.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>