﻿<?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-乐在其中-随笔分类-J2EE</title><link>http://www.blogjava.net/charles/category/36706.html</link><description>以JEE为主攻，以Flex为点缀，以Eclipse RCP为乐趣</description><language>zh-cn</language><lastBuildDate>Mon, 16 Feb 2009 20:48:31 GMT</lastBuildDate><pubDate>Mon, 16 Feb 2009 20:48:31 GMT</pubDate><ttl>60</ttl><item><title>在Spring基础上实现自己的异常处理框架 </title><link>http://www.blogjava.net/charles/archive/2009/02/12/254469.html</link><dc:creator>suprasoft Inc,.</dc:creator><author>suprasoft Inc,.</author><pubDate>Thu, 12 Feb 2009 14:58:00 GMT</pubDate><guid>http://www.blogjava.net/charles/archive/2009/02/12/254469.html</guid><wfw:comment>http://www.blogjava.net/charles/comments/254469.html</wfw:comment><comments>http://www.blogjava.net/charles/archive/2009/02/12/254469.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/charles/comments/commentRss/254469.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/charles/services/trackbacks/254469.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 应用项目大致的体系结构：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;该异常处理框架满足的要求：    完整的异常组织结构    异常的统一处理    可配置，受管式，方便使用 &nbsp; 完整的异常组织结构：    用户可以方便的定义自己的异常，但所有UncheckedException需要继承BaseAppRunti...&nbsp;&nbsp;<a href='http://www.blogjava.net/charles/archive/2009/02/12/254469.html'>阅读全文</a><img src ="http://www.blogjava.net/charles/aggbug/254469.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/charles/" target="_blank">suprasoft Inc,.</a> 2009-02-12 22:58 <a href="http://www.blogjava.net/charles/archive/2009/02/12/254469.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>读Spring源代码之按图索骥（一）Context创建与配置文件加载</title><link>http://www.blogjava.net/charles/archive/2008/12/26/248497.html</link><dc:creator>suprasoft Inc,.</dc:creator><author>suprasoft Inc,.</author><pubDate>Fri, 26 Dec 2008 08:53:00 GMT</pubDate><guid>http://www.blogjava.net/charles/archive/2008/12/26/248497.html</guid><wfw:comment>http://www.blogjava.net/charles/comments/248497.html</wfw:comment><comments>http://www.blogjava.net/charles/archive/2008/12/26/248497.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/charles/comments/commentRss/248497.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/charles/services/trackbacks/248497.html</trackback:ping><description><![CDATA[<p>Spring 和 Struts在web.xml中增加的配置：</p> <div class="csharpcode-wrapper"> <div class="csharpcode"><pre class="alt"><span class="lnum">   1:</span> <span class="rem">&lt;!-- spring的配置 --&gt;</span></pre><pre class="alteven"><span class="lnum">   2:</span> <span class="kwrd">&lt;</span><span class="html">context-param</span><span class="kwrd">&gt;</span></pre><pre class="alt"><span class="lnum">   3:</span>     <span class="kwrd">&lt;</span><span class="html">param-name</span><span class="kwrd">&gt;</span>contextConfigLocation<span class="kwrd">&lt;/</span><span class="html">param-name</span><span class="kwrd">&gt;</span></pre><pre class="alteven"><span class="lnum">   4:</span>     <span class="kwrd">&lt;</span><span class="html">param-value</span><span class="kwrd">&gt;</span>classpath:/SpringContext/applicationContext-web.xml<span class="kwrd">&lt;/</span><span class="html">param-value</span><span class="kwrd">&gt;</span></pre><pre class="alt"><span class="lnum">   5:</span> <span class="kwrd">&lt;/</span><span class="html">context-param</span><span class="kwrd">&gt;</span>    </pre><pre class="alt"><span class="lnum">   7:</span>&nbsp; </pre><pre class="alteven"><span class="lnum">   8:</span> <span class="kwrd">&lt;</span><span class="html">listener</span><span class="kwrd">&gt;</span></pre><pre class="alt"><span class="lnum">   9:</span>     <span class="kwrd">&lt;</span><span class="html">listener-class</span><span class="kwrd">&gt;</span>org.springframework.web.context.ContextLoaderListener</pre><pre class="alteven"><span class="lnum">  10:</span>     <span class="kwrd">&lt;/</span><span class="html">listener-class</span><span class="kwrd">&gt;</span></pre><pre class="alt"><span class="lnum">  11:</span> <span class="kwrd">&lt;/</span><span class="html">listener</span><span class="kwrd">&gt;</span></pre><pre class="alteven"><span class="lnum">  12:</span>&nbsp; </pre><pre class="alt"><span class="lnum">  13:</span> <span class="kwrd">&lt;</span><span class="html">filter</span><span class="kwrd">&gt;</span></pre><pre class="alteven"><span class="lnum">  14:</span>     <span class="kwrd">&lt;</span><span class="html">filter-name</span><span class="kwrd">&gt;</span>struts2<span class="kwrd">&lt;/</span><span class="html">filter-name</span><span class="kwrd">&gt;</span></pre><pre class="alt"><span class="lnum">  15:</span>     <span class="kwrd">&lt;</span><span class="html">filter-class</span><span class="kwrd">&gt;</span>org.apache.struts2.dispatcher.FilterDispatcher<span class="kwrd">&lt;/</span><span class="html">filter-class</span><span class="kwrd">&gt;</span></pre><pre class="alt"><span class="lnum">  17:</span>     <span class="kwrd">&lt;</span><span class="html">init-param</span><span class="kwrd">&gt;</span></pre><pre class="alteven"><span class="lnum">  18:</span>         <span class="kwrd">&lt;</span><span class="html">param-name</span><span class="kwrd">&gt;</span>config<span class="kwrd">&lt;/</span><span class="html">param-name</span><span class="kwrd">&gt;</span></pre><pre class="alt"><span class="lnum">  19:</span>         <span class="kwrd">&lt;</span><span class="html">param-value</span><span class="kwrd">&gt;</span>struts-default.xml,struts-plugin.xml,struts/struts.xml<span class="kwrd">&lt;/</span><span class="html">param-value</span><span class="kwrd">&gt;</span></pre><pre class="alteven"><span class="lnum">  20:</span>     <span class="kwrd">&lt;/</span><span class="html">init-param</span><span class="kwrd">&gt;</span></pre><pre class="alt"><span class="lnum">  21:</span> <span class="kwrd">&lt;/</span><span class="html">filter</span><span class="kwrd">&gt;</span></pre><pre class="alteven"><span class="lnum">  22:</span>&nbsp; </pre><pre class="alt"><span class="lnum">  23:</span> <span class="kwrd">&lt;</span><span class="html">filter-mapping</span><span class="kwrd">&gt;</span></pre><pre class="alteven"><span class="lnum">  24:</span>     <span class="kwrd">&lt;</span><span class="html">filter-name</span><span class="kwrd">&gt;</span>struts2<span class="kwrd">&lt;/</span><span class="html">filter-name</span><span class="kwrd">&gt;</span></pre><pre class="alt"><span class="lnum">  25:</span>     <span class="kwrd">&lt;</span><span class="html">url-pattern</span><span class="kwrd">&gt;</span>*.do<span class="kwrd">&lt;/</span><span class="html">url-pattern</span><span class="kwrd">&gt;</span></pre><pre class="alteven"><span class="lnum">  26:</span> <span class="kwrd">&lt;/</span><span class="html">filter-mapping</span><span class="kwrd">&gt;</span></pre></div></div>
<p>&nbsp;</p>
<p>第一个tag定义的是spring的配置文件地址到环境参数(context parameter)</p>
<p>第二个tag定义一个listener为<u>org.springframework.web.context.ContextLoaderListener</u>,这里相当于j2ee容器给我们提供的main函数的切入点，可以让我们做一些系统初始化的工作，需要实现的类是：javax.servlet.ServletContextListener</p>
<p>第三个tag则定义了struts2的一个filter。Filter则是对每次请求（可以通过filter-mapping指定）做过滤处理，请求首先请过filter链的处理，然后再到HttpServlet的init方法。对应的类是：javax.servlet.Filter。上面先配置了一个filter,对应的类是org.apache.struts2.dispatcher.FilterDispatcher,参数则是struts的配置文件位置</p>
<p>第四个参数定义了filter怎样行为，显然它对.do为后缀的请求应用struts2这个名称的filter</p>
<div class="csharpcode-wrapper">
<div class="csharpcode"><pre class="alt">这里需要首先搞清楚servlet规范中什么是listener?</pre><pre class="alteven">&nbsp;</pre><pre class="alt">详细请参见 <a href="http://jamesblog.javaeye.com/blog/124790">Servlet Listener和Filter</a></pre></div></div>
<p>&nbsp;</p>
<p>查看ContextLoaderListener可知，它正好继承了<u>javax.servlet.ServletContextListener</u>，用于监听javax.servlet.ServletContextEvent事件</p>
<div class="csharpcode-wrapper">
<div class="csharpcode"><pre class="alt"><span class="rem">/*</span></pre><pre class="alteven"><span class="rem"> * Copyright 2002-2007 the original author or authors.</span></pre><pre class="alt"><span class="rem"> *</span></pre><pre class="alteven"><span class="rem"> * Licensed under the Apache License, Version 2.0 (the "License");</span></pre><pre class="alt"><span class="rem"> * you may not use this file except in compliance with the License.</span></pre><pre class="alteven"><span class="rem"> * You may obtain a copy of the License at</span></pre><pre class="alt"><span class="rem"> *</span></pre><pre class="alteven"><span class="rem"> *      http://www.apache.org/licenses/LICENSE-2.0</span></pre><pre class="alt"><span class="rem"> *</span></pre><pre class="alteven"><span class="rem"> * Unless required by applicable law or agreed to in writing, software</span></pre><pre class="alt"><span class="rem"> * distributed under the License is distributed on an "AS IS" BASIS,</span></pre><pre class="alteven"><span class="rem"> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span></pre><pre class="alt"><span class="rem"> * See the License for the specific language governing permissions and</span></pre><pre class="alteven"><span class="rem"> * limitations under the License.</span></pre><pre class="alt"><span class="rem"> */</span></pre><pre class="alteven">&nbsp;</pre><pre class="alt">package org.springframework.web.context;</pre><pre class="alteven">&nbsp;</pre><pre class="alt">import javax.servlet.ServletContextEvent;</pre><pre class="alteven">import javax.servlet.ServletContextListener;</pre><pre class="alt">&nbsp;</pre><pre class="alteven"><span class="rem">/**</span></pre><pre class="alt"><span class="rem"> * Bootstrap listener to start up Spring's root {@link WebApplicationContext}.</span></pre><pre class="alteven"><span class="rem"> * Simply delegates to {@link ContextLoader}.</span></pre><pre class="alt"><span class="rem"> *</span></pre><pre class="alteven"><span class="rem"> * &lt;p&gt;This listener should be registered after</span></pre><pre class="alt"><span class="rem"> * {@link org.springframework.web.util.Log4jConfigListener}</span></pre><pre class="alteven"><span class="rem"> * in &lt;code&gt;web.xml&lt;/code&gt;, if the latter is used.</span></pre><pre class="alt"><span class="rem"> *</span></pre><pre class="alteven"><span class="rem"> * @author Juergen Hoeller</span></pre><pre class="alt"><span class="rem"> * @since 17.02.2003</span></pre><pre class="alteven"><span class="rem"> * @see ContextLoaderServlet</span></pre><pre class="alt"><span class="rem"> * @see org.springframework.web.util.Log4jConfigListener</span></pre><pre class="alteven"><span class="rem"> */</span></pre><pre class="alt"><span class="kwrd">public</span> <span class="kwrd">class</span> ContextLoaderListener implements ServletContextListener {</pre><pre class="alteven">&nbsp;</pre><pre class="alt">    <span class="kwrd">private</span> ContextLoader contextLoader;</pre><pre class="alteven">&nbsp;</pre><pre class="alt">&nbsp;</pre><pre class="alteven">    <span class="rem">/**</span></pre><pre class="alt"><span class="rem">     * Initialize the root web application context.</span></pre><pre class="alteven"><span class="rem">     */</span></pre><pre class="alt">    <span class="kwrd">public</span> <span class="kwrd">void</span> contextInitialized(ServletContextEvent <span class="kwrd">event</span>) {</pre><pre class="alteven">        <span class="kwrd">this</span>.contextLoader = createContextLoader();</pre><pre class="alt">        <span class="kwrd">this</span>.contextLoader.initWebApplicationContext(<span class="kwrd">event</span>.getServletContext());</pre><pre class="alteven">    }</pre><pre class="alt">&nbsp;</pre><pre class="alteven">    <span class="rem">/**</span></pre><pre class="alt"><span class="rem">     * Create the ContextLoader to use. Can be overridden in subclasses.</span></pre><pre class="alteven"><span class="rem">     * @return the new ContextLoader</span></pre><pre class="alt"><span class="rem">     */</span></pre><pre class="alteven">    <span class="kwrd">protected</span> ContextLoader createContextLoader() {</pre><pre class="alt">        <span class="kwrd">return</span> <span class="kwrd">new</span> ContextLoader();</pre><pre class="alteven">    }</pre><pre class="alt">&nbsp;</pre><pre class="alteven">    <span class="rem">/**</span></pre><pre class="alt"><span class="rem">     * Return the ContextLoader used by this listener.</span></pre><pre class="alteven"><span class="rem">     * @return the current ContextLoader</span></pre><pre class="alt"><span class="rem">     */</span></pre><pre class="alteven">    <span class="kwrd">public</span> ContextLoader getContextLoader() {</pre><pre class="alt">        <span class="kwrd">return</span> <span class="kwrd">this</span>.contextLoader;</pre><pre class="alteven">    }</pre><pre class="alt">&nbsp;</pre><pre class="alteven">&nbsp;</pre><pre class="alt">    <span class="rem">/**</span></pre><pre class="alteven"><span class="rem">     * Close the root web application context.</span></pre><pre class="alt"><span class="rem">     */</span></pre><pre class="alteven">    <span class="kwrd">public</span> <span class="kwrd">void</span> contextDestroyed(ServletContextEvent <span class="kwrd">event</span>) {</pre><pre class="alt">        <span class="kwrd">if</span> (<span class="kwrd">this</span>.contextLoader != <span class="kwrd">null</span>) {</pre><pre class="alteven">            <span class="kwrd">this</span>.contextLoader.closeWebApplicationContext(<span class="kwrd">event</span>.getServletContext());</pre><pre class="alt">        }</pre><pre class="alteven">    }</pre><pre class="alt">&nbsp;</pre><pre class="alteven">}</pre></div></div>
<p>此类implement了ServletContextListener的两个方法：</p>
<div class="csharpcode-wrapper">
<div class="csharpcode"><pre class="alt"><span class="kwrd">public</span> <span class="kwrd">void</span> contextInitialized(ServletContextEvent <span class="kwrd">event</span>);</pre><pre class="alteven"><span class="kwrd">public</span> <span class="kwrd">void</span> contextDestroyed(ServletContextEvent <span class="kwrd">event</span>);</pre></div></div>
<p>分别做context的初始化和销毁</p>
<p>另外提供了一个protected方法：protected ContextLoader createContextLoader()&nbsp; 用于创建真正做事情的代理类CotextLoader</p>
<p>和一个public方法：public ContextLoader getContextLoader()；</p>
<p>&nbsp;</p>
<p>可见，这个Listener类直接将工作<strong><u>代理</u></strong>给了ContextLoader类了</p>
<p>&nbsp;</p>
<p>____________________________________________________________________________________________________________________________</p>
<p>我们按图索骥，下面再分析org.springframework.web.context.ContextLoader</p>
<p>ContextLoader里面有个私有成员：private WebApplicationContext context</p>
<p>此变量提供了create方法：</p>
<p>createWebApplicationContext(ServletContext servletContext, ApplicationContext parent) 
<p>因为Spring提供了多种WebApplicationContext类，所以需要一个方法来决定使用哪个WebApplicationContextContext类</p>
<div class="csharpcode-wrapper">
<div class="csharpcode"><pre class="alt"><span class="kwrd">protected</span> Class determineContextClass(ServletContext servletContext) throws ApplicationContextException {</pre><pre class="alteven">        String contextClassName = servletContext.getInitParameter(CONTEXT_CLASS_PARAM);</pre><pre class="alt">        <span class="kwrd">if</span> (contextClassName != <span class="kwrd">null</span>) {</pre><pre class="alteven">            <span class="kwrd">try</span> {</pre><pre class="alt">                <span class="kwrd">return</span> ClassUtils.forName(contextClassName);</pre><pre class="alteven">            }</pre><pre class="alt">            <span class="kwrd">catch</span> (ClassNotFoundException ex) {</pre><pre class="alteven">                <span class="kwrd">throw</span> <span class="kwrd">new</span> ApplicationContextException(</pre><pre class="alt">                        <span class="str">"Failed to load custom context class ["</span> + contextClassName + <span class="str">"]"</span>, ex);</pre><pre class="alteven">            }</pre><pre class="alt">        }</pre><pre class="alteven">        <span class="kwrd">else</span> {</pre><pre class="alt">            contextClassName = defaultStrategies.getProperty(WebApplicationContext.<span class="kwrd">class</span>.getName());</pre><pre class="alteven">            <span class="kwrd">try</span> {</pre><pre class="alt">                <span class="kwrd">return</span> ClassUtils.forName(contextClassName, ContextLoader.<span class="kwrd">class</span>.getClassLoader());</pre><pre class="alteven">            }</pre><pre class="alt">            <span class="kwrd">catch</span> (ClassNotFoundException ex) {</pre><pre class="alteven">                <span class="kwrd">throw</span> <span class="kwrd">new</span> ApplicationContextException(</pre><pre class="alt">                        <span class="str">"Failed to load default context class ["</span> + contextClassName + <span class="str">"]"</span>, ex);</pre><pre class="alteven">            }</pre><pre class="alt">        }</pre><pre class="alteven">    }</pre></div></div>
<p>&nbsp;</p>
<p>public static final String CONTEXT_CLASS_PARAM = "contextClass";</p>
<p>所以如果在web.xml中的&lt;context-param&gt; &lt;/context-param&gt;中定义了参数contextClass，那么直接就决定了用此Context类</p>
<p>否则，就应用缺省策略来决定使用哪个Context类。</p>
<p>缺省策略如下：</p>
<div class="csharpcode-wrapper">
<div class="csharpcode"><pre class="alt"><span class="kwrd">private</span> <span class="kwrd">static</span> final Properties defaultStrategies;</pre><pre class="alteven">&nbsp;</pre><pre class="alt"><span class="kwrd">static</span> {</pre><pre class="alteven">    <span class="rem">// Load default strategy implementations from properties file.</span></pre><pre class="alt">    <span class="rem">// This is currently strictly internal and not meant to be customized</span></pre><pre class="alteven">    <span class="rem">// by application developers.</span></pre><pre class="alt">    <span class="kwrd">try</span> {</pre><pre class="alteven">        ClassPathResource resource = <span class="kwrd">new</span> ClassPathResource(DEFAULT_STRATEGIES_PATH, ContextLoader.<span class="kwrd">class</span>);</pre><pre class="alt">        defaultStrategies = PropertiesLoaderUtils.loadProperties(resource);</pre><pre class="alteven">    }</pre><pre class="alt">    <span class="kwrd">catch</span> (IOException ex) {</pre><pre class="alteven">        <span class="kwrd">throw</span> <span class="kwrd">new</span> IllegalStateException(<span class="str">"Could not load 'ContextLoader.properties': "</span> + ex.getMessage());</pre><pre class="alt">    }</pre><pre class="alteven">}</pre></div></div>
<p>实际上，缺省策略从org\springframework\web\context\ContextLoader.properties 文件中取得属性org.springframework.web.context.WebApplicationContext</p>
<p>我们看看ContextLoader.properties文件的内容：</p>
<div class="csharpcode-wrapper">
<div class="csharpcode"><pre class="alt"># Default WebApplicationContext implementation <span class="kwrd">class</span> <span class="kwrd">for</span> ContextLoader.</pre><pre class="alteven"># Used <span class="kwrd">as</span> fallback when no <span class="kwrd">explicit</span> context implementation has been specified <span class="kwrd">as</span> context-param.</pre><pre class="alt"># Not meant to be customized by application developers.</pre><pre class="alteven">&nbsp;</pre><pre class="alt">org.springframework.web.context.WebApplicationContext=org.springframework.web.context.support.XmlWebApplicationContext</pre></div></div>
<p>显然，缺省的Context类就是 XmlWebApplicationContext类</p>
<p>！！！真累啊，Spring...</p>
<p>&nbsp;</p>
<p>OK,总算知道用哪个Context类了，那么现在到了create这个Context实例的时候了</p>
<div class="csharpcode-wrapper">
<div class="csharpcode"><pre class="alt"><span class="kwrd">protected</span> WebApplicationContext createWebApplicationContext(</pre><pre class="alteven">            ServletContext servletContext, ApplicationContext parent) throws BeansException {</pre><pre class="alt">&nbsp;</pre><pre class="alteven">        Class contextClass = determineContextClass(servletContext);</pre><pre class="alt">        <span class="kwrd">if</span> (!ConfigurableWebApplicationContext.<span class="kwrd">class</span>.isAssignableFrom(contextClass)) {</pre><pre class="alteven">            <span class="kwrd">throw</span> <span class="kwrd">new</span> ApplicationContextException(<span class="str">"Custom context class ["</span> + contextClass.getName() +</pre><pre class="alt">                    <span class="str">"] is not of type ["</span> + ConfigurableWebApplicationContext.<span class="kwrd">class</span>.getName() + <span class="str">"]"</span>);</pre><pre class="alteven">        }</pre><pre class="alt">&nbsp;</pre><pre class="alteven">        ConfigurableWebApplicationContext wac =</pre><pre class="alt">                (ConfigurableWebApplicationContext) BeanUtils.instantiateClass(contextClass);</pre><pre class="alteven">        wac.setParent(parent);</pre><pre class="alt">        wac.setServletContext(servletContext);</pre><pre class="alteven">        wac.setConfigLocation(servletContext.getInitParameter(CONFIG_LOCATION_PARAM));</pre><pre class="alt">        customizeContext(servletContext, wac);</pre><pre class="alteven">        wac.refresh();</pre><pre class="alt">&nbsp;</pre><pre class="alteven">        <span class="kwrd">return</span> wac;</pre><pre class="alt">    }</pre></div></div>
<p>这里很容易理解，只不过它的创建不是直接new，而是封装了一层，调用BeanUtils.instantiateClass()工具方法</p>
<p>接下来设定WebApplicationCcontext实例的parent, servletContext, </p>
<p>其中配置文件位置(web.xml中)的contextConfigLocation参数指定的</p>
<div class="csharpcode-wrapper">
<div class="csharpcode"><pre class="alt">&lt;context-param&gt;</pre><pre class="alteven">    &lt;param-name&gt;contextConfigLocation&lt;/param-name&gt;</pre><pre class="alt">    &lt;param-<span class="kwrd">value</span>&gt;classpath:/SpringContext/applicationContext-web.xml</pre><pre class="alteven">    &lt;/param-<span class="kwrd">value</span>&gt;</pre><pre class="alt">&lt;/context-param&gt;</pre></div></div>
<p>倒数第二行调用的customizeContext()方法目前Spring实现代码是空的，估计留作以后（看来万事要留余地啊^_^）</p>
<p>最后一件事就是调用WebApplicationContext的<font color="#ff0000" size="4"><u>refresh()</u></font>方法。（这个方法是个stratup方法，很重要。他干的事情后面会着重涉及）</p>
<p>&nbsp;</p>
<p>最后就是真正做事的initWebApplicationContext()方法：</p>
<div class="csharpcode-wrapper">
<div class="csharpcode"><pre class="alt"><span class="kwrd">public</span> WebApplicationContext initWebApplicationContext(ServletContext servletContext)</pre><pre class="alteven">            throws IllegalStateException, BeansException {</pre><pre class="alt">&nbsp;</pre><pre class="alteven">        <span class="kwrd">if</span> (servletContext.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE) != <span class="kwrd">null</span>) {</pre><pre class="alt">            <span class="kwrd">throw</span> <span class="kwrd">new</span> IllegalStateException(</pre><pre class="alteven">                    <span class="str">"Cannot initialize context because there is already a root application context present - "</span> +</pre><pre class="alt">                    <span class="str">"check whether you have multiple ContextLoader* definitions in your web.xml!"</span>);</pre><pre class="alteven">        }</pre><pre class="alt">&nbsp;</pre><pre class="alteven">        servletContext.log(<span class="str">"Initializing Spring root WebApplicationContext"</span>);</pre><pre class="alt">        <span class="kwrd">if</span> (logger.isInfoEnabled()) {</pre><pre class="alteven">            logger.info(<span class="str">"Root WebApplicationContext: initialization started"</span>);</pre><pre class="alt">        }</pre><pre class="alteven">        <span class="kwrd">long</span> startTime = System.currentTimeMillis();</pre><pre class="alt">&nbsp;</pre><pre class="alteven">        <span class="kwrd">try</span> {</pre><pre class="alt">            <span class="rem">// Determine parent for root web application context, if any.</span></pre><pre class="alteven">            ApplicationContext parent = loadParentContext(servletContext);</pre><pre class="alt">&nbsp;</pre><pre class="alteven">            <span class="rem">// Store context in local instance variable, to guarantee that</span></pre><pre class="alt">            <span class="rem">// it is available on ServletContext shutdown.</span></pre><pre class="alteven">            <span class="kwrd">this</span>.context = createWebApplicationContext(servletContext, parent);</pre><pre class="alt">            servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, <span class="kwrd">this</span>.context);</pre><pre class="alteven">            currentContextPerThread.put(Thread.currentThread().getContextClassLoader(), <span class="kwrd">this</span>.context);</pre><pre class="alt">&nbsp;</pre><pre class="alteven">            <span class="kwrd">if</span> (logger.isDebugEnabled()) {</pre><pre class="alt">                logger.debug(<span class="str">"Published root WebApplicationContext as ServletContext attribute with name ["</span> +</pre><pre class="alteven">                        WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE + <span class="str">"]"</span>);</pre><pre class="alt">            }</pre><pre class="alteven">            <span class="kwrd">if</span> (logger.isInfoEnabled()) {</pre><pre class="alt">                <span class="kwrd">long</span> elapsedTime = System.currentTimeMillis() - startTime;</pre><pre class="alteven">                logger.info(<span class="str">"Root WebApplicationContext: initialization completed in "</span> + elapsedTime + <span class="str">" ms"</span>);</pre><pre class="alt">            }</pre><pre class="alteven">&nbsp;</pre><pre class="alt">            <span class="kwrd">return</span> <span class="kwrd">this</span>.context;</pre><pre class="alteven">        }</pre><pre class="alt">        <span class="kwrd">catch</span> (RuntimeException ex) {</pre><pre class="alteven">            logger.error(<span class="str">"Context initialization failed"</span>, ex);</pre><pre class="alt">            servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, ex);</pre><pre class="alteven">            <span class="kwrd">throw</span> ex;</pre><pre class="alt">        }</pre><pre class="alteven">        <span class="kwrd">catch</span> (Error err) {</pre><pre class="alt">            logger.error(<span class="str">"Context initialization failed"</span>, err);</pre><pre class="alteven">            servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, err);</pre><pre class="alt">            <span class="kwrd">throw</span> err;</pre><pre class="alteven">        }</pre><pre class="alt">    }</pre></div></div>
<p>它其实做得事情很简单，调用loadParentContext()方法获取父context,调用createWebApplicationContext()创建WebApplicationContext实例</p>
<p>&nbsp;</p>
<p>一切都似乎完成了，至少我们明白了配置文件是如何加载进去的，至于IoC容器如何帮你注入配置文件中的bean，下次再探索。线索是什么呢？你还记得在createWebApplication()的最后一步做什么了吗？refresh(), 对了，这个就是你作为职业"嘿客"要探索的下一个线索</p><img src ="http://www.blogjava.net/charles/aggbug/248497.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/charles/" target="_blank">suprasoft Inc,.</a> 2008-12-26 16:53 <a href="http://www.blogjava.net/charles/archive/2008/12/26/248497.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PO BO VO DTO POJO DAO概念及其作用（附转换图）</title><link>http://www.blogjava.net/charles/archive/2008/12/26/248418.html</link><dc:creator>suprasoft Inc,.</dc:creator><author>suprasoft Inc,.</author><pubDate>Fri, 26 Dec 2008 04:53:00 GMT</pubDate><guid>http://www.blogjava.net/charles/archive/2008/12/26/248418.html</guid><wfw:comment>http://www.blogjava.net/charles/comments/248418.html</wfw:comment><comments>http://www.blogjava.net/charles/archive/2008/12/26/248418.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/charles/comments/commentRss/248418.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/charles/services/trackbacks/248418.html</trackback:ping><description><![CDATA[<p>J2EE开发中大量的专业缩略语很是让人迷惑，尤其是跟一些高手讨论问题的时候，三分钟就被人家满口的专业术语喷晕了，PO VO BO DTO POJO DAO，一大堆的就来了（听过老罗对这种现象的批判的朋友会会心一笑）。  <p>&nbsp;&nbsp;&nbsp; 首先声明偶也不是什么高手，以下总结都是自己的体会。不对之处请您多指教。 <p>PO：<br>persistant object持久对象<br>最形象的理解就是一个PO就是数据库中的一条记录。<br>好处是可以把一条记录作为一个对象处理，可以方便的转为其它对象。 <hr>  <p>BO：<br>business object业务对象<br>主要作用是把业务逻辑封装为一个对象。这个对象可以包括一个或多个其它的对象。<br>比如一个简历，有教育经历、工作经历、社会关系等等。<br>我们可以把教育经历对应一个PO，工作经历对应一个PO，社会关系对应一个PO。<br>建立一个对应简历的BO对象处理简历，每个BO包含这些PO。<br>这样处理业务逻辑时，我们就可以针对BO去处理。 <hr>  <p>VO ：<br>value object值对象<br>ViewObject表现层对象<br>主要对应界面显示的数据对象。对于一个WEB页面，或者SWT、SWING的一个界面，用一个VO对象对应整个界面的值。 <hr>  <p>DTO ：<br>Data Transfer Object数据传输对象<br>主要用于远程调用等需要大量传输对象的地方。<br>比如我们一张表有100个字段，那么对应的PO就有100个属性。<br>但是我们界面上只要显示10个字段，<br>客户端用WEB service来获取数据，没有必要把整个PO对象传递到客户端，<br>这时我们就可以用只有这10个属性的DTO来传递结果到客户端，这样也不会暴露服务端表结构.到达客户端以后，如果用这个对象来对应界面显示，那此时它的身份就转为VO <hr>  <p>POJO ：<br>plain ordinary java object 简单java对象<br>个人感觉POJO是最常见最多变的对象，是一个中间对象，也是我们最常打交道的对象。<br>一个POJO持久化以后就是PO<br>直接用它传递、传递过程中就是DTO<br>直接用来对应表示层就是VO <hr>  <p>DAO：<br>data access object数据访问对象<br>这个大家最熟悉，和上面几个O区别最大，基本没有互相转化的可能性和必要.<br>主要用来封装对数据库的访问。通过它可以把POJO持久化为PO，用PO组装出来VO、DTO<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 总结下我认为一个对象究竟是什么O要看具体环境，在不同的层、不同的应用场合，对象的身份也不一样，而且对象身份的转化也是很自然的。就像你对老婆来说就是老公，对父母来说就是子女。设计这些概念的初衷不是为了唬人而是为了更好的理解和处理各种逻辑，让大家能更好的去用面向对象的方式处理问题.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 大家千万不要陷入过度设计，大可不必为了设计而设计一定要在代码中区分各个对象。一句话技术是为应用服务的。<br>欢迎指正。 <hr> <br>画了个图，感觉没有完全表达出自己的意思。。。。。谁帮忙完善下，最好能体现各个O在MVC中的位置<br><img height="480" alt="snap20070108.jpg" src="http://www.blogjava.net/images/blogjava_net/vip01/snap20070108.jpg" width="557" border="0"><img src ="http://www.blogjava.net/charles/aggbug/248418.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/charles/" target="_blank">suprasoft Inc,.</a> 2008-12-26 12:53 <a href="http://www.blogjava.net/charles/archive/2008/12/26/248418.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>web.xml详解</title><link>http://www.blogjava.net/charles/archive/2008/12/26/248402.html</link><dc:creator>suprasoft Inc,.</dc:creator><author>suprasoft Inc,.</author><pubDate>Fri, 26 Dec 2008 03:34:00 GMT</pubDate><guid>http://www.blogjava.net/charles/archive/2008/12/26/248402.html</guid><wfw:comment>http://www.blogjava.net/charles/comments/248402.html</wfw:comment><comments>http://www.blogjava.net/charles/archive/2008/12/26/248402.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/charles/comments/commentRss/248402.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/charles/services/trackbacks/248402.html</trackback:ping><description><![CDATA[<p>每一个站的WEB-INF下都有一个web.xml的设定文件，它提供了我们站台的配置设定.  <p>web.xml定义：<br>.站台的名称和说明<br>.针对环境参数(Context)做初始化工作<br>.Servlet的名称和映射<br>.Session的设定<br>.Tag library的对映<br>.JSP网页设定<br>.Mime Type处理<br>.错误处理<br>.利用JDNI取得站台资源  <p>要了解web.xml的设定值，必须了解它的schema,从web.xml中知道它的schema是由Sum Microsystems公司定制的，如果你想更为详细的了解它，<br>可以到<a href="http://java.sun.com/xml/ns/j2ee/web-mapp_2_4.xsd">http://java.sun.com/xml/ns/j2ee/web-mapp_2_4.xsd</a>网页，那里有更为详细的介绍。这里我介绍我们平常见得最多的.</p> <div class="csharpcode-wrapper"> <div class="csharpcode"><pre class="alt"><span class="lnum">   1:</span> <span class="kwrd">&lt;?</span><span class="html">xml</span> <span class="attr">version</span><span class="kwrd">="1.0"</span> <span class="attr">encoding</span><span class="kwrd">="ISO-8859-1"</span>?<span class="kwrd">&gt;</span> </pre><pre class="alteven"><span class="lnum">   2:</span>&nbsp; </pre><pre class="alt"><span class="lnum">   3:</span> <span class="kwrd">&lt;</span><span class="html">web-app</span> <span class="attr">xmlns</span><span class="kwrd">="http://java.sun.com/xml/ns/j2ee"</span></pre><pre class="alteven"><span class="lnum">   4:</span>     <span class="attr">xmlns:xsi</span><span class="kwrd">="http://www.w3.org/2001/XMLSchema-instance"</span></pre><pre class="alt"><span class="lnum">   5:</span>     <span class="attr">xsi:schemaLocation</span><span class="kwrd">="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"</span></pre><pre class="alteven"><span class="lnum">   6:</span>     <span class="attr">version</span><span class="kwrd">="2.4"</span><span class="kwrd">&gt;</span></pre><pre class="alt"><span class="lnum">   7:</span> <span class="kwrd">&lt;</span><span class="html">web-app</span><span class="kwrd">&gt;</span></pre></div></div>
<p><br>这是一般在写XML时所做的声明,定义了XML的版本，编码格式,还有重要的指明schema的来源,为<a href="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd</a>. 
<p><strong>&lt;description&gt;,&lt;display-name&gt;,&lt;icon&gt;</strong><br>____________________________________________ </p>
<p>&lt;description&gt;站台描述&lt;/discription&gt;<br>对站台做出描述. 
<p>&lt;display-name&gt;站台名称&lt;/display-name&gt;<br>定义站台的名称. 
<p>&lt;icon&gt;<br>icon元素包含small-icon和large-icon两个子元素.用来指定web站台中小图标和大图标的路径.<br>&lt;small-icon&gt;/路径/smallicon.gif&lt;/small-icon&gt;<br>small-icon元素应指向web站台中某个小图标的路径,大小为16 X 16 pixel,但是图象文件必须为GIF或JPEG格式,扩展名必须为:.gif或.jpg. 
<p>&lt;large-icon&gt;/路径/largeicon-jpg&lt;/large-icon&gt;<br>large-icon元素应指向web站台中某个大图表路径,大小为32 X 32 pixel,但是图象文件必须为GIF或JPEG的格式,扩展名必须为; gif<br>或jpg.<br>范例:</p>
<div class="csharpcode-wrapper">
<div class="csharpcode"><pre class="alt"><span class="lnum">   1:</span> <span class="kwrd">&lt;</span><span class="html">display-name</span><span class="kwrd">&gt;</span>Develop Example<span class="kwrd">&lt;/</span><span class="html">display-name</span><span class="kwrd">&gt;</span></pre><pre class="alteven"><span class="lnum">   2:</span> <span class="kwrd">&lt;</span><span class="html">description</span><span class="kwrd">&gt;</span>JSP 2.0 Tech Book's Examples<span class="kwrd">&lt;/</span><span class="html">description</span><span class="kwrd">&gt;</span></pre><pre class="alt"><span class="lnum">   3:</span> <span class="kwrd">&lt;</span><span class="html">icon</span><span class="kwrd">&gt;</span></pre><pre class="alteven"><span class="lnum">   4:</span>    <span class="kwrd">&lt;</span><span class="html">small-icon</span><span class="kwrd">&gt;</span>/images/small.gif<span class="kwrd">&lt;/</span><span class="html">small-icon</span><span class="kwrd">&gt;</span></pre><pre class="alt"><span class="lnum">   5:</span>    <span class="kwrd">&lt;</span><span class="html">large-icon</span><span class="kwrd">&gt;</span>/images/large.gir<span class="kwrd">&lt;/</span><span class="html">large-icon</span><span class="kwrd">&gt;</span></pre><pre class="alteven"><span class="lnum">   6:</span> <span class="kwrd">&lt;/</span><span class="html">icon</span><span class="kwrd">&gt;</span> </pre><pre class="alt"><span class="lnum">   7:</span>&nbsp; </pre><pre class="alteven"><span class="lnum">   8:</span> <span class="kwrd">&lt;</span><span class="html">distributable</span><span class="kwrd">&gt;</span></pre></div></div>
<p><strong></strong>&nbsp;</p>
<p><strong></strong>&nbsp;</p>
<p><strong></strong>&nbsp;</p>
<p><strong></strong>&nbsp;</p>
<p><strong>&lt;distributable&gt;</strong><br>______________________________________ <br>distributable 元素为空标签,它的存在与否可以指定站台是否可分布式处理.如果web.xml中出现这个元素,则代表站台在开发时已经<br>被设计为能在多个JSP Container 之间分散执行.<br>范例:</p>
<div class="csharpcode-wrapper">
<div class="csharpcode"><pre class="alt"><span class="lnum">   1:</span> <span class="kwrd">&lt;</span><span class="html">distributable</span><span class="kwrd">/&gt;</span> </pre></div></div>
<p>&nbsp; <p>&nbsp; <p>&nbsp; <p><strong>&lt;context-param&gt;</strong><br>___________________________________ 
<p>&lt;context-param&gt;<br>context-param 元素用来设定web站点的<u><strong>环境参数</strong></u>(context),它包含两个子元素:<br>param-name和param-value.<br>&lt;param-name&gt;参数名称&lt;/param-name&gt;<br>设定Context名称<br>&lt;param-value&gt;值&lt;/param-value&gt;<br>设定Context名称的值<br>&lt;/context-param&gt;<br>范例:</p>
<div class="csharpcode-wrapper">
<div class="csharpcode"><pre class="alt"><span class="lnum">   1:</span> <span class="kwrd">&lt;</span><span class="html">context-param</span><span class="kwrd">&gt;</span></pre><pre class="alteven"><span class="lnum">   2:</span>    <span class="kwrd">&lt;</span><span class="html">param-name</span><span class="kwrd">&gt;</span>param_name<span class="kwrd">&lt;/</span><span class="html">param-name</span><span class="kwrd">&gt;</span></pre><pre class="alt"><span class="lnum">   3:</span>    <span class="kwrd">&lt;</span><span class="html">param-value</span><span class="kwrd">&gt;</span>param_value<span class="kwrd">&lt;/</span><span class="html">param-value</span><span class="kwrd">&gt;</span></pre><pre class="alteven"><span class="lnum">   4:</span> <span class="kwrd">&lt;/</span><span class="html">context-param</span><span class="kwrd">&gt;</span></pre></div></div>
<p><br>此所设定的参数,<font color="#ff00ff">在JSP网页中可以使用下列方法来取得</font>:</p>
<div class="csharpcode-wrapper">
<div class="csharpcode"><pre class="alt"><span class="lnum">   1:</span> ${initParam.param_name}</pre></div></div>
<p><br>若在Servlet可以使用下列方法来获得:</p>
<div class="csharpcode-wrapper">
<div class="csharpcode"><pre class="alt"><span class="lnum">   1:</span> String param_name=getServletContext().getInitParamter("param_name"); </pre></div></div>
<p><strong></strong> 又如Spring framework在这里可以设置context参数</p>
<div class="csharpcode-wrapper">
<div class="csharpcode"><pre class="alt"><span class="lnum">   1:</span> <span class="rem">&lt;!-- spring的配置 --&gt;</span></pre><pre class="alteven"><span class="lnum">   2:</span> <span class="kwrd">&lt;</span><span class="html">context-param</span><span class="kwrd">&gt;</span></pre><pre class="alt"><span class="lnum">   3:</span>     <span class="kwrd">&lt;</span><span class="html">param-name</span><span class="kwrd">&gt;</span>contextConfigLocation<span class="kwrd">&lt;/</span><span class="html">param-name</span><span class="kwrd">&gt;</span></pre><pre class="alteven"><span class="lnum">   4:</span>     <span class="kwrd">&lt;</span><span class="html">param-value</span><span class="kwrd">&gt;</span>classpath:/SpringContext/applicationContext-web.xml</pre><pre class="alt"><span class="lnum">   5:</span>     <span class="kwrd">&lt;/</span><span class="html">param-value</span><span class="kwrd">&gt;</span></pre><pre class="alteven"><span class="lnum">   6:</span> <span class="kwrd">&lt;/</span><span class="html">context-param</span><span class="kwrd">&gt;</span></pre></div></div>
<p><strong></strong>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>&lt;filter&gt;<br></strong>_________________________________<br>filter元素用来声明filter的相关设定.filter元素除了下面介绍的的子元素之外,还包括&lt;servlet&gt;介绍过的&lt;icon&gt;,&lt;display-name&gt;<br>,&lt;description&gt;,&lt;init-param&gt;,其用途一样.<br>&lt;filter-name&gt;Filter的名称&lt;/filter-name&gt;<br>定义Filter的名称.<br>&lt;filter-class&gt;Filter的类名称&lt;/filter-class&gt;<br>定义Filter的类名称.例如:com.foo.hello<br><br>范例:</p>
<div class="csharpcode-wrapper">
<div class="csharpcode"><pre class="alt"><span class="lnum">   1:</span> <span class="kwrd">&lt;</span><span class="html">filter</span><span class="kwrd">&gt;</span></pre><pre class="alteven"><span class="lnum">   2:</span>   <span class="kwrd">&lt;</span><span class="html">filter-name</span><span class="kwrd">&gt;</span>setCharacterEncoding<span class="kwrd">&lt;/</span><span class="html">filter-name</span><span class="kwrd">&gt;</span></pre><pre class="alt"><span class="lnum">   3:</span>   <span class="kwrd">&lt;</span><span class="html">filter-class</span><span class="kwrd">&gt;</span>coreservlet.javaworld.CH11.SetCharacterEncodingFilter<span class="kwrd">&lt;/</span><span class="html">filter-class</span><span class="kwrd">&gt;</span></pre><pre class="alteven"><span class="lnum">   4:</span>   <span class="kwrd">&lt;</span><span class="html">init-param</span><span class="kwrd">&gt;</span></pre><pre class="alt"><span class="lnum">   5:</span>      <span class="kwrd">&lt;</span><span class="html">param-name</span><span class="kwrd">&gt;</span>encoding<span class="kwrd">&lt;/</span><span class="html">param-name</span><span class="kwrd">&gt;</span></pre><pre class="alteven"><span class="lnum">   6:</span>      <span class="kwrd">&lt;</span><span class="html">param-value</span><span class="kwrd">&gt;</span>GB2312<span class="kwrd">&lt;/</span><span class="html">param-value</span><span class="kwrd">&gt;</span></pre><pre class="alt"><span class="lnum">   7:</span>   <span class="kwrd">&lt;/</span><span class="html">init-param</span><span class="kwrd">&gt;</span></pre><pre class="alteven"><span class="lnum">   8:</span> <span class="kwrd">&lt;/</span><span class="html">filter</span><span class="kwrd">&gt;</span> </pre><pre class="alt"><span class="lnum">   9:</span>&nbsp; </pre><pre class="alteven"><span class="lnum">  10:</span> <span class="kwrd">&lt;</span><span class="html">filter-mapping</span><span class="kwrd">&gt;</span></pre></div></div>
<p>又如Struts2可以在这里设filter</p>
<div class="csharpcode-wrapper">
<div class="csharpcode"><pre class="alt"><span class="lnum">   1:</span> <span class="kwrd">&lt;</span><span class="html">filter</span><span class="kwrd">&gt;</span></pre><pre class="alteven"><span class="lnum">   2:</span>     <span class="kwrd">&lt;</span><span class="html">filter-name</span><span class="kwrd">&gt;</span>struts2<span class="kwrd">&lt;/</span><span class="html">filter-name</span><span class="kwrd">&gt;</span></pre><pre class="alt"><span class="lnum">   3:</span>     <span class="kwrd">&lt;</span><span class="html">filter-class</span><span class="kwrd">&gt;</span>org.apache.struts2.dispatcher.FilterDispatcher</pre><pre class="alteven"><span class="lnum">   4:</span>     <span class="kwrd">&lt;/</span><span class="html">filter-class</span><span class="kwrd">&gt;</span></pre><pre class="alt"><span class="lnum">   5:</span>     <span class="kwrd">&lt;</span><span class="html">init-param</span><span class="kwrd">&gt;</span></pre><pre class="alteven"><span class="lnum">   6:</span>         <span class="kwrd">&lt;</span><span class="html">param-name</span><span class="kwrd">&gt;</span>config<span class="kwrd">&lt;/</span><span class="html">param-name</span><span class="kwrd">&gt;</span></pre><pre class="alt"><span class="lnum">   7:</span>         <span class="kwrd">&lt;</span><span class="html">param-value</span><span class="kwrd">&gt;</span>struts-default.xml,struts-plugin.xml,struts/struts.xml<span class="kwrd">&lt;/</span><span class="html">param-value</span><span class="kwrd">&gt;</span></pre><pre class="alteven"><span class="lnum">   8:</span>     <span class="kwrd">&lt;/</span><span class="html">init-param</span><span class="kwrd">&gt;</span></pre><pre class="alt"><span class="lnum">   9:</span> <span class="kwrd">&lt;/</span><span class="html">filter</span><span class="kwrd">&gt;</span></pre><pre class="alteven"><span class="lnum">  10:</span>&nbsp; </pre><pre class="alt"><span class="lnum">  11:</span> <span class="kwrd">&lt;</span><span class="html">filter-mapping</span><span class="kwrd">&gt;</span></pre><pre class="alteven"><span class="lnum">  12:</span>     <span class="kwrd">&lt;</span><span class="html">filter-name</span><span class="kwrd">&gt;</span>struts2<span class="kwrd">&lt;/</span><span class="html">filter-name</span><span class="kwrd">&gt;</span></pre><pre class="alt"><span class="lnum">  13:</span>     <span class="kwrd">&lt;</span><span class="html">url-pattern</span><span class="kwrd">&gt;</span>*.do<span class="kwrd">&lt;/</span><span class="html">url-pattern</span><span class="kwrd">&gt;</span></pre><pre class="alteven"><span class="lnum">  14:</span> <span class="kwrd">&lt;/</span><span class="html">filter-mapping</span><span class="kwrd">&gt;</span></pre></div></div>
<p>&nbsp;</p>
<p><br><strong></strong>&nbsp;</p>
<p><strong>&lt;filter-mapping&gt;</strong></p>
<p><strong>______________________________________</strong><br><br>filter-mapping 元素的两个主要子元素filter-name和url-pattern.用来定义Filter所对应的URL.<br>&lt;filter-name&gt;Filter的名称&lt;/filter-name&gt;<br>定义Filter的名称.<br>&lt;url-pattern&gt;URL&lt;/url-pattern&gt;<br>Filter所对应的RUL.例如:&lt;url-pattern&gt;/Filter/Hello&lt;/url-pattern&gt; </p>
<p>&lt;servlet-name&gt;Servlet的名称&lt;servlet-name&gt;<br>定义servlet的名称.<br>&lt;dispatcher&gt;REQUEST|INCLUDE|FORWARD|ERROR&lt;/disaptcher&gt;<br>设定Filter对应的请求方式,有RQUEST,INCLUDE,FORWAR,ERROR四种,默认为REQUEST.<br>&lt;/filter-mapping&gt;<br>范例:</p>
<div class="csharpcode-wrapper">
<div class="csharpcode"><pre class="alt"><span class="lnum">   1:</span> <span class="kwrd">&lt;</span><span class="html">filter-mapping</span><span class="kwrd">&gt;</span></pre><pre class="alteven"><span class="lnum">   2:</span>    <span class="kwrd">&lt;</span><span class="html">filter-name</span><span class="kwrd">&gt;</span>GZIPEncoding<span class="kwrd">&lt;/</span><span class="html">filter-name</span><span class="kwrd">&gt;</span></pre><pre class="alt"><span class="lnum">   3:</span>    <span class="kwrd">&lt;</span><span class="html">url-pattern</span><span class="kwrd">&gt;</span>/*<span class="kwrd">&lt;/</span><span class="html">url-pattern</span><span class="kwrd">&gt;</span></pre><pre class="alteven"><span class="lnum">   4:</span> <span class="kwrd">&lt;/</span><span class="html">filter-mapping</span><span class="kwrd">&gt;</span> </pre></div></div>
<p>&nbsp; <p>&nbsp; <p>&nbsp; <p><strong>&lt;servlet&gt;</strong>
<p>___________________________________________
<p>&lt;servlet-name&gt;servlet的名称&lt;/servlet-name&gt;</p>
<p>&lt;display-name&gt;显示名称&lt;/display-name&gt;<br>&lt;servlet-class&gt;servlet对应的class名&lt;/servlet-class&gt;
<p>范例：</p>
<div class="csharpcode-wrapper">
<div class="csharpcode"><pre class="alt"><span class="lnum">   1:</span> <span class="kwrd">&lt;</span><span class="html">servlet</span><span class="kwrd">&gt;</span></pre><pre class="alteven"><span class="lnum">   2:</span>     <span class="kwrd">&lt;</span><span class="html">servlet-name</span><span class="kwrd">&gt;</span>org.apache.jsp.index_jsp<span class="kwrd">&lt;/</span><span class="html">servlet-name</span><span class="kwrd">&gt;</span></pre><pre class="alt"><span class="lnum">   3:</span>     <span class="kwrd">&lt;</span><span class="html">servlet-class</span><span class="kwrd">&gt;</span>org.apache.jsp.index_jsp<span class="kwrd">&lt;/</span><span class="html">servlet-class</span><span class="kwrd">&gt;</span></pre><pre class="alteven"><span class="lnum">   4:</span> <span class="kwrd">&lt;/</span><span class="html">servlet</span><span class="kwrd">&gt;</span></pre></div></div>
<p>&nbsp; <p>&nbsp; <p>&nbsp; <p><strong>&lt;servlet-mapping&gt;</strong><br>_____________________________________________<br>servlet-mapping元素包含两个子元素servlet-name和url-pattern.用来定义servlet所对应URL.<br>&lt;servlet-name&gt;Servlet的名称&lt;/servlet-name&gt;<br>定义Servlet的名称.<br>&lt;url-pattern&gt;Servlet URL&lt;/url-pattern&gt;<br>定义Servlet所对应的RUL.例如:&lt;url-pattern&gt;/Servlet/Hello&lt;/url-pattern&gt;<br>&lt;/servlet-mapping&gt;<br>范例:</p>
<div class="csharpcode-wrapper">
<div class="csharpcode"><pre class="alt"><span class="lnum">   1:</span> <span class="kwrd">&lt;</span><span class="html">servlet-mapping</span><span class="kwrd">&gt;</span></pre><pre class="alteven"><span class="lnum">   2:</span>    <span class="kwrd">&lt;</span><span class="html">servlet-name</span><span class="kwrd">&gt;</span>LoginChecker<span class="kwrd">&lt;/</span><span class="html">servlet-name</span><span class="kwrd">&gt;</span></pre><pre class="alt"><span class="lnum">   3:</span>    <span class="kwrd">&lt;</span><span class="html">url-pattern</span><span class="kwrd">&gt;</span>/LoginChecker<span class="kwrd">&lt;/</span><span class="html">url-pattern</span><span class="kwrd">&gt;</span></pre><pre class="alteven"><span class="lnum">   4:</span> <span class="kwrd">&lt;/</span><span class="html">servlet-mapping</span><span class="kwrd">&gt;</span> </pre></div></div>
<p>&nbsp; <p>&nbsp; <p>&nbsp; <p><strong>&lt;listener&gt;</strong><br>___________________________________________<br>&lt;listener&gt;<br>listener元素用来定义Listener接口,它的主要子元素为&lt;listener-class&gt;<br>&lt;listen-class&gt;Listener的类名称&lt;/listener-class&gt;<br>定义Listener的类名称.例如: com.foo.hello<br>&lt;listener&gt;<br>范例:</p>
<div class="csharpcode-wrapper">
<div class="csharpcode"><pre class="alt"><span class="lnum">   1:</span> <span class="kwrd">&lt;</span><span class="html">listener</span><span class="kwrd">&gt;</span></pre><pre class="alteven"><span class="lnum">   2:</span>   <span class="kwrd">&lt;</span><span class="html">listener-class</span><span class="kwrd">&gt;</span>coreservlet.javaworld.CH11.ContenxtListener<span class="kwrd">&lt;/</span><span class="html">listener-class</span><span class="kwrd">&gt;</span></pre><pre class="alt"><span class="lnum">   3:</span> <span class="kwrd">&lt;/</span><span class="html">listener</span><span class="kwrd">&gt;</span> </pre></div></div>
<p>又如Spring framework可以在这里设listener</p>
<div class="csharpcode-wrapper">
<div class="csharpcode"><pre class="alt"><span class="lnum">   1:</span> <span class="kwrd">&lt;</span><span class="html">listener</span><span class="kwrd">&gt;</span></pre><pre class="alteven"><span class="lnum">   2:</span>     <span class="kwrd">&lt;</span><span class="html">listener-class</span><span class="kwrd">&gt;</span>org.springframework.web.context.ContextLoaderListener<span class="kwrd">&lt;/</span><span class="html">listener-class</span><span class="kwrd">&gt;</span></pre><pre class="alt"><span class="lnum">   3:</span> <span class="kwrd">&lt;/</span><span class="html">listener</span><span class="kwrd">&gt;</span></pre></div></div>
<p>&nbsp; <p>&nbsp; <p>&nbsp; <p><strong>&lt;session-cofing&gt;</strong><br>__________________________________<br>&lt;session-config&gt;<br>session-config包含一个子元素session-timeout.定义web站台中的session参数.<br>&lt;session-timeout&gt;分钟&lt;/session-timeout&gt;<br>定义这个web站台所有session的有效期限.单位为分钟.<br>&lt;/session-config&gt;<br>范例:</p>
<div class="csharpcode-wrapper">
<div class="csharpcode"><pre class="alt"><span class="lnum">   1:</span> <span class="kwrd">&lt;</span><span class="html">session-config</span><span class="kwrd">&gt;</span></pre><pre class="alteven"><span class="lnum">   2:</span>    <span class="kwrd">&lt;</span><span class="html">session-timeout</span><span class="kwrd">&gt;</span>20<span class="kwrd">&lt;/</span><span class="html">session-timeout</span><span class="kwrd">&gt;</span></pre><pre class="alt"><span class="lnum">   3:</span> <span class="kwrd">&lt;/</span><span class="html">session-config</span><span class="kwrd">&gt;</span> </pre></div></div>
<p><br>&nbsp; <p>&nbsp; <p>&nbsp; <p><strong>&lt;mime-mapping&gt;</strong><br>___________________________________________________<br>&lt;mima-mapping&gt;<br>mime-mapping包含两个子元素extension和mime-type.定义某一个扩展名和某一MIME Type做对映.<br>&lt;extension&gt;扩展名名称&lt;/extension&gt;<br>扩展名称<br>&lt;mime-type&gt;MIME格式&lt;/mime-type&gt;<br>MIME格式.<br>&lt;/mime-mapping&gt;<br>范例:</p>
<div class="csharpcode-wrapper">
<div class="csharpcode"><pre class="alt"><span class="lnum">   1:</span> <span class="kwrd">&lt;</span><span class="html">mime-mapping</span><span class="kwrd">&gt;</span></pre><pre class="alteven"><span class="lnum">   2:</span>    <span class="kwrd">&lt;</span><span class="html">extension</span><span class="kwrd">&gt;</span>doc<span class="kwrd">&lt;/</span><span class="html">extension</span><span class="kwrd">&gt;</span></pre><pre class="alt"><span class="lnum">   3:</span>    <span class="kwrd">&lt;</span><span class="html">mime-type</span><span class="kwrd">&gt;</span>application/vnd.ms-word<span class="kwrd">&lt;/</span><span class="html">mime-type</span><span class="kwrd">&gt;</span></pre><pre class="alteven"><span class="lnum">   4:</span> <span class="kwrd">&lt;/</span><span class="html">mime-mapping</span><span class="kwrd">&gt;</span></pre><pre class="alt"><span class="lnum">   5:</span> <span class="kwrd">&lt;</span><span class="html">mime-mapping</span><span class="kwrd">&gt;</span></pre><pre class="alteven"><span class="lnum">   6:</span>    <span class="kwrd">&lt;</span><span class="html">extension</span><span class="kwrd">&gt;</span>xls<span class="kwrd">&lt;/</span><span class="html">extension</span><span class="kwrd">&gt;</span></pre><pre class="alt"><span class="lnum">   7:</span>    <span class="kwrd">&lt;</span><span class="html">mime-type</span><span class="kwrd">&gt;</span>application/vnd.ms-excel<span class="kwrd">&lt;/</span><span class="html">mime-type</span><span class="kwrd">&gt;</span></pre><pre class="alteven"><span class="lnum">   8:</span> <span class="kwrd">&lt;/</span><span class="html">mime-mapping</span><span class="kwrd">&gt;</span></pre><pre class="alt"><span class="lnum">   9:</span> <span class="kwrd">&lt;</span><span class="html">mime-mapping</span><span class="kwrd">&gt;</span></pre><pre class="alteven"><span class="lnum">  10:</span>    <span class="kwrd">&lt;</span><span class="html">extension</span><span class="kwrd">&gt;</span>ppt<span class="kwrd">&lt;/</span><span class="html">extesnion</span><span class="kwrd">&gt;</span></pre><pre class="alt"><span class="lnum">  11:</span>    <span class="kwrd">&lt;</span><span class="html">mime-type</span><span class="kwrd">&gt;</span>application/vnd.ms-powerpoint<span class="kwrd">&lt;/</span><span class="html">mime-type</span><span class="kwrd">&gt;</span></pre><pre class="alteven"><span class="lnum">  12:</span> <span class="kwrd">&lt;/</span><span class="html">mime-mapping</span><span class="kwrd">&gt;</span> </pre></div></div>
<p>&nbsp; <p>&nbsp; <p>&nbsp; <p><strong>&lt;welcome-file-list&gt;</strong><br>_____________________________________________<br>&lt;welcome-file-list&gt;<br>welcome-file-list包含一个子元素welcome-file.用来定义首页列单.<br>&lt;welcome-file&gt;用来指定首页文件名称&lt;/welcome-flie&gt;<br>welcome-file用来指定首页文件名称.我们可以用&lt;welcome-file&gt;指定几个首页,而服务器会依照设定的顺序来找首页.<br>范例:</p>
<div class="csharpcode-wrapper">
<div class="csharpcode"><pre class="alt"><span class="lnum">   1:</span> <span class="kwrd">&lt;</span><span class="html">welcome-file-list</span><span class="kwrd">&gt;</span></pre><pre class="alteven"><span class="lnum">   2:</span>   <span class="kwrd">&lt;</span><span class="html">welcome-file</span><span class="kwrd">&gt;</span>index.jsp<span class="kwrd">&lt;/</span><span class="html">welcome-file</span><span class="kwrd">&gt;</span></pre><pre class="alt"><span class="lnum">   3:</span>   <span class="kwrd">&lt;</span><span class="html">welcome-file</span><span class="kwrd">&gt;</span>index.htm<span class="kwrd">&lt;/</span><span class="html">welcome-file</span><span class="kwrd">&gt;</span></pre><pre class="alteven"><span class="lnum">   4:</span> <span class="kwrd">&lt;/</span><span class="html">welcome-file-list</span><span class="kwrd">&gt;</span> </pre></div></div>
<p>&nbsp; <p>&nbsp; <p>&nbsp; <p><strong>&lt;error-page&gt;</strong><br>_________________________<br>&lt;error-page&gt;<br>error-page元素包含三个子元素error-code,exception-type和location.将错误代码(Error Code)或异常(Exception)的种类对应<br>到web站台资源路径.<br>&lt;error-code&gt;错误代码&lt;/error-code&gt;<br>HTTP Error code,例如: 404<br>&lt;exception-type&gt;Exception&lt;/exception-type&gt;<br>一个完整名称的Java异常类型<br>&lt;location&gt;/路径&lt;/location&gt;<br>在web站台内的相关资源路径<br>&lt;/error-page&gt;<br>范例:</p>
<div class="csharpcode-wrapper">
<div class="csharpcode"><pre class="alt"><span class="lnum">   1:</span> <span class="kwrd">&lt;</span><span class="html">error-page</span><span class="kwrd">&gt;</span></pre><pre class="alteven"><span class="lnum">   2:</span>    <span class="kwrd">&lt;</span><span class="html">error-code</span><span class="kwrd">&gt;</span>404<span class="kwrd">&lt;/</span><span class="html">error-code</span><span class="kwrd">&gt;</span></pre><pre class="alt"><span class="lnum">   3:</span>    <span class="kwrd">&lt;</span><span class="html">location</span><span class="kwrd">&gt;</span>/error404.jsp<span class="kwrd">&lt;/</span><span class="html">location</span><span class="kwrd">&gt;</span></pre><pre class="alteven"><span class="lnum">   4:</span> <span class="kwrd">&lt;/</span><span class="html">error-page</span><span class="kwrd">&gt;</span></pre><pre class="alt"><span class="lnum">   5:</span> <span class="kwrd">&lt;</span><span class="html">error-page</span><span class="kwrd">&gt;</span></pre><pre class="alteven"><span class="lnum">   6:</span>    <span class="kwrd">&lt;</span><span class="html">exception-type</span><span class="kwrd">&gt;</span>java.lang.Exception<span class="kwrd">&lt;/</span><span class="html">exception-type</span><span class="kwrd">&gt;</span></pre><pre class="alt"><span class="lnum">   7:</span>    <span class="kwrd">&lt;</span><span class="html">location</span><span class="kwrd">&gt;</span>/except.jsp<span class="kwrd">&lt;/</span><span class="html">location</span><span class="kwrd">&gt;</span></pre><pre class="alteven"><span class="lnum">   8:</span> <span class="kwrd">&lt;/</span><span class="html">error-page</span><span class="kwrd">&gt;</span> </pre></div></div>
<p>&nbsp; <p>&nbsp; <p>&nbsp; <p><strong>&lt;jsp-config&gt;</strong><br>_______________________________________________<br>&lt;jsp-config&gt;<br>jsp-config元素主要用来设定JSP的相关配置,&lt;jsp:config&gt;包括&lt;taglib&gt;和&lt;jsp-property-group&gt;两个子元素.其中&lt;taglib&gt;元素<br>在JSP 1.2时就已经存在了;而&lt;jsp-property-group&gt;是JSP 2.0新增的元素. 
<p>&lt;taglib&gt;<br>taglib元素包含两个子元素taglib-uri和taglib-location.用来设定JSP网页用到的Tag Library路径.<br>&lt;taglib-uri&gt;URI&lt;/taglib-uri&gt;<br>&nbsp;&nbsp; taglib-uri定义TLD文件的URI,JSP网页的taglib指令可以经由这个URI存取到TLD文件.<br>&lt;taglib-location&gt;/WEB-INF/lib/xxx.tld&lt;/taglib-laction&gt;<br>&nbsp;&nbsp; TLD文件对应Web站台的存放位置.<br>&lt;/taglib&gt; 
<p>&lt;jsp-property-group&gt;<br>jsp-property-group元素包含8个元素,分别为:<br>&lt;description&gt;Description&lt;/descrition&gt;<br>此设定的说明 
<p>&lt;display-name&gt;Name&lt;/display-name&gt;<br>此设定的名称 
<p>&lt;url-pattern&gt;URL&lt;/url-pattern&gt;<br>设定值所影响的范围,如:/CH2 或者/*.jsp 
<p>&lt;el-ignored&gt;true|false&lt;/el-ignored&gt;<br>若为true,表示不支持EL语法. 
<p>&lt;scripting-invalid&gt;true|false&lt;/scripting-invalid&gt;<br>若为true表示不支持&lt;%scription%&gt;语法. 
<p>&lt;page-encoding&gt;encoding&lt;/page-encoding&gt;<br>设定JSP网页的编码 
<p>&lt;include-prelude&gt;.jspf&lt;/include-prelude&gt;<br>设置JSP网页的抬头,扩展名为.jspf 
<p>&lt;include-coda&gt;.jspf&lt;/include-coda&gt;<br>设置JSP网页的结尾,扩展名为.jspf<br>&lt;/jsp-property-group&gt;<br>&lt;/jsp-config&gt;<br>范例:</p>
<div class="csharpcode-wrapper">
<div class="csharpcode"><pre class="alt"><span class="lnum">   1:</span> <span class="kwrd">&lt;</span><span class="html">jsp-config</span><span class="kwrd">&gt;</span></pre><pre class="alteven"><span class="lnum">   2:</span> <span class="kwrd">&lt;</span><span class="html">taglib</span><span class="kwrd">&gt;</span></pre><pre class="alt"><span class="lnum">   3:</span>    <span class="kwrd">&lt;</span><span class="html">taglib-uri</span><span class="kwrd">&gt;</span>Taglib<span class="kwrd">&lt;/</span><span class="html">taglib-uri</span><span class="kwrd">&gt;</span></pre><pre class="alteven"><span class="lnum">   4:</span>    <span class="kwrd">&lt;</span><span class="html">taglib-location</span><span class="kwrd">&gt;</span>/WEB-INF/tlds/MyTaglib.tld<span class="kwrd">&lt;/</span><span class="html">taglib-location</span><span class="kwrd">&gt;</span></pre><pre class="alt"><span class="lnum">   5:</span> <span class="kwrd">&lt;/</span><span class="html">taglib</span><span class="kwrd">&gt;</span></pre><pre class="alteven"><span class="lnum">   6:</span> <span class="kwrd">&lt;</span><span class="html">jsp-property-group</span><span class="kwrd">&gt;</span></pre><pre class="alt"><span class="lnum">   7:</span>    <span class="kwrd">&lt;</span><span class="html">description</span><span class="kwrd">&gt;</span></pre><pre class="alteven"><span class="lnum">   8:</span>       Special property group for JSP Configuration JSP example.</pre><pre class="alt"><span class="lnum">   9:</span>    <span class="kwrd">&lt;/</span><span class="html">description</span><span class="kwrd">&gt;</span></pre><pre class="alteven"><span class="lnum">  10:</span>    <span class="kwrd">&lt;</span><span class="html">display-name</span><span class="kwrd">&gt;</span>JSPConfiguration<span class="kwrd">&lt;/</span><span class="html">display-name</span><span class="kwrd">&gt;</span></pre><pre class="alt"><span class="lnum">  11:</span>    <span class="kwrd">&lt;</span><span class="html">uri-pattern</span><span class="kwrd">&gt;</span>/*<span class="kwrd">&lt;/</span><span class="html">uri-pattern</span><span class="kwrd">&gt;</span></pre><pre class="alteven"><span class="lnum">  12:</span>    <span class="kwrd">&lt;</span><span class="html">el-ignored</span><span class="kwrd">&gt;</span>true<span class="kwrd">&lt;/</span><span class="html">el-ignored</span><span class="kwrd">&gt;</span></pre><pre class="alt"><span class="lnum">  13:</span>    <span class="kwrd">&lt;</span><span class="html">page-encoding</span><span class="kwrd">&gt;</span>GB2312<span class="kwrd">&lt;/</span><span class="html">page-encoding</span><span class="kwrd">&gt;</span></pre><pre class="alteven"><span class="lnum">  14:</span>    <span class="kwrd">&lt;</span><span class="html">scripting-inivalid</span><span class="kwrd">&gt;</span>true<span class="kwrd">&lt;/</span><span class="html">scripting-inivalid</span><span class="kwrd">&gt;</span></pre><pre class="alt"><span class="lnum">  15:</span>    ............</pre><pre class="alteven"><span class="lnum">  16:</span> <span class="kwrd">&lt;/</span><span class="html">jsp-property-group</span><span class="kwrd">&gt;</span></pre><pre class="alt"><span class="lnum">  17:</span> <span class="kwrd">&lt;/</span><span class="html">jsp-config</span><span class="kwrd">&gt;</span> </pre></div></div>
<p>&nbsp; <p>&nbsp; <p>&nbsp; <p><strong>&lt;resource-ref&gt;</strong><br>________________________________________________<br>&lt;resource-ref&gt;<br>resource-ref元素包括五个子元素description,res-ref-name,res-type,res-auth,res-sharing-scope.利用JNDI取得站点可<br>利用资源.<br>&lt;description&gt;说明&lt;/description&gt;<br>资源说明 
<p>&lt;rec-ref-name&gt;资源名称&lt;/rec-ref-name&gt;<br>资源名称 
<p>&lt;res-type&gt;资源种类&lt;/res-type&gt;<br>资源种类 
<p>&lt;res-auth&gt;Application|Container&lt;/res-auth&gt;<br>资源由Application或Container来许可 
<p>&lt;res-sharing-scope&gt;Shareable|Unshareable&lt;/res-sharing-scope&gt;<br>资源是否可以共享.默认值为 Shareable<br>范例:</p>
<div class="csharpcode-wrapper">
<div class="csharpcode"><pre class="alt"><span class="lnum">   1:</span> <span class="kwrd">&lt;</span><span class="html">resource-ref</span><span class="kwrd">&gt;</span></pre><pre class="alteven"><span class="lnum">   2:</span>    <span class="kwrd">&lt;</span><span class="html">description</span><span class="kwrd">&gt;</span>JNDI JDBC DataSource of JSPBook<span class="kwrd">&lt;/</span><span class="html">description</span><span class="kwrd">&gt;</span></pre><pre class="alt"><span class="lnum">   3:</span>    <span class="kwrd">&lt;</span><span class="html">res-ref-name</span><span class="kwrd">&gt;</span>jdbc/sample_db<span class="kwrd">&lt;/</span><span class="html">res-ref-name</span><span class="kwrd">&gt;</span></pre><pre class="alteven"><span class="lnum">   4:</span>    <span class="kwrd">&lt;</span><span class="html">res-type</span><span class="kwrd">&gt;</span>javax.sql.DataSoruce<span class="kwrd">&lt;/</span><span class="html">res-type</span><span class="kwrd">&gt;</span></pre><pre class="alt"><span class="lnum">   5:</span>    <span class="kwrd">&lt;</span><span class="html">res-auth</span><span class="kwrd">&gt;</span>Container<span class="kwrd">&lt;/</span><span class="html">res-auth</span><span class="kwrd">&gt;</span></pre><pre class="alteven"><span class="lnum">   6:</span> <span class="kwrd">&lt;/</span><span class="html">resource-ref</span><span class="kwrd">&gt;</span> </pre></div></div>
<p>这些都是些比较常用的,详细可以登录: <a href="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd</a> 
<p><a href="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"></a></p><img src ="http://www.blogjava.net/charles/aggbug/248402.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/charles/" target="_blank">suprasoft Inc,.</a> 2008-12-26 11:34 <a href="http://www.blogjava.net/charles/archive/2008/12/26/248402.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>POJO2VO</title><link>http://www.blogjava.net/charles/archive/2008/12/25/248329.html</link><dc:creator>suprasoft Inc,.</dc:creator><author>suprasoft Inc,.</author><pubDate>Thu, 25 Dec 2008 12:13:00 GMT</pubDate><guid>http://www.blogjava.net/charles/archive/2008/12/25/248329.html</guid><wfw:comment>http://www.blogjava.net/charles/comments/248329.html</wfw:comment><comments>http://www.blogjava.net/charles/archive/2008/12/25/248329.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/charles/comments/commentRss/248329.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/charles/services/trackbacks/248329.html</trackback:ping><description><![CDATA[<p>最近用Flex做UI,但是和业务层不好结合，特地写了个业务BO转VO的class</p> <p>只需要指定需要生成的目录，就可以批量将*BO.java转换为*VO.as</p> <p>代码如下：</p> <div class="csharpcode-wrapper"> <div class="csharpcode"><pre class="alt"><span class="lnum">   1:</span> <span class="rem">/**</span></pre><pre class="alteven"><span class="lnum">   2:</span> <span class="rem"> * </span></pre><pre class="alt"><span class="lnum">   3:</span> <span class="rem"> */</span></pre><pre class="alteven"><span class="lnum">   4:</span> package com.suprasoft.utils.flex;</pre><pre class="alt"><span class="lnum">   5:</span>&nbsp; </pre><pre class="alteven"><span class="lnum">   6:</span> <span class="rem">/**</span></pre><pre class="alt"><span class="lnum">   7:</span> <span class="rem"> * @作者 Charles <span style="color: #0000ff">&lt;</span><span style="color: #800000">chio.yang</span>@gmail.com<span style="color: #0000ff">&gt;</span> Suprasoft Inc.,</span></pre><pre class="alteven"><span class="lnum">   8:</span> <span class="rem"> * </span></pre><pre class="alt"><span class="lnum">   9:</span> <span class="rem"> * 2008-12-25</span></pre><pre class="alteven"><span class="lnum">  10:</span> <span class="rem"> */</span></pre><pre class="alt"><span class="lnum">  11:</span>&nbsp; </pre><pre class="alteven"><span class="lnum">  12:</span> import java.io.BufferedWriter;</pre><pre class="alt"><span class="lnum">  13:</span> import java.io.File;</pre><pre class="alteven"><span class="lnum">  14:</span> import java.io.FileWriter;</pre><pre class="alt"><span class="lnum">  15:</span> import java.io.IOException;</pre><pre class="alteven"><span class="lnum">  16:</span> import java.lang.reflect.Field;</pre><pre class="alt"><span class="lnum">  17:</span>&nbsp; </pre><pre class="alteven"><span class="lnum">  18:</span> import org.apache.commons.lang.StringUtils;</pre><pre class="alt"><span class="lnum">  19:</span>&nbsp; </pre><pre class="alteven"><span class="lnum">  20:</span> <span class="kwrd">public</span> <span class="kwrd">class</span> POJO2VO {</pre><pre class="alt"><span class="lnum">  21:</span>     <span class="kwrd">public</span> POJO2VO() {</pre><pre class="alteven"><span class="lnum">  22:</span>     }</pre><pre class="alt"><span class="lnum">  23:</span>&nbsp; </pre><pre class="alteven"><span class="lnum">  24:</span>     <span class="kwrd">public</span> <span class="kwrd">static</span> String getClassType(Class c) {</pre><pre class="alt"><span class="lnum">  25:</span>         String typeName = c.getSimpleName();</pre><pre class="alteven"><span class="lnum">  26:</span> <span class="rem">//        System.out.println("typename " + typeName);</span></pre><pre class="alt"><span class="lnum">  27:</span>         <span class="rem">// 数值型的都转成Number</span></pre><pre class="alteven"><span class="lnum">  28:</span>         <span class="kwrd">if</span> (typeName.equals(<span class="str">"BigDecimal"</span>) || typeName.equals(<span class="str">"Decimal"</span>)</pre><pre class="alt"><span class="lnum">  29:</span>                 || typeName.equals(<span class="str">"Double"</span>) || typeName.equals(<span class="str">"int"</span>)</pre><pre class="alteven"><span class="lnum">  30:</span>                 || typeName.equals(<span class="str">"Integer"</span>) || typeName.equals(<span class="str">"Long"</span>)</pre><pre class="alt"><span class="lnum">  31:</span>                 || typeName.equals(<span class="str">"long"</span>)) {</pre><pre class="alteven"><span class="lnum">  32:</span>             <span class="kwrd">return</span> <span class="str">"Number"</span>;</pre><pre class="alt"><span class="lnum">  33:</span>         } <span class="kwrd">else</span> <span class="kwrd">if</span> (typeName.equals(<span class="str">"Boolean"</span>)) {</pre><pre class="alteven"><span class="lnum">  34:</span>             <span class="kwrd">return</span> <span class="str">"boolean"</span>;</pre><pre class="alt"><span class="lnum">  35:</span>         } <span class="kwrd">else</span> <span class="kwrd">if</span> (typeName.equals(<span class="str">"Set"</span>)) {</pre><pre class="alteven"><span class="lnum">  36:</span>             <span class="kwrd">return</span> <span class="str">"Array"</span>;</pre><pre class="alt"><span class="lnum">  37:</span>         } <span class="kwrd">else</span> {</pre><pre class="alteven"><span class="lnum">  38:</span>             <span class="kwrd">if</span> (isBasicType(typeName)) {</pre><pre class="alt"><span class="lnum">  39:</span>                 <span class="kwrd">return</span> typeName;<span class="rem">// 其它类型的设置为未知类型</span></pre><pre class="alteven"><span class="lnum">  40:</span>             } <span class="kwrd">else</span> {</pre><pre class="alt"><span class="lnum">  41:</span>                 <span class="kwrd">return</span> typeName + <span class="str">"VO"</span>;<span class="rem">// 自定义类型的，加上VO结尾</span></pre><pre class="alteven"><span class="lnum">  42:</span>             }</pre><pre class="alt"><span class="lnum">  43:</span>         }</pre><pre class="alteven"><span class="lnum">  44:</span>&nbsp; </pre><pre class="alt"><span class="lnum">  45:</span>     }</pre><pre class="alteven"><span class="lnum">  46:</span>&nbsp; </pre><pre class="alt"><span class="lnum">  47:</span>     <span class="rem">// 是否基本的数据类型</span></pre><pre class="alteven"><span class="lnum">  48:</span>     <span class="kwrd">public</span> <span class="kwrd">static</span> boolean isBasicType(String type) {</pre><pre class="alt"><span class="lnum">  49:</span>         <span class="kwrd">return</span> type.equals(<span class="str">"String"</span>) || type.equals(<span class="str">"BigDecimal"</span>)</pre><pre class="alteven"><span class="lnum">  50:</span>                 || type.equals(<span class="str">"Decimal"</span>) || type.equals(<span class="str">"Double"</span>)</pre><pre class="alt"><span class="lnum">  51:</span>                 || type.equals(<span class="str">"int"</span>) || type.equals(<span class="str">"Integer"</span>)</pre><pre class="alteven"><span class="lnum">  52:</span>                 || type.equals(<span class="str">"Boolean"</span>) || type.equals(<span class="str">"Set"</span>)</pre><pre class="alt"><span class="lnum">  53:</span>                 || type.equals(<span class="str">"Long"</span>) || type.equals(<span class="str">"long"</span>)</pre><pre class="alteven"><span class="lnum">  54:</span>                 || type.equals(<span class="str">"Date"</span>);</pre><pre class="alt"><span class="lnum">  55:</span>     }</pre><pre class="alteven"><span class="lnum">  56:</span>&nbsp; </pre><pre class="alt"><span class="lnum">  57:</span>     <span class="kwrd">public</span> <span class="kwrd">static</span> String repeat(String c, <span class="kwrd">int</span> count) {</pre><pre class="alteven"><span class="lnum">  58:</span>         String temp = <span class="str">""</span>;</pre><pre class="alt"><span class="lnum">  59:</span>         <span class="kwrd">for</span> (<span class="kwrd">int</span> i = 0; i &lt; count; i++) {</pre><pre class="alteven"><span class="lnum">  60:</span>             temp += c;</pre><pre class="alt"><span class="lnum">  61:</span>         }</pre><pre class="alteven"><span class="lnum">  62:</span>&nbsp; </pre><pre class="alt"><span class="lnum">  63:</span>         <span class="kwrd">return</span> temp;</pre><pre class="alteven"><span class="lnum">  64:</span>     }</pre><pre class="alt"><span class="lnum">  65:</span>     </pre><pre class="alteven"><span class="lnum">  66:</span>     <span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">void</span> makeDirByPackageName(String rootFolder, String packageName) {</pre><pre class="alt"><span class="lnum">  67:</span>&nbsp; </pre><pre class="alteven"><span class="lnum">  68:</span>         File folder = <span class="kwrd">new</span> File(rootFolder + <span class="str">"\\" + packageName.replace("</span>.<span class="str">", "</span>\\<span class="str">"));</pre><pre class="alt"><span class="lnum">  69:</span>         if(!folder.exists()) {</pre><pre class="alteven"><span class="lnum">  70:</span>             folder.mkdirs();</pre><pre class="alt"><span class="lnum">  71:</span>         }</pre><pre class="alteven"><span class="lnum">  72:</span>     }</pre><pre class="alt"><span class="lnum">  73:</span>     </pre><pre class="alteven"><span class="lnum">  74:</span>     public static void generateAsFiles(String pojoQualifiedName ){</pre><pre class="alt"><span class="lnum">  75:</span>         </pre><pre class="alteven"><span class="lnum">  76:</span>     }</pre><pre class="alt"><span class="lnum">  77:</span>&nbsp; </pre><pre class="alteven"><span class="lnum">  78:</span>     /**</pre><pre class="alt"><span class="lnum">  79:</span>      * 生成as文件</pre><pre class="alteven"><span class="lnum">  80:</span>      * </pre><pre class="alt"><span class="lnum">  81:</span>      * @param pojoQualifiedName</pre><pre class="alteven"><span class="lnum">  82:</span>      * @param voPackageName</pre><pre class="alt"><span class="lnum">  83:</span>      * @param folders</pre><pre class="alteven"><span class="lnum">  84:</span>      * @throws ClassNotFoundException</pre><pre class="alt"><span class="lnum">  85:</span>      * @throws IOException</pre><pre class="alteven"><span class="lnum">  86:</span>      */</pre><pre class="alt"><span class="lnum">  87:</span>     public static void generateAsFile(String pojoQualifiedName, String voPackageRootFolder, String voPackageName) throws ClassNotFoundException, IOException {</pre><pre class="alteven"><span class="lnum">  88:</span>         //pojoName必须带包名的Qualified Name</pre><pre class="alt"><span class="lnum">  89:</span>         Class c = Class.forName(pojoQualifiedName);</pre><pre class="alteven"><span class="lnum">  90:</span>         Field[] fields = c.getDeclaredFields();</pre><pre class="alt"><span class="lnum">  91:</span>&nbsp; </pre><pre class="alteven"><span class="lnum">  92:</span>         POJO2VO.makeDirByPackageName(voPackageRootFolder, voPackageName);</pre><pre class="alt"><span class="lnum">  93:</span>         // as的vo对象名称结尾加上VO标志</pre><pre class="alteven"><span class="lnum">  94:</span>         File f = new File(voPackageRootFolder + "</span>\\<span class="str">" </pre><pre class="alt"><span class="lnum">  95:</span>                         + voPackageName.replace("</span>.<span class="str">", "</span>\\<span class="str">") + "</span>\\<span class="str">"</pre><pre class="alteven"><span class="lnum">  96:</span>                         + c.getSimpleName().replace("</span>BO<span class="str">", "</span>VO<span class="str">") + "</span>.<span class="kwrd">as</span><span class="str">");</pre><pre class="alt"><span class="lnum">  97:</span>         </pre><pre class="alteven"><span class="lnum">  98:</span>         BufferedWriter bw = new BufferedWriter(new FileWriter(f));</pre><pre class="alt"><span class="lnum">  99:</span>         // 包名，没有设置包名就取和java pojo一样的包名</pre><pre class="alteven"><span class="lnum"> 100:</span>         if (StringUtils.isEmpty(voPackageName)) {</pre><pre class="alt"><span class="lnum"> 101:</span>             bw.write("</span>package <span class="str">" + c.getPackage().getName() + "</span>\n{\n<span class="str">");</pre><pre class="alteven"><span class="lnum"> 102:</span>         } else {</pre><pre class="alt"><span class="lnum"> 103:</span>             bw.write("</span>package <span class="str">" + voPackageName + "</span>\n{\n<span class="str">");</pre><pre class="alteven"><span class="lnum"> 104:</span>         }</pre><pre class="alt"><span class="lnum"> 105:</span>&nbsp; </pre><pre class="alteven"><span class="lnum"> 106:</span>         // 写类</pre><pre class="alt"><span class="lnum"> 107:</span>         bw.write(repeat("</span> <span class="str">", 4) + "</span><span class="kwrd">public</span> <span class="kwrd">class</span> <span class="str">" + c.getSimpleName().replace("</span>BO<span class="str">", "</span>VO<span class="str">") + "</span>\n<span class="str">");</pre><pre class="alteven"><span class="lnum"> 108:</span>         bw.write(repeat("</span> <span class="str">", 4) + "</span>{\n<span class="str">");</pre><pre class="alt"><span class="lnum"> 109:</span>&nbsp; </pre><pre class="alteven"><span class="lnum"> 110:</span>         // 写属性</pre><pre class="alt"><span class="lnum"> 111:</span>         for (int i = 0; i &lt; fields.length; i++) {</pre><pre class="alteven"><span class="lnum"> 112:</span>             Class fieldType = fields[i].getType();</pre><pre class="alt"><span class="lnum"> 113:</span>             String typeName = getClassType(fieldType);</pre><pre class="alteven"><span class="lnum"> 114:</span>             bw.write(repeat("</span> <span class="str">", 8) + "</span><span class="kwrd">private</span> var _<span class="str">" + fields[i].getName()</pre><pre class="alt"><span class="lnum"> 115:</span>                     + "</span>:<span class="str">" + typeName + "</span>;\n<span class="str">");</pre><pre class="alteven"><span class="lnum"> 116:</span>         }</pre><pre class="alt"><span class="lnum"> 117:</span>&nbsp; </pre><pre class="alteven"><span class="lnum"> 118:</span>         bw.write("</span>\n\n\n<span class="str">");</pre><pre class="alt"><span class="lnum"> 119:</span>         // 写空的构造函数</pre><pre class="alteven"><span class="lnum"> 120:</span>         bw.write(repeat("</span> <span class="str">", 8) + "</span><span class="kwrd">public</span> function <span class="str">" + c.getSimpleName().replace("</span>BO<span class="str">", "</span>VO<span class="str">")</pre><pre class="alt"><span class="lnum"> 121:</span>                 + "</span>(){}\n\n<span class="str">");</pre><pre class="alteven"><span class="lnum"> 122:</span>&nbsp; </pre><pre class="alt"><span class="lnum"> 123:</span>         // 写 setter/getter 方法</pre><pre class="alteven"><span class="lnum"> 124:</span>         for (int i = 0; i &lt; fields.length; i++) {</pre><pre class="alt"><span class="lnum"> 125:</span>             Class fieldType = fields[i].getType();</pre><pre class="alteven"><span class="lnum"> 126:</span>             String typeName = getClassType(fieldType);</pre><pre class="alt"><span class="lnum"> 127:</span>             // setter</pre><pre class="alteven"><span class="lnum"> 128:</span>             bw.write(repeat("</span> <span class="str">", 8) + "</span><span class="kwrd">public</span> function set <span class="str">"</pre><pre class="alt"><span class="lnum"> 129:</span>                     + fields[i].getName() + "</span>(<span class="kwrd">value</span>:<span class="str">" + typeName + "</span>):<span class="kwrd">void</span>{\n<span class="str">");</pre><pre class="alteven"><span class="lnum"> 130:</span>             bw.write(repeat("</span> <span class="str">", 12) + "</span><span class="kwrd">this</span>._<span class="str">" + fields[i].getName()</pre><pre class="alt"><span class="lnum"> 131:</span>                     + "</span> = <span class="kwrd">value</span>;\n<span class="str">");</pre><pre class="alteven"><span class="lnum"> 132:</span>             bw.write(repeat("</span> <span class="str">", 8) + "</span>}\n\n<span class="str">");</pre><pre class="alt"><span class="lnum"> 133:</span>             // getter</pre><pre class="alteven"><span class="lnum"> 134:</span>             bw.write(repeat("</span> <span class="str">", 8) + "</span><span class="kwrd">public</span> function get <span class="str">"</pre><pre class="alt"><span class="lnum"> 135:</span>                     + fields[i].getName() + "</span>():<span class="str">" + typeName + "</span>{\n<span class="str">");</pre><pre class="alteven"><span class="lnum"> 136:</span>             bw.write(repeat("</span> <span class="str">", 12) + "</span><span class="kwrd">return</span> <span class="kwrd">this</span>._<span class="str">" + fields[i].getName()</pre><pre class="alt"><span class="lnum"> 137:</span>                     + "</span>;\n<span class="str">");</pre><pre class="alteven"><span class="lnum"> 138:</span>             bw.write(repeat("</span> <span class="str">", 8) + "</span>}\n\n\n<span class="str">");</pre><pre class="alt"><span class="lnum"> 139:</span>&nbsp; </pre><pre class="alteven"><span class="lnum"> 140:</span>         }</pre><pre class="alt"><span class="lnum"> 141:</span>         bw.write(repeat("</span> <span class="str">", 4) + "</span>}\n<span class="str">");</pre><pre class="alteven"><span class="lnum"> 142:</span>         bw.write("</span>}<span class="str">");</pre><pre class="alt"><span class="lnum"> 143:</span>         bw.close();</pre><pre class="alteven"><span class="lnum"> 144:</span>     }</pre><pre class="alt"><span class="lnum"> 145:</span>     </pre><pre class="alteven"><span class="lnum"> 146:</span>     public static void generateAsFileBatch(String pojoPackageRootFolder, String pojoPackageName, String voPackageRootFolder, String voPackageName) throws ClassNotFoundException, IOException {</pre><pre class="alt"><span class="lnum"> 147:</span>         String packageFolder = pojoPackageRootFolder + "</span>\\<span class="str">" + pojoPackageName.replace("</span>.<span class="str">", "</span>\\<span class="str">");</pre><pre class="alteven"><span class="lnum"> 148:</span>         File dir = new File(packageFolder);</pre><pre class="alt"><span class="lnum"> 149:</span>         File[] files = dir.listFiles();</pre><pre class="alteven"><span class="lnum"> 150:</span>         for(File file : files){</pre><pre class="alt"><span class="lnum"> 151:</span>             if(file.isDirectory()) continue;</pre><pre class="alteven"><span class="lnum"> 152:</span>             </pre><pre class="alt"><span class="lnum"> 153:</span>             if(file.getName().endsWith("</span>BO.java<span class="str">")){</pre><pre class="alteven"><span class="lnum"> 154:</span>                 String pojoName = pojoPackageName + "</span>.<span class="str">" + file.getName().replace("</span>.java<span class="str">", "</span><span class="str">");</pre><pre class="alt"><span class="lnum"> 155:</span>                 POJO2VO.generateAsFile(pojoName, voPackageRootFolder, voPackageName);</pre><pre class="alteven"><span class="lnum"> 156:</span>             }</pre><pre class="alt"><span class="lnum"> 157:</span>         }</pre><pre class="alteven"><span class="lnum"> 158:</span>     }</pre><pre class="alt"><span class="lnum"> 159:</span>&nbsp; </pre><pre class="alteven"><span class="lnum"> 160:</span>&nbsp; </pre><pre class="alt"><span class="lnum"> 161:</span>     /*</pre><pre class="alteven"><span class="lnum"> 162:</span>      * 测试</pre><pre class="alt"><span class="lnum"> 163:</span>      */</pre><pre class="alteven"><span class="lnum"> 164:</span>     public static void main(String[] args) throws ClassNotFoundException, IOException {</pre><pre class="alt"><span class="lnum"> 165:</span>         </pre><pre class="alteven"><span class="lnum"> 166:</span> //        String[] pojos = { "</span>com.bankcomm.icms.domain.migrate.RawCollateralBasicBO<span class="str">" };</pre><pre class="alt"><span class="lnum"> 167:</span> //        for (int i = 0; i &lt; pojos.length; i++) {</pre><pre class="alteven"><span class="lnum"> 168:</span> //            POJO2VO.generateAsFile(pojos[i], "</span>C:<span class="str">", "</span>com.bankcomm.icms.domain<span class="str">");</pre><pre class="alt"><span class="lnum"> 169:</span> //        }</pre><pre class="alteven"><span class="lnum"> 170:</span>&nbsp; </pre><pre class="alt"><span class="lnum"> 171:</span>         POJO2VO.generateAsFileBatch("</span>D:\\ICMS\\eclipse\\workspace\\Utils\\src\\<span class="str">", </pre><pre class="alteven"><span class="lnum"> 172:</span>                 "</span>com.bankcomm.icms.domain.migrate<span class="str">", </pre><pre class="alt"><span class="lnum"> 173:</span>                 "</span>C:\\Documents and Settings\\Administrator\\My Documents\\Flex Builder 3\\Temp\\src<span class="str">", </pre><pre class="alteven"><span class="lnum"> 174:</span>                 "</span>com.bankcomm.icms.domain");</pre><pre class="alt"><span class="lnum"> 175:</span>     }</pre><pre class="alteven"><span class="lnum"> 176:</span> }</pre></div></div><img src ="http://www.blogjava.net/charles/aggbug/248329.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/charles/" target="_blank">suprasoft Inc,.</a> 2008-12-25 20:13 <a href="http://www.blogjava.net/charles/archive/2008/12/25/248329.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>