﻿<?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-华梦行-随笔分类-Spring </title><link>http://www.blogjava.net/huamengxing/category/25304.html</link><description>专注于java</description><language>zh-cn</language><lastBuildDate>Sat, 19 Jan 2008 04:58:59 GMT</lastBuildDate><pubDate>Sat, 19 Jan 2008 04:58:59 GMT</pubDate><ttl>60</ttl><item><title>c3p0 + spring 配置</title><link>http://www.blogjava.net/huamengxing/archive/2008/01/18/176315.html</link><dc:creator>华梦行</dc:creator><author>华梦行</author><pubDate>Fri, 18 Jan 2008 11:47:00 GMT</pubDate><guid>http://www.blogjava.net/huamengxing/archive/2008/01/18/176315.html</guid><wfw:comment>http://www.blogjava.net/huamengxing/comments/176315.html</wfw:comment><comments>http://www.blogjava.net/huamengxing/archive/2008/01/18/176315.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huamengxing/comments/commentRss/176315.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huamengxing/services/trackbacks/176315.html</trackback:ping><description><![CDATA[网上没有找到比较合适的，自己看了看，然后放到项目中实验的一下。<br />很多人都认为比DBCP优秀。<br /><br />&lt;bean id="c3p0DataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"&gt;<br />      &lt;property name="driverClass"&gt;<br />        &lt;value&gt;${jdbc.driverClassName}&lt;/value&gt;<br />      &lt;/property&gt;<br />      &lt;property name="jdbcUrl"&gt;<br />        &lt;value&gt;${jdbc.url}&lt;/value&gt;<br />      &lt;/property&gt;<br />      &lt;property name="user"&gt;<br />       &lt;value&gt;${jdbc.username}&lt;/value&gt;<br />      &lt;/property&gt;<br />      &lt;property name="password"&gt;<br />       &lt;value&gt;${jdbc.password}&lt;/value&gt;<br />      &lt;/property&gt;<br />      &lt;property name="initialPoolSize"&gt;&lt;value&gt;10&lt;/value&gt;&lt;/property&gt;<br />      &lt;property name="minPoolSize"&gt;&lt;value&gt;5&lt;/value&gt;&lt;/property&gt;<br />      &lt;property name="maxPoolSize"&gt;&lt;value&gt;30&lt;/value&gt;&lt;/property&gt;<br />      &lt;property name="acquireIncrement"&gt;&lt;value&gt;5&lt;/value&gt;&lt;/property&gt;<br />      &lt;property name="maxIdleTime"&gt;&lt;value&gt;10&lt;/value&gt;&lt;/property&gt;<br />      &lt;property name="maxStatements"&gt;&lt;value&gt;0&lt;/value&gt;&lt;/property&gt;<br />    &lt;/bean&gt;<br /><br />以下几个参数是使用的基本配置参数：<br />initialPoolSize： <br />Number of Connections a pool will try to acquire upon startup. Should be between minPoolSize and maxPoolSize<br />连接池初始化时获取的链接数，介于minPoolSize和maxPoolSize之间<br /><br />minPoolSize：<br />Minimum number of Connections a pool will maintain at any given time.<br />最小链接数<br /><br />maxPoolSize：<br />Maximum number of Connections a pool will maintain at any given time.<br />最大连接数<br /><br />acquireIncrement：<br />Determines how many connections at a time c3p0 will try to acquire when the pool is exhausted.<br />在当前连接数耗尽的时候，一次获取的新的连接数<br /><br />maxIdleTime：<br />Seconds a Connection can remain pooled but unused before being discarded. Zero means idle connections never expire.<br />最大空闲的时间，单位是秒，无用的链接再过时后会被回收<br /><img src ="http://www.blogjava.net/huamengxing/aggbug/176315.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huamengxing/" target="_blank">华梦行</a> 2008-01-18 19:47 <a href="http://www.blogjava.net/huamengxing/archive/2008/01/18/176315.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Acegi安全系统详解</title><link>http://www.blogjava.net/huamengxing/archive/2008/01/14/175290.html</link><dc:creator>华梦行</dc:creator><author>华梦行</author><pubDate>Mon, 14 Jan 2008 12:19:00 GMT</pubDate><guid>http://www.blogjava.net/huamengxing/archive/2008/01/14/175290.html</guid><wfw:comment>http://www.blogjava.net/huamengxing/comments/175290.html</wfw:comment><comments>http://www.blogjava.net/huamengxing/archive/2008/01/14/175290.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huamengxing/comments/commentRss/175290.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huamengxing/services/trackbacks/175290.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 当前位置: 首页 &gt;&gt; 应用软件 &gt;&gt; 网络相关 &gt;&gt; Acegi安全系统详解												 																								Acegi安全系统详解																						作者：																								      来源：http://blog.csdn.ne...&nbsp;&nbsp;<a href='http://www.blogjava.net/huamengxing/archive/2008/01/14/175290.html'>阅读全文</a><img src ="http://www.blogjava.net/huamengxing/aggbug/175290.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huamengxing/" target="_blank">华梦行</a> 2008-01-14 20:19 <a href="http://www.blogjava.net/huamengxing/archive/2008/01/14/175290.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring 异常控制</title><link>http://www.blogjava.net/huamengxing/archive/2007/09/13/144781.html</link><dc:creator>华梦行</dc:creator><author>华梦行</author><pubDate>Thu, 13 Sep 2007 03:23:00 GMT</pubDate><guid>http://www.blogjava.net/huamengxing/archive/2007/09/13/144781.html</guid><wfw:comment>http://www.blogjava.net/huamengxing/comments/144781.html</wfw:comment><comments>http://www.blogjava.net/huamengxing/archive/2007/09/13/144781.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huamengxing/comments/commentRss/144781.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huamengxing/services/trackbacks/144781.html</trackback:ping><description><![CDATA[
		<h1>异常控制</h1>
		<p>  Author: <a href="http://calvin.blogjava.net/" target="_blank">江南白衣</a></p>
		<h2>1.业务异常类</h2>
		<p>      1.所以业务异常类派生于BusinessException基类。</p>
		<p>      2.原则上，要进行相同处理的异常分为一类，用ERROR_CODE标识不同。</p>
		<p>      3.出错信息统一写在errors.properties，以ERROR_CODE为主键，支持i18N，由基类提供默认的getMessage()函数。</p>
		<p>      参考BussinessException.java和OrderException.java。</p>
		<h2>2.Servlet规范里的异常控制</h2>
		<h3> 2.1按error-code统一定义错误页面</h3>
		<pre>&lt;error-page&gt;<br />  &lt;error-code&gt;404&lt;/error-code&gt;<br />  &lt;location&gt;/404.jsp&lt;/location&gt;<br />&lt;/error-page&gt;</pre>
		<pre>&lt;error-page&gt;<br />  &lt;error-code&gt;500&lt;/error-code&gt;<br />  &lt;location&gt;/error.jsp&lt;/location&gt;<br />&lt;/error-page&gt;</pre>
		<h3>2.2按异常类型定义单独错误页面</h3>
		<pre>&lt;error-page&gt;<br />  &lt;exception-type&gt;org.sprngside.bookstore.UserNotFound&lt;/exception-type&gt;<br />  &lt;location&gt;/userNotFound.jsp&lt;/location&gt;<br />&lt;/error-page&gt;</pre>
		<h3>2.3 在JSP里单独定义错误页面</h3>
		<pre>&lt;@ errorPage="error.jsp"&gt;</pre>
		<h2>3.Spring MVC里的异常控制</h2>
		<p>   spring-mvc可在xxx-serverlet.xml里定义default和 按Excepiton类型影射的错误页面, 和Servlet规范比,主要作了Spring特色的JSP路径转向和日志记录.参见bookstore-servlet.xml</p>
		<pre>  &lt;bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"&gt;<br />        &lt;property name="defaultErrorView" value="/error.jsp"/&gt;<br />        &lt;property name="exceptionMappings"&gt;<br />            &lt;props&gt;<br />                &lt;prop key="org.springside.framework.base.BusinessException"&gt;/businessError.jsp&lt;/prop&gt;<br />            &lt;/props&gt;<br />        &lt;/property&gt;<br />    &lt;/bean&gt;</pre>
		<h2>4. error.jsp的处理</h2>
		<p>         error.jsp会同时处理jsp,servlet,和spring抛过来的异常</p>
		<p>         其中jsp的异常在exception 变量中.</p>
		<p>         servlet的异常在(Exception)request.getAttribute("javax.servlet.error.exception")</p>
		<p>         spring的异常在(Exception) request.getAttribute("exception")</p>
		<p>         使用 (String) request.getAttribute("javax.servlet.error.request_uri")获得 request_uri<br />         使用 logger.error(exception.getMessage(), exception); 记录整个异常栈</p>
<img src ="http://www.blogjava.net/huamengxing/aggbug/144781.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huamengxing/" target="_blank">华梦行</a> 2007-09-13 11:23 <a href="http://www.blogjava.net/huamengxing/archive/2007/09/13/144781.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>FilterChainProxy  详解</title><link>http://www.blogjava.net/huamengxing/archive/2007/09/12/144528.html</link><dc:creator>华梦行</dc:creator><author>华梦行</author><pubDate>Wed, 12 Sep 2007 08:20:00 GMT</pubDate><guid>http://www.blogjava.net/huamengxing/archive/2007/09/12/144528.html</guid><wfw:comment>http://www.blogjava.net/huamengxing/comments/144528.html</wfw:comment><comments>http://www.blogjava.net/huamengxing/archive/2007/09/12/144528.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huamengxing/comments/commentRss/144528.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huamengxing/services/trackbacks/144528.html</trackback:ping><description><![CDATA[Class <font style="BACKGROUND-COLOR: #0a246a" color="#ffffff">FilterChainProxy</font><pre><a title="class or interface in java.lang" href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Object.html">java.lang.Object</a><img alt="extended by " src="mk:@MSITStore:C:\Documents%20and%20Settings\ljl\桌面\Acegi.CHM::/resources/inherit.gif" /><b>org.acegisecurity.util.<font style="BACKGROUND-COLOR: #0a246a" color="#ffffff">FilterChainProxy</font></b></pre><dl><dt><b>All Implemented Interfaces:</b></dt><dd><a title="class or interface in javax.servlet" href="http://tomcat.apache.org/tomcat-5.0-doc/servletapi/javax/servlet/Filter.html">Filter</a>, <a title="class or interface in org.springframework.beans.factory" href="http://www.springframework.org/docs/api/org/springframework/beans/factory/InitializingBean.html">InitializingBean</a>, <a title="class or interface in org.springframework.context" href="http://www.springframework.org/docs/api/org/springframework/context/ApplicationContextAware.html">ApplicationContextAware</a></dd></dl><hr /><dl><dt></dt><pre>public class <b><font style="BACKGROUND-COLOR: #0a246a" color="#ffffff">FilterChainProxy</font></b><dt>extends <a title="class or interface in java.lang" href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Object.html">Object</a></dt><dt>implements <a title="class or interface in javax.servlet" href="http://tomcat.apache.org/tomcat-5.0-doc/servletapi/javax/servlet/Filter.html">Filter</a>, <a title="class or interface in org.springframework.beans.factory" href="http://www.springframework.org/docs/api/org/springframework/beans/factory/InitializingBean.html">InitializingBean</a>, <a title="class or interface in org.springframework.context" href="http://www.springframework.org/docs/api/org/springframework/context/ApplicationContextAware.html">ApplicationContextAware</a></dt></pre></dl><pre></pre><p>Delegates <code>Filter</code> requests to a list of Spring-managed beans. <br /></p><p>通过一系列的由spring托管的beans ，代理过滤请求。<br />FilterChainProxy 通过在web.xml中定义的FilterToBeanProxy 被加载，FilterChainProxy 将会通过<a href="mk:@MSITStore:C:\Documents%20and%20Settings\ljl\桌面\Acegi.CHM::/org/acegisecurity/util/FilterChainProxy.html#init(javax.servlet.FilterConfig)"><code>init(FilterConfig)</code></a>, <a href="mk:@MSITStore:C:\Documents%20and%20Settings\ljl\桌面\Acegi.CHM::/org/acegisecurity/util/FilterChainProxy.html#destroy()"><code>destroy()</code></a> and <a href="mk:@MSITStore:C:\Documents%20and%20Settings\ljl\桌面\Acegi.CHM::/org/acegisecurity/util/FilterChainProxy.html#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain)"><code>doFilter(ServletRequest, ServletResponse, FilterChain)</code></a>调用，调用每一个在其中定义的过滤器。<br /><br />The <code><font style="BACKGROUND-COLOR: #0a246a" color="#ffffff">FilterChainProxy</font></code> is loaded via a standard <a title="class in org.acegisecurity.util" href="mk:@MSITStore:C:\Documents%20and%20Settings\ljl\桌面\Acegi.CHM::/org/acegisecurity/util/FilterToBeanProxy.html"><code>FilterToBeanProxy</code></a> declaration in <code>web.xml</code>. <code><font style="BACKGROUND-COLOR: #0a246a" color="#ffffff">FilterChainProxy</font></code> will then pass <a href="mk:@MSITStore:C:\Documents%20and%20Settings\ljl\桌面\Acegi.CHM::/org/acegisecurity/util/FilterChainProxy.html#init(javax.servlet.FilterConfig)"><code>init(FilterConfig)</code></a>, <a href="mk:@MSITStore:C:\Documents%20and%20Settings\ljl\桌面\Acegi.CHM::/org/acegisecurity/util/FilterChainProxy.html#destroy()"><code>destroy()</code></a> and <a href="mk:@MSITStore:C:\Documents%20and%20Settings\ljl\桌面\Acegi.CHM::/org/acegisecurity/util/FilterChainProxy.html#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain)"><code>doFilter(ServletRequest, ServletResponse, FilterChain)</code></a> invocations through to each <code>Filter</code> defined against <code><font style="BACKGROUND-COLOR: #0a246a" color="#ffffff">FilterChainProxy</font></code>.</p><p><code><font style="BACKGROUND-COLOR: #0a246a" color="#ffffff">  <br />    FilterChainProxy  是通过一个标准的FilterInvocationDefinitionSource 来实现配置的，每个可能的FilterChainProxy应该服务的URI模式都必须进入<br />            第一个搭配的URI模式将会被用来定义处理请求的所有的过滤器，就是说只适配第一组过滤器，后面的其他过滤器将无效。<br />FilterChainProxy</font></code> is configured using a standard <a title="interface in org.acegisecurity.intercept.web" href="mk:@MSITStore:C:\Documents%20and%20Settings\ljl\桌面\Acegi.CHM::/org/acegisecurity/intercept/web/FilterInvocationDefinitionSource.html"><code>FilterInvocationDefinitionSource</code></a>. Each possible URI pattern that <code><font style="BACKGROUND-COLOR: #0a246a" color="#ffffff">FilterChainProxy</font></code> should service must be entered. The first matching URI pattern located by <code>FilterInvocationDefinitionSource</code> for a given request will be used to define all of the <code>Filter</code>s that apply to that request. NB: This means you must put most specific URI patterns at the top of the list, and ensure all <code>Filter</code>s that should apply for a given URI pattern are entered against the respective entry. The <code><font style="BACKGROUND-COLOR: #0a246a" color="#ffffff">FilterChainProxy</font></code> will not iterate the remainder of the URI patterns to locate additional <code>Filter</code>s. The <code>FilterInvocationDefinitionSource</code> described the applicable URI pattern to fire the filter chain, followed by a list of configuration attributes. Each configuration attribute's <a href="mk:@MSITStore:C:\Documents%20and%20Settings\ljl\桌面\Acegi.CHM::/org/acegisecurity/ConfigAttribute.html#getAttribute()"><code>ConfigAttribute.getAttribute()</code></a> corresponds to a bean name that is available from the application context.</p><p><code><font style="BACKGROUND-COLOR: #0a246a" color="#ffffff">FilterChainProxy</font></code> respects normal handling of <code>Filter</code>s that elect not to call <a title="class or interface in javax.servlet" href="http://tomcat.apache.org/tomcat-5.0-doc/servletapi/javax/servlet/Filter.html#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain)"><code>Filter.doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain)</code></a>, in that the remainder of the origial or <code><font style="BACKGROUND-COLOR: #0a246a" color="#ffffff">FilterChainProxy</font></code>-declared filter chain will not be called.</p><p>It is particularly noted the <code>Filter</code> lifecycle mismatch between the servlet container and IoC container. As per <a title="class in org.acegisecurity.util" href="mk:@MSITStore:C:\Documents%20and%20Settings\ljl\桌面\Acegi.CHM::/org/acegisecurity/util/FilterToBeanProxy.html"><code>FilterToBeanProxy</code></a> JavaDocs, we recommend you allow the IoC container to manage lifecycle instead of the servlet container. By default the <code>FilterToBeanProxy</code> will never call this class' <a href="mk:@MSITStore:C:\Documents%20and%20Settings\ljl\桌面\Acegi.CHM::/org/acegisecurity/util/FilterChainProxy.html#init(javax.servlet.FilterConfig)"><code>init(FilterConfig)</code></a> and <a href="mk:@MSITStore:C:\Documents%20and%20Settings\ljl\桌面\Acegi.CHM::/org/acegisecurity/util/FilterChainProxy.html#destroy()"><code>destroy()</code></a> methods, meaning each of the filters defined against <code>FilterInvocationDefinitionSource</code> will not be called. If you do need your filters to be initialized and destroyed, please set the <code>lifecycle</code> initialization parameter against the <code>FilterToBeanProxy</code> to specify servlet container lifecycle management.</p><p>If a filter name of <a href="mk:@MSITStore:C:\Documents%20and%20Settings\ljl\桌面\Acegi.CHM::/org/acegisecurity/util/FilterChainProxy.html#TOKEN_NONE"><code>TOKEN_NONE</code></a> is used, this allows specification of a filter pattern which should never cause any filters to fire.</p><img src ="http://www.blogjava.net/huamengxing/aggbug/144528.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huamengxing/" target="_blank">华梦行</a> 2007-09-12 16:20 <a href="http://www.blogjava.net/huamengxing/archive/2007/09/12/144528.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一 Acegi安全系统介绍 (1)</title><link>http://www.blogjava.net/huamengxing/archive/2007/09/12/144482.html</link><dc:creator>华梦行</dc:creator><author>华梦行</author><pubDate>Wed, 12 Sep 2007 06:42:00 GMT</pubDate><guid>http://www.blogjava.net/huamengxing/archive/2007/09/12/144482.html</guid><wfw:comment>http://www.blogjava.net/huamengxing/comments/144482.html</wfw:comment><comments>http://www.blogjava.net/huamengxing/archive/2007/09/12/144482.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huamengxing/comments/commentRss/144482.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huamengxing/services/trackbacks/144482.html</trackback:ping><description><![CDATA[
		<h1>一 Acegi安全系统介绍 </h1>
		<p>    Author: <a href="">cac 差沙</a></p>
		<p>    Acegi是Spring Framework 下最成熟的安全系统，它提供了强大灵活的企业级安全服务，如完善的认证和授权机制，Http资源访问控制，Method 调用访问控制，Access Control List (ACL) 基于对象实例的访问控制，Yale Central Authentication Service (CAS) 耶鲁单点登陆，X509 认证，当前所有流行容器的认证适配器，Channel Security频道安全管理等功能。</p>
		<h2>1.1 网站资源</h2>
		<p>官方网站      <a href="http://acegisecurity.sourceforge.net/">http://acegisecurity.sourceforge.net</a><br />论坛            <a href="http://forum.springframework.org/forumdisplay.php?f=33">http://forum.springframework.org/forumdisplay.php?f=33</a><br />Jira              <a href="http://opensource.atlassian.com/projects/spring/browse/SEC">http://opensource.atlassian.com/projects/spring/browse/SEC</a></p>
		<h2>1.2 多方面的安全控制粒度</h2>
		<ol>
				<li>URL 资源访问控制<br /> http://apps:8080/index.htm -&gt; for public<br /> http://apps:8080/user.htm -&gt; for authorized user 
</li>
				<li>方法调用访问控制<br />public void getData() -&gt; all user<br />public void modifyData() -&gt; supervisor only 
</li>
				<li>对象实例保护<br />order.getValue() &lt; $100 -&gt; all user<br />order.getValue() &gt; $100 -&gt; supervisor only</li>
		</ol>
		<h2>1.3 非入侵式安全架构</h2>
		<ol>
				<li>基于Servlet Filter和Spring aop,  使商业逻辑和安全逻辑分开，结构更清晰 
</li>
				<li>使用Spring 来代理对象，能方便地保护方法调用</li>
		</ol>
		<h2>1.4 其它安全架构</h2>
		<p>    Acegi只是安全框架之一，其实还存在其它优秀的安全框架可供选择：</p>
		<ul>
				<li> JAAS ：<a href="http://java.sun.com/products/jaas/">http://java.sun.com/products/jaas/</a></li>
				<li> Seraph: <a href="http://opensource.atlassian.com/seraph/">http://opensource.atlassian.com/seraph/</a></li>
				<li> jSai - Servlet Security : <a href="http://oss.ipov.org/jsai/">http://oss.ipov.org/jsai/</a></li>
				<li> Gabriel : <a href="http://gabriel.codehaus.org/">http://gabriel.codehaus.org/</a></li>
				<li> JOSSO : <a href="http://www.josso.org/">http://www.josso.org/</a></li>
				<li> Kasai: <a href="http://www.manentiasoftware.com/kasai/goToHome.action">http://www.manentiasoftware.com/kasai/goToHome.action</a></li>
				<li> jPAM : <a href="http://jpam.sourceforge.net/">http://jpam.sourceforge.net/</a></li>
				<li> OpenSAML : <a href="http://www.opensaml.org/">http://www.opensaml.org/</a></li>
		</ul>
<img src ="http://www.blogjava.net/huamengxing/aggbug/144482.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huamengxing/" target="_blank">华梦行</a> 2007-09-12 14:42 <a href="http://www.blogjava.net/huamengxing/archive/2007/09/12/144482.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Acegi</title><link>http://www.blogjava.net/huamengxing/archive/2007/09/12/144479.html</link><dc:creator>华梦行</dc:creator><author>华梦行</author><pubDate>Wed, 12 Sep 2007 06:39:00 GMT</pubDate><guid>http://www.blogjava.net/huamengxing/archive/2007/09/12/144479.html</guid><wfw:comment>http://www.blogjava.net/huamengxing/comments/144479.html</wfw:comment><comments>http://www.blogjava.net/huamengxing/archive/2007/09/12/144479.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huamengxing/comments/commentRss/144479.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huamengxing/services/trackbacks/144479.html</trackback:ping><description><![CDATA[
		<a href="http://wiki.springside.org.cn/display/springside/Acegi+Reference">http://wiki.springside.org.cn/display/springside/Acegi+Reference</a>
		<br />
		<br />
		<br />
		<a href="http://www.springside.org.cn/docs/reference/Acegi2.htm">http://www.springside.org.cn/docs/reference/Acegi2.htm</a>
		<br />
		<br />
		<a href="http://www.springside.org.cn/docs/reference/Acegi3.htm">http://www.springside.org.cn/docs/reference/Acegi3.htm</a>
		<br />
		<br />
		<br />
		<a href="http://www.springside.org.cn/docs/reference/Acegi4.htm">http://www.springside.org.cn/docs/reference/Acegi4.htm</a>
		<br />
		<a href="http://www.springside.org.cn/docs/reference/Acegi5.htm">http://www.springside.org.cn/docs/reference/Acegi5.htm</a>
		<br />
		<a href="http://www.springside.org.cn/docs/reference/Acegi6.htm">http://www.springside.org.cn/docs/reference/Acegi6.htm</a>
		<br />
<img src ="http://www.blogjava.net/huamengxing/aggbug/144479.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huamengxing/" target="_blank">华梦行</a> 2007-09-12 14:39 <a href="http://www.blogjava.net/huamengxing/archive/2007/09/12/144479.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MainTestForJdbcTemplate</title><link>http://www.blogjava.net/huamengxing/archive/2007/09/11/144191.html</link><dc:creator>华梦行</dc:creator><author>华梦行</author><pubDate>Tue, 11 Sep 2007 03:22:00 GMT</pubDate><guid>http://www.blogjava.net/huamengxing/archive/2007/09/11/144191.html</guid><wfw:comment>http://www.blogjava.net/huamengxing/comments/144191.html</wfw:comment><comments>http://www.blogjava.net/huamengxing/archive/2007/09/11/144191.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huamengxing/comments/commentRss/144191.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huamengxing/services/trackbacks/144191.html</trackback:ping><description><![CDATA[
		<p>package org.springframework.samples;</p>
		<p>import java.sql.Connection;<br />import java.sql.PreparedStatement;<br />import java.sql.ResultSet;<br />import java.sql.SQLException;<br />import java.sql.Statement;<br />import java.util.ArrayList;<br />import java.util.Iterator;<br />import java.util.List;</p>
		<p>import org.apache.commons.logging.Log;<br />import org.apache.commons.logging.LogFactory;<br />import org.springframework.beans.factory.ListableBeanFactory;<br />import org.springframework.beans.factory.generic.GenericBeanFactoryAccessor;<br />import org.springframework.context.support.ClassPathXmlApplicationContext;<br />import org.springframework.dao.DataAccessException;<br />import org.springframework.jdbc.core.ColumnMapRowMapper;<br />import org.springframework.jdbc.core.ConnectionCallback;<br />import org.springframework.jdbc.core.JdbcTemplate;<br />import org.springframework.jdbc.core.PreparedStatementCallback;<br />import org.springframework.jdbc.core.PreparedStatementCreator;<br />import org.springframework.jdbc.core.PreparedStatementSetter;<br />import org.springframework.jdbc.core.ResultSetExtractor;<br />import org.springframework.jdbc.core.RowCallbackHandler;<br />import org.springframework.jdbc.core.RowCountCallbackHandler;<br />import org.springframework.jdbc.core.RowMapper;<br />import org.springframework.jdbc.core.StatementCallback;<br />import org.springframework.jdbc.support.JdbcUtils;<br />import org.springframework.samples.petclinic.Person;</p>
		<p>/**<br /> * <br /> * @author worldheart<br /> *<br /> */<br />public class MainTestForJdbcTemplate {</p>
		<p> private static final Log log = LogFactory.getLog(MainTestForJdbcTemplate.class);<br /> <br /> public static void main(String[] args) {  <br />  ListableBeanFactory cbf = new ClassPathXmlApplicationContext("ac1.xml");  <br />  GenericBeanFactoryAccessor gbfa = new GenericBeanFactoryAccessor(cbf);<br />  <br />  JdbcTemplate jt = gbfa.getBean("jdbcTemplate");<br />  <br />  jt.execute(new ConnectionCallback(){<br />   public Object doInConnection(Connection con) throws SQLException, DataAccessException {<br />    System.out.println(con.getMetaData().getDriverName());<br />    return null;<br />   }<br />  });<br />  <br />  List nameList = (List)jt.execute(new StatementCallback(){<br />   public Object doInStatement(Statement stmt) throws SQLException, DataAccessException {<br />    System.out.println(stmt.getConnection().getMetaData().getDatabaseProductVersion());<br />    List&lt;String&gt; nameList = new ArrayList&lt;String&gt;();<br />    ResultSet rs = null;<br />    try{<br />     rs = stmt.executeQuery("select name from types");<br />     while(rs.next()){<br />      nameList.add(rs.getString("name"));<br />     }<br />    }finally{<br />     JdbcUtils.closeResultSet(rs);<br />    }<br />    return nameList;<br />   }<br />  });<br />  System.out.println(nameList);<br />  <br />  List perList = (List)jt.query("select * from vets", <br />    new ResultSetExtractor(){<br />      public Object extractData(ResultSet rs) throws SQLException, DataAccessException {<br />       List&lt;Person&gt; personList = new ArrayList&lt;Person&gt;();<br />       while(rs.next()){<br />        Person per = new Person();<br />        per.setId(rs.getInt("id"));<br />        per.setFirstName(rs.getString("first_name"));<br />        per.setLastName(rs.getString("last_name"));<br />        personList.add(per);<br />       }<br />       return personList;<br />    }<br />  });<br />  for(Iterator iterator = perList.iterator(); iterator.hasNext();){<br />   Person person = (Person)iterator.next();<br />   System.out.println(person.getId() + "," + person.getFirstName() + "," + person.getLastName());<br />  }</p>
		<p>  final List&lt;Person&gt; pSonList = new ArrayList&lt;Person&gt;(); <br />  jt.query("select * from vets", new RowCallbackHandler(){<br />   public void processRow(ResultSet rs) throws SQLException {<br />    Person per = new Person();<br />    per.setId(rs.getInt("id"));<br />    per.setFirstName(rs.getString("first_name"));<br />    per.setLastName(rs.getString("last_name"));<br />    pSonList.add(per);<br />   }<br />  });<br />  for(Person pSon: pSonList){<br />   System.out.println(pSon.getId() + "," + pSon.getFirstName() + "," + pSon.getLastName());<br />  }<br />  <br />  RowCountCallbackHandler rcch = new RowCountCallbackHandler();<br />  jt.query("select * from vets", rcch);<br />  for(String colName: rcch.getColumnNames())<br />   System.out.println(colName);<br />  for(int colType: rcch.getColumnTypes())<br />   System.out.println(colType); <br />  System.out.println(rcch.getColumnCount()); <br />  System.out.println(rcch.getRowCount()); <br />  <br />  List vetsList = (List)jt.query("select * from vets", <br />    new RowMapper(){<br />     public Object mapRow(ResultSet rs, int rowNum) throws SQLException {<br />      Person pers = new Person();<br />      pers.setId(rs.getInt("id"));<br />      pers.setFirstName(rs.getString("first_name"));<br />      pers.setLastName(rs.getString("last_name"));<br />      return pers;<br />     }<br />  });<br />  System.out.println(vetsList);<br />  <br />  ColumnMapRowMapper cmrw = new ColumnMapRowMapper(); <br />  List vList = (List)jt.query("select * from vets", cmrw);<br />  System.out.println(vList);<br />  <br />  System.out.println(jt.queryForInt("select count(*) from vets where id = ?", <br />    new Object[]{3}));<br />      <br />  jt.execute("update owners set address = 'GuangZhou' where telephone = ?", <br />    new PreparedStatementCallback(){<br />     public Object doInPreparedStatement(PreparedStatement ps) throws SQLException, DataAccessException {<br />      ps.setString(1, "16068008");<br />      ps.addBatch();<br />      ps.setString(1, "6085555487");<br />      ps.addBatch();<br />      return ps.executeBatch();<br />     }<br />  });<br />  <br />  System.out.println(jt.query("select address from owners where first_name = ? and last_name = ?",<br />    new PreparedStatementSetter(){<br />     public void setValues(PreparedStatement ps) throws SQLException {<br />      ps.setString(1, "Jeff");<br />      ps.setString(2, "Black");<br />     }<br />    }, <br />    new RowMapper(){<br />     public Object mapRow(ResultSet rs, int rowNum) throws SQLException {      <br />      return rs.getString("address");<br />     }<br />    }));<br />  <br />  System.out.println(jt.execute(<br />    new PreparedStatementCreator(){<br />     public PreparedStatement createPreparedStatement(Connection con) throws SQLException {<br />      return con.prepareStatement("select address from owners");<br />     }<br />    }, <br />    new PreparedStatementCallback(){<br />     public Object doInPreparedStatement(PreparedStatement ps) throws SQLException, DataAccessException {<br />      List&lt;String&gt; list = new ArrayList&lt;String&gt;();<br />      ResultSet rs = null;<br />      try{<br />       rs = ps.executeQuery();<br />       while(rs.next()){<br />        list.add(rs.getString("address"));<br />       }<br />      }finally{<br />       JdbcUtils.closeResultSet(rs);<br />      }<br />      return list;<br />     }<br />    }));<br />  <br /> }</p>
		<p>}<br /></p>
<img src ="http://www.blogjava.net/huamengxing/aggbug/144191.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huamengxing/" target="_blank">华梦行</a> 2007-09-11 11:22 <a href="http://www.blogjava.net/huamengxing/archive/2007/09/11/144191.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>BindStatus     API</title><link>http://www.blogjava.net/huamengxing/archive/2007/09/11/144186.html</link><dc:creator>华梦行</dc:creator><author>华梦行</author><pubDate>Tue, 11 Sep 2007 03:00:00 GMT</pubDate><guid>http://www.blogjava.net/huamengxing/archive/2007/09/11/144186.html</guid><wfw:comment>http://www.blogjava.net/huamengxing/comments/144186.html</wfw:comment><comments>http://www.blogjava.net/huamengxing/archive/2007/09/11/144186.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huamengxing/comments/commentRss/144186.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huamengxing/services/trackbacks/144186.html</trackback:ping><description><![CDATA[
		<dl>
				<dt>
				</dt>
				<pre>public class <b><font style="BACKGROUND-COLOR: #0a246a" color="#ffffff">BindStatus</font></b><dt>extends <a title="class or interface in java.lang" href="http://java.sun.com/javase/6/docs/api/java/lang/Object.html?is-external=true">Object</a></dt></pre>
		</dl>
		<pre>
		</pre>
		<p>Simple adapter to expose the bind status of a field or object. Set as a variable both by the JSP bind tag and Velocity/FreeMarker macros. <br /></p>
		<p>  简单的适配器获取域或者是对象绑定状态， 同样适用于模板。<br />Obviously, object status representations (i.e. errors at the object level rather than the field level) do not have an expression and a value but only error codes and messages. For simplicity's sake and to be able to use the same tags and macros, the same status class is used for both scenarios. <br />显然，对象的状态表示（例如错误是对象级的而不是域级别的）没有表达式或者值，而是只有错误码和消息<br /></p>
		<table cellspacing="0" cellpadding="3" width="100%" summary="" border="1">
				<tbody>
						<tr class="TableHeadingColor" bgcolor="#ccccff">
								<th align="left" colspan="2">
										<font size="+2">
												<b>Method Summary</b>
										</font>
								</th>
						</tr>
						<tr class="TableRowColor" bgcolor="white">
								<td valign="top" align="right" width="1%">
										<font size="-1">
												<code> int</code>
										</font>
								</td>
								<td>
										<code>
												<b>
														<a href="http://www.springframework.org/docs/api/org/springframework/web/servlet/tags/BindTag.html#doEndTag()">doEndTag</a>
												</b>()</code>
										<br />           </td>
						</tr>
						<tr class="TableRowColor" bgcolor="white">
								<td valign="top" align="right" width="1%">
										<font size="-1">
												<code> void</code>
										</font>
								</td>
								<td>
										<code>
												<b>
														<a href="http://www.springframework.org/docs/api/org/springframework/web/servlet/tags/BindTag.html#doFinally()">doFinally</a>
												</b>()</code>
										<br />           </td>
						</tr>
						<tr class="TableRowColor" bgcolor="white">
								<td valign="top" align="right" width="1%">
										<font size="-1">
												<code>protected  int</code>
										</font>
								</td>
								<td>
										<code>
												<b>
														<a href="http://www.springframework.org/docs/api/org/springframework/web/servlet/tags/BindTag.html#doStartTagInternal()">doStartTagInternal</a>
												</b>()</code>
										<br />          Called by doStartTag to perform the actual work.</td>
						</tr>
						<tr class="TableRowColor" bgcolor="white">
								<td valign="top" align="right" width="1%">
										<font size="-1">
												<code> <a title="class or interface in java.beans" href="http://java.sun.com/j2se/1.5.0/docs/api/java/beans/PropertyEditor.html">PropertyEditor</a></code>
										</font>
								</td>
								<td>
										<code>
												<b>
														<a href="http://www.springframework.org/docs/api/org/springframework/web/servlet/tags/BindTag.html#getEditor()">getEditor</a>
												</b>()</code>
										<br />          Retrieve the PropertyEditor for the property that this tag is currently bound to.</td>
						</tr>
						<tr class="TableRowColor" bgcolor="white">
								<td valign="top" align="right" width="1%">
										<font size="-1">
												<code> <a title="interface in org.springframework.validation" href="http://www.springframework.org/docs/api/org/springframework/validation/Errors.html">Errors</a></code>
										</font>
								</td>
								<td>
										<code>
												<b>
														<a href="http://www.springframework.org/docs/api/org/springframework/web/servlet/tags/BindTag.html#getErrors()">getErrors</a>
												</b>()</code>
										<br />          Retrieve the Errors instance that this tag is currently bound to.</td>
						</tr>
						<tr class="TableRowColor" bgcolor="white">
								<td valign="top" align="right" width="1%">
										<font size="-1">
												<code> <a title="class or interface in java.lang" href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html">String</a></code>
										</font>
								</td>
								<td>
										<code>
												<b>
														<a href="http://www.springframework.org/docs/api/org/springframework/web/servlet/tags/BindTag.html#getPath()">getPath</a>
												</b>()</code>
										<br />          Return the path that this tag applies to.</td>
						</tr>
						<tr class="TableRowColor" bgcolor="white">
								<td valign="top" align="right" width="1%">
										<font size="-1">
												<code> <a title="class or interface in java.lang" href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html">String</a></code>
										</font>
								</td>
								<td>
										<code>
												<b>
														<a href="http://www.springframework.org/docs/api/org/springframework/web/servlet/tags/BindTag.html#getProperty()">getProperty</a>
												</b>()</code>
										<br />          Retrieve the property that this tag is currently bound to, or <code>null</code> if bound to an object rather than a specific property.</td>
						</tr>
						<tr class="TableRowColor" bgcolor="white">
								<td valign="top" align="right" width="1%">
										<font size="-1">
												<code> boolean</code>
										</font>
								</td>
								<td>
										<code>
												<b>
														<a href="http://www.springframework.org/docs/api/org/springframework/web/servlet/tags/BindTag.html#isIgnoreNestedPath()">isIgnoreNestedPath</a>
												</b>()</code>
										<br />          Return whether to ignore a nested path, if any.</td>
						</tr>
						<tr class="TableRowColor" bgcolor="white">
								<td valign="top" align="right" width="1%">
										<font size="-1">
												<code> void</code>
										</font>
								</td>
								<td>
										<code>
												<b>
														<a href="http://www.springframework.org/docs/api/org/springframework/web/servlet/tags/BindTag.html#setIgnoreNestedPath(boolean)">setIgnoreNestedPath</a>
												</b>(boolean ignoreNestedPath)</code>
										<br />          Set whether to ignore a nested path, if any.</td>
						</tr>
						<tr class="TableRowColor" bgcolor="white">
								<td valign="top" align="right" width="1%">
										<font size="-1">
												<code> void</code>
										</font>
								</td>
								<td>
										<code>
												<b>
														<a href="http://www.springframework.org/docs/api/org/springframework/web/servlet/tags/BindTag.html#setPath(java.lang.String)">setPath</a>
												</b>(<a title="class or interface in java.lang" href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html">String</a> path)</code>
										<br />          Set the path that this tag should apply.</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/huamengxing/aggbug/144186.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huamengxing/" target="_blank">华梦行</a> 2007-09-11 11:00 <a href="http://www.blogjava.net/huamengxing/archive/2007/09/11/144186.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>RowCountCallbackHandler   回调</title><link>http://www.blogjava.net/huamengxing/archive/2007/09/10/143935.html</link><dc:creator>华梦行</dc:creator><author>华梦行</author><pubDate>Mon, 10 Sep 2007 03:35:00 GMT</pubDate><guid>http://www.blogjava.net/huamengxing/archive/2007/09/10/143935.html</guid><wfw:comment>http://www.blogjava.net/huamengxing/comments/143935.html</wfw:comment><comments>http://www.blogjava.net/huamengxing/archive/2007/09/10/143935.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huamengxing/comments/commentRss/143935.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huamengxing/services/trackbacks/143935.html</trackback:ping><description><![CDATA[RowCountCallbackHandler rcch = new RowCountCallbackHandler();<br />  jt.query("select * from vets", rcch);<br />  for(String colName: rcch.getColumnNames())<br />   System.out.println(colName);<br />  for(int colType: rcch.getColumnTypes())<br />   System.out.println(colType); <br />  System.out.println(rcch.getColumnCount()); <br />  System.out.println(rcch.getRowCount()); <img src ="http://www.blogjava.net/huamengxing/aggbug/143935.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huamengxing/" target="_blank">华梦行</a> 2007-09-10 11:35 <a href="http://www.blogjava.net/huamengxing/archive/2007/09/10/143935.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>所谓回调</title><link>http://www.blogjava.net/huamengxing/archive/2007/09/10/143926.html</link><dc:creator>华梦行</dc:creator><author>华梦行</author><pubDate>Mon, 10 Sep 2007 03:16:00 GMT</pubDate><guid>http://www.blogjava.net/huamengxing/archive/2007/09/10/143926.html</guid><wfw:comment>http://www.blogjava.net/huamengxing/comments/143926.html</wfw:comment><comments>http://www.blogjava.net/huamengxing/archive/2007/09/10/143926.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huamengxing/comments/commentRss/143926.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huamengxing/services/trackbacks/143926.html</trackback:ping><description><![CDATA[
		<p>所谓的回调就是在执行statement A过程中，用到了statement B，那么先保存以前的执行信息，此时statement B 可以使用Statement A 的内容，然后再执行 Statement B， Statement B执行完毕后，返回的结果，可以被Statement A 利用，然后继续执行statementA。这就是传说中回调</p>
<img src ="http://www.blogjava.net/huamengxing/aggbug/143926.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huamengxing/" target="_blank">华梦行</a> 2007-09-10 11:16 <a href="http://www.blogjava.net/huamengxing/archive/2007/09/10/143926.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> PreparedStatementCallback   PreparedStatement回调接口定义。</title><link>http://www.blogjava.net/huamengxing/archive/2007/09/10/143921.html</link><dc:creator>华梦行</dc:creator><author>华梦行</author><pubDate>Mon, 10 Sep 2007 03:10:00 GMT</pubDate><guid>http://www.blogjava.net/huamengxing/archive/2007/09/10/143921.html</guid><wfw:comment>http://www.blogjava.net/huamengxing/comments/143921.html</wfw:comment><comments>http://www.blogjava.net/huamengxing/archive/2007/09/10/143921.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huamengxing/comments/commentRss/143921.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huamengxing/services/trackbacks/143921.html</trackback:ping><description><![CDATA[jt.execute("update owners set address = 'GuangZhou' where telephone = ?", <br />    new PreparedStatementCallback(){<br />     public Object doInPreparedStatement(PreparedStatement ps) throws SQLException, DataAccessException {<br />      ps.setString(1, "16068008");<br />      ps.addBatch();<br />      ps.setString(1, "6085555487");<br />      ps.addBatch();<br />      return ps.executeBatch();<br />     }<br />  });<br /><ol><li><p><i><font color="#339900">/**</font></i></p><br /></li><li><i><font color="#339900"> * Copyright: Copyright (c) 2005-2005</font></i><br /></li><li><i><font color="#339900"> * Company: JavaResearch(http://www.javaresearch.org)</font></i><br /></li><li><i><font color="#339900"> */</font></i><br /></li><li><b><font color="#0000ff">package</font></b> org.javaresearch.jerch;<br /></li><li><br /></li><li><b><font color="#0000ff">import</font></b> java.sql.<b><a href="http://www.javaresearch.org/source/jdk142/java/sql/PreparedStatement.java.html"><font color="#ff0000"><u>PreparedStatement</u></font></a></b>;<br /></li><li><b><font color="#0000ff">import</font></b> java.sql.<b><a href="http://www.javaresearch.org/source/jdk142/java/sql/SQLException.java.html"><font color="#ff0000"><u>SQLException</u></font></a></b>;<br /></li><li><br /></li><li><i><font color="#339900">/**</font></i><br /></li><li><i><font color="#339900"> * PreparedStatement回调接口定义。</font></i><br /></li><li><i><font color="#339900"> * 最后更新日期:2005年3月28日</font></i><br /></li><li><i><font color="#339900"> * @author cherami</font></i><br /></li><li><i><font color="#339900"> */</font></i><br /></li><li><b><font color="#0000ff">public</font></b><b><font color="#0000ff">interface</font></b><a href="http://www.javaresearch.org/source/javaresearch/jerch0.9/org/javaresearch/jerch/PreparedStatementCallback.java.html"><font color="#ff0000"><u>PreparedStatementCallback</u></font></a> {<br /></li><li>  <i><font color="#339900">/**</font></i><br /></li><li><i><font color="#339900">   * 定义PreparedStatement中的执行内容。 </font></i><br /></li><li><i><font color="#339900">   * 执行前PreparedStatement的参数等内容都已经设置好了。</font></i><br /></li><li><i><font color="#339900">   * @param stmt PreparedStatement</font></i><br /></li><li><i><font color="#339900">   * @return 执行的结果</font></i><br /></li><li><i><font color="#339900">   * @throws SQLException</font></i><br /></li><li><i><font color="#339900">   */</font></i><br /></li><li>  <b><font color="#0000ff">public</font></b><b><a href="http://www.javaresearch.org/source/jdk142/java/lang/Object.java.html"><font color="#ff0000"><u>Object</u></font></a></b> doInPreparedStatement(<b><a href="http://www.javaresearch.org/source/jdk142/java/sql/PreparedStatement.java.html"><font color="#ff0000"><u>PreparedStatement</u></font></a></b> stmt) <b><font color="#0000ff">throws</font></b><b><a href="http://www.javaresearch.org/source/jdk142/java/sql/SQLException.java.html"><font color="#ff0000"><u>SQLException</u></font></a></b>;<br /></li><li>}</li></ol><img src ="http://www.blogjava.net/huamengxing/aggbug/143921.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huamengxing/" target="_blank">华梦行</a> 2007-09-10 11:10 <a href="http://www.blogjava.net/huamengxing/archive/2007/09/10/143921.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>取ResultSet中的全部数据的接口定义。</title><link>http://www.blogjava.net/huamengxing/archive/2007/09/10/143916.html</link><dc:creator>华梦行</dc:creator><author>华梦行</author><pubDate>Mon, 10 Sep 2007 03:05:00 GMT</pubDate><guid>http://www.blogjava.net/huamengxing/archive/2007/09/10/143916.html</guid><wfw:comment>http://www.blogjava.net/huamengxing/comments/143916.html</wfw:comment><comments>http://www.blogjava.net/huamengxing/archive/2007/09/10/143916.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huamengxing/comments/commentRss/143916.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huamengxing/services/trackbacks/143916.html</trackback:ping><description><![CDATA[
		<ol>
				<li>
						<i>
								<font color="#339900">/**</font>
						</i>
						<br />
				</li>
				<li>
						<i>
								<font color="#339900"> * Copyright: Copyright (c) 2005-2005</font>
						</i>
						<br />
				</li>
				<li>
						<i>
								<font color="#339900"> * Company: JavaResearch(http://www.javaresearch.org)</font>
						</i>
						<br />
				</li>
				<li>
						<i>
								<font color="#339900"> */</font>
						</i>
						<br />
				</li>
				<li>
						<b>
								<font color="#0000ff">package</font>
						</b> org.javaresearch.jerch;<br /></li>
				<li>
						<br />
				</li>
				<li>
						<b>
								<font color="#0000ff">import</font>
						</b> java.sql.<b><a href="http://www.javaresearch.org/source/jdk142/java/sql/ResultSet.java.html"><font color="#ff0000"><u>ResultSet</u></font></a></b>;<br /></li>
				<li>
						<b>
								<font color="#0000ff">import</font>
						</b> java.sql.<b><a href="http://www.javaresearch.org/source/jdk142/java/sql/SQLException.java.html"><font color="#ff0000"><u>SQLException</u></font></a></b>;<br /></li>
				<li>
						<br />
				</li>
				<li>
						<i>
								<font color="#339900">/**</font>
						</i>
						<br />
				</li>
				<li>
						<i>
								<font color="#339900"> * 提取ResultSet中的全部数据的接口定义。</font>
						</i>
						<br />
				</li>
				<li>
						<i>
								<font color="#339900"> * 最后更新日期:2005年3月28日</font>
						</i>
						<br />
				</li>
				<li>
						<i>
								<font color="#339900"> * @author cherami</font>
						</i>
						<br />
				</li>
				<li>
						<i>
								<font color="#339900"> */</font>
						</i>
						<br />
				</li>
				<li>
						<b>
								<font color="#0000ff">public</font>
						</b>
						<b>
								<font color="#0000ff">interface</font>
						</b>
						<a href="http://www.javaresearch.org/source/javaresearch/jerch0.9/org/javaresearch/jerch/ResultSetExtractor.java.html">
								<font color="#ff0000">
										<u>ResultSetExtractor</u>
								</font>
						</a> {<br /></li>
				<li>  <i><font color="#339900">/**</font></i><br /></li>
				<li>
						<i>
								<font color="#339900">   * 提取ResultSet中的全部数据。</font>
						</i>
						<br />
				</li>
				<li>
						<i>
								<font color="#339900">   * @param rs ResultSet</font>
						</i>
						<br />
				</li>
				<li>
						<i>
								<font color="#339900">   * @return ResultSet中的全部数据</font>
						</i>
						<br />
				</li>
				<li>
						<i>
								<font color="#339900">   * @throws SQLException</font>
						</i>
						<br />
				</li>
				<li>
						<i>
								<font color="#339900">   */</font>
						</i>
						<br />
				</li>
				<li>  <b><font color="#0000ff">public</font></b><b><a href="http://www.javaresearch.org/source/jdk142/java/lang/Object.java.html"><font color="#ff0000"><u>Object</u></font></a></b> extractSet(<b><a href="http://www.javaresearch.org/source/jdk142/java/sql/ResultSet.java.html"><font color="#ff0000"><u>ResultSet</u></font></a></b> rs) <b><font color="#0000ff">throws</font></b><b><a href="http://www.javaresearch.org/source/jdk142/java/sql/SQLException.java.html"><font color="#ff0000"><u>SQLException</u></font></a></b>;<br /></li>
				<li>}<br /></li>
		</ol>
		<p>List perList = (List)jt.query("select * from vets", <br />    new ResultSetExtractor(){<br />      public Object extractData(ResultSet rs) throws SQLException, DataAccessException {<br />       List&lt;Person&gt; personList = new ArrayList&lt;Person&gt;();<br />       while(rs.next()){<br />        Person per = new Person();<br />        per.setId(rs.getInt("id"));<br />        per.setFirstName(rs.getString("first_name"));<br />        per.setLastName(rs.getString("last_name"));<br />        personList.add(per);<br />       }<br />       return personList;<br />    }<br />  });</p>
<img src ="http://www.blogjava.net/huamengxing/aggbug/143916.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huamengxing/" target="_blank">华梦行</a> 2007-09-10 11:05 <a href="http://www.blogjava.net/huamengxing/archive/2007/09/10/143916.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>interface Mappable </title><link>http://www.blogjava.net/huamengxing/archive/2007/09/10/143915.html</link><dc:creator>华梦行</dc:creator><author>华梦行</author><pubDate>Mon, 10 Sep 2007 03:00:00 GMT</pubDate><guid>http://www.blogjava.net/huamengxing/archive/2007/09/10/143915.html</guid><wfw:comment>http://www.blogjava.net/huamengxing/comments/143915.html</wfw:comment><comments>http://www.blogjava.net/huamengxing/archive/2007/09/10/143915.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huamengxing/comments/commentRss/143915.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huamengxing/services/trackbacks/143915.html</trackback:ping><description><![CDATA[
		<ol>
				<li>
						<p>
								<b>
										<font color="#0000ff">public</font>
								</b>
								<b>
										<font color="#0000ff">interface</font>
								</b>
								<a href="http://www.javaresearch.org/source/javaresearch/jerch0.9/org/javaresearch/jerch/Mappable.java.html">
										<font color="#ff0000">
												<u>Mappable</u>
										</font>
								</a> {</p>
						<br />
				</li>
				<li>  <i><font color="#339900">/**</font></i><br /></li>
				<li>
						<i>
								<font color="#339900">   * 得到字段对应的填充方法的方法名。</font>
						</i>
						<br />
				</li>
				<li>
						<i>
								<font color="#339900">   * @param fieldName 数据库表的字段名</font>
						</i>
						<br />
				</li>
				<li>
						<i>
								<font color="#339900">   * @return 进行填充的方法名。</font>
						</i>
						<br />
				</li>
				<li>
						<i>
								<font color="#339900">   */</font>
						</i>
						<br />
				</li>
				<li>  <b><font color="#0000ff">public</font></b><b><a href="http://www.javaresearch.org/source/jdk142/java/lang/String.java.html"><font color="#ff0000"><u>String</u></font></a></b> getMapMethod(<b><a href="http://www.javaresearch.org/source/jdk142/java/lang/String.java.html"><font color="#ff0000"><u>String</u></font></a></b> fieldName);<br /></li>
				<li>  <i><font color="#339900">/**</font></i><br /></li>
				<li>
						<i>
								<font color="#339900">   * 得到字段对应的填充方法的参数类型。</font>
						</i>
						<br />
				</li>
				<li>
						<i>
								<font color="#339900">   * 数据库返回的值的类型和Java中的可能不是匹配的，或者JavaBean中自己定义为原始类型了，因此需要指定。</font>
						</i>
						<br />
				</li>
				<li>
						<i>
								<font color="#339900">   * @param fieldName 数据库表的字段名</font>
						</i>
						<br />
				</li>
				<li>
						<i>
								<font color="#339900">   * @param dbType 数据库返回的类型常量定义</font>
						</i>
						<br />
				</li>
				<li>
						<i>
								<font color="#339900">   * @return 进行填充的方法的参数的类型</font>
						</i>
						<br />
				</li>
				<li>
						<i>
								<font color="#339900">   */</font>
						</i>
						<br />
				</li>
				<li>  <b><font color="#0000ff">public</font></b><b><a href="http://www.javaresearch.org/source/jdk142/java/lang/Class.java.html"><font color="#ff0000"><u>Class</u></font></a></b> getMethodParameterType(<b><a href="http://www.javaresearch.org/source/jdk142/java/lang/String.java.html"><font color="#ff0000"><u>String</u></font></a></b> fieldName,<b><font color="#0000ff">int</font></b> dbType);<br /></li>
				<li>}<br /></li>
		</ol>
<img src ="http://www.blogjava.net/huamengxing/aggbug/143915.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huamengxing/" target="_blank">华梦行</a> 2007-09-10 11:00 <a href="http://www.blogjava.net/huamengxing/archive/2007/09/10/143915.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PreparedStatementSetter 设置PreparedStatement所需的全部参数。</title><link>http://www.blogjava.net/huamengxing/archive/2007/09/10/143912.html</link><dc:creator>华梦行</dc:creator><author>华梦行</author><pubDate>Mon, 10 Sep 2007 02:54:00 GMT</pubDate><guid>http://www.blogjava.net/huamengxing/archive/2007/09/10/143912.html</guid><wfw:comment>http://www.blogjava.net/huamengxing/comments/143912.html</wfw:comment><comments>http://www.blogjava.net/huamengxing/archive/2007/09/10/143912.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huamengxing/comments/commentRss/143912.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huamengxing/services/trackbacks/143912.html</trackback:ping><description><![CDATA[
		<ol>
				<li>
						<p>
								<i>
										<font color="#339900">/**</font>
								</i>
						</p>
						<br />
				</li>
				<li>
						<i>
								<font color="#339900">* Copyright: Copyright (c) 2005-2005</font>
						</i>
						<br />
				</li>
				<li>
						<i>
								<font color="#339900">* Company: JavaResearch(http://www.javaresearch.org)</font>
						</i>
						<br />
				</li>
				<li>
						<i>
								<font color="#339900">*/</font>
						</i>
						<br />
				</li>
				<li>
						<b>
								<font color="#0000ff">package</font>
						</b>org.javaresearch.jerch;<br /></li>
				<li>
						<br />
				</li>
				<li>
						<b>
								<font color="#0000ff">import</font>
						</b>java.sql.<b><a href="http://www.javaresearch.org/source/jdk142/java/sql/PreparedStatement.java.html"><font color="#ff0000"><u>PreparedStatement</u></font></a></b>;<br /></li>
				<li>
						<b>
								<font color="#0000ff">import</font>
						</b>java.sql.<b><a href="http://www.javaresearch.org/source/jdk142/java/sql/SQLException.java.html"><font color="#ff0000"><u>SQLException</u></font></a></b>;<br /></li>
				<li>
						<br />
				</li>
				<li>
						<i>
								<font color="#339900">/**</font>
						</i>
						<br />
				</li>
				<li>
						<i>
								<font color="#339900">* 设置PreparedStatement的参数的接口定义。</font>
						</i>
						<br />
				</li>
				<li>
						<i>
								<font color="#339900">* 最后更新日期:2005年3月28日</font>
						</i>
						<br />
				</li>
				<li>
						<i>
								<font color="#339900">* @author cherami</font>
						</i>
						<br />
				</li>
				<li>
						<i>
								<font color="#339900">*/</font>
						</i>
						<br />
				</li>
				<li>
						<b>
								<font color="#0000ff">public</font>
						</b>
						<b>
								<font color="#0000ff">interface</font>
						</b>
						<a href="http://www.javaresearch.org/source/javaresearch/jerch0.9/org/javaresearch/jerch/PreparedStatementSetter.java.html">
								<font color="#ff0000">
										<u>PreparedStatementSetter</u>
								</font>
						</a>{<br /></li>
				<li>  <i><font color="#339900">/**</font></i><br /></li>
				<li>
						<i>
								<font color="#339900">   * 设置PreparedStatement所需的全部参数。</font>
						</i>
						<br />
				</li>
				<li>
						<i>
								<font color="#339900">   * @param ps PreparedStatement</font>
						</i>
						<br />
				</li>
				<li>
						<i>
								<font color="#339900">   * @throws SQLException</font>
						</i>
						<br />
				</li>
				<li>
						<i>
								<font color="#339900">   */</font>
						</i>
						<br />
				</li>
				<li>  <b><font color="#0000ff">public</font></b><b><font color="#0000ff">void</font></b> setValues(<b><a href="http://www.javaresearch.org/source/jdk142/java/sql/PreparedStatement.java.html"><font color="#ff0000"><u>PreparedStatement</u></font></a></b> ps)  <b><font color="#0000ff">throws</font></b><b><a href="http://www.javaresearch.org/source/jdk142/java/sql/SQLException.java.html"><font color="#ff0000"><u>SQLException</u></font></a></b>;<br /></li>
				<li>}
</li>
				<li>
				</li>
				<li>jt.query("select address from owners where first_name = ? and last_name = ?",<br />    new PreparedStatementSetter(){<br />     public void setValues(PreparedStatement ps) throws SQLException {<br />      ps.setString(1, "Jeff");<br />      ps.setString(2, "Black");<br />     }<br />    }, <br />    new RowMapper(){<br />     public Object mapRow(ResultSet rs, int rowNum) throws SQLException {      <br />      return rs.getString("address");<br />     }<br />    }));<br /></li>
		</ol>
<img src ="http://www.blogjava.net/huamengxing/aggbug/143912.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huamengxing/" target="_blank">华梦行</a> 2007-09-10 10:54 <a href="http://www.blogjava.net/huamengxing/archive/2007/09/10/143912.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PreparedStatementCreator</title><link>http://www.blogjava.net/huamengxing/archive/2007/09/10/143900.html</link><dc:creator>华梦行</dc:creator><author>华梦行</author><pubDate>Mon, 10 Sep 2007 02:38:00 GMT</pubDate><guid>http://www.blogjava.net/huamengxing/archive/2007/09/10/143900.html</guid><wfw:comment>http://www.blogjava.net/huamengxing/comments/143900.html</wfw:comment><comments>http://www.blogjava.net/huamengxing/archive/2007/09/10/143900.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huamengxing/comments/commentRss/143900.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huamengxing/services/trackbacks/143900.html</trackback:ping><description><![CDATA[
		<ol>
				<li>
						<p>
								<i>
										<font color="#339900">/**</font>
								</i>
						</p>
						<br />
				</li>
				<li>
						<i>
								<font color="#339900">* Copyright: Copyright (c) 2005-2005</font>
						</i>
						<br />
				</li>
				<li>
						<i>
								<font color="#339900">* Company: JavaResearch(http://www.javaresearch.org)</font>
						</i>
						<br />
				</li>
				<li>
						<i>
								<font color="#339900">*/</font>
						</i>
						<br />
				</li>
				<li>
						<b>
								<font color="#0000ff">package</font>
						</b>org.javaresearch.jerch;<br /></li>
				<li>
						<br />
				</li>
				<li>
						<b>
								<font color="#0000ff">import</font>
						</b>java.sql.<b><a href="http://www.javaresearch.org/source/jdk142/java/sql/Connection.java.html"><font color="#ff0000"><u>Connection</u></font></a></b>;<br /></li>
				<li>
						<b>
								<font color="#0000ff">import</font>
						</b>java.sql.<b><a href="http://www.javaresearch.org/source/jdk142/java/sql/PreparedStatement.java.html"><font color="#ff0000"><u>PreparedStatement</u></font></a></b>;<br /></li>
				<li>
						<b>
								<font color="#0000ff">import</font>
						</b>java.sql.<b><a href="http://www.javaresearch.org/source/jdk142/java/sql/SQLException.java.html"><font color="#ff0000"><u>SQLException</u></font></a></b>;<br /></li>
				<li>
						<br />
				</li>
				<li>
						<i>
								<font color="#339900">/**</font>
						</i>
						<br />
				</li>
				<li>
						<i>
								<font color="#339900">* 创建PreparedStatement的接口定义。</font>
						</i>
						<br />
				</li>
				<li>
						<i>
								<font color="#339900">* 最后更新日期:2005年3月28日</font>
						</i>
						<br />
				</li>
				<li>
						<i>
								<font color="#339900">* @author cherami</font>
						</i>
						<br />
				</li>
				<li>
						<i>
								<font color="#339900">*/</font>
						</i>
						<br />
				</li>
				<li>
						<b>
								<font color="#0000ff">public</font>
						</b>
						<b>
								<font color="#0000ff">interface</font>
						</b>
						<a href="http://www.javaresearch.org/source/javaresearch/jerch0.9/org/javaresearch/jerch/PreparedStatementCreator.java.html">
								<font color="#ff0000">
										<u>PreparedStatementCreator</u>
								</font>
						</a>{<br /></li>
				<li>  <i><font color="#339900">/**</font></i><br /></li>
				<li>
						<i>
								<font color="#339900">   * 从数据库连接中创建一个PreparedStatement。</font>
						</i>
						<br />
				</li>
				<li>
						<i>
								<font color="#339900">   * @param con 数据库连接</font>
						</i>
						<br />
				</li>
				<li>
						<i>
								<font color="#339900">   * @return 创建好的PreparedStatement</font>
						</i>
						<br />
				</li>
				<li>
						<i>
								<font color="#339900">   * @throws SQLException</font>
						</i>
						<br />
				</li>
				<li>
						<i>
								<font color="#339900">   */</font>
						</i>
						<br />
				</li>
				<li>  <b><font color="#0000ff">public</font></b><b><a href="http://www.javaresearch.org/source/jdk142/java/sql/PreparedStatement.java.html"><font color="#ff0000"><u>PreparedStatement</u></font></a></b> createPreparedStatement(<b><a href="http://www.javaresearch.org/source/jdk142/java/sql/Connection.java.html"><font color="#ff0000"><u>Connection</u></font></a></b> con) <b><font color="#0000ff">throws</font></b><b><a href="http://www.javaresearch.org/source/jdk142/java/sql/SQLException.java.html"><font color="#ff0000"><u>SQLException</u></font></a></b>; <br /></li>
				<li>}
</li>
				<li>
				</li>
				<li>使用实例：<br /></li>
				<li>jt  jdbctemplate：<br />  System.out.println(jt.execute(<br />    new PreparedStatementCreator(){<br />     public PreparedStatement createPreparedStatement(Connection con) throws SQLException {<br />      return con.prepareStatement("select address from owners");<br />     }<br />    }, <br />    new PreparedStatementCallback(){<br />     public Object doInPreparedStatement(PreparedStatement ps) throws SQLException, DataAccessException {<br />      List&lt;String&gt; list = new ArrayList&lt;String&gt;();<br />      ResultSet rs = null;<br />      try{<br />       rs = ps.executeQuery();<br />       while(rs.next()){<br />        list.add(rs.getString("address"));<br />       }<br />      }finally{<br />       JdbcUtils.closeResultSet(rs);<br />      }<br />      return list;<br />     }<br />    }));</li>
		</ol>
<img src ="http://www.blogjava.net/huamengxing/aggbug/143900.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huamengxing/" target="_blank">华梦行</a> 2007-09-10 10:38 <a href="http://www.blogjava.net/huamengxing/archive/2007/09/10/143900.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring JDBC Template</title><link>http://www.blogjava.net/huamengxing/archive/2007/09/06/143234.html</link><dc:creator>华梦行</dc:creator><author>华梦行</author><pubDate>Thu, 06 Sep 2007 09:50:00 GMT</pubDate><guid>http://www.blogjava.net/huamengxing/archive/2007/09/06/143234.html</guid><wfw:comment>http://www.blogjava.net/huamengxing/comments/143234.html</wfw:comment><comments>http://www.blogjava.net/huamengxing/archive/2007/09/06/143234.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huamengxing/comments/commentRss/143234.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huamengxing/services/trackbacks/143234.html</trackback:ping><description><![CDATA[&lt;bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"&gt;<br />  &lt;property name="driverClassName" value="org.hsqldb.jdbcDriver" /&gt;<br />  &lt;property name="username" value="sa" /&gt;<br />  &lt;property name="password" value="" /&gt;<br />  &lt;property name="url" value="jdbc:hsqldb:hsql://localhost:9001" /&gt;<br /> &lt;/bean&gt;<br /> <br /> &lt;bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"&gt;<br />  &lt;property name="dataSource" ref="dataSource"&gt;&lt;/property&gt;<br /> &lt;/bean&gt;<br /><br />ListableBeanFactory cbf = new ClassPathXmlApplicationContext("ac1.xml");<br />  JdbcTemplate jt = (JdbcTemplate) cbf.getBean("jdbcTemplate");  <br />  List rsList = jt.queryForList("select * from pets");<br />  //////////////////// 首先取得list<br />  for(Iterator iterator = rsList.iterator();iterator.hasNext() ;){<br />//////////////////////////////将所有的list迭代出来<br />   System.out.println(iterator.next());<br />  }  <br /><ol><li class="alt"><span><span>List rows = jdbcTemplate.queryForList(</span><span class="string">"SELECT * FROM USER"</span><span>);   </span></span></li><li class=""><span>Iterator it = rows.iterator();   </span></li><li class="alt"><span></span><span class="keyword">while</span><span>(it.hasNext()) {   </span></li><li class=""><span>    Map userMap = (Map) it.next();   </span></li><li class="alt"><span>    System.out.print(userMap.get(</span><span class="string">"user_id"</span><span>) + </span><span class="string">"\t"</span><span>);   </span></li><li class=""><span>    System.out.print(userMap.get(</span><span class="string">"name"</span><span>) + </span><span class="string">"\t"</span><span>);   </span></li><li class="alt"><span>    System.out.print(userMap.get(</span><span class="string">"sex"</span><span>) + </span><span class="string">"\t"</span><span>);   </span></li><li class=""><span>    System.out.println(userMap.get(</span><span class="string">"age"</span><span>) + </span><span class="string">"\t"</span><span>);   </span></li><li class="alt"><span>} </span></li></ol><img src ="http://www.blogjava.net/huamengxing/aggbug/143234.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huamengxing/" target="_blank">华梦行</a> 2007-09-06 17:50 <a href="http://www.blogjava.net/huamengxing/archive/2007/09/06/143234.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MessageSourceResolvable</title><link>http://www.blogjava.net/huamengxing/archive/2007/09/05/142934.html</link><dc:creator>华梦行</dc:creator><author>华梦行</author><pubDate>Wed, 05 Sep 2007 08:43:00 GMT</pubDate><guid>http://www.blogjava.net/huamengxing/archive/2007/09/05/142934.html</guid><wfw:comment>http://www.blogjava.net/huamengxing/comments/142934.html</wfw:comment><comments>http://www.blogjava.net/huamengxing/archive/2007/09/05/142934.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huamengxing/comments/commentRss/142934.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huamengxing/services/trackbacks/142934.html</trackback:ping><description><![CDATA[//通过MessageSourceResolvable接口获得message_zh_CN.properties中的消息<br />  MessageSourceResolvable msr = new DefaultMessageSourceResolvable(new String[]{"welcome"}, <br />    new Object[]{"默认MessageSourceResolvable实现"});<br />  System.out.println(aac.getMessage(msr, Locale.CHINA));
<p> </p><img src ="http://www.blogjava.net/huamengxing/aggbug/142934.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huamengxing/" target="_blank">华梦行</a> 2007-09-05 16:43 <a href="http://www.blogjava.net/huamengxing/archive/2007/09/05/142934.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring提供了MethodNameResolver的三种方式：</title><link>http://www.blogjava.net/huamengxing/archive/2007/08/30/141396.html</link><dc:creator>华梦行</dc:creator><author>华梦行</author><pubDate>Thu, 30 Aug 2007 07:21:00 GMT</pubDate><guid>http://www.blogjava.net/huamengxing/archive/2007/08/30/141396.html</guid><wfw:comment>http://www.blogjava.net/huamengxing/comments/141396.html</wfw:comment><comments>http://www.blogjava.net/huamengxing/archive/2007/08/30/141396.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huamengxing/comments/commentRss/141396.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huamengxing/services/trackbacks/141396.html</trackback:ping><description><![CDATA[Spring提供了MethodNameResolver的三种方式：<br /><br />1 : ParameterMethodNameResolver,这个可以根据请求的参数来确定一个需要调用的方法。<br />例如，<a href="http://www.sf.net/index.view?testParam=testIt">http://www.sf.net/index.view?testParam=testIt</a>，这个请求会调用名称为testIt的处理方法。<br /><br />2 : InternalPathMethodNameResolver，这个可以根据请求的路径名称来调用相应的方法。<br />例如，<a href="http://www.sf.net/testing.view">http://www.sf.net/testing.view</a>,这个请求会调用testing方法。<br /><br />3 : PropertiesMethodNameResolver，这个可以根据一个URLs 映射列表来调用相应的方法。<br />例如，如果定义了/index/welcome.html=doIt，那么当请求为/index/welcome.html时，会调用doIt方法。在定义URLs时可以使用通配符。/**/welcom?.html<img src ="http://www.blogjava.net/huamengxing/aggbug/141396.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huamengxing/" target="_blank">华梦行</a> 2007-08-30 15:21 <a href="http://www.blogjava.net/huamengxing/archive/2007/08/30/141396.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring 控制器</title><link>http://www.blogjava.net/huamengxing/archive/2007/08/30/141312.html</link><dc:creator>华梦行</dc:creator><author>华梦行</author><pubDate>Thu, 30 Aug 2007 04:32:00 GMT</pubDate><guid>http://www.blogjava.net/huamengxing/archive/2007/08/30/141312.html</guid><wfw:comment>http://www.blogjava.net/huamengxing/comments/141312.html</wfw:comment><comments>http://www.blogjava.net/huamengxing/archive/2007/08/30/141312.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huamengxing/comments/commentRss/141312.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huamengxing/services/trackbacks/141312.html</trackback:ping><description><![CDATA[
		<div class="section" lang="zh-cn">
				<div class="titlepage">
						<div>
								<div>
										<h2 class="title" style="CLEAR: both">
												<a name="mvc-controller">
												</a>13.3. 控制器</h2>
								</div>
						</div>
				</div>
				<p>控制器的概念是MVC设计模式的一部分(确切地说，是MVC中的<span class="emphasis"><em>C</em></span>）。应用程序的行为通常被定义为服务接口，而控制器使得用户可以访问应用所提供的服务。控制器解析用户输入，并将其转换成合理的模型数据，从而可以进一步由视图展示给用户。Spring以一种抽象的方式实现了控制器概念，这样使得不同类型的控制器可以被创建。Spring本身包含表单控制器、命令控制器、向导型控制器等多种多样的控制器。</p>
				<p>Spring控制器架构的基础是<code class="interfacename">org.springframework.mvc.Controller</code>接口，其代码如下：</p>
				<pre class="programlisting">public interface Controller {

    /**
     * Process the request and return a ModelAndView object which the DispatcherServlet
     * will render.
     */
    ModelAndView handleRequest(
        HttpServletRequest request,
        HttpServletResponse response) throws Exception;

}</pre>
				<p>你可以发现<code class="interfacename">Controller</code>接口仅仅声明了一个方法，它负责处理请求并返回合适的模型和视图。Spring MVC实现的基础就是这三个概念：Mdel、View（<code class="classname">ModelAndView</code>）以及 <code class="interfacename">Controller</code>。虽然<code class="interfacename">Controller</code>接口是完全抽象的，但Spring也提供了许多你可能会用到的控制器。Controller接口仅仅定义了每个控制器都必须提供的基本功能：处理请求并返回一个模型和一个视图。</p>
				<div class="section" lang="zh-cn">
						<div class="titlepage">
								<div>
										<div>
												<h3 class="title">
														<a name="mvc-controller-abstractcontroller">
														</a>13.3.1. <code class="classname">AbstractController</code> 和 <code class="classname">WebContentGenerator</code></h3>
										</div>
								</div>
						</div>
						<p>为了提供一套基础设施，所有的Spring控制器都继承了 <code class="classname">AbstractController</code> ，<code class="classname">AbstractController</code> 提供了诸如缓存支持和mimetype设置这样的功能。</p>
						<div class="table">
								<a name="mvc-controller-abstract-features">
								</a>
								<p class="title">
										<b>表 13.3. <code class="classname">AbstractController</code>提供的功能</b>
								</p>
								<div class="table-contents">
										<table summary="AbstractController提供的功能" border="1">
												<colgroup>
														<col />
														<col />
												</colgroup>
												<thead>
														<tr>
																<th>功能</th>
																<th>描述</th>
														</tr>
												</thead>
												<tbody>
														<tr>
																<td>
																		<code class="literal">supportedMethods</code>
																</td>
																<td>指定这个控制器应该接受什么样的请求方法。通常它被设置成同时支持GET和POST，但是你可以选择你想支持的方法。如果控制器不支持请求发送的方法，客户端会得到通知（通常是抛出一个<code class="classname">ServletException</code>）。 </td>
														</tr>
														<tr>
																<td>
																		<code class="literal">requiresSession</code>
																</td>
																<td>指定这个控制器是否需要HTTP session才能正常工作。如果控制器在没有session的情况下接收到请求，客户端会因为抛出<code class="classname">ServletException</code>而得到通知。 </td>
														</tr>
														<tr>
																<td>
																		<code class="literal">synchronizeSession</code>
																</td>
																<td>指定controller是否同步用户的HTTP session。 </td>
														</tr>
														<tr>
																<td>
																		<code class="literal">cacheSeconds</code>
																</td>
																<td>指定controller通知客户端对数据内容缓存的秒数，一般为大于零的整数。默认值为<span class="emphasis"><em>-1</em></span>，即不缓存。 </td>
														</tr>
														<tr>
																<td>
																		<code class="literal">useExpiresHeader</code>
																</td>
																<td>指定Controller在响应请求时是否兼容HTTP 1.0 <span class="emphasis"><em>Expires</em></span> header。缺省值为<code class="literal">true</code>。 </td>
														</tr>
														<tr>
																<td>
																		<code class="literal">useCacheHeader</code>
																</td>
																<td>指定Controller在相应请求时是否兼容HTTP 1.1 <span class="emphasis"><em>Cache-Control</em></span> header。默认值为<code class="literal">true</code>。 </td>
														</tr>
												</tbody>
										</table>
								</div>
						</div>
						<br class="table-break" />
						<p>当从<code class="classname">AbstractController</code>继承时，需要实现<code class="literal">handleRequestInternal(HttpServletRequest, HttpServletResponse)</code>抽象方法，该方法将用来实现自己的逻辑，并返回一个<code class="classname">ModelAndView</code>对象。下面这个简单的例子演示了如何从<code class="classname">AbstractController</code>继承以及如何在applicationContext.xml中进行配置</p>
						<pre class="programlisting">package samples;

public class SampleController extends AbstractController {

    public ModelAndView handleRequestInternal(
        HttpServletRequest request,
        HttpServletResponse response) throws Exception {

        ModelAndView mav = new ModelAndView("hello");
        mav.addObject("message", "Hello World!");
        return mav;        
    }
}</pre>
						<pre class="programlisting">&lt;bean id="sampleController" class="samples.SampleController"&gt;
    &lt;property name="cacheSeconds" value="120"/&gt;
&lt;/bean&gt;</pre>
						<p>该controller返回的ModelAndView使用了硬编码的视图名（尽管这样做不好），并通知客户端将响应数据缓存2分钟。除了通过以上方式创建和配置controller之外，还需要配置handler mapping(请参考<a title="13.4. 处理器映射（handler mapping）" href="mk:@MSITStore:C:\Documents%20and%20Settings\ljl\桌面\spring2.0-reference_final_zh_cn.chm::/ch13s04.html">第 13.4 节 “处理器映射（handler mapping）”</a>)，这样该controller就可以工作了。</p>
				</div>
				<div class="section" lang="zh-cn">
						<div class="titlepage">
								<div>
										<div>
												<h3 class="title">
														<a name="mvc-controller-othersimplecontrollers">
														</a>13.3.2. 其它的简单控制器</h3>
										</div>
								</div>
						</div>
						<p>尽管可以继承<code class="classname">AbstractController</code>来实现自己的控制器，不过Spring提供的众多控制器减轻了我们开发简单MVC应用时的负担。<code class="classname">ParameterizableViewController</code>基本上和上面例子中的一样，不同的是，你可以在applicationContext.xml配置中指定返回视图名从而避免了在Java代码中的硬编码。</p>
						<p>
								<code class="classname">UrlFilenameViewController</code>会检查URL，获取文件请求的文件名，并把它作为视图名加以使用。。例如，<code class="literal">http://www.springframework.org/index.html</code>对应的视图文件名是<code class="literal">index</code>。</p>
				</div>
				<div class="section" lang="zh-cn">
						<div class="titlepage">
								<div>
										<div>
												<h3 class="title">
														<a name="mvc-controller-multiaction">
														</a>13.3.3. <code class="classname">MultiActionController</code></h3>
										</div>
								</div>
						</div>
						<p>
								<code class="classname">MultiActionController</code>将多个行为(action)合并在一个控制器里，这样可以把相关功能组合在一起。<code class="classname">MultiActionController</code>位于<code class="literal">org.springframework.web.mvc.multiaction</code>包中，它通过将请求映射到正确的方法名来调用方法。当在一个控制器存在大量公共的行为，但是有多个调用入口时，使用<code class="classname">MultiActionController</code>就特别方便。</p>
						<div class="table">
								<a name="mvc-controller-multiaction-features">
								</a>
								<p class="title">
										<b>表 13.4. <code class="classname">MultiActionController</code>提供的功能</b>
								</p>
								<div class="table-contents">
										<table summary="MultiActionController提供的功能" border="1">
												<colgroup>
														<col />
														<col />
												</colgroup>
												<thead>
														<tr>
																<th>功能</th>
																<th>描述</th>
														</tr>
												</thead>
												<tbody>
														<tr>
																<td>
																		<code class="literal">delegate</code>
																</td>
																<td>
																		<code class="classname">MultiActionController</code>有两种使用方式。第一种是你继承<code class="classname">MultiActionController</code>，并在子类中指定由<code class="interfacename">MethodNameResolver</code>解析的方法（这种情况下不需要这个delegate参数）。第二种是你定义一个代理对象，由它提供<code class="interfacename">MethodNameResolver</code>解析出来的方法（这种情况下，你必须使用这个配置参数定义代理对象）。 </td>
														</tr>
														<tr>
																<td>
																		<code class="literal">methodNameResolver</code>
																</td>
																<td>
																		<code class="classname">MultiActionController</code>需要一种策略，使其可以通过解析请求信息来获得要调用的方法。这个解析策略由<code class="interfacename">MethodNameResolver</code>这个接口定义的。这个参数允许你实现<code class="interfacename">MethodNameResolver</code>接口，然后在控制器中使用你的策略。 </td>
														</tr>
												</tbody>
										</table>
								</div>
						</div>
						<br class="table-break" />
						<p>
								<code class="classname">MultiActionController</code>所支持的方法需要符合下列格式：</p>
						<pre class="programlisting">
								<em class="lineannotation">
										<span class="lineannotation">// anyMeaningfulName can be replaced by any methodname</span>
								</em>
public [ModelAndView | Map | void] anyMeaningfulName(HttpServletRequest, HttpServletResponse [, Exception | AnyObject]);</pre>
						<p>注意：在此<span class="emphasis"><em>不允许</em></span>方法重载，因为<code class="classname">MultiActionController</code>无法分辨出重载（overloading）了的方法。此外，你可以定义<span class="emphasis"><em>exception handler</em></span>来处理方法中抛出的异常。 </p>
						<p>
								<code class="classname">Exception</code> 参数是可选的，它可以是<span class="emphasis"><em>任何</em></span>异常，只要它是<code class="classname">java.lang.Exception</code>或<code class="classname">java.lang.RuntimeException</code>的子类。<code class="classname">AnyObject</code>参数也是可选的，它可以是<span class="emphasis"><em>任何</em></span>对象。HTTP Request中的参数会存在这个对象中，以便使用。</p>
						<p>下面几个例子示范了<code class="classname">MultiActionController</code>正确的方法定义。</p>
						<p>标准格式(跟<code class="interfacename">Controller</code>接口定义的一样)。</p>
						<pre class="programlisting">public ModelAndView doRequest(HttpServletRequest, HttpServletResponse)</pre>
						<p>下面这个方法支持<code class="classname">Login</code>参数， 这个参数中包含从请求中抽取出来的信息。</p>
						<pre class="programlisting">public ModelAndView doLogin(HttpServletRequest, HttpServletResponse, Login)</pre>
						<p>下面这个方法可以处理<code class="classname">Exception</code>。</p>
						<pre class="programlisting">public ModelAndView processException(HttpServletRequest, HttpServletResponse, IllegalArgumentException)</pre>
						<p>下面这个方法不返回任何数值。 (请参考后面的章节 <a title="13.11. 惯例优先原则(convention over configuration)" href="mk:@MSITStore:C:\Documents%20and%20Settings\ljl\桌面\spring2.0-reference_final_zh_cn.chm::/ch13s11.html">第 13.11 节 “惯例优先原则(convention over configuration)”</a>)</p>
						<pre class="programlisting">public void goHome(HttpServletRequest, HttpServletResponse)</pre>
						<p>This signature has a <code class="interfacename">Map</code> return type (see the section entitled <a title="13.11. 惯例优先原则(convention over configuration)" href="mk:@MSITStore:C:\Documents%20and%20Settings\ljl\桌面\spring2.0-reference_final_zh_cn.chm::/ch13s11.html">第 13.11 节 “惯例优先原则(convention over configuration)”</a> below).</p>
						<p>下面这个方法返回一个<code class="interfacename">Map</code>。 (请参考后面的章节<a title="13.11. 惯例优先原则(convention over configuration)" href="mk:@MSITStore:C:\Documents%20and%20Settings\ljl\桌面\spring2.0-reference_final_zh_cn.chm::/ch13s11.html">第 13.11 节 “惯例优先原则(convention over configuration)”</a>)</p>
						<pre class="programlisting">public Map doRequest(HttpServletRequest, HttpServletResponse)</pre>
						<p>
								<code class="interfacename">MethodNameResolver</code>负责从请求中解析出需要调用的方法名称。下面是Spring中内置的三个<code class="interfacename">MethodNameResolver</code> 实现。</p>
						<div class="itemizedlist">
								<ul type="disc" compact="">
										<li>
												<p>
														<code class="classname">ParameterMethodNameResolver</code> - 解析请求参数，并将它作为方法名。(对应<code class="literal">http://www.sf.net/index.view?testParam=testIt</code>的请求，会调用 <code class="literal">testIt(HttpServletRequest,HttpServletResponse)</code>方法)。使用<code class="literal">paramName</code>配置参数，可以设定要检查的参数。</p>
										</li>
										<li>
												<p>
														<code class="classname">InternalPathMethodNameResolver</code> -从路径中获取文件名作为方法名 (<code class="literal">http://www.sf.net/testing.view</code>的请求会调用<code class="literal">testing(HttpServletRequest,HttpServletResponse)</code>方法。</p>
										</li>
										<li>
												<p>
														<code class="classname">PropertiesMethodNameResolver</code> - 使用用户自定义的属性对象，将请求的URL映射到方法名。当属性中包含<code class="literal">/index/welcome.html=doIt</code>时，发到<code class="literal">/index/welcome.html</code> 的请求会调用<code class="literal">doIt(HttpServletRequest, HttpServletResponse)</code>这个方法。 这个方法名解析器可以和<code class="literal">PathMatcher</code>一起工作，比如上边那个URL写成<code class="literal">/**/welcom?.html</code>也是可以的。</p>
										</li>
								</ul>
						</div>
						<p>我们来看一组例子。首先是一个使用<code class="classname">ParameterMethodNameResolver</code>和代理（delegate）属性的例子，它接受包含参数名"method"的请求，调用方法<code class="literal">retrieveIndex</code>： </p>
						<pre class="programlisting">&lt;bean id="paramResolver" class="org....mvc.multiaction.ParameterMethodNameResolver"&gt;
  &lt;property name="paramName" value="method"/&gt;
&lt;/bean&gt;

&lt;bean id="paramMultiController" class="org....mvc.multiaction.MultiActionController"&gt;
  &lt;property name="methodNameResolver" ref="paramResolver"/&gt;
  &lt;property name="delegate" ref="sampleDelegate"/&gt;
&lt;/bean&gt;

&lt;bean id="sampleDelegate" class="samples.SampleDelegate"/&gt;

<em class="lineannotation"><span class="lineannotation">## together with</span></em>

public class SampleDelegate {

    public ModelAndView retrieveIndex(HttpServletRequest req, HttpServletResponse resp) {

        return new ModelAndView("index", "date", new Long(System.currentTimeMillis()));
    }
}</pre>
						<p>当使用上面的代理对象时，我们也可以使用<code class="classname">PropertiesMethodNameRseolver</code>来匹配一组URL，将它们映射到我们定义的方法上：</p>
						<pre class="programlisting">&lt;bean id="propsResolver" class="org....mvc.multiaction.PropertiesMethodNameResolver"&gt;
  &lt;property name="mappings"&gt;
    &lt;value&gt;
        /index/welcome.html=retrieveIndex
        /**/notwelcome.html=retrieveIndex
        /*/user?.html=retrieveIndex
    &lt;/value&gt;
  &lt;/property&gt;
&lt;/bean&gt;

&lt;bean id="paramMultiController" class="org....mvc.multiaction.MultiActionController"&gt;
    &lt;property name="methodNameResolver" ref="propsResolver"/&gt;
    &lt;property name="delegate" ref="sampleDelegate"/&gt;
&lt;/bean&gt;</pre>
				</div>
				<div class="section" lang="zh-cn">
						<div class="titlepage">
								<div>
										<div>
												<h3 class="title">
														<a name="mvc-controller-command">
														</a>13.3.4. 命令控制器</h3>
										</div>
								</div>
						</div>
						<p>Spring的<span class="emphasis"><em>CommandController</em></span>是Spring MVC的重要部分。命令控制器提供了一种和数据对象交互的方式，并动态地将来自<code class="interfacename">HttpServletRequest</code>的参数绑定到你指定的数据对象上。它的功能和Struts中的<code class="classname">ActionForm</code>有点像，不过在Spring中，你不需要实现任何接口来实现数据绑定。首先，让我们看一下有哪些可以使用的命令控制器：</p>
						<div class="itemizedlist">
								<ul type="disc" compact="">
										<li>
												<p>
														<code class="classname">AbstractCommandController</code> －－你可以使用该抽象命令控制器来创建自己的命令控制器，它能够将请求参数绑定到你指定的命令对象。这个类并不提供任何表单功能，但是它提供验证功能，并且让你在子类中去实现如何处理由请求参数产生的命令对象。 </p>
										</li>
										<li>
												<p>
														<code class="classname">AbstractFormController</code>－－一个支持表单提交的抽象控制器类。使用这个控制器，你可以定义表单，并使用从控制器获取的数据对象构建表单。当用户输入表单内容，<code class="classname">AbstractFormController</code>将用户输入的内容绑定到命令对象，验证表单内容，并将该对象交给控制器，完成相应的操作。它支持的功能有防止重复提交、表单验证以及一般的表单处理流程。子类需要实现自己的方法来指定采用哪个视图来显示输入表单，哪个视图显示表单正确提交后的结果。如果你需要表单，但不想在应用上下文中指定显示给用户的视图，就使用这个控制器。 </p>
										</li>
										<li>
												<p>
														<code class="classname">SimpleFormController</code> －－这是一个form cotnroller，当需要根据命令对象来创建相应的form的时候，该类可以提供更多的支持。你可以为其指定一个命令对象，显示表单的视图名，当表单提交成功后显示给用户的视图名等等。 </p>
										</li>
										<li>
												<p>
														<code class="classname">AbstractWizardFormController</code> －－这是一个抽象类，继承这个类需要实现<code class="literal">validatePage()</code>、<code class="literal">processFinish()</code> 和<code class="literal">processCancel()</code> 方法。</p>
												<p>你有可能也需要写一个构造器，它至少需要调用<code class="literal">setPages()</code>和<code class="literal">setCommandName()</code>方法。setPages()的参数是一个String数组，这个数组包含了组成向导的视图名。setCommandName()的参数是一个String，该参数将用来在视图中调用你的命令对象。</p>
												<p>和<code class="classname">AbstractFormController</code>的实现一样, 你需要使用命令对象（其实就是一个JavaBean， 这个bean中包含了表单的信息）。你有两个选择：在构造函数中调用<code class="literal">setCommandClass()</code>方法（参数是命令对象的类名），或者实现<code class="literal">formBackingObject()</code>方法。</p>
												<p>
														<code class="classname">AbstractWizardFormController</code> 有几个你可以复写（override）的方法。最有用的一个是<code class="literal">referenceData(..)</code>。这个方法允许你把模型数据以<code class="interfacename">Map</code>的格式传递给视图；<code class="literal">getTargetPage()</code> 允许你动态地更改向导的页面顺序，或者直接跳过某些页面；<code class="literal">onBindAndValidate()</code> 允许你复写内置的绑定和验证流程。</p>
												<p>最后，我们有必要提一下<code class="literal">setAllowDirtyBack()</code> 和<code class="literal">setAllowDirtyForward()</code>两个方法。 你可以在<code class="literal">getTargetPage()</code>中调用这两个方法，这两个方法将决定在当前页面验证失败时，是否允许向导前移或后退。</p>
												<p>
														<code class="classname">AbstractWizardFormController</code>的更详细内容请参考JavaDoc。在Spring附带的例子jPetStore中，有一个关于向导实现的例子： <code class="classname">org.springframework.samples.jpetstore.web.spring.OrderFormController</code>。</p>
										</li>
								</ul>
						</div>
				</div>
		</div>
<img src ="http://www.blogjava.net/huamengxing/aggbug/141312.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huamengxing/" target="_blank">华梦行</a> 2007-08-30 12:32 <a href="http://www.blogjava.net/huamengxing/archive/2007/08/30/141312.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>视图解析器</title><link>http://www.blogjava.net/huamengxing/archive/2007/08/30/141185.html</link><dc:creator>华梦行</dc:creator><author>华梦行</author><pubDate>Thu, 30 Aug 2007 02:01:00 GMT</pubDate><guid>http://www.blogjava.net/huamengxing/archive/2007/08/30/141185.html</guid><wfw:comment>http://www.blogjava.net/huamengxing/comments/141185.html</wfw:comment><comments>http://www.blogjava.net/huamengxing/archive/2007/08/30/141185.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huamengxing/comments/commentRss/141185.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huamengxing/services/trackbacks/141185.html</trackback:ping><description><![CDATA[视图解析器
<div></div><p>就象和Spring集成的其他表现层技术一样，对于JSP页面你需要一个视图解析器来解析。最常用的JSP视图解析器是<tt class="literal">InternalResourceViewResolver</tt>和<tt class="literal">ResourceBundleViewResolver</tt>。它们被定义在WebApplicationContext里：</p><pre class="programlisting"># The ResourceBundleViewResolver:
&lt;bean id="viewResolver" class="org.springframework.web.servlet.view.ResourceBundleViewResolver"&gt;
    &lt;property name="basename"&gt;&lt;value&gt;views&lt;/value&gt;&lt;/property&gt;
&lt;/bean&gt;

# And a sample properties file is uses (views.properties in WEB-INF/classes):
welcome.class=org.springframework.web.servlet.view.JstlView
welcome.url=/WEB-INF/jsp/welcome.jsp

productList.class=org.springframework.web.servlet.view.JstlView
productList.url=/WEB-INF/jsp/productlist.jsp</pre><p>你可以看到ResourceBundleViewResolver需要一个属性文件来把视图名称映射到 1)类和 2) URL。 通过ResolverBundleViewResolver，你可以用一个解析器来解析两种类型的视图。</p><pre class="programlisting">&lt;bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"&gt;
    &lt;property name="viewClass"&gt;&lt;value&gt;org.springframework.web.servlet.view.JstlView&lt;/value&gt;&lt;/property&gt;
    &lt;property name="prefix"&gt;&lt;value&gt;/WEB-INF/jsp/&lt;/value&gt;&lt;/property&gt;
    &lt;property name="suffix"&gt;&lt;value&gt;.jsp&lt;/value&gt;&lt;/property&gt;
&lt;/bean&gt;</pre><p>InternalResourceBundleViewResolver可以配置成使用JSP页面。作为好的实现方式，强烈推荐你将JSP文件放在WEB-INF下的一个目录中，这样客户端就不会直接访问到它们。</p><img src ="http://www.blogjava.net/huamengxing/aggbug/141185.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huamengxing/" target="_blank">华梦行</a> 2007-08-30 10:01 <a href="http://www.blogjava.net/huamengxing/archive/2007/08/30/141185.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring2.0 Bean  xsd</title><link>http://www.blogjava.net/huamengxing/archive/2007/08/30/141164.html</link><dc:creator>华梦行</dc:creator><author>华梦行</author><pubDate>Thu, 30 Aug 2007 01:24:00 GMT</pubDate><guid>http://www.blogjava.net/huamengxing/archive/2007/08/30/141164.html</guid><wfw:comment>http://www.blogjava.net/huamengxing/comments/141164.html</wfw:comment><comments>http://www.blogjava.net/huamengxing/archive/2007/08/30/141164.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huamengxing/comments/commentRss/141164.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huamengxing/services/trackbacks/141164.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &lt;?xml version="1.0" encoding="UTF-8" standalone="no"?&gt;		&lt;xsd:schema xmlns="http://www.springframework.org/schema/beans"  xmlns:xsd="http://www.w3.org/2001/XMLSchema"  targetNamespace="http:...&nbsp;&nbsp;<a href='http://www.blogjava.net/huamengxing/archive/2007/08/30/141164.html'>阅读全文</a><img src ="http://www.blogjava.net/huamengxing/aggbug/141164.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huamengxing/" target="_blank">华梦行</a> 2007-08-30 09:24 <a href="http://www.blogjava.net/huamengxing/archive/2007/08/30/141164.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring2.0 可扩展XML配置初探 </title><link>http://www.blogjava.net/huamengxing/archive/2007/08/29/140925.html</link><dc:creator>华梦行</dc:creator><author>华梦行</author><pubDate>Wed, 29 Aug 2007 07:08:00 GMT</pubDate><guid>http://www.blogjava.net/huamengxing/archive/2007/08/29/140925.html</guid><wfw:comment>http://www.blogjava.net/huamengxing/comments/140925.html</wfw:comment><comments>http://www.blogjava.net/huamengxing/archive/2007/08/29/140925.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huamengxing/comments/commentRss/140925.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huamengxing/services/trackbacks/140925.html</trackback:ping><description><![CDATA[
		<table width="100%">
				<tbody>
						<tr>
								<td>
										<span class="date_show">2007-07-18</span>
								</td>
								<td align="right">
										<a title="Spring的事务通知" href="http://tom-duan.javaeye.com/blog/100137">Spring的事务通知</a> <img src="http://tom-duan.javaeye.com/images/grayright.gif" />   </td>
						</tr>
				</tbody>
		</table>
		<br />
		<div style="MARGIN-TOP: 1px; MARGIN-LEFT: 15px">
				<h2>
						<a title="永久链接：Spring2.0 可扩展XML配置初探" href="http://tom-duan.javaeye.com/blog/102450">Spring2.0 可扩展XML配置初探</a>
				</h2>
		</div>
		<div style="MARGIN-TOP: 5px; MARGIN-LEFT: 15px">
				<b>关键字:</b> Spring        </div>
		<div style="MARGIN-TOP: 10px; MARGIN-LEFT: 15px; OVERFLOW: auto">
				<table width="100%">
						<tbody>
								<tr>
										<td>
												<p>Spring 2.0版本支持扩展XML配置，着实兴奋了一下，在我看来，Spring作为目前最流行的框架，不能扩展用户自定义的配置，实在是Spring的一个很不爽的地方，&lt;bean /&gt;的方式用起来比较通用，起码到目前为止符合大部分人的使用习惯，并且能完成Spring所有的配置操作,但是对于第三方的提供商或则会经常扩展Spring功能的开发者来说,使用&lt;bean /&gt;这样的配置方式或许不是他们最想要的，他们需要使组件的配置更加直观、易阅读、易扩展……试想使用下面的配置方式 <br /></p>
												<div class="code_title">代码</div>
												<div class="code_div">
														<div class="dp-highlighter">
																<div class="bar">
																</div>
																<ol class="dp-j">
																		<li class="alt">
																				<span>
																						<span>&lt;mytag:datasource id=</span>
																						<span class="string">"datasource"</span>
																						<span>    </span>
																				</span>
																		</li>
																		<li class="">
																				<span>       databaseType=</span>
																				<span class="string">"oracle"</span>
																				<span>    </span>
																		</li>
																		<li class="alt">
																				<span>       ip=</span>
																				<span class="string">"192.168.1.110"</span>
																				<span>    </span>
																		</li>
																		<li class="">
																				<span>       port=</span>
																				<span class="string">"1521"</span>
																				<span>    </span>
																		</li>
																		<li class="alt">
																				<span>       databaseName=</span>
																				<span class="string">"myDB"</span>
																				<span>  </span>
																		</li>
																		<li class="">
																				<span>       userName=</span>
																				<span class="string">"admin"</span>
																				<span>  </span>
																		</li>
																		<li class="alt">
																				<span>       password=</span>
																				<span class="string">"password"</span>
																				<span>  </span>
																		</li>
																		<li class="">
																				<span>       /&gt;   </span>
																		</li>
																		<li class="alt">
																				<span>  </span>
																		</li>
																		<li class="">
																				<span>&lt;mytag:ehCache id=</span>
																				<span class="string">"ehcache"</span>
																				<span>    </span>
																		</li>
																		<li class="alt">
																				<span>       cache=</span>
																				<span class="string">"true"</span>
																				<span>    </span>
																		</li>
																		<li class="">
																				<span>       maxElements=</span>
																				<span class="string">"100000"</span>
																				<span>    </span>
																		</li>
																		<li class="alt">
																				<span>       timeToIdleSeconds=</span>
																				<span class="string">"120"</span>
																				<span>    </span>
																		</li>
																		<li class="">
																				<span>       timeToLiveSeconds=</span>
																				<span class="string">"120"</span>
																				<span>  </span>
																		</li>
																		<li class="alt">
																				<span>       overflowToDisk=</span>
																				<span class="string">"true"</span>
																				<span>  </span>
																		</li>
																		<li class="">
																				<span>       /&gt;   </span>
																		</li>
																</ol>
														</div>
												</div>
												<script><![CDATA[ender_code();]]&gt;</script>
												<br />上面的代码中配置了两个组件，datasource和cache组件，相比普通的bean&amp;propertiy方式,很显然，这种配置方式更直观，更易读，更重要的是，如果作为组件发布，使用者也可以很方便快捷的开始使用，而不需要关心组件的任何实现细节。 
<p></p><p>扩展XML配置大致需要一下几个步骤 <br />1、创建一个需要扩展的组件 <br />2、定义一个xsd文件描述组件内容 <br />3、创建一个文件，实现BeanDefinitionParser接口，用来解析xsd文件中的定义和组件定义 <br />4、创建一个Handler文件，扩展自NamespaceHandlerSupport，目的是将组件注册到Spring容器 <br />5、编写spring.handlers和spring.schemas文件</p><p>提供一个简单的例子，来说明如何去扩展一个Spring配置，需求如下：使用自定义标签定义一个简单的bean，这个bean有一个或多个属性，标签定义完成后，可以在其他项目中用自定义标签来定义该bean。</p><p>首先，创建一个需要扩展的组件，在这里只是一个简单的bean，而且这个bean只有一个属性age. <br />One.java <br /></p><div class="code_title">代码</div><div class="code_div"><div class="dp-highlighter"><div class="bar"></div><ol class="dp-j"><li class="alt"><span><span class="keyword">package</span><span> com.mysite.tag;   </span></span></li><li class=""><span>  </span></li><li class="alt"><span></span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> One {   </span></li><li class=""><span>    </span><span class="keyword">private</span><span> String age;   </span></li><li class="alt"><span>       </span></li><li class=""><span>    </span><span class="keyword">public</span><span> One(){   </span></li><li class="alt"><span>           </span></li><li class=""><span>    }   </span></li><li class="alt"><span>  </span></li><li class=""><span>    </span><span class="keyword">public</span><span> String getAge() {   </span></li><li class="alt"><span>        </span><span class="keyword">return</span><span> age;   </span></li><li class=""><span>    }   </span></li><li class="alt"><span>  </span></li><li class=""><span>    </span><span class="keyword">public</span><span> </span><span class="keyword">void</span><span> setAge(String age) {   </span></li><li class="alt"><span>        </span><span class="keyword">this</span><span>.age = age;   </span></li><li class=""><span>    }   </span></li><li class="alt"><span>}   </span></li></ol></div></div><script><![CDATA[ender_code();]]&gt;</script><p></p><p>然后，建立一个xsd文件，来描述这个bean <br />mytag.xsd <br /></p><div class="code_title">代码</div><div class="code_div"><div class="dp-highlighter"><div class="bar"></div><ol class="dp-xml"><li class="alt"><span><span class="tag">&lt;?</span><span class="tag-name">xml</span><span> </span><span class="attribute">version</span><span>=</span><span class="attribute-value">"1.0"</span><span> </span><span class="attribute">encoding</span><span>=</span><span class="attribute-value">"UTF-8"</span><span class="tag">?&gt;</span><span>  </span></span></li><li class=""><span></span><span class="tag">&lt;</span><span class="tag-name">xsd:schema</span><span> </span><span class="attribute">xmlns</span><span>=</span><span class="attribute-value">"http://www.mysite.org/schema/mytag"</span><span>  </span></li><li class="alt"><span>        </span><span class="attribute">xmlns:xsd</span><span>=</span><span class="attribute-value">"http://www.w3.org/2001/XMLSchema"</span><span>  </span></li><li class=""><span>        </span><span class="attribute">xmlns:beans</span><span>=</span><span class="attribute-value">"http://www.springframework.org/schema/beans"</span><span>  </span></li><li class="alt"><span>        </span><span class="attribute">targetNamespace</span><span>=</span><span class="attribute-value">"http://www.mysite.org/schema/mytag"</span><span>  </span></li><li class=""><span>        </span><span class="attribute">elementFormDefault</span><span>=</span><span class="attribute-value">"qualified"</span><span>  </span></li><li class="alt"><span>        </span><span class="attribute">attributeFormDefault</span><span>=</span><span class="attribute-value">"unqualified"</span><span class="tag">&gt;</span><span>  </span></li><li class=""><span>       </span></li><li class="alt"><span>    </span><span class="tag">&lt;</span><span class="tag-name">xsd:import</span><span> </span><span class="attribute">namespace</span><span>=</span><span class="attribute-value">"http://www.springframework.org/schema/beans"</span><span class="tag">/&gt;</span><span>  </span></li><li class=""><span>       </span></li><li class="alt"><span>    </span><span class="tag">&lt;</span><span class="tag-name">xsd:element</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"one"</span><span class="tag">&gt;</span><span>  </span></li><li class=""><span>        </span><span class="tag">&lt;</span><span class="tag-name">xsd:complexType</span><span class="tag">&gt;</span><span>  </span></li><li class="alt"><span>            </span><span class="tag">&lt;</span><span class="tag-name">xsd:complexContent</span><span class="tag">&gt;</span><span>  </span></li><li class=""><span>                </span><span class="tag">&lt;</span><span class="tag-name">xsd:extension</span><span> </span><span class="attribute">base</span><span>=</span><span class="attribute-value">"beans:identifiedType"</span><span class="tag">&gt;</span><span>  </span></li><li class="alt"><span>                    </span><span class="tag">&lt;</span><span class="tag-name">xsd:attribute</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"age"</span><span> </span><span class="attribute">type</span><span>=</span><span class="attribute-value">"xsd:string"</span><span> </span><span class="attribute">default</span><span>=</span><span class="attribute-value">"99999"</span><span class="tag">/&gt;</span><span>  </span></li><li class=""><span>                </span><span class="tag">&lt;/</span><span class="tag-name">xsd:extension</span><span class="tag">&gt;</span><span>  </span></li><li class="alt"><span>            </span><span class="tag">&lt;/</span><span class="tag-name">xsd:complexContent</span><span class="tag">&gt;</span><span>  </span></li><li class=""><span>        </span><span class="tag">&lt;/</span><span class="tag-name">xsd:complexType</span><span class="tag">&gt;</span><span>  </span></li><li class="alt"><span>    </span><span class="tag">&lt;/</span><span class="tag-name">xsd:element</span><span class="tag">&gt;</span><span>  </span></li><li class=""><span></span><span class="tag">&lt;/</span><span class="tag-name">xsd:schema</span><span class="tag">&gt;</span><span>  </span></li></ol></div></div><script><![CDATA[ender_code();]]&gt;</script><br />在上面的xsd文件描述了一个新的targetNamespace，并在这个空间中定义了一个name为one的element,one有一个age属性，类型为string，默认值为99999.xsd文件是xml DTD的替代者，使用XML Schema语言进行编写，这里对xsd schema不做太多解释，有兴趣可以参考相关的资料。 
<p></p><p>创建一个Java文件，该文件实现了BeanDefinitionParser接口，用来解析xsd文件中的定义并注册到组件中。 <br />MyBeanDefinitionParser.java <br /></p><div class="code_title">代码</div><div class="code_div"><div class="dp-highlighter"><div class="bar"></div><ol class="dp-j"><li class="alt"><span><span class="keyword">package</span><span> com.mysite.tag;   </span></span></li><li class=""><span>  </span></li><li class="alt"><span></span><span class="keyword">import</span><span> org.springframework.beans.factory.config.BeanDefinition;   </span></li><li class=""><span></span><span class="keyword">import</span><span> org.springframework.beans.factory.config.BeanDefinitionHolder;   </span></li><li class="alt"><span></span><span class="keyword">import</span><span> org.springframework.beans.factory.support.BeanDefinitionReaderUtils;   </span></li><li class=""><span></span><span class="keyword">import</span><span> org.springframework.beans.factory.support.RootBeanDefinition;   </span></li><li class="alt"><span></span><span class="keyword">import</span><span> org.springframework.beans.factory.xml.BeanDefinitionParser;   </span></li><li class=""><span></span><span class="keyword">import</span><span> org.springframework.beans.factory.xml.ParserContext;   </span></li><li class="alt"><span></span><span class="keyword">import</span><span> org.w3c.dom.Element;   </span></li><li class=""><span>  </span></li><li class="alt"><span></span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> MyBeanDefinitionParser </span><span class="keyword">implements</span><span> BeanDefinitionParser{   </span></li><li class=""><span>    </span><span class="keyword">public</span><span> BeanDefinition parse(Element arg0, ParserContext arg1) {   </span></li><li class="alt"><span>        RootBeanDefinition def = </span><span class="keyword">new</span><span> RootBeanDefinition();   </span></li><li class=""><span>                </span><span class="comment">//设置Bean Class </span><span>  </span></li><li class="alt"><span>        def.setBeanClass(One.</span><span class="keyword">class</span><span>);   </span></li><li class=""><span>           </span></li><li class="alt"><span>                </span><span class="comment">//注册ID属性 </span><span>  </span></li><li class=""><span>        String id = arg0.getAttribute(</span><span class="string">"id"</span><span>);   </span></li><li class="alt"><span>        BeanDefinitionHolder idHolder= </span><span class="keyword">new</span><span> BeanDefinitionHolder(def,id);   </span></li><li class=""><span>        BeanDefinitionReaderUtils.registerBeanDefinition(idHolder, arg1.getRegistry());   </span></li><li class="alt"><span>           </span></li><li class=""><span>                </span><span class="comment">//注册age属性 </span><span>  </span></li><li class="alt"><span>        String age = arg0.getAttribute(</span><span class="string">"age"</span><span>);   </span></li><li class=""><span>        BeanDefinitionHolder ageHolder= </span><span class="keyword">new</span><span> BeanDefinitionHolder(def,age);   </span></li><li class="alt"><span>        BeanDefinitionReaderUtils.registerBeanDefinition(ageHolder, arg1.getRegistry());   </span></li><li class=""><span>        def.getPropertyValues().addPropertyValue(</span><span class="string">"age"</span><span>, age);   </span></li><li class="alt"><span>           </span></li><li class=""><span>        </span><span class="keyword">return</span><span> def;   </span></li><li class="alt"><span>    }   </span></li><li class=""><span>}   </span></li><li class="alt"><span>  </span></li></ol></div></div><script><![CDATA[ender_code();]]&gt;</script><br />上面的代码仅仅实现了一个方法public BeanDefinition parse(Element arg0, ParserContext arg1)，设置相关的Bean Class，解析了对应的xsd文件，并将解析的内容注册到上下文中，同时返回一个BeanDefinition对象（BeanDefinition是Spring的bean定义，提供了bean部分的操作方法，如isSingleton()、isLazyInit()等)。 
<p></p><p>注意，id属性是一个默认的属性，可以不在xsd文件中描述，但是需要注册它，否则将无法通过getBean方法获取标签定义的bean，也无法被其他bean引用。 <br />另外，下面代码是给bean的属性赋值，这个是不可缺少的，否则在使用标签定义时将无法获取bean属性的值。 <br /></p><div class="code_title">代码</div><div class="code_div"><div class="dp-highlighter"><div class="bar"></div><ol class="dp-j"><li class="alt"><span><span>def.getPropertyValues().addPropertyValue(</span><span class="string">"age"</span><span>, age);   </span></span></li></ol></div></div><script><![CDATA[ender_code();]]&gt;</script><p></p><p>然后为组件编写一个Handler文件，扩展自NamespaceHandlerSupport，它的作用是将组件注册到Spring容器 <br />MyNameSpaceHandler.java <br /></p><div class="code_title">代码</div><div class="code_div"><div class="dp-highlighter"><div class="bar"></div><ol class="dp-j"><li class="alt"><span><span class="keyword">package</span><span> com.mysite.tag;   </span></span></li><li class=""><span>  </span></li><li class="alt"><span></span><span class="keyword">import</span><span> org.springframework.beans.factory.xml.NamespaceHandlerSupport;   </span></li><li class=""><span>  </span></li><li class="alt"><span></span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> MyNameSpaceHandler </span><span class="keyword">extends</span><span> NamespaceHandlerSupport {   </span></li><li class=""><span>  </span></li><li class="alt"><span>    </span><span class="keyword">public</span><span> </span><span class="keyword">void</span><span> init() {   </span></li><li class=""><span>         registerBeanDefinitionParser(</span><span class="string">"one"</span><span>,</span><span class="keyword">new</span><span> MyBeanDefinitionParser());   </span></li><li class="alt"><span>    }   </span></li><li class=""><span>}   </span></li></ol></div></div><script><![CDATA[ender_code();]]&gt;</script><br />实际执行的过程只有一句代码，注册了一个名字为one的扩展配置，包含了MyBeanDefinitionParser所parser相关xsd的内容。 
<p></p><p>到了这里，一个Spring扩展标签已经完成，但是我们目前还没办法使用它，Spring没那么聪明，它无法知道我们在什么地方定义了哪些扩展标签，这些标签将被谁解析，这个过程要我们通过一些文件来告知Spring知道，它们就是spring.handlers和spring.schemas，它们放在META-INF目录中，Spring.jar的META-INF目录中也有同名的文件，它们的文件内容基本上是相似的，而Spring在执行过程中，如果发现其他jar文件的META-INF文件夹中包含有这两个文件，Spring将会合并它们。 <br />spring.schemas <br /></p><div class="code_title">代码</div><div class="code_div"><div class="dp-highlighter"><div class="bar"></div><ol class="dp-j"><li class="alt"><span><span>http\:</span><span class="comment">//www.mysite.org/schema/mytag.xsd=com/mysite/tag/mytag.xsd </span><span>  </span></span></li></ol></div></div><script><![CDATA[ender_code();]]&gt;</script><p></p><p>spring.handlers <br /></p><div class="code_title">代码</div><div class="code_div"><div class="dp-highlighter"><div class="bar"></div><ol class="dp-j"><li class="alt"><span><span>http\:</span><span class="comment">//www.mysite.org/schema/mytag=com.mysite.tag.MyNameSpaceHandler </span><span>  </span></span></li></ol></div></div><script><![CDATA[ender_code();]]&gt;</script><p></p><p>spring.schemas将告诉Spring配置文件知道，如果在配置中引用http://www.mysite.org/schema/mytag.xsd，它应该去什么地方找相应的xsd文件。 <br />而spring.handlers文件将告诉Spring，应该使用哪个Handler注册扩展标签。</p><p>现在为止，一个完整的xml扩展标签全部完成，做一个小应用测试一下。 <br />将整个项目打包成jar文件（别忘记META-INF内的两个文件），然后新建一个项目，引用刚才打包的jar文件，并引用Spring相关文件。 <br />需要注意,自定义xml扩展配置只有xsd方式的引用才可以使用. <br />application.xml <br /></p><div class="code_title">代码</div><div class="code_div"><div class="dp-highlighter"><div class="bar"></div><ol class="dp-xml"><li class="alt"><span><span class="tag">&lt;?</span><span class="tag-name">xml</span><span> </span><span class="attribute">version</span><span>=</span><span class="attribute-value">"1.0"</span><span> </span><span class="attribute">encoding</span><span>=</span><span class="attribute-value">"UTF-8"</span><span class="tag">?&gt;</span><span>  </span></span></li><li class=""><span></span><span class="tag">&lt;</span><span class="tag-name">beans</span><span> </span><span class="attribute">xmlns</span><span>=</span><span class="attribute-value">"http://www.springframework.org/schema/beans"</span><span>  </span></li><li class="alt"><span>    </span><span class="attribute">xmlns:xsi</span><span>=</span><span class="attribute-value">"http://www.w3.org/2001/XMLSchema-instance"</span><span>  </span></li><li class=""><span>    </span><span class="attribute">xmlns:tag</span><span>=</span><span class="attribute-value">"http://www.mysite.org/schema/mytag"</span><span>  </span></li><li class="alt"><span>    </span><span class="attribute">xsi:schemaLocation</span><span>="http://www.springframework.org/schema/beans   </span></li><li class=""><span>    http://www.springframework.org/schema/beans/spring-beans-2.0.xsd   </span></li><li class="alt"><span>    http://www.mysite.org/schema/mytag   </span></li><li class=""><span>    http://www.mysite.org/schema/mytag.xsd"</span><span class="tag">&gt;</span><span>  </span></li><li class="alt"><span>  </span></li><li class=""><span>    </span><span class="tag">&lt;</span><span class="tag-name">tag:one</span><span> </span><span class="attribute">id</span><span>=</span><span class="attribute-value">"oneBean"</span><span> </span><span class="attribute">age</span><span>=</span><span class="attribute-value">"99"</span><span class="tag">/&gt;</span><span>  </span></li><li class="alt"><span></span><span class="tag">&lt;/</span><span class="tag-name">beans</span><span class="tag">&gt;</span><span>  </span></li></ol></div></div><script><![CDATA[ender_code();]]&gt;</script><br />在xml文件引用上可以看到,配置了一个名字为tag的名称空间,目标为http://www.mysite.org/schema/mytag命名空间,这个目标名称空间必须是存在于项目的引用中的(mytag.xsd中所定义的). <br /><div class="code_title">代码</div><div class="code_div"><div class="dp-highlighter"><div class="bar"></div><ol class="dp-j"><li class="alt"><span><span>&lt;tag:one id=</span><span class="string">"oneBean"</span><span> age=</span><span class="string">"99"</span><span>/&gt;   </span></span></li></ol></div></div><script><![CDATA[ender_code();]]&gt;</script><br />上面定义了一个id为oneBean的组件，使用了“one”扩展标签，也就是我们在handler中所注册的，组件age属性的值为99。 
<p></p><p>Main.java <br /></p><div class="code_title">代码</div><div class="code_div"><div class="dp-highlighter"><div class="bar"></div><ol class="dp-j"><li class="alt"><span><span class="keyword">package</span><span> com.test;   </span></span></li><li class=""><span>  </span></li><li class="alt"><span></span><span class="keyword">import</span><span> org.springframework.context.ApplicationContext;   </span></li><li class=""><span></span><span class="keyword">import</span><span> org.springframework.context.support.ClassPathXmlApplicationContext;   </span></li><li class="alt"><span>  </span></li><li class=""><span></span><span class="keyword">import</span><span> com.mysite.tag.One;   </span></li><li class="alt"><span>  </span></li><li class=""><span></span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> Main {   </span></li><li class="alt"><span>  </span></li><li class=""><span>    </span><span class="keyword">public</span><span> </span><span class="keyword">static</span><span> </span><span class="keyword">void</span><span> main(String[] args) {   </span></li><li class="alt"><span>        ApplicationContext ctx = </span><span class="keyword">new</span><span> ClassPathXmlApplicationContext(</span><span class="string">"application.xml"</span><span>);   </span></li><li class=""><span>        One tag = (One) ctx.getBean(</span><span class="string">"oneBean"</span><span>);   </span></li><li class="alt"><span>        System.out.println(</span><span class="string">"oneBean age is "</span><span>+tag.getAge());   </span></li><li class=""><span>    }   </span></li><li class="alt"><span>}   </span></li></ol></div></div><script><![CDATA[ender_code();]]&gt;</script><br />运行测试程序，结果如下 <br /><div class="code_title">代码</div><div class="code_div"><div class="dp-highlighter"><div class="bar"></div><ol class="dp-j"><li class="alt"><span><span>oneBean age is </span><span class="number">99</span><span>  </span></span></li></ol></div></div><script><![CDATA[ender_code();]]&gt;</script><p></p><p>Spring的xml扩展是一个非常有用的特性，在Spring2.0的版本中也提供了一些新的标签使用，如&lt;aop&gt;,&lt;tx&gt;等,但就目前来讲受大家关注程度并不高，我想大部分使用Spring的开发人员都在使用Spring开发企业应用，而Spring所提供的&lt;bean /&gt;定义的方式对于开发人员来说已经能够满足需要，但是如果看的更远一些，在Spring以后的发展过程中，xml扩展应该会成为spring的核心特性之一，或许到时大家会习惯这样的方式来编写Spring配置文件吧 <br /></p><div class="code_title">代码</div><div class="code_div"><div class="dp-highlighter"><div class="bar"></div><ol class="dp-j"><li class="alt"><span><span>&lt;XXCompany:XXXModule id=</span><span class="string">""</span><span>&gt;   </span></span></li><li class=""><span>...   </span></li><li class="alt"><span>...   </span></li></ol></div></div><script><![CDATA[ender_code();]]&gt;</script><p></p></td>
								</tr>
						</tbody>
				</table>
		</div>
		<div class="topic_summary">
				<table width="100%">
						<tbody>
								<tr>
										<td valign="bottom" width="90%">最后更新：2007-07-18 16:03<br />15:42  |   <a href="javascript:Element.toggle('link102450');">永久链接</a>  |   浏览 (481)  |   <a href="http://tom-duan.javaeye.com/blog/102450#comments">评论</a> (2)  |    <a href="http://tom-duan.javaeye.com/admin/favorite_blog/336174">收藏</a>  |   <a href="http://tom-duan.javaeye.com/topic/102450">进入论坛</a>  |   <span style="COLOR: #006699"></span></td>
										<td width="10%">
										</td>
								</tr>
						</tbody>
				</table>
		</div>
		<div class="topic_link" id="link102450" style="DISPLAY: none">
				<table width="90%" align="center" border="0">
						<tbody>
								<tr>
										<td align="left" height="30">
												<span class="date_show">永久链接</span>
										</td>
								</tr>
								<tr>
										<td align="left">
												<a href="http://tom-duan.javaeye.com/blog/102450">http://tom-duan.javaeye.com/blog/102450</a>
										</td>
								</tr>
						</tbody>
				</table>
		</div>
		<div>
				<a name="comments">
				</a>
				<div style="BORDER-TOP: gray 1px solid; MARGIN-TOP: 15px">
						<div id="comment-list" style="MARGIN: 10px 20px 0px">
								<div>
										<table width="100%">
												<tbody>
														<tr valign="top">
																<td width="50%">
																		<b class="title">评论</b>    共 2 条 </td>
																<td align="right" width="50%">
																		<a href="javascript:Field.focus('message');">发表评论</a>
																</td>
														</tr>
												</tbody>
										</table>
								</div>
								<div style="MARGIN-TOP: 10px">
										<div id="post_336183">
												<div class="light_b" style="PADDING-RIGHT: 2px; MARGIN-TOP: 10px; PADDING-LEFT: 2px; PADDING-BOTTOM: 2px; PADDING-TOP: 2px">
														<a href="http://baallee.javaeye.com/">baallee</a>     2007-07-18 15:53 </div>
												<div style="MARGIN-TOP: 5px">
														<table width="100%">
																<tbody>
																		<tr>
																				<td>
																						<p>
																						</p>
																						<div class="code_title">代码</div>
																						<div class="code_div">
																								<div class="dp-highlighter">
																										<div class="bar">
																										</div>
																										<ol class="dp-xml">
																												<li class="alt">
																														<span>
																																<span class="tag">&lt;?</span>
																																<span class="tag-name">xml</span>
																																<span> </span>
																																<span class="attribute">version</span>
																																<span>=</span>
																																<span class="attribute-value">"1.0"</span>
																																<span> </span>
																																<span class="attribute">encoding</span>
																																<span>=</span>
																																<span class="attribute-value">"UTF-8"</span>
																																<span class="tag">?&gt;</span>
																																<span>    </span>
																														</span>
																												</li>
																												<li class="">
																														<span>
																														</span>
																														<span class="tag">&lt;</span>
																														<span class="tag-name">beans</span>
																														<span> </span>
																														<span class="attribute">xmlns</span>
																														<span>=</span>
																														<span class="attribute-value">"http://www.springframework.org/schema/beans"</span>
																														<span>       </span>
																												</li>
																												<li class="alt">
																														<span>
																														</span>
																														<span class="attribute">xmlns:xsi</span>
																														<span>=</span>
																														<span class="attribute-value">"http://www.w3.org/2001/XMLSchema-instance"</span>
																														<span>       </span>
																												</li>
																												<li class="">
																														<span>
																														</span>
																														<span class="attribute">xmlns:p</span>
																														<span>=</span>
																														<span class="attribute-value">"http://www.springframework.org/schema/p"</span>
																														<span>       </span>
																												</li>
																												<li class="alt">
																														<span>
																														</span>
																														<span class="attribute">xsi:schemaLocation</span>
																														<span>="http://www.springframework.org/schema/beans           </span>
																												</li>
																												<li class="">
																														<span>http://www.springframework.org/schema/beans/spring-beans.xsd"</span>
																														<span class="tag">&gt;</span>
																														<span>     </span>
																												</li>
																												<li class="alt">
																														<span>
																														</span>
																														<span class="tag">&lt;</span>
																														<span class="tag-name">bean</span>
																														<span> </span>
																														<span class="attribute">class</span>
																														<span>=</span>
																														<span class="attribute-value">"com.interface21.spring2.ioc.Person"</span>
																														<span>        </span>
																												</li>
																												<li class="">
																														<span>
																														</span>
																														<span class="attribute">p:name</span>
																														<span>=</span>
																														<span class="attribute-value">"Tony"</span>
																														<span>       </span>
																												</li>
																												<li class="alt">
																														<span>
																														</span>
																														<span class="attribute">p:age</span>
																														<span>=</span>
																														<span class="attribute-value">"53"</span>
																														<span>        </span>
																												</li>
																												<li class="">
																														<span>
																														</span>
																														<span class="attribute">p:house-ref</span>
																														<span>=</span>
																														<span class="attribute-value">"number10"</span>
																														<span> </span>
																														<span class="tag">/&gt;</span>
																														<span>      </span>
																												</li>
																												<li class="alt">
																														<span>
																														</span>
																														<span class="tag">&lt;</span>
																														<span class="tag-name">bean</span>
																														<span> </span>
																														<span class="attribute">class</span>
																														<span>=</span>
																														<span class="attribute-value">"com.interface21.spring2.ioc.House"</span>
																														<span>        </span>
																												</li>
																												<li class="">
																														<span>
																														</span>
																														<span class="attribute">id</span>
																														<span>=</span>
																														<span class="attribute-value">"number10"</span>
																														<span>       </span>
																												</li>
																												<li class="alt">
																														<span>
																														</span>
																														<span class="attribute">p:name</span>
																														<span>=</span>
																														<span class="attribute-value">"10 Downing Street"</span>
																														<span class="tag">/&gt;</span>
																														<span>     </span>
																												</li>
																												<li class="">
																														<span>
																														</span>
																														<span class="tag">&lt;/</span>
																														<span class="tag-name">beans</span>
																														<span class="tag">&gt;</span>
																														<span>  </span>
																												</li>
																										</ol>
																								</div>
																						</div>
																						<script><![CDATA[ender_code();]]&gt;</script>
																						<p>
																						</p>
																						<p>对于简单的应用可以用p标签就好了。 <br />自定意扩展应该用在更多的高级应用上</p>
																				</td>
																		</tr>
																</tbody>
														</table>
												</div>
										</div>
								</div>
						</div>
				</div>
		</div>
<img src ="http://www.blogjava.net/huamengxing/aggbug/140925.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huamengxing/" target="_blank">华梦行</a> 2007-08-29 15:08 <a href="http://www.blogjava.net/huamengxing/archive/2007/08/29/140925.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring中dispatcherservlet的运行机制</title><link>http://www.blogjava.net/huamengxing/archive/2007/08/29/140843.html</link><dc:creator>华梦行</dc:creator><author>华梦行</author><pubDate>Wed, 29 Aug 2007 04:25:00 GMT</pubDate><guid>http://www.blogjava.net/huamengxing/archive/2007/08/29/140843.html</guid><wfw:comment>http://www.blogjava.net/huamengxing/comments/140843.html</wfw:comment><comments>http://www.blogjava.net/huamengxing/archive/2007/08/29/140843.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huamengxing/comments/commentRss/140843.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huamengxing/services/trackbacks/140843.html</trackback:ping><description><![CDATA[spring中dispatcherservlet的运行机制<br /><br />dispatcherservlet是spring的web框架(以下简称springweb)中的核心servlet."spring的web框架——象其它web框架一样——是一个请求驱动的web框架，其设计围绕一个能将请求分发到控制器的servlet，它也提供其它功能帮助web应用开发。"----《spring framework 开发参考手册（中文版）》而在springweb框架中这个servlet就是org.springframework.web.servlet.dispatcherservlet。这个servlet的继承关系如下图所示：springweb首先将传统的httpservlet抽象类包装成了bean；frameworkservlet抽象出了web框架中的servlets的一些基本行为，比如对application context的访问；dispatcherservlet的主要工作就是将一个request分发到一个合适的处理器上，并将处理返回的modelandview绘制出来返回给客户端。<br /><br />dispatcherservlet作为一个servlet那他一定有两个主要的方法：init()和doservice()。<br /><br />一 init()初始化。dispatcherservlet继承体系中init()方法的实现位于httpservletbean中，httpservletbean首先调用initbeanwrapper()，初始化beanwrapper，然后调用抽象方法initservletbean()，这个方法的实现位于他的子类frameworkservlet中；framewordservlet中的initservletbean()方法将调用initwebapplicationcontext()，初始化webapplicationcontext，然后同样调用他的抽象方法initframeworkservlet()，而这个抽象方法的实现位于最终的dispatcherservlet中；dispatcherservlet中的initframeworkservet()将依次初始化multipar（用作文件上传）解析器、本地化信息解析器、主题解析器处理器映射等等内容。所以dispatcherservlet的初始化顺序为init();initbeanwrapper();<br /><br />initservletbeaninitwebapplicationcontext()<br /><br />initframework();initmultipartresolver();initlocaleresolver();initthemeresolver();inithandlermappings();inithandleradapters();inithandlerexceptionresolvers();initviewresolvers();<br /><br />二 doservice()处理请求。dispatcherservlet中无论是通过post方式还是get方式提交的request，最终都会交由doservice()处理。doservice()中的处理逻辑大致分以下六个步骤：1.if(request是multipart,即文件上传) 则将request解析并包装成multiparthttpservletrequest2.mappedhandler = gethandler(request)根据request得到相应的处理器3.调用注册的所有拦截器的prehandle方法4.调用处理器    handleradapter ha = new gethandleradapter(mappedhandler.gethandler());    modelandview mv = ha.handle(req, res, mappedhandler.gethandler())//这里使用了adapter模式5.调用注册的所有拦截器的posthandle方法6.绘制mv<br /><br />也许spring不像struts、hibernate那样是使用最为广泛的，但他是全面的、轻量级的、足够灵活的、容易替换、容易扩展的。springweb是springframework中的一个部分，而dispatcherservlet又是springweb中的一小部分，要弄懂spring以及他背后的设计思想，对我等菜鸟而言，还是有很长一段路要走的。但愿在新的一条路出现之前，我们已经走遍了这条路。路漫漫其修远兮，吾将上下而求索。继续研究ing...to be continue...<br /><br /><img src ="http://www.blogjava.net/huamengxing/aggbug/140843.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huamengxing/" target="_blank">华梦行</a> 2007-08-29 12:25 <a href="http://www.blogjava.net/huamengxing/archive/2007/08/29/140843.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring-mvc 的处理流程 </title><link>http://www.blogjava.net/huamengxing/archive/2007/08/29/140803.html</link><dc:creator>华梦行</dc:creator><author>华梦行</author><pubDate>Wed, 29 Aug 2007 02:23:00 GMT</pubDate><guid>http://www.blogjava.net/huamengxing/archive/2007/08/29/140803.html</guid><wfw:comment>http://www.blogjava.net/huamengxing/comments/140803.html</wfw:comment><comments>http://www.blogjava.net/huamengxing/archive/2007/08/29/140803.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huamengxing/comments/commentRss/140803.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huamengxing/services/trackbacks/140803.html</trackback:ping><description><![CDATA[
		<div style="MARGIN-TOP: 1px; MARGIN-LEFT: 15px">
				<h2>
						<a title="永久链接：Spring-mvc 的处理流程" href="http://netment.javaeye.com/blog/93161">Spring-mvc 的处理流程</a>
				</h2>
		</div>
		<div style="MARGIN-TOP: 5px; MARGIN-LEFT: 15px">
				<b>关键字:</b> Spring   mvc ioc      </div>
		<div style="MARGIN-TOP: 10px; MARGIN-LEFT: 15px; OVERFLOW: auto">
				<table width="100%">
						<tbody>
								<tr>
										<td>
												<p>请求的分发</p>
												<p>请求首先到达DispatcherServlet，应用服务器会根据Web应用中web.xml文件定义的url映射将相应的请求分发到DispatcherServlet中</p>
												<p>请求的处理</p>
												<p>DispatcherServlet会查找相应的HandlerMapping接口的实现类，调用其中的方法：HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception，该方法会返回一个HandlerExecutionChain。返回的HandlerExecutionChain中包含了零个或者是多个Interceptor和一个处理请求的Handler。DispatcherServlet会调用Interceptor中的preHandle() 方法。然后处理Handler，这个Handler相当于Struts中Action，在SpringMVC中默认的实现是Controller接口，是具体处理请求的代码所驻留的地方。事实上HandlerExecutionChain中的getHandler()返回的是一个Object类型。DispatcherServlet不会直接调用getHandler（）返回对象中的方法，DispatcherServlet会查找相应的HandlerAdapter，然后具体通过HandlerAdapter来调用getHandler()返回的handler对象中的方法。就是说我们可以实现自己的HandlerAdapter然后通过IoC注入到DispatcherServlet中，从而可以实现一套自定义的控制器。随后DispatcherServlet会调用Interceptor中的postHandle()方法。 </p>
												<p>视图的处理</p>
												<p>DispatcherServlet会期望Hander返回一个ModelAndView，DispatcherServlet会根据所返回的ModelAndView对象所包含的信息进行视图的渲染。起具体出来流程如下：</p>
												<p>首先DispatcherServlet会根据LocaleResolver来识别请求中的Locale，开发人员可以自己实现LocaleResolver接口，然后通过IoC注入到DispatcherServlet中，然后DispatcherServlet会判断ModelAndView中是否已经包含了接口View的具体实现，如果包含了，则直接调用View中的方法render(Map model, HttpServletRequest request, HttpServletResponse response)。如果不包含，则说明该ModelAndView只是包含了View的名称引用，DispatcherServlet会调用ViewResolver中的resolveViewName(String viewName, Locale locale)来解析其真正的视图。该方法会返回一个View的具体实现。</p>
												<p>视图的渲染</p>
												<p>Spring支持多种视图技术，其中比较常用的包括有Jstl视图，Veloctiy视图，FreeMarker视图等。对Jstl视图的渲染Spring是通过JstlView这个类具体实现的。事实上其最终的渲染是交给容器来做的，Spring只是通过RequestDispatcher实现了服务器内部请求的Forward。而对于模板视图，如Veloctiy和FreeMarker等，Spring会初始化其相应的模板引擎，由模板引擎生成最终的Html页面然后在合并到Response的输出流中。</p>
												<p>异常的处理</p>
												<p>如果在Hander中处理请求是抛出异常，DispatcherServlet会查找HandlerExceptionResolver接口的具体实现，该接口定义了一个方法：</p>
												<p>ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)，实现类需要实现该方法以便对异常进行处理，最后该方法需要返回一个ModelAndView。</p>
												<p>SpringMVC的一些总结 <br />灵活的Interceptor，通过Interceptor我们可以在一个请求处理前和请求处理完成之后做相应的操作，通过Interceptor机制，我们可以做authentication, logging, and filtering等。 <br />良好的表单支持，在SpringMVC的Controller继承体系结构中，其具体的子类对表单（Form）提供了良好的支持。能够很好的支持单个表单的显示、修改、提交操作。同时也提供了表单的分步提交。 <br />可定制的数据绑定（Data Binding）。 <br />多视图技术的支持，SpringMVC同时支持Jstl, Velocity 等多中视图技术，但是这同时也会引出一个问题，因为各种视图技术都有自己的一套方法来处理国际化，例如Jstl和Velocity处理国际化的方式就很不相同。因此在多个视图技术并存的应用中，国际化也是一个需要注意的问题。 <br />其Handler（控制器）作为Bean定义在Spring容器中，因此能享受容器带来的服务。 <br />Handler（控制器）具有良好的可测试性。 </p>
										</td>
								</tr>
						</tbody>
				</table>
		</div>
<img src ="http://www.blogjava.net/huamengxing/aggbug/140803.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huamengxing/" target="_blank">华梦行</a> 2007-08-29 10:23 <a href="http://www.blogjava.net/huamengxing/archive/2007/08/29/140803.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HttpServletBean</title><link>http://www.blogjava.net/huamengxing/archive/2007/08/29/140794.html</link><dc:creator>华梦行</dc:creator><author>华梦行</author><pubDate>Wed, 29 Aug 2007 02:13:00 GMT</pubDate><guid>http://www.blogjava.net/huamengxing/archive/2007/08/29/140794.html</guid><wfw:comment>http://www.blogjava.net/huamengxing/comments/140794.html</wfw:comment><comments>http://www.blogjava.net/huamengxing/archive/2007/08/29/140794.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huamengxing/comments/commentRss/140794.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huamengxing/services/trackbacks/140794.html</trackback:ping><description><![CDATA[
		<dl>
				<dt>
				</dt>
				<pre>public abstract class <b>HttpServletBean</b><dt>extends <a title="class or interface in javax.servlet.http" href="http://java.sun.com/j2ee/1.4/docs/api/javax/servlet/http/HttpServlet.html">HttpServlet</a></dt></pre>
		</dl>
		<pre>
		</pre>
		<p>Simple extension of <a title="class or interface in javax.servlet.http" href="http://java.sun.com/j2ee/1.4/docs/api/javax/servlet/http/HttpServlet.html"><code>HttpServlet</code></a> which treats its config parameters (<code>init-param</code> entries within the <code>servlet</code> tag in <code>web.xml</code>) as bean properties. <br /></p>
		<p>HttpServlet的简单扩展用来处理 （init-param）in the web.xml<br />A handy superclass for any type of servlet. Type conversion of config parameters is automatic, with the corresponding setter method getting invoked with the converted value. It is also possible for subclasses to specify required properties. Parameters without matching bean property setter will simply be ignored. </p>
		<p>This servlet leaves request handling to subclasses, inheriting the default behavior of HttpServlet (<code>doGet</code>, <code>doPost</code>, etc). </p>
		<p>This generic servlet base class has no dependency on the Spring <a title="interface in org.springframework.context" href="http://www.springframework.org/docs/api/org/springframework/context/ApplicationContext.html"><code>ApplicationContext</code></a> concept. Simple servlets usually don't load their own context but rather access service beans from the Spring root application context, accessible via the filter's <a href="http://www.springframework.org/docs/api/org/springframework/web/servlet/HttpServletBean.html#getServletContext()"><code>ServletContext</code></a> (see <a title="class in org.springframework.web.context.support" href="http://www.springframework.org/docs/api/org/springframework/web/context/support/WebApplicationContextUtils.html"><code>WebApplicationContextUtils</code></a>). </p>
		<p>The <a title="class in org.springframework.web.servlet" href="http://www.springframework.org/docs/api/org/springframework/web/servlet/FrameworkServlet.html"><code>FrameworkServlet</code></a> class is a more specific servlet base class which loads its own application context. FrameworkServlet serves as direct base class of Spring's full-fledged <a title="class in org.springframework.web.servlet" href="http://www.springframework.org/docs/api/org/springframework/web/servlet/DispatcherServlet.html"><code>DispatcherServlet</code></a>. <br /><br /></p>
		<dl>
				<dt>
				</dt>
				<pre>public abstract class <b>FrameworkServlet</b><dt>extends <a title="class in org.springframework.web.servlet" href="http://www.springframework.org/docs/api/org/springframework/web/servlet/HttpServletBean.html">HttpServletBean</a></dt><dt>implements <a title="interface in org.springframework.context" href="http://www.springframework.org/docs/api/org/springframework/context/ApplicationListener.html">ApplicationListener</a></dt></pre>
		</dl>
		<pre>
		</pre>
		<p>Base servlet for Spring's web framework. Provides integration with a Spring application context, in a JavaBean-based overall solution. <br /></p>
		<p>spring web Framework的基础 servlet  ，提供在以javabean为基础的整体解决方案已完成与spring应用上下文的集成<br />This class offers the following functionality: <br />1.管理一个servlet一个网络应用上下文实例，这个servlet的配置由servlet命名空间里的bean来决定<br />2.根据请求处理发布事件，是否请求成功的被处理了 </p>
		<ul>
				<li>Manages a <a title="interface in org.springframework.web.context" href="http://www.springframework.org/docs/api/org/springframework/web/context/WebApplicationContext.html"><code>WebApplicationContext</code></a> instance per servlet. The servlet's configuration is determined by beans in the servlet's namespace. 
</li>
				<li>Publishes events on request processing, whether or not a request is successfully handled. </li>
		</ul>
		<p>Subclasses must implement <a href="http://www.springframework.org/docs/api/org/springframework/web/servlet/FrameworkServlet.html#doService(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)"><code>doService(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)</code></a> to handle requests. Because this extends <a title="class in org.springframework.web.servlet" href="http://www.springframework.org/docs/api/org/springframework/web/servlet/HttpServletBean.html"><code>HttpServletBean</code></a> rather than HttpServlet directly, bean properties are automatically mapped onto it. Subclasses can override <a href="http://www.springframework.org/docs/api/org/springframework/web/servlet/FrameworkServlet.html#initFrameworkServlet()"><code>initFrameworkServlet()</code></a> for custom initialization. <br /></p>
		<p>因为它继承自httpservletBean 所以bean的属性已经被自动的装配了，子类可以通过覆盖initFrameworkServlet来定制初始化bean<br /><br />Detects a "contextClass" parameter at the servlet init-param level, falling back to the default context class, <a title="class in org.springframework.web.context.support" href="http://www.springframework.org/docs/api/org/springframework/web/context/support/XmlWebApplicationContext.html"><code>XmlWebApplicationContext</code></a>, if not found. Note that, with the default FrameworkServlet, a custom context class needs to implement the <a title="interface in org.springframework.web.context" href="http://www.springframework.org/docs/api/org/springframework/web/context/ConfigurableWebApplicationContext.html"><code>ConfigurableWebApplicationContext</code></a> SPI. </p>
		<p>Passes a "contextConfigLocation" servlet init-param to the context instance, parsing it into potentially multiple file paths which can be separated by any number of commas and spaces, like "test-servlet.xml, myServlet.xml". If not explicitly specified, the context implementation is supposed to build a default location from the namespace of the servlet. </p>
		<p>Note: In case of multiple config locations, later bean definitions will override ones defined in earlier loaded files, at least when using Spring's default ApplicationContext implementation. This can be leveraged to deliberately override certain bean definitions via an extra XML file. </p>
		<p>The default namespace is "'servlet-name'-servlet", e.g. "test-servlet" for a servlet-name "test" (leading to a "/WEB-INF/test-servlet.xml" default location with XmlWebApplicationContext). The namespace can also be set explicitly via the "namespace" servlet init-param. </p>
<img src ="http://www.blogjava.net/huamengxing/aggbug/140794.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huamengxing/" target="_blank">华梦行</a> 2007-08-29 10:13 <a href="http://www.blogjava.net/huamengxing/archive/2007/08/29/140794.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>定制初始化跟销毁bean的方法</title><link>http://www.blogjava.net/huamengxing/archive/2007/08/28/140488.html</link><dc:creator>华梦行</dc:creator><author>华梦行</author><pubDate>Tue, 28 Aug 2007 06:28:00 GMT</pubDate><guid>http://www.blogjava.net/huamengxing/archive/2007/08/28/140488.html</guid><wfw:comment>http://www.blogjava.net/huamengxing/comments/140488.html</wfw:comment><comments>http://www.blogjava.net/huamengxing/archive/2007/08/28/140488.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huamengxing/comments/commentRss/140488.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huamengxing/services/trackbacks/140488.html</trackback:ping><description><![CDATA[
		<pre class="programlisting">
				<pre class="programlisting">&lt;bean id="exampleInitBean" class="examples.ExampleBean" init-method="cleanup"/&gt;</pre>
				<br />&lt;bean id="exampleInitBean" class="examples.ExampleBean" destroy-method="cleanup"/&gt;</pre>
<img src ="http://www.blogjava.net/huamengxing/aggbug/140488.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huamengxing/" target="_blank">华梦行</a> 2007-08-28 14:28 <a href="http://www.blogjava.net/huamengxing/archive/2007/08/28/140488.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring   BeanFactory  API 详解</title><link>http://www.blogjava.net/huamengxing/archive/2007/08/28/140469.html</link><dc:creator>华梦行</dc:creator><author>华梦行</author><pubDate>Tue, 28 Aug 2007 06:09:00 GMT</pubDate><guid>http://www.blogjava.net/huamengxing/archive/2007/08/28/140469.html</guid><wfw:comment>http://www.blogjava.net/huamengxing/comments/140469.html</wfw:comment><comments>http://www.blogjava.net/huamengxing/archive/2007/08/28/140469.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huamengxing/comments/commentRss/140469.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huamengxing/services/trackbacks/140469.html</trackback:ping><description><![CDATA[Bean factory implementations should support the standard bean lifecycle interfaces as far as possible. The full set of initialization methods and their standard order is:<br />BeanFactory的实现应该尽可能支持标准的bean生命周期，以下是所以的方法的顺序的依次列表<br />1. BeanNameAware's   <code>setBeanName</code><br />2. BeanClassLoaderAware's  <code>setBeanClassLoader</code><br />3. BeanFactoryAware's   <code>setBeanFactory</code><br />4. ResourceLoaderAware's <code>setResourceLoader</code> (only applicable when running in an application context)<br />5. ApplicationEventPublisherAware's <code>setApplicationEventPublisher</code> (only applicable when running in an application context)<br />6. MessageSourceAware's <code>setMessageSource</code> (only applicable when running in an application context)<br />7. ApplicationContextAware's <code>setApplicationContext</code> (only applicable when running in an application context)<br />8. ServletContextAware's <code>setServletContext</code> (only applicable when running in a web application context)<br />9. <code>postProcessBeforeInitialization</code> methods of BeanPostProcessors<br />10. InitializingBean's <code>afterPropertiesSet</code><br />11. a custom init-method definition<br />12. <code>postProcessAfterInitialization</code> methods of BeanPostProcessors <br /> 当关闭一个bean的时候<br />On shutdown of a bean factory, the following lifecycle methods apply:<br />1. DisposableBean's <code>destroy</code><br />2. a custom destroy-method definition<br /><br /><table cellspacing="0" cellpadding="3" width="100%" summary="" border="1"><tbody><tr class="TableHeadingColor" bgcolor="#ccccff"><th align="left" colspan="2"><font size="+2"><b>Method Summary</b></font></th></tr><tr class="TableRowColor" bgcolor="white"><td valign="top" align="right" width="1%"><font size="-1"><code> boolean</code></font></td><td><code><b><a href="http://www.springframework.org/docs/api/org/springframework/beans/factory/BeanFactory.html#containsBean(java.lang.String)"><font color="#002c99">containsBean</font></a></b>(<a title="class or interface in java.lang" href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html"><font color="#002c99">String</font></a> name)</code><br />          Does this bean factory contain a bean with the given name?</td></tr><tr class="TableRowColor" bgcolor="white"><td valign="top" align="right" width="1%"><font size="-1"><code> <a title="class or interface in java.lang" href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html"><font color="#002c99">String</font></a>[]</code></font></td><td><code><b><a href="http://www.springframework.org/docs/api/org/springframework/beans/factory/BeanFactory.html#getAliases(java.lang.String)"><font color="#002c99">getAliases</font></a></b>(<a title="class or interface in java.lang" href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html"><font color="#002c99">String</font></a> name)</code><br />          Return the aliases for the given bean name, if any.</td></tr><tr class="TableRowColor" bgcolor="white"><td valign="top" align="right" width="1%"><font size="-1"><code> <a title="class or interface in java.lang" href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Object.html"><font color="#002c99">Object</font></a></code></font></td><td><code><b><a href="http://www.springframework.org/docs/api/org/springframework/beans/factory/BeanFactory.html#getBean(java.lang.String)"><font color="#002c99">getBean</font></a></b>(<a title="class or interface in java.lang" href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html"><font color="#002c99">String</font></a> name)</code><br />          Return an instance, which may be shared or independent, of the specified bean.</td></tr><tr class="TableRowColor" bgcolor="white"><td valign="top" align="right" width="1%"><font size="-1"><code> <a title="class or interface in java.lang" href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Object.html"><font color="#002c99">Object</font></a></code></font></td><td><code><b><a href="http://www.springframework.org/docs/api/org/springframework/beans/factory/BeanFactory.html#getBean(java.lang.String, java.lang.Class)"><font color="#002c99">getBean</font></a></b>(<a title="class or interface in java.lang" href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html"><font color="#002c99">String</font></a> name, <a title="class or interface in java.lang" href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Class.html"><font color="#002c99">Class</font></a> requiredType)</code><br />          Return an instance, which may be shared or independent, of the specified bean.</td></tr><tr class="TableRowColor" bgcolor="white"><td valign="top" align="right" width="1%"><font size="-1"><code> <a title="class or interface in java.lang" href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Class.html"><font color="#002c99">Class</font></a></code></font></td><td><code><b><a href="http://www.springframework.org/docs/api/org/springframework/beans/factory/BeanFactory.html#getType(java.lang.String)"><font color="#002c99">getType</font></a></b>(<a title="class or interface in java.lang" href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html"><font color="#002c99">String</font></a> name)</code><br />          Determine the type of the bean with the given name.</td></tr><tr class="TableRowColor" bgcolor="white"><td valign="top" align="right" width="1%"><font size="-1"><code> boolean</code></font></td><td><code><b><a href="http://www.springframework.org/docs/api/org/springframework/beans/factory/BeanFactory.html#isPrototype(java.lang.String)"><font color="#002c99">isPrototype</font></a></b>(<a title="class or interface in java.lang" href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html"><font color="#002c99">String</font></a> name)</code><br />          Is this bean a prototype?</td></tr><tr class="TableRowColor" bgcolor="white"><td valign="top" align="right" width="1%"><font size="-1"><code> boolean</code></font></td><td><code><b><a href="http://www.springframework.org/docs/api/org/springframework/beans/factory/BeanFactory.html#isSingleton(java.lang.String)"><font color="#002c99">isSingleton</font></a></b>(<a title="class or interface in java.lang" href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html"><font color="#002c99">String</font></a> name)</code><br />          Is this bean a shared singleton?</td></tr><tr class="TableRowColor" bgcolor="white"><td valign="top" align="right" width="1%"><font size="-1"><code> boolean</code></font></td><td><code><b><a href="http://www.springframework.org/docs/api/org/springframework/beans/factory/BeanFactory.html#isTypeMatch(java.lang.String, java.lang.Class)"><font color="#002c99">isTypeMatch</font></a></b>(<a title="class or interface in java.lang" href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html"><font color="#002c99">String</font></a> name, <a title="class or interface in java.lang" href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Class.html"><font color="#002c99">Class</font></a> targetType)</code><br />          Check whether the bean with the given name matches the specified type.</td></tr></tbody></table>  <img src ="http://www.blogjava.net/huamengxing/aggbug/140469.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huamengxing/" target="_blank">华梦行</a> 2007-08-28 14:09 <a href="http://www.blogjava.net/huamengxing/archive/2007/08/28/140469.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Lifecycle api</title><link>http://www.blogjava.net/huamengxing/archive/2007/08/28/140460.html</link><dc:creator>华梦行</dc:creator><author>华梦行</author><pubDate>Tue, 28 Aug 2007 05:49:00 GMT</pubDate><guid>http://www.blogjava.net/huamengxing/archive/2007/08/28/140460.html</guid><wfw:comment>http://www.blogjava.net/huamengxing/comments/140460.html</wfw:comment><comments>http://www.blogjava.net/huamengxing/archive/2007/08/28/140460.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huamengxing/comments/commentRss/140460.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huamengxing/services/trackbacks/140460.html</trackback:ping><description><![CDATA[
		<dl>
				<dt>
				</dt>
				<pre>public interface <b>Lifecycle</b></pre>
		</dl>
		<pre>
		</pre>
		<p>Interface defining methods for start/stop lifecycle control. The typical use case for this is to control asynchronous processing. 
</p>
		<p>Can be implemented by both components (typically a Spring bean defined in a Spring <a title="interface in org.springframework.beans.factory" href="http://www.springframework.org/docs/api/org/springframework/beans/factory/BeanFactory.html"><code>BeanFactory</code></a>) and containers (typically a Spring <a title="interface in org.springframework.context" href="http://www.springframework.org/docs/api/org/springframework/context/ApplicationContext.html"><code>ApplicationContext</code></a>). Containers will propagate start/stop signals to all components that apply. 
</p>
		<p>Can be used for direct invocations or for management operations via JMX. In the latter case, the <a title="class in org.springframework.jmx.export" href="http://www.springframework.org/docs/api/org/springframework/jmx/export/MBeanExporter.html"><code>MBeanExporter</code></a> will typically be defined with an <a title="class in org.springframework.jmx.export.assembler" href="http://www.springframework.org/docs/api/org/springframework/jmx/export/assembler/InterfaceBasedMBeanInfoAssembler.html"><code>InterfaceBasedMBeanInfoAssembler</code></a>, restricting the visibility of activity-controlled components to the Lifecycle interface. 
</p>
		<p>
		</p>
		<p>
		</p>
		<dl>
				<dt>
						<b>Since:</b>
				</dt>
				<dd>2.0 
</dd>
				<dt>
						<b>Author:</b>
				</dt>
				<dd>Juergen Hoeller 
</dd>
				<dt>
						<b>See Also:</b>
				</dt>
				<dd>
						<a title="interface in org.springframework.context" href="http://www.springframework.org/docs/api/org/springframework/context/ConfigurableApplicationContext.html">
								<code>ConfigurableApplicationContext</code>
						</a>, <a title="class in org.springframework.jms.listener" href="http://www.springframework.org/docs/api/org/springframework/jms/listener/AbstractMessageListenerContainer.html"><code>AbstractMessageListenerContainer</code></a>, <a title="class in org.springframework.scheduling.quartz" href="http://www.springframework.org/docs/api/org/springframework/scheduling/quartz/SchedulerFactoryBean.html"><code>SchedulerFactoryBean</code></a></dd>
		</dl>
		<hr />
		<p>
				<!-- ========== METHOD SUMMARY =========== -->
				<a name="method_summary">
						<!-- -->
				</a>
		</p>
		<table cellspacing="0" cellpadding="3" width="100%" summary="" border="1">
				<tbody>
						<tr class="TableHeadingColor" bgcolor="#ccccff">
								<th align="left" colspan="2">
										<font size="+2">
												<b>Method Summary</b>
										</font>
								</th>
						</tr>
						<tr class="TableRowColor" bgcolor="white">
								<td valign="top" align="right" width="1%">
										<font size="-1">
												<code> boolean</code>
										</font>
								</td>
								<td>
										<code>
												<b>
														<a href="http://www.springframework.org/docs/api/org/springframework/context/Lifecycle.html#isRunning()">isRunning</a>
												</b>()</code>
										<br />          Check whether this component is currently running.</td>
						</tr>
						<tr class="TableRowColor" bgcolor="white">
								<td valign="top" align="right" width="1%">
										<font size="-1">
												<code> void</code>
										</font>
								</td>
								<td>
										<code>
												<b>
														<a href="http://www.springframework.org/docs/api/org/springframework/context/Lifecycle.html#start()">start</a>
												</b>()</code>
										<br />          Start this component.</td>
						</tr>
						<tr class="TableRowColor" bgcolor="white">
								<td valign="top" align="right" width="1%">
										<font size="-1">
												<code> void</code>
										</font>
								</td>
								<td>
										<code>
												<b>
														<a href="http://www.springframework.org/docs/api/org/springframework/context/Lifecycle.html#stop()">stop</a>
												</b>()</code>
										<br />          Stop this component.</td>
						</tr>
				</tbody>
		</table>  <img src ="http://www.blogjava.net/huamengxing/aggbug/140460.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huamengxing/" target="_blank">华梦行</a> 2007-08-28 13:49 <a href="http://www.blogjava.net/huamengxing/archive/2007/08/28/140460.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring中Bean的生命周期 </title><link>http://www.blogjava.net/huamengxing/archive/2007/08/28/140415.html</link><dc:creator>华梦行</dc:creator><author>华梦行</author><pubDate>Tue, 28 Aug 2007 04:56:00 GMT</pubDate><guid>http://www.blogjava.net/huamengxing/archive/2007/08/28/140415.html</guid><wfw:comment>http://www.blogjava.net/huamengxing/comments/140415.html</wfw:comment><comments>http://www.blogjava.net/huamengxing/archive/2007/08/28/140415.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huamengxing/comments/commentRss/140415.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huamengxing/services/trackbacks/140415.html</trackback:ping><description><![CDATA[
		<table style="BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" width="100%" align="center" border="0">
				<tbody>
						<tr>
								<td align="middle" bgcolor="#bbf0ff">
										<font style="FONT-SIZE: 14pt" color="#000066">
												<b>Spring中Bean的生命周期</b>
										</font>
								</td>
						</tr>
						<tr>
								<td>
										<table style="BORDER-COLLAPSE: collapse" bordercolor="#bbf0ff" cellspacing="1" cellpadding="0" width="100%" border="1">
												<tbody>
														<tr>
																<td align="middle">
																		<table style="BORDER-COLLAPSE: collapse; WORD-WRAP: break-word" cellspacing="0" cellpadding="0" width="650" border="0">
																				<tbody>
																						<tr>
																								<td align="middle">
																										<table style="BORDER-COLLAPSE: collapse; WORD-WRAP: break-word" cellspacing="0" cellpadding="0" width="100%" border="0">
																												<tbody>
																														<tr>
																																<td width="650">
																																		<div id="art" style="MARGIN: 15px">    在传统的Java应用中，Bean的生命周期非常简单。Java的关键词new用来实例化Bean（或许他是非序列化的）。这样就够用了。相反，Bean的生命周期在Spring容器中更加细致。理解Spring Bean的生命周期非常重要，因为你或许要利用Spring提供的机会来订制Bean的创建过程。<br /><br /><br /><div align="center"><img src="http://blog.chinaunix.net/upfile/061211093048.jpg" width="500" onload="javascript:if(this.width&gt;500)this.width=500;" border="0" /></div>1. 容器寻找Bean的定义信息并且将其实例化。<br />2.受用依赖注入，Spring按照Bean定义信息配置Bean的所有属性。<br />3.如果Bean实现了BeanNameAware接口，工厂调用Bean的setBeanName()方法传递Bean的ID。<br />4.如果Bean实现了BeanFactoryAware接口，工厂调用setBeanFactory()方法传入工厂自身。<br />5.如果BeanPostProcessor和Bean关联，那么它们的postProcessBeforeInitialzation()方法将被调用。<br />6.如果Bean指定了init-method方法，它将被调用。<br />7.最后，如果有BeanPsotProcessor和Bean关联，那么它们的postProcessAfterInitialization()方法将被调用。<br />    到这个时候，Bean已经可以被应用系统使用了，并且将被保留在Bean Factory中知道它不再需要。有两种方法可以把它从Bean Factory中删除掉。<br />1.如果Bean实现了DisposableBean接口，destory()方法被调用。<br />2.如果指定了订制的销毁方法，就调用这个方法。<br />    Bean在Spring应用上下文的生命周期与在Bean工厂中的生命周期只有一点不同，唯一不同的是，如果Bean实现了ApplicationContextAwre接口，setApplicationContext()方法被调用。<br /><div align="center"><img src="http://blog.chinaunix.net/upfile/061211094105.jpg" width="500" onload="javascript:if(this.width&gt;500)this.width=500;" border="0" /></div><br /></div>
																																</td>
																														</tr>
																												</tbody>
																										</table>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/huamengxing/aggbug/140415.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huamengxing/" target="_blank">华梦行</a> 2007-08-28 12:56 <a href="http://www.blogjava.net/huamengxing/archive/2007/08/28/140415.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ClassPathXmlApplicationContext  获得javabean</title><link>http://www.blogjava.net/huamengxing/archive/2007/08/28/140324.html</link><dc:creator>华梦行</dc:creator><author>华梦行</author><pubDate>Tue, 28 Aug 2007 01:58:00 GMT</pubDate><guid>http://www.blogjava.net/huamengxing/archive/2007/08/28/140324.html</guid><wfw:comment>http://www.blogjava.net/huamengxing/comments/140324.html</wfw:comment><comments>http://www.blogjava.net/huamengxing/archive/2007/08/28/140324.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huamengxing/comments/commentRss/140324.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huamengxing/services/trackbacks/140324.html</trackback:ping><description><![CDATA[ ApplicationContext ctx = new ClassPathXmlApplicationContext("knight.xml");<img src ="http://www.blogjava.net/huamengxing/aggbug/140324.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huamengxing/" target="_blank">华梦行</a> 2007-08-28 09:58 <a href="http://www.blogjava.net/huamengxing/archive/2007/08/28/140324.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>