﻿<?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-konhon-随笔分类-Spring</title><link>http://www.blogjava.net/konhon/category/3028.html</link><description>忘掉過去，展望未來。找回自我，超越自我。
&lt;br&gt;
&lt;b&gt;逃避不一定躲的过, 面对不一定最难过, 孤单不一定不快乐, 得到不一定能长久, 失去不一定不再拥有, 可能因为某个理由而伤心难过, 但我却能找个理由让自己快乐.&lt;/b&gt;&lt;br&gt;&lt;p&gt;
&lt;!-- Search Google --&gt;
&lt;left&gt;
&lt;form method="get" action="http://www.google.com/custom" target="google_window"&gt;
&lt;table&gt;
&lt;tr&gt;&lt;td nowrap="nowrap" valign="top" align="left" height="32"&gt;
&lt;a href="http://www.google.com/"&gt;
&lt;img src="http://www.google.com/logos/Logo_25wht.gif" border="0" alt="Google" align="middle"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;input type="text" name="q" size="31" maxlength="255" value=""&gt;&lt;/input&gt;
&lt;input type="submit" name="sa" value="搜索"&gt;&lt;/input&gt;
&lt;input type="hidden" name="client" value="pub-5408663347953425"&gt;&lt;/input&gt;
&lt;input type="hidden" name="forid" value="1"&gt;&lt;/input&gt;
&lt;input type="hidden" name="ie" value="UTF-8"&gt;&lt;/input&gt;
&lt;input type="hidden" name="oe" value="UTF-8"&gt;&lt;/input&gt;
&lt;input type="hidden" name="cof" value="GALT:#008000;GL:1;DIV:#336699;VLC:663399;AH:center;BGC:FFFFFF;LBGC:336699;ALC:0000FF;LC:0000FF;T:000000;GFNT:0000FF;GIMP:0000FF;FORID:1;"&gt;&lt;/input&gt;
&lt;input type="hidden" name="hl" value="zh-CN"&gt;&lt;/input&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/form&gt;
&lt;/left&gt;
&lt;!-- Search Google --&gt;
</description><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 11:06:55 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 11:06:55 GMT</pubDate><ttl>60</ttl><item><title>spring xdoclet</title><link>http://www.blogjava.net/konhon/archive/2006/12/06/85762.html</link><dc:creator>konhon 优华</dc:creator><author>konhon 优华</author><pubDate>Wed, 06 Dec 2006 02:05:00 GMT</pubDate><guid>http://www.blogjava.net/konhon/archive/2006/12/06/85762.html</guid><wfw:comment>http://www.blogjava.net/konhon/comments/85762.html</wfw:comment><comments>http://www.blogjava.net/konhon/archive/2006/12/06/85762.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/konhon/comments/commentRss/85762.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/konhon/services/trackbacks/85762.html</trackback:ping><description><![CDATA[<h2>
				<a id="viewpost1_TitleUrl" href="/jacky/articles/1007.html">spring xdoclet使用</a>
		</h2>
		<div class="postbody">
				<font size="2">手工书写spring-beans.xml非常繁琐，而且如果多个程序员同时进行一个项目的时候，即使分成多个spring文件，也很容易会产生冲突，更别说经常遇到的错误和程序升级问题了，还好最新的Xdoclet可以帮助我们解决这个烦恼，在最新的Xdoclet中已经包含了对srping的支持，即srpingdoclet。如下是例子： <br /><br />1、下载ant，从jakarta.apache.org <br />安装在c:\dev\ant，安装过程就不详细说了，如果ant都不懂，那看来您有些落伍了，也先别往下看了，学习一下ant先 <br /><br />2、下载xdoclet，当然是xdoclet.sf.net了，下载后把lib的东西放置到 <br />c:\dev\ant\lib\xdoclet <br /><br />3、java 代码 <br />只是个例子而已 <br />=================================================================== <br />XdocletMain.java : <br />=================================================================== <br /></font>
				<table cellspacing="1" cellpadding="3" width="90%" align="center" border="0">
						<tbody>
								<tr>
										<td>
												<span class="genmed">
														<b>
																<font size="2">代码:</font>
														</b>
												</span>
										</td>
								</tr>
								<tr>
										<td class="code">
												<br />/** <br /> * Created by IntelliJ IDEA. <br /> * User: wangzy <br /> * Date: 2004-12-5 <br /> * @spring.bean <br /> *  id="XdocletMain" <br /> *  singleton="true" <br /> * 上述说明,这是个spring的bean，id为XdocletMain，如果看不懂，再补习一下xdoclet <br /> * @spring.property <br /> *      name="bean1" <br /> *      ref="Bean1" <br /> * 上述说明，有个bean1属性，关联的为Bean1的spring组件 <br /> * @spring.property <br /> *     name="bean2" <br /> *     ref="Bean2" <br /> * 同上 <br /> */ <br />public class XdocletMain { <br /><br />    public Bean1 getBean1() { <br />        return bean1; <br />    } <br /><br />    public void setBean1(Bean1 bean1) { <br />        this.bean1 = bean1; <br />    } <br /><br />    public Bean2 getBean2() { <br />        return bean2; <br />    } <br /><br />    public void setBean2(Bean2 bean2) { <br />        this.bean2 = bean2; <br />    } <br /><br />    private Bean1 bean1 = null; <br /><br />    private Bean2 bean2 = null; <br />    <br />} <br /></td>
								</tr>
						</tbody>
				</table>
				<span class="postbody">
						<br />
						<font size="2">=================================================================== <br /><br />Bean1.java : <br />=================================================================== <br /></font>
				</span>
				<table cellspacing="1" cellpadding="3" width="90%" align="center" border="0">
						<tbody>
								<tr>
										<td>
												<span class="genmed">
														<b>
																<font size="2">代码:</font>
														</b>
												</span>
										</td>
								</tr>
								<tr>
										<td class="code">
												<br />/** <br /> * Created by IntelliJ IDEA. <br /> * User: wangzy <br /> * Date: 2004-12-5 <br /> * @spring.bean <br /> *      id="Bean1" <br /> *      singleton="true" <br /> * 声明一个Bean1的spring组件 <br /> */ <br />public class Bean1 { <br />    <br />} <br /></td>
								</tr>
						</tbody>
				</table>
				<span class="postbody">
						<br />
						<font size="2">=================================================================== <br />Bean2.java : <br /><br />=================================================================== <br /></font>
				</span>
				<table cellspacing="1" cellpadding="3" width="90%" align="center" border="0">
						<tbody>
								<tr>
										<td>
												<span class="genmed">
														<b>
																<font size="2">代码:</font>
														</b>
												</span>
										</td>
								</tr>
								<tr>
										<td class="code">
												<br />/** <br /> * Created by IntelliJ IDEA. <br /> * User: wangzy <br /> * Date: 2004-12-5 <br /> * @spring.bean <br /> *      id="Bean2" <br /> *      singleton="true" <br /> * 类似Bean1 <br /> */ <br />public class Bean2 { <br />} <br /></td>
								</tr>
						</tbody>
				</table>
				<span class="postbody">
						<br />
						<font size="2">=================================================================== <br /><br />下来当然就是最重要的ant的build.xml了，其中相关部分为： <br /></font>
				</span>
				<table cellspacing="1" cellpadding="3" width="90%" align="center" border="0">
						<tbody>
								<tr>
										<td>
												<span class="genmed">
														<b>
																<font size="2">代码:</font>
														</b>
												</span>
										</td>
								</tr>
								<tr>
										<td class="code">
												<br />&lt;!--这里是xdoclet的lib,这些都不是ant的core包，所以要引进来 --&gt; <br />&lt;path id="xdoclet.class.path"&gt; <br />    &lt;fileset dir="c:\dev\ant\lib\xdoclet"&gt; <br />        &lt;include name="*.jar"/&gt; <br />    &lt;/fileset&gt; <br />&lt;/path&gt; <br /><br />&lt;!--这里就是生成spring-beans配置了 --&gt; <br />&lt;target name="srpingdoclet"&gt; <br />    &lt;!--定义springdoclet task --&gt;    <br />    &lt;taskdef <br />        name="springdoclet" <br />        classname="xdoclet.modules.spring.SpringDocletTask" <br />        classpathref="xdoclet.class.path" <br />    /&gt; <br />    &lt;!--这里根据src下的java文件中的信息，生成spring-beans.xml到“spring/spring-beans.xml”文件中--&gt; <br />    &lt;springdoclet destdir="spring"&gt; <br />        &lt;fileset dir="src" includes="**/*.java" /&gt; <br />        &lt;springxml destinationFile="spring-beans.xml" /&gt; <br />    &lt;/springdoclet&gt; <br />&lt;/target&gt; <br /></td>
								</tr>
						</tbody>
				</table>
				<span class="postbody">
						<p>
								<br />
								<br />
								<font size="2">运行ant springdoclet，看看spring/spring-beans.xml文件，大功告成！！！ <br />具体详细信息可以看xdoclet文档</font>
						</p>
						<p>
						</p>
						<table cellspacing="1" cellpadding="3" width="90%" align="center" border="0">
								<tbody>
										<tr>
												<td>
														<span class="genmed">
																<b>
																		<font size="2">代码:</font>
																</b>
														</span>
												</td>
										</tr>
										<tr>
												<td class="code">
														<br />
														<br />&lt;?xml version="1.0" encoding="UTF-8"?&gt; <br /><br />&lt;!DOCTYPE beans PUBLIC <br />    "-//SPRING//DTD BEAN//EN" <br />    "http://www.springframework.org/dtd/spring-beans.dtd"&gt; <br /><br />&lt;beans <br />  default-autowire="no" <br />  default-lazy-init="false" <br />  default-dependency-check="none" <br />&gt; <br /><br />  &lt;bean <br />      id="Bean1" <br />      class="Bean1" <br />      singleton="true" <br />  &gt; <br /><br />  &lt;/bean&gt; <br /><br />  &lt;bean <br />      id="XdocletMain" <br />      class="XdocletMain" <br />      singleton="true" <br />  &gt; <br /><br />    &lt;property name="bean1"&gt; <br />      &lt;ref bean="Bean1"/&gt; <br />    &lt;/property&gt; <br />    &lt;property name="bean2"&gt; <br />      &lt;ref bean="Bean2"/&gt; <br />    &lt;/property&gt; <br />  &lt;/bean&gt; <br /><br />  &lt;bean <br />      id="Bean2" <br />      class="Bean2" <br />      singleton="true" <br />  &gt; <br /><br />  &lt;/bean&gt; <br /><br />  &lt;!-- <br />     To include additional bean definitions for Spring in the generated <br />     application context file, add a file to your XDoclet merge directory <br />     called spring-beans.xml that contains the &lt;bean&gt;&lt;/bean&gt; markup. <br />  --&gt; <br /><br />&lt;/beans&gt; <br /></td>
										</tr>
								</tbody>
						</table>
				</span>
		</div><img src ="http://www.blogjava.net/konhon/aggbug/85762.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/konhon/" target="_blank">konhon 优华</a> 2006-12-06 10:05 <a href="http://www.blogjava.net/konhon/archive/2006/12/06/85762.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring Framework标记库初学指南 </title><link>http://www.blogjava.net/konhon/archive/2006/05/29/48674.html</link><dc:creator>konhon 优华</dc:creator><author>konhon 优华</author><pubDate>Mon, 29 May 2006 01:11:00 GMT</pubDate><guid>http://www.blogjava.net/konhon/archive/2006/05/29/48674.html</guid><wfw:comment>http://www.blogjava.net/konhon/comments/48674.html</wfw:comment><comments>http://www.blogjava.net/konhon/archive/2006/05/29/48674.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/konhon/comments/commentRss/48674.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/konhon/services/trackbacks/48674.html</trackback:ping><description><![CDATA[Spring是一个服务于所有层面的application framework:提供了bean的配置基础，AOP的支持，JDBC的提取框架,抽象事务支持，等等。它有一个非常显著的特点：在某个层面上如果你不需要Spring的支持，你就可以不使用String的class，只使用它的某一部分的功能。从它的设计理念，你可以看到String帮助你实现了真正的逻辑层和web层的分离。 <br /><br />　　相对于EJB来说，Spring是一个轻量级的J2EE应用开发框架。这里提到的轻量级指的是Spring框架本身，而不是说Spring只能适用于轻量级的应用开发。Spring的轻盈体现在其框架本身的基础结构以及对其他应用工具的支持和装配能力，与EJB这种庞然大物相比，Spring使我们把各个技术层次之间的风险降低。EJB的内聚性较强，比如数据持久层管理、事务管理、生命周期管理都全部交给了EJB容器中管理，内聚性的白盒特征使我们必须放弃一部分可控性而去信任容器能力。而Spring则是考虑如何“不造轮子”，如何更好的组装这些轮子，让他们更好的转动。比如数据持久层管理可以使用hibernate，日志管理可以使用jakartacommonlogging。一个比较恰当的比喻就是“我们要钉几个钉子，为了完成这个目的，锤子生产商生产了大大小小一系列的锤子，每个锤子都有一套复杂的使用方法，用来钉某种特别的钉子，结果令我们头疼不堪。解决锤子过多的问题，通过spring，我们可以使用几种锤子，但用起来象是只有一个锤子”。(注：这段话是在网上看见的，这里引用这个比喻，我个人觉得很生动)关于这个框架也有一些简单的总结：“Spring有几个主要的部分：Bean+ApplicationContext，以一种统一的、IoC的方式查找、管理、组装、使用系统的组件，取代一切工厂；持久化框架；web框架。“J2EE框架”是RodJohnson的愿景，他希望Spring为J2EE轻量级解决方案提供自底至顶的全面基础设施支持。” <br />　　上面是关于一个新的Framework的简单介绍，据说是未来J2EE发展的方向。以前在论坛上有关于J2EE最佳组合的讨论，听说这个JSTL+Struts(或webwork)+Spring+Hibernate的组合很被看好,如果你感兴趣的话，可以到SpringFramework中文论坛上看看。下面转入本文的正题。 <br /><br />　　Spring 标记库介绍及用法： <br /><br />　　本文将重点介绍Spring 提供的标记库及其用法： <br /><br />　　当你在项目中用Spring Framework的时候，表现层可以选择Spring Framework自带的标记库。当然，这不是你唯一的选择。你可以选择其它标记库或模板替换技术。Spring Framework 并没有为应用提供非常丰富的标记库。Spring Framework 提供的标记库仅仅是为了够用就行，它并不是无所不包的。呵呵，这点与Struts丰富的标记库不一样。其实这点符合RodJohnson的出发点，既“不造轮子”。当然，Spring Framework标记库有它自身的特点，可以说是个有益的补充吧。 <br /><br />　　Spring 标记库分类如下： <br /><br />　　1、spring:hasBindErrors <br /><br />　　2、spring:bind <br /><br />　　3、spring:transform <br /><br />　　4、spring:message <br /><br />　　5、spring:htmlEscape <br /><br />　　6、spring:theme <br /><br />　　下面我们来具体介绍一下用法： <br /><br />　　1、spring:hasBindErrors <br /><br />　　对应org.springframework.web.servlet.tags.BindErrorsTag标记库处理类。 <br /><br />　　这个标记提供用于绑定对象的errors，如果这个标记被用到的话，那么关于这个对象的错误将在页面上显示出来。使用这个标记的前提条件是要先使用＜spring:bind＞标记,并且＜spring:hasBindErrors＞这个标记不能用来表示对象的状态，它仅仅可以绑定对象本身和对象的属性。 具体用法如下： <br /><br />＜spring:hasBindErrors name="priceIncrease"＞ ＜b＞Please fix all errors!＜/b＞ ＜/spring:hasBindErrors＞ <br /><br />　　通过这个简单的例子，我来具体说一下这个标记的属性吧。 <br /><br />　　name：是要被检查的Bean的名字。这个属性是必需要的。 <br /><br />　　这里是简单用法，所以就不介绍它包含的errors变量了。具体看英语文档。下同。 <br /><br />　　2、spring:bind <br /><br />　　对应org.springframework.web.servlet.tags.BindTag标记库处理类 <br /><br />　　这个标记用来为某个bean或bean 的属性赋值，通常和form一起用，相当于action的作用。它指明表单要提交到那个类或类的属性中去。 <br /><br />　　其中path属性是必须的，指明转到的类的路径。举例如下： <br /><br />＜form method="post"＞ <br />＜table width="95%" bgcolor="f8f8ff" border="0" cellspacing="0" cellpadding="5"＞ <br />＜tr＞ <br />＜td alignment="right" width="20%"＞Increase (%):＜/td＞ <br />＜spring:bind path="priceIncrease.percentage"＞ <br />＜td width="20%"＞ <br />＜input type="text" name="percentage" value="＜c:out value="${status.value}"/＞"＞ <br />＜/td＞ <br />＜td width="60%"＞ <br />＜font color="red"＞＜c:out value="${status.errorMessage}"/＞＜/font＞ <br />＜/td＞ <br />＜/spring:bind＞ <br />＜/tr＞ <br />＜/table＞ <br />＜br＞ <br />……………………省略 <br />＜/form＞ <br /><br />　3、spring:transform <br /><br />　　对应org.springframework.web.servlet.tags.TransformTag标记库处理类,这个标记用来转换表单中不与bean中的属性一一对应的那些属性，通常和＜spring:bind＞一起使用。＜spring:transform＞标记为＜spring:bind＞使用提供了更好的支持。 <br /><br />　　属性如下： <br /><br />　　value：必需要的。和当前＜spring:bind＞标记指向的bean类相同。就是你要转换的实体类名。 <br /><br />　　var：不是必需的。这个字符串被用来绑定输出结果到page，request, session或application scope.默认情况输出到jsp中。 <br /><br />　　scope：不是必需的。前提条件var必须设置的情况下。它的值可以是page，request, session或application。 <br /><br />　　4、spring:message 对应org.springframework.web.servlet.tags.MessageTag标记库处理类 <br /><br />　　这个标记用来帮助springframework支持国际化。和JSTL的fmt:message标记类似。当然这个标记可以很好的工作的本地的springframework框架下。 <br /><br />　　属性如下： <br /><br />　　code：不是必需的。用来查找message,如果没有被使用的话，text将被使用。 <br /><br />　　text：不是必需的。假如code不存在的话，默认是text输出。当code和text都没有设置的话，标记将输出为null. <br /><br />　　var：不是必需的。这个字符串被用来绑定输出结果到page，request, session或application scope.默认情况输出到jsp中。 <br /><br />　　scope：不是必需的。前提条件var必须设置的情况下。它的值可以是page，request, session或application。 <br /><br />　　5、spring:htmlEscape <br /><br />　　对应org.springframework.web.servlet.tags.HtmlEscapeTag标记库处理类 <br /><br />　　不常用，这里省略 <br /><br />　　6、spring:theme <br /><br />　　对应org.springframework.web.servlet.tags.ThemeTag标记库处理类 <br /><br />　　不常用，这里省略 <br /><br />　　学习完这些用法后，让我们来看个具体的例子吧。 <br /><br />　　配置步骤如下： <br /><br />　　目录结构图： <br /><br />-spirngapp <br />-WEB-INF <br />-classes <br />-lib <br />-src <br />-war <br /><br />　　1、将spring.tld拷贝到WEB-INF目录。 <br /><br />　　2、将spring.jar拷贝到WEB-INF\lib包下 <br /><br />　　举例如下： <br /><br />　　在web.xml中配置好taglib属性，代码如下： <br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">＜?xml version="1.0" encoding="UTF-8"?＞ <br />＜!DOCTYPE web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN' 'http://java.sun.com/dtd/web-app_2_3.dtd'＞ <br />＜web-app＞ <br />＜servlet＞ <br />＜servlet-name＞springapp＜/servlet-name＞ <br />＜servlet-class＞org.springframework.web.servlet.DispatcherServlet＜/servlet-class＞ <br />＜load-on-startup＞1＜/load-on-startup＞ <br />＜/servlet＞ <br />＜servlet-mapping＞ <br />＜servlet-name＞springapp＜/servlet-name＞ <br />＜url-pattern＞*.htm＜/url-pattern＞ <br />＜/servlet-mapping＞ <br />＜welcome-file-list＞ <br />＜welcome-file＞ index.jsp ＜/welcome-file＞ <br />＜/welcome-file-list＞ <br />＜taglib＞ <br />＜taglib-uri＞/spring＜/taglib-uri＞ <br />＜taglib-location＞/WEB-INF/spring.tld＜/taglib-location＞ <br />＜/taglib＞ <br />＜/web-app＞ <br /></span></div><br />　　jsp页面代码如下： <br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">＜%@ include file="/WEB-INF/jsp/include.jsp" %＞ <br />＜%@ taglib prefix="spring" uri="/spring" %＞ <br />＜html＞ <br />＜head＞ <br />＜title＞＜fmt:message key="title"/＞＜/title＞ <br />＜/head＞ <br />＜body＞ <br />＜h1＞ <br />＜fmt:message key="priceincrease.heading"/＞ <br />＜/h1＞ <br />＜form method="post"＞ <br />＜table width="95%" bgcolor="f8f8ff" border="0" cellspacing="0" cellpadding="5"＞ <br />＜tr＞ <br />＜td alignment="right" width="20%"＞Increase (%):＜/td＞ <br />＜spring:bind path="priceIncrease.percentage"＞ <br />＜td width="20%"＞ <br />＜input type="text" name="percentage" value="＜c:out value="${status.value}"/＞"＞ <br />＜/td＞ <br />＜td width="60%"＞ <br />＜font color="red"＞ <br />＜c:out value="${status.errorMessage}"/＞ <br />＜/font＞ <br />＜/td＞ <br />＜/spring:bind＞ <br />＜/tr＞ <br />＜/table＞ <br />＜br＞ <br />＜spring:hasBindErrors name="priceIncrease"＞ <br />＜b＞Please fix all errors!＜/b＞ <br />＜/spring:hasBindErrors＞ ＜br＞＜br＞ <br />＜input type="submit" alignment="center" value="Execute"＞ <br />＜/form＞ <br />＜a href="＜c:url value="hello.htm"/＞"＞Home＜/a＞ <br />＜/body＞ <br />＜/html＞ <br /></span></div><br />　　＜spring:bind＞标记经常用来绑定＜input＞表单元素以便提交给PriceIncrease.java,其实PriceIncrease.java中就是包含一些getter和setter的方法的类。当用户按下按钮提交的时候，其表单中的值实际上就被framework放到了PriceIncrease.java中。＜spring:bind＞经常和form一起使用.这个${status.errorMessage}和${status.value}是一个framework定义的特殊变量，它们被用来显示错误信息和当前表单中的数据。呵呵，今天就到此为止吧，关于Spring Framework标记库的详细用法，请参考其文档。<img src ="http://www.blogjava.net/konhon/aggbug/48674.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/konhon/" target="_blank">konhon 优华</a> 2006-05-29 09:11 <a href="http://www.blogjava.net/konhon/archive/2006/05/29/48674.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MultiActionController類別 </title><link>http://www.blogjava.net/konhon/archive/2006/05/26/48259.html</link><dc:creator>konhon 优华</dc:creator><author>konhon 优华</author><pubDate>Fri, 26 May 2006 01:07:00 GMT</pubDate><guid>http://www.blogjava.net/konhon/archive/2006/05/26/48259.html</guid><wfw:comment>http://www.blogjava.net/konhon/comments/48259.html</wfw:comment><comments>http://www.blogjava.net/konhon/archive/2006/05/26/48259.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/konhon/comments/commentRss/48259.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/konhon/services/trackbacks/48259.html</trackback:ping><description><![CDATA[我們經常為每一個Action撰寫一個Controller類別，很快的，您發現到您的Web應用程式下越來越多的Controller類別，而事實上當中的方法是可以組織在一起成為一個類別檔案，例如與資料庫操作相關的list()、add()、delete()等方法，就可以組織為一個類別。 
<p>　要將相關的方法組織在一個檔案中，只使用一個handleRequest()方法似乎是不夠的，我們希望同一個Controller中可以根據我們的指定來Action中的某個方法，而不只是使用handleRequest()方法。 </p><p>　作為org.springframework.web.servlet.mvc.AbstractController下的另一個子類別：org.springframework.web.servlet.mvc.multiaction.MultiActionController，它可以讓我們在一個Controller類別中定義多個方法，並根據我們的請求來呼叫當中的某個方法來執行。 </p><p>　如果您瞭解Struts，其DispatchAction就類似於Spring的MultiActionController類別，所不同的是，MultiActionController擁有比Struts的DispatchAction更多樣化的方式來參數化與組織這些Action。 </p><p>　要使用MultiActionController，您要配合一個MethodNameResolver的實例，MultiActionController預設是InternalPathMethodNameResolver，這是最簡單的方式，根據您所給的網址最後的檔案名稱來判斷要執行Action中的哪一個方法，但通常我們不會使用InternalPathMethodNameResolver，因為這就失去了使用MultiActionController的一些優點，像是依請求參數來決定要呼叫的方法。 </p><p>　我們通常會使用ParameterMethodNameResolver或PropertiesMethodNameResolver，在一個網址上結合請求參數，以參數來決定要執行哪一個Action，這邊以ParameterMethodNameResolver為例，首先，我們可以在bean定義檔中這麼撰寫： </p><div class="code" style="BORDER-TOP-STYLE: solid; BORDER-RIGHT-STYLE: solid; BORDER-LEFT-STYLE: solid; BORDER-BOTTOM-STYLE: solid"><div class="codeContent"><pre class="code-java">&lt;?xml version=<span class="code-quote">"1.0"</span> encoding=<span class="code-quote">"UTF-8"</span>?&gt; 
&lt;!DOCTYPE beans PUBLIC <span class="code-quote">"-<span class="code-comment">//SPRING/DTD BEAN/EN"</span><span class="code-quote">"http://www.springframework.org/dtd/spring-beans.dtd"</span>&gt; 
</span>&lt;beans&gt; 
    &lt;bean id=<span class="code-quote">"urlMapping"</span> class=<span class="code-quote">"org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"</span>&gt; 
        &lt;property name=<span class="code-quote">"mappings"</span>&gt; 
            &lt;props&gt; 
                &lt;prop key=<span class="code-quote">"/book.<span class="code-keyword">do</span>"</span>&gt;bookAction&lt;/prop&gt; 
            &lt;/props&gt; 
        &lt;/property&gt; 
    &lt;/bean&gt; 
    
    &lt;bean id=<span class="code-quote">"viewResolver"</span> class=<span class="code-quote">"org.springframework.web.servlet.view.InternalResourceViewResolver"</span>&gt; 
        &lt;property name=<span class="code-quote">"viewClass"</span>&gt; 
            &lt;value&gt;org.springframework.web.servlet.view.InternalResourceView&lt;/value&gt; 
        &lt;/property&gt; 
        &lt;property name=<span class="code-quote">"prefix"</span>&gt; 
            &lt;value&gt;/WEB-INF/jsp/&lt;/value&gt; 
        &lt;/property&gt; 
        &lt;property name=<span class="code-quote">"suffix"</span>&gt; 
            &lt;value&gt;.jsp&lt;/value&gt; 
        &lt;/property&gt; 
    &lt;/bean&gt; 

    &lt;bean id=<span class="code-quote">"paraMethodResolver"</span> 
        class=<span class="code-quote">"org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver"</span>&gt; 
        &lt;property name=<span class="code-quote">"paramName"</span>&gt;&lt;value&gt;method&lt;/value&gt;&lt;/property&gt; 
        &lt;property name=<span class="code-quote">"defaultMethodName"</span>&gt;&lt;value&gt;list&lt;/value&gt;&lt;/property&gt; 
    &lt;/bean&gt; 
        
    &lt;bean id=<span class="code-quote">"bookAction"</span> class=<span class="code-quote">"onlyfun.caterpillar.GuestBookAction"</span>&gt; 
        &lt;property name=<span class="code-quote">"methodNameResolver"</span>&gt; 
            &lt;ref bean=<span class="code-quote">"paraMethodResolver"</span>/&gt; 
        &lt;/property&gt; 
        &lt;property name=<span class="code-quote">"testPage"</span>&gt; 
            &lt;value&gt;test&lt;/value&gt; 
        &lt;/property&gt; 
    &lt;/bean&gt; 
&lt;/beans&gt;</pre></div></div><p>　在paraMethodResolver中，我們使用paramName定義在http請求中使用method參數來指定要呼叫的方法，若是請求中沒有指定method參數，則會使用defaultMethodName所指定的方法，這邊指定的是list()方法。 </p><p>　GuestBookAction是個繼承MultiActionController的類別，當中我們可以定義我們在method參數指定下所要呼叫的方法，例如：</p><div class="code" style="BORDER-TOP-STYLE: solid; BORDER-RIGHT-STYLE: solid; BORDER-LEFT-STYLE: solid; BORDER-BOTTOM-STYLE: solid"><div class="codeHeader" style="BORDER-BOTTOM-STYLE: solid"><b>GuestBookAction.java</b></div><div class="codeContent"><pre class="code-java"><span class="code-keyword">package</span> onlyfun.caterpillar; 

<span class="code-keyword">import</span> javax.servlet.http.*; 
<span class="code-keyword">import</span> org.springframework.web.servlet.ModelAndView; 
<span class="code-keyword">import</span> org.springframework.web.servlet.mvc.multiaction.MultiActionController; 

<span class="code-keyword">public</span> class GuestBookAction <span class="code-keyword">extends</span> MultiActionController { 
    <span class="code-keyword">private</span><span class="code-object">String</span> testPage; 
    
    <span class="code-keyword">public</span> ModelAndView list(HttpServletRequest req, HttpServletResponse res) { 
        <span class="code-keyword">return</span><span class="code-keyword">new</span> ModelAndView(<span class="code-keyword">this</span>.getTestPage(),<span class="code-quote">"executed"</span>, <span class="code-quote">"list"</span>); 
    } 
    
    <span class="code-keyword">public</span> ModelAndView add(HttpServletRequest req, HttpServletResponse res) { 
        <span class="code-keyword">return</span><span class="code-keyword">new</span> ModelAndView(<span class="code-keyword">this</span>.getTestPage(),<span class="code-quote">"executed"</span>, <span class="code-quote">"add"</span>); 
    } 
    
    <span class="code-keyword">public</span> ModelAndView delete(HttpServletRequest req, HttpServletResponse res) { 
        <span class="code-keyword">return</span><span class="code-keyword">new</span> ModelAndView(<span class="code-keyword">this</span>.getTestPage(),<span class="code-quote">"executed"</span>, <span class="code-quote">"delete"</span>); 
    } 
    
    <span class="code-keyword">public</span><span class="code-object">String</span> getTestPage() { 
        <span class="code-keyword">return</span> testPage; 
    } 
    
    <span class="code-keyword">public</span> void setTestPage(<span class="code-object">String</span> testPage) { 
        <span class="code-keyword">this</span>.testPage = testPage; 
    } 
}</pre></div></div><p>　注意到我們的方法必須包括HttpServletRequest與HttpServletResponse作為參數，您也可以使用帶有第三個參數HttpSession的版本。 </p><p>　上面的類別只是一個簡單的範例，用於測試MultiActionController的運作，我們測試用的JSP網頁如下： </p><div class="code" style="BORDER-TOP-STYLE: solid; BORDER-RIGHT-STYLE: solid; BORDER-LEFT-STYLE: solid; BORDER-BOTTOM-STYLE: solid"><div class="codeContent"><pre class="code-java">&lt;html&gt; 
&lt;head&gt;&lt;title&gt;Test&lt;/title&gt;&lt;/head&gt; 
&lt;body&gt; 
    &lt;H1&gt; <span class="code-quote">"${executed}"</span> method is executed.&lt;/H2&gt; 
&lt;/body&gt; 
&lt;/html&gt;</pre></div></div><p>　當您使用以下的網址請求資源時： <br /><span class="nobr"><a title="Visit page outside Confluence" href="http://localhost:8080/springapp/book.do?method=add" rel="nofollow">http://localhost:8080/springapp/book.do?method=add<sup><img class="rendericon" height="7" alt="" src="http://www.javaworld.com.tw/confluence/images/icons/linkext7.gif" width="7" align="absMiddle" border="0" /></sup></a></span></p><p>　我們的測試網頁將傳回以下的內容： </p><div class="code" style="BORDER-TOP-STYLE: solid; BORDER-RIGHT-STYLE: solid; BORDER-LEFT-STYLE: solid; BORDER-BOTTOM-STYLE: solid"><div class="codeContent"><pre class="code-java">&lt;html&gt; 
&lt;head&gt;&lt;title&gt;Test&lt;/title&gt;&lt;/head&gt; 
&lt;body&gt; 
    &lt;H1&gt; <span class="code-quote">"add"</span> method is executed.&lt;/H2&gt; 
&lt;/body&gt; 
&lt;/html&gt;</pre></div></div><p>　您也可以將所有相對應的方法專門組織在一個委託（delegate）物件中，而不是撰寫在Controller類別中，當請求來到時，將委託給這個物件來執行指定的方法，您只要定義MultiActionController的delegate屬性即可，例如我們的委託物件如下： </p><div class="code" style="BORDER-TOP-STYLE: solid; BORDER-RIGHT-STYLE: solid; BORDER-LEFT-STYLE: solid; BORDER-BOTTOM-STYLE: solid"><div class="codeHeader" style="BORDER-BOTTOM-STYLE: solid"><b>BookActionDelegate.java</b></div><div class="codeContent"><pre class="code-java"><span class="code-keyword">package</span> onlyfun.caterpillar; 

<span class="code-keyword">import</span> javax.servlet.http.*; 
<span class="code-keyword">import</span> org.springframework.web.servlet.ModelAndView; 

<span class="code-keyword">public</span> class BookActionDelegate { 
    <span class="code-keyword">private</span><span class="code-object">String</span> testPage; 
    
    <span class="code-keyword">public</span> ModelAndView list(HttpServletRequest req, HttpServletResponse res) { 
        <span class="code-keyword">return</span><span class="code-keyword">new</span> ModelAndView(<span class="code-keyword">this</span>.getTestPage(),<span class="code-quote">"executed"</span>, <span class="code-quote">"list"</span>); 
    } 
    
    <span class="code-keyword">public</span> ModelAndView add(HttpServletRequest req, HttpServletResponse res) { 
        <span class="code-keyword">return</span><span class="code-keyword">new</span> ModelAndView(<span class="code-keyword">this</span>.getTestPage(),<span class="code-quote">"executed"</span>, <span class="code-quote">"add"</span>); 
    } 
    
    <span class="code-keyword">public</span> ModelAndView delete(HttpServletRequest req, HttpServletResponse res) { 
        <span class="code-keyword">return</span><span class="code-keyword">new</span> ModelAndView(<span class="code-keyword">this</span>.getTestPage(),<span class="code-quote">"executed"</span>, <span class="code-quote">"delete"</span>); 
    } 
    
    <span class="code-keyword">public</span><span class="code-object">String</span> getTestPage() { 
        <span class="code-keyword">return</span> testPage; 
    } 
    
    <span class="code-keyword">public</span> void setTestPage(<span class="code-object">String</span> testPage) { 
        <span class="code-keyword">this</span>.testPage = testPage; 
    } 
}</pre></div></div><p>　現在我們不用定義GuestBookAction了，直接使用MultiActionController，只要定義Bean定義檔就好了： </p><div class="code" style="BORDER-TOP-STYLE: solid; BORDER-RIGHT-STYLE: solid; BORDER-LEFT-STYLE: solid; BORDER-BOTTOM-STYLE: solid"><div class="codeContent"><pre class="code-java">&lt;?xml version=<span class="code-quote">"1.0"</span> encoding=<span class="code-quote">"UTF-8"</span>?&gt; 
&lt;!DOCTYPE beans PUBLIC <span class="code-quote">"-<span class="code-comment">//SPRING/DTD BEAN/EN"</span><span class="code-quote">"http://www.springframework.org/dtd/spring-beans.dtd"</span>&gt; 
</span>&lt;beans&gt; 
    &lt;bean id=<span class="code-quote">"urlMapping"</span> class=<span class="code-quote">"org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"</span>&gt; 
        &lt;property name=<span class="code-quote">"mappings"</span>&gt; 
            &lt;props&gt; 
                &lt;prop key=<span class="code-quote">"/book.<span class="code-keyword">do</span>"</span>&gt;bookAction&lt;/prop&gt; 
            &lt;/props&gt; 
        &lt;/property&gt; 
    &lt;/bean&gt; 
    
    &lt;bean id=<span class="code-quote">"viewResolver"</span> class=<span class="code-quote">"org.springframework.web.servlet.view.InternalResourceViewResolver"</span>&gt; 
        &lt;property name=<span class="code-quote">"viewClass"</span>&gt; 
            &lt;value&gt;org.springframework.web.servlet.view.InternalResourceView&lt;/value&gt; 
        &lt;/property&gt; 
        &lt;property name=<span class="code-quote">"prefix"</span>&gt; 
            &lt;value&gt;/WEB-INF/jsp/&lt;/value&gt; 
        &lt;/property&gt; 
        &lt;property name=<span class="code-quote">"suffix"</span>&gt; 
            &lt;value&gt;.jsp&lt;/value&gt; 
        &lt;/property&gt; 
    &lt;/bean&gt; 

    &lt;bean id=<span class="code-quote">"paraMethodResolver"</span> 
        class=<span class="code-quote">"org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver"</span>&gt; 
        &lt;property name=<span class="code-quote">"paramName"</span>&gt;&lt;value&gt;method&lt;/value&gt;&lt;/property&gt; 
        &lt;property name=<span class="code-quote">"defaultMethodName"</span>&gt;&lt;value&gt;list&lt;/value&gt;&lt;/property&gt; 
    &lt;/bean&gt; 

    &lt;bean id=<span class="code-quote">"bookActionDelegate"</span> class=<span class="code-quote">"onlyfun.caterpillar.BookActionDelegate"</span>&gt; 
        &lt;property name=<span class="code-quote">"testPage"</span>&gt; 
            &lt;value&gt;test&lt;/value&gt; 
        &lt;/property&gt; 
    &lt;/bean&gt; 
    
    &lt;bean id=<span class="code-quote">"bookAction"</span> class=<span class="code-quote">"org.springframework.web.servlet.mvc.multiaction.MultiActionController"</span>&gt; 
        &lt;property name=<span class="code-quote">"methodNameResolver"</span>&gt; 
            &lt;ref bean=<span class="code-quote">"paraMethodResolver"</span>/&gt; 
        &lt;/property&gt; 
        &lt;property name=<span class="code-quote">"delegate"</span>&gt; 
            &lt;ref bean=<span class="code-quote">"bookActionDelegate"</span>/&gt; 
        &lt;/property&gt; 
    &lt;/bean&gt;    
&lt;/beans&gt;</pre></div></div><p>　測試的結果與上面是相同的。 </p><p>　以上說明的是ParameterMethodNameResolver，而PropertiesMethodNameResolver的設定方法是類似的，有興趣的話，可以看一下Spring參考手冊中有關MultiActionController的說明，當中也有個簡明的設定範例。 </p><img src ="http://www.blogjava.net/konhon/aggbug/48259.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/konhon/" target="_blank">konhon 优华</a> 2006-05-26 09:07 <a href="http://www.blogjava.net/konhon/archive/2006/05/26/48259.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring 编程入门十大问题解答 </title><link>http://www.blogjava.net/konhon/archive/2005/08/13/10016.html</link><dc:creator>konhon 优华</dc:creator><author>konhon 优华</author><pubDate>Sat, 13 Aug 2005 00:24:00 GMT</pubDate><guid>http://www.blogjava.net/konhon/archive/2005/08/13/10016.html</guid><wfw:comment>http://www.blogjava.net/konhon/comments/10016.html</wfw:comment><comments>http://www.blogjava.net/konhon/archive/2005/08/13/10016.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/konhon/comments/commentRss/10016.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/konhon/services/trackbacks/10016.html</trackback:ping><description><![CDATA[<SPAN id=ArticleContent1_ArticleContent1_lblContent><BR><BR>　　1、如何学习Spring？<BR><BR>　　你可以通过下列途径学习spring：<BR><BR>　　(1) spring下载包中doc目录下的MVC-step-by-step和sample目录下的例子都是比较好的spring开发的例子。 <BR><BR>　　(2) AppFuse集成了目前最流行的几个开源轻量级框架或者工具 Ant,XDoclet,Spring,Hibernate(iBATIS),JUnit,Cactus,StrutsTestCase,Canoo&amp;#39;s WebTest,Struts Menu,Display Tag Library,OSCache,JSTL,Struts 。<BR><BR>　　你可以通过AppFuse源代码来学习spring。<BR><BR>AppFuse网站：http://raibledesigns.com/wiki/Wiki.jsp?page=AppFuse<BR><BR>　　(3)Spring 开发指南(夏昕)（http://www.xiaxin.net/Spring_Dev_Guide.rar）<BR><BR>　　一本spring的入门书籍,里面介绍了反转控制和依赖注射的概念，以及spring的bean管理，spring的MVC，spring和hibernte，iBatis的结合。<BR><BR>　　(4) spring学习的中文论坛<BR><BR>　　SpringFramework中文论坛(http://spring.jactiongroup.net)<BR><BR>　　Java视线论坛(http://forum.javaeye.com)的spring栏目<BR><BR>　　2、利用Spring框架编程，console打印出log4j:WARN Please initialize the log4j system properly？<BR><BR>　　说明你的log4j.properties没有配置。请把log4j.properties放到工程的classpath中，eclipse的classpath为bin目录，由于编译后src目录下的文件会拷贝到bin目录下，所以你可以把log4j.properties放到src目录下。<BR><BR>　　这里给出一个log4j.properties的例子：<BR><BR>log4j.rootLogger=DEBUG,stdout<BR>log4j.appender.stdout=org.apache.log4j.ConsoleAppender<BR>log4j.appender.stdout.layout=org.apache.log4j.PatternLayout<BR>log4j.appender.stdout.layout.ConversionPattern=%d %5p (%F:%L) - %m%n <BR><BR>　　3、出现 java.lang.NoClassDefFoundError?<BR><BR>　　一般情况下是由于你没有把必要的jar包放到lib中。<BR><BR>　　比如你要采用spring和hibernate（带事务支持的话），你除了spring.jar外还需要hibernat.jar、aopalliance.jar、cglig.jar、jakarta-commons下的几个jar包。<BR><BR>http://www.springframework.org/download.html下载spring开发包，提供两种zip包<BR>spring-framework-1.1.3-with-dependencies.zip和spring-framework-1.1.3.zip，我建议你下载spring-framework-1.1.3-with-dependencies.zip。这个zip解压缩后比后者多一个lib目录，其中有hibernate、j2ee、dom4j、aopalliance、jakarta-commons等常用包。<BR><BR>　　4、java.io.FileNotFoundException: Could not open class path resource [....hbm.xml],提示找不到xml文件？<BR><BR>　　原因一般有两个：<BR><BR>　　(1)该xml文件没有在classpath中。 <BR><BR>　　(2)applicationContext-hibernate.xml中的xml名字没有带包名。比如：<BR><BR>＜bean id="sessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean"＞<BR>＜property name="dataSource"＞＜ref bean="dataSource"/＞＜/property＞<BR>＜property name="mappingResources"＞<BR>　＜list＞<BR>　　＜value＞User.hbm.xml＜/value＞<BR>　　错，改为： <BR>　　＜value＞com/yz/spring/domain/User.hbm.xml＜/value＞<BR>　＜/list＞<BR>＜/property＞<BR>＜property name="hibernateProperties"＞<BR>＜props＞ <BR>　＜prop key="hibernate.dialect"＞ net.sf.hibernate.dialect.MySQLDialect ＜/prop＞ <BR>　＜prop key="hibernate.show_sql"＞true＜/prop＞ <BR>＜/props＞ <BR>＜/property＞<BR>＜/bean＞ <BR><BR>　　5、org.springframework.beans.NotWritablePropertyException: Invalid property &amp;#39;postDao&amp;#39; of bean class？<BR><BR>　　出现异常的原因是在application-xxx.xml中property name的错误。<BR><BR>　　＜property name="...."＞ 中name的名字是与bean的set方法相关的，而且要注意大小写。<BR><BR>　　比如<BR><BR>public class PostManageImpl extends BaseManage implements PostManage {<BR>　private PostDAO dao = null;<BR>　public void setPostDAO(PostDAO postDAO){<BR>　　this.dao = postDAO;<BR>　}<BR>} <BR><BR>　　那么xml的定义应该是：<BR><BR>＜bean id="postManage" parent="txProxyTemplate"＞<BR>＜property name="target"＞<BR>　＜bean class="com.yz.spring.service.implement.PostManageImpl"＞<BR>　　＜property name="postDAO"＞＜ref bean="postDAO"/＞＜/property＞ 对<BR>　　＜property name="dao"＞＜ref bean="postDAO"/＞＜/property＞ 错<BR>　＜/bean＞<BR>＜/property＞<BR>＜/bean＞ <BR><BR>　　6、Spring中如何实现事务管理？<BR><BR>　　首先，如果使用mysql，确定mysql为InnoDB类型。<BR><BR>　　事务管理的控制应该放到商业逻辑层。你可以写个处理商业逻辑的JavaBean，在该JavaBean中调用DAO，然后把该Bean的方法纳入spring的事务管理。<BR><BR>　　比如：xml文件定义如下：<BR><BR>＜bean id="txProxyTemplate" abstract="true"<BR>class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"＞<BR>＜property name="transactionManager"＞＜ref bean="transactionManager"/＞＜/property＞<BR>＜property name="transactionAttributes"＞<BR>＜props＞<BR>＜prop key="save*"＞PROPAGATION_REQUIRED＜/prop＞<BR>＜prop key="remove*"＞PROPAGATION_REQUIRED＜/prop＞<BR>＜prop key="*"＞PROPAGATION_REQUIRED＜/prop＞<BR>＜/props＞<BR>＜/property＞<BR>＜/bean＞<BR><BR>＜bean id="userManage" parent="txProxyTemplate"＞<BR>　＜property name="target"＞<BR>　　＜bean class="com.yz.spring.service.implement.UserManageImpl"＞<BR>　　　＜property name="userDAO"＞＜ref bean="userDAO"/＞＜/property＞<BR>　　＜/bean＞<BR>　＜/property＞<BR>＜/bean＞ <BR><BR>　　com.yz.spring.service.implement.UserManageImpl就是我们的实现商业逻辑的JavaBean。我们通过parent元素声明其事务支持。<BR><BR>　　7、如何管理Spring框架下更多的JavaBean？<BR><BR>　　JavaBean越多，spring配置文件就越大，这样不易维护。为了使配置清晰，我们可以将JavaBean分类管理，放在不同的配置文件中。 应用启动时将所有的xml同时加载。<BR><BR>　　比如：<BR><BR>　　DAO层的JavaBean放到applicationContext-hibernate.xml中，商业逻辑层的JavaBean放到applicationContext-service.xml中。然后启动类中调用以下代码载入所有的ApplicationContext。<BR><BR>String[] paths = {"com/yz/spring/dao/hibernate/applicationContext-hibernate.xml",<BR>"com/yz/spring/service/applicationContext-service.xml"};<BR>ctx = new ClassPathXmlApplicationContext(paths); <BR><BR>　　8、web应用中如何加载ApplicationContext？<BR><BR>　　可以通过定义web.xml，由web容器自动加载。<BR><BR>＜servlet＞<BR>＜servlet-name＞context＜/servlet-name＞<BR>＜servlet-class＞org.springframework.web.context.ContextLoaderServlet＜/servlet-class＞<BR>＜load-on-startup＞1＜/load-on-startup＞<BR>＜/servlet＞<BR><BR>＜context-param＞<BR>＜param-name＞contextConfigLocation＜/param-name＞<BR>＜param-value＞/WEB-INF/applicationContext-hibernate.xml＜/param-value＞<BR>＜param-value＞/WEB-INF/applicationContext-service.xml＜/param-value＞<BR>＜/context-param＞ <BR><BR>　　9、在spring中如何配置的log4j?<BR><BR>　　在web.xml中加入以下代码即可。<BR><BR>＜context-param＞<BR>＜param-name＞log4jConfigLocation＜/param-name＞<BR>＜param-value＞/WEB-INF/log4j.properties＜/param-value＞<BR>＜/context-param＞ <BR><BR>　　10、Spring框架入门的编程问题解决了，我该如何更深地领会Spring框架呢？<BR><BR>　　这两本书你该去看看。这两本书是由Spring的作者Rod Johnson编写的。<BR><BR>Expert One on one J2EE Design and Development<BR>Expert One on one J2EE Development Without EJB <BR><BR>　　你也该看看martinfowler的Inversion of Control Containers and the Dependency Injection pattern。<BR><BR>http://www.martinfowler.com/articles/injection.html <BR>　<BR>　　再好好研读一下spring的文档。<BR><BR>http://www.jactiongroup.net/reference/html/index.html（中文版，未全部翻译） <BR><BR>　　还有就是多实践吧。 <BR></SPAN><img src ="http://www.blogjava.net/konhon/aggbug/10016.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/konhon/" target="_blank">konhon 优华</a> 2005-08-13 08:24 <a href="http://www.blogjava.net/konhon/archive/2005/08/13/10016.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>