﻿<?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-&lt;font color="red"&gt;JRen&lt;/font&gt;&lt;font color="lightgreen"&gt;大鹏一曰同风起，扶摇直上九万里&lt;/font&gt;-随笔分类-Spring</title><link>http://www.blogjava.net/liaojiyong/category/13297.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 25 May 2007 10:43:23 GMT</lastBuildDate><pubDate>Fri, 25 May 2007 10:43:23 GMT</pubDate><ttl>60</ttl><item><title>Spring MVC 开发快速入门(转)</title><link>http://www.blogjava.net/liaojiyong/archive/2007/03/30/107416.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Fri, 30 Mar 2007 01:51:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/03/30/107416.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/107416.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/03/30/107416.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/107416.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/107416.html</trackback:ping><description><![CDATA[这篇文章将教你快速地上手使用 Spring 框架，如果你手上有一本《Spring in Action》， 那么你最好从第三部分"Spring 在 Web 层的应用--建立 Web 层"开始看， 否则那将是一场恶梦! 
<p>　　首先， 我需要在你心里建立起 Spring MVC 的基本概念. 基于 Spring 的 Web 应用程序接收到 http://localhost:8080/hello.do(事实上请求路径是 /hello.do) 的请求后， Spring 将这个请求交给一个名为 helloController 的程序进行处理， helloController 再调用 一个名为 hello.jsp 的 jsp 文件生成 HTML 代码发给用户的浏览器显示. 上面的名称(/hello.do， helloController， hello.jsp) 都是变量， 你可以更改. </p><p>　　在 Spring MVC 中， jsp 文件中尽量不要有 Java 代码， 只有 HTML 代码和"迭代(forEach)"与"判断(if)"两个jstl标签. jsp 文件只作为渲染(或称为视图 View)模板使用. </p><p>　　好了， 我们开始吧. 首先我们需要一个放在 WEB-INF 目录下的 web.xml 文件: </p><strong>web.xml:</strong><pre><font color="#a52a2a"> 1 </font><font color="#8080c0">＜?</font><font color="#008000">xml</font><font color="#008000"></font><font color="#008000">version</font>=<font color="#dd0000">"1.0"</font><font color="#008000"></font><font color="#008000">encoding</font>=<font color="#dd0000">"UTF-8"</font><font color="#8080c0">?＞</font><br /><font color="#a52a2a"> 2 </font><br /><font color="#a52a2a"> 3 </font><font color="#008000">＜</font><font color="#008000">web-app</font><font color="#008000"></font><font color="#008000">version</font>=<font color="#dd0000">"2.4"</font><font color="#008000"></font><font color="#008000">xmlns</font>=<font color="#dd0000">"<a href="http://java.sun.com/xml/ns/j2ee"><font color="#002c99">http://java.sun.com/xml/ns/j2ee</font></a>"</font><br /><font color="#a52a2a"> 4 </font><font color="#008000"></font><font color="#008000">xmlns</font><font color="#8080c0">:</font><font color="#008000">xsi</font>=<font color="#dd0000">"<a href="http://www.w3.org/2001/XMLSchema-instance"><font color="#002c99">http://www.w3.org/2001/XMLSchema-instance</font></a>"</font><br /><font color="#a52a2a"> 5 </font><font color="#008000"></font><font color="#008000">xsi</font><font color="#8080c0">:</font><font color="#008000">schemaLocation</font>=<font color="#dd0000">"<a href="http://java.sun.com/xml/ns/j2ee"><font color="#002c99">http://java.sun.com/xml/ns/j2ee</font></a></font><br /><font color="#a52a2a"> 6 </font><font color="#dd0000"><a href="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"><font color="#002c99">http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd</font></a>"</font><font color="#008000">＞</font><br /><font color="#a52a2a"> 7 </font><br /><font color="#a52a2a"> 8 </font><font color="#008000">＜</font><font color="#008000">context-param</font><font color="#008000">＞</font><br /><font color="#a52a2a"> 9 </font><font color="#008000">＜</font><font color="#008000">param-name</font><font color="#008000">＞</font>contextConfigLocation<font color="#008000">＜/param-name＞</font><br /><font color="#a52a2a">10 </font><font color="#008000">＜</font><font color="#008000">param-value</font><font color="#008000">＞</font><br /><font color="#a52a2a">11 </font>            /WEB-INF/database.xml<br /><font color="#a52a2a">12 </font>            /WEB-INF/applicationContext.xml<br /><font color="#a52a2a">13 </font><font color="#008000">＜/param-value＞</font><br /><font color="#a52a2a">14 </font><font color="#008000">＜/context-param＞</font><br /><font color="#a52a2a">15 </font><br /><font color="#a52a2a">16 </font><font color="#008000">＜</font><font color="#008000">listener</font><font color="#008000">＞</font><br /><font color="#a52a2a">17 </font><font color="#008000">＜</font><font color="#008000">listener-class</font><font color="#008000">＞</font>org.springframework.web.context.ContextLoaderListener<font color="#008000">＜/listener-class＞</font><br /><font color="#a52a2a">18 </font><font color="#008000">＜/listener＞</font><br /><font color="#a52a2a">19 </font><br /><font color="#a52a2a">20 </font><font color="#008000">＜</font><font color="#008000">filter</font><font color="#008000">＞</font><br /><font color="#a52a2a">21 </font><font color="#008000">＜</font><font color="#008000">filter-name</font><font color="#008000">＞</font>encodingFilter<font color="#008000">＜/filter-name＞</font><br /><font color="#a52a2a">22 </font><font color="#008000">＜</font><font color="#008000">filter-class</font><font color="#008000">＞</font>org.springframework.web.filter.CharacterEncodingFilter<font color="#008000">＜/filter-class＞</font><br /><font color="#a52a2a">23 </font><font color="#008000">＜</font><font color="#008000">init-param</font><font color="#008000">＞</font><br /><font color="#a52a2a">24 </font><font color="#008000">＜</font><font color="#008000">param-name</font><font color="#008000">＞</font>encoding<font color="#008000">＜/param-name＞</font><br /><font color="#a52a2a">25 </font><font color="#008000">＜</font><font color="#008000">param-value</font><font color="#008000">＞</font>UTF-8<font color="#008000">＜/param-value＞</font><br /><font color="#a52a2a">26 </font><font color="#008000">＜/init-param＞</font><br /><font color="#a52a2a">27 </font><font color="#008000">＜/filter＞</font><br /><font color="#a52a2a">28 </font><br /><font color="#a52a2a">29 </font><font color="#008000">＜</font><font color="#008000">filter-mapping</font><font color="#008000">＞</font><br /><font color="#a52a2a">30 </font><font color="#008000">＜</font><font color="#008000">filter-name</font><font color="#008000">＞</font>encodingFilter<font color="#008000">＜/filter-name＞</font><br /><font color="#a52a2a">31 </font><font color="#008000">＜</font><font color="#008000">url-pattern</font><font color="#008000">＞</font>*.do<font color="#008000">＜/url-pattern＞</font><br /><font color="#a52a2a">32 </font><font color="#008000">＜/filter-mapping＞</font><br /><font color="#a52a2a">33 </font><br /><font color="#a52a2a">34 </font><font color="#008000">＜</font><font color="#008000">servlet</font><font color="#008000">＞</font><br /><font color="#a52a2a">35 </font><font color="#008000">＜</font><font color="#008000">servlet-name</font><font color="#008000">＞</font>ideawu<font color="#008000">＜/servlet-name＞</font><br /><font color="#a52a2a">36 </font><font color="#008000">＜</font><font color="#008000">servlet-class</font><font color="#008000">＞</font>org.springframework.web.servlet.DispatcherServlet<font color="#008000">＜/servlet-class＞</font><br /><font color="#a52a2a">37 </font><font color="#008000">＜</font><font color="#008000">load-on-startup</font><font color="#008000">＞</font>1<font color="#008000">＜/load-on-startup＞</font><br /><font color="#a52a2a">38 </font><font color="#008000">＜/servlet＞</font><br /><font color="#a52a2a">39 </font><br /><font color="#a52a2a">40 </font><font color="#008000">＜</font><font color="#008000">servlet-mapping</font><font color="#008000">＞</font><br /><font color="#a52a2a">41 </font><font color="#008000">＜</font><font color="#008000">servlet-name</font><font color="#008000">＞</font>ideawu<font color="#008000">＜/servlet-name＞</font><br /><font color="#a52a2a">42 </font><font color="#008000">＜</font><font color="#008000">url-pattern</font><font color="#008000">＞</font>*.do<font color="#008000">＜/url-pattern＞</font><br /><font color="#a52a2a">43 </font><font color="#008000">＜/servlet-mapping＞</font><br /><font color="#a52a2a">44 </font><br /><font color="#a52a2a">45 </font><font color="#008000">＜</font><font color="#008000">welcome-file-list</font><font color="#008000">＞</font><br /><font color="#a52a2a">46 </font><font color="#008000">＜</font><font color="#008000">welcome-file</font><font color="#008000">＞</font>index.jsp<font color="#008000">＜/welcome-file＞</font><br /><font color="#a52a2a">47 </font><font color="#008000">＜</font><font color="#008000">welcome-file</font><font color="#008000">＞</font>index.html<font color="#008000">＜/welcome-file＞</font><br /><font color="#a52a2a">48 </font><font color="#008000">＜/welcome-file-list＞</font><br /><font color="#a52a2a">49 </font><br /><font color="#a52a2a">50 </font><font color="#008000">＜</font><font color="#008000">jsp-config</font><font color="#008000">＞</font><br /><font color="#a52a2a">51 </font><font color="#008000">＜</font><font color="#008000">taglib</font><font color="#008000">＞</font><br /><font color="#a52a2a">52 </font><font color="#008000">＜</font><font color="#008000">taglib-uri</font><font color="#008000">＞</font><a href="http://java.sun.com/jsp/jstl/core"><font color="#002c99">http://java.sun.com/jsp/jstl/core</font></a><font color="#008000">＜/taglib-uri＞</font><br /><font color="#a52a2a">53 </font><font color="#008000">＜</font><font color="#008000">taglib-location</font><font color="#008000">＞</font>/WEB-INF/tld/c.tld<font color="#008000">＜/taglib-location＞</font><br /><font color="#a52a2a">54 </font><font color="#008000">＜/taglib＞</font><br /><font color="#a52a2a">55 </font><font color="#008000">＜</font><font color="#008000">taglib</font><font color="#008000">＞</font><br /><font color="#a52a2a">56 </font><font color="#008000">＜</font><font color="#008000">taglib-uri</font><font color="#008000">＞</font><a href="http://java.sun.com/jsp/jstl/fmt"><font color="#002c99">http://java.sun.com/jsp/jstl/fmt</font></a><font color="#008000">＜/taglib-uri＞</font><br /><font color="#a52a2a">57 </font><font color="#008000">＜</font><font color="#008000">taglib-location</font><font color="#008000">＞</font>/WEB-INF/tld/fmt.tld<font color="#008000">＜/taglib-location＞</font><br /><font color="#a52a2a">58 </font><font color="#008000">＜/taglib＞</font><br /><font color="#a52a2a">59 </font><font color="#008000">＜/jsp-config＞</font><br /><font color="#a52a2a">60 </font><br /><font color="#a52a2a">61 </font><font color="#008000">＜/web-app＞</font></pre><p>　　它配置了以下功能: </p><ul><li>配置 DispatcherServlet (servlet 标签)， 它是一个 Java Servlet 程序. 我们将它命名为 ideawu. 然后我们再配置 Servlet 映射(servlet-mapping 标签)， 也就是你希望哪些请求被DispatcherServlet处理. 这里， 我们设置后缀名为 do(*.do) 的所有URL请求都被名为 ideawu 的 DispatcherServlet 的程序处理. 选择 .do 只是一个习惯，但是你不要选择 .html! 虽然《Spring in Action》选择了 .html， 但是那是一种非常糟糕的作法， 特别是你整合 <a href="http://www.apache.org/"><font color="#002c99">Apache</font></a> 和 <a href="http://tomcat.apache.org/"><font color="#002c99">Tomcat</font></a> 的时候. 
</li><li>配置 CharacterEncodingFilter (filter 标签)， 否则你会发现中文乱码. 因为我的 jsp 和 html 文件都是 UTF-8 编码的， 所以我在 param-value 标签中设置了 UTF-8. 估计你使用的是 GB2312 或者 GBK， 立即转到 UTF-8 上来吧. 
</li><li>分解配置文件. context-param 标签指明我们的配置文件还有 /WEB-INF/database.xml 和 /WEB-INF/applicationContext.xml. ContextLoaderListener(listener 标签) 由此得知配置文件是哪些， 它会将它们载入. </li></ul><p>　　因为我们将 DispatcherServlet 命名为 <a href="http://www.ideawu.net/"><font color="#002c99">ideawu</font></a>， 所以我们在 WEB-INF 目录下建立一个名为 ideawu-servlet.xml 的文件: </p><strong>　　ideawu-servlet.xml:</strong><pre><font color="#a52a2a"> 1 </font><font color="#8080c0">＜?</font><font color="#008000">xml</font><font color="#008000"></font><font color="#008000">version</font>=<font color="#dd0000">"1.0"</font><font color="#008000"></font><font color="#008000">encoding</font>=<font color="#dd0000">"UTF-8"</font><font color="#008000"></font><font color="#8080c0">?＞</font><br /><font color="#a52a2a"> 2 </font><font color="#008000">＜!</font><font color="#008000">DOCTYPE</font> beans <font color="#008000">PUBLIC</font><font color="#dd0000">"-//SPRING//DTD BEAN//EN"</font><font color="#dd0000">"<br /><a href="http://www.springframework.org/dtd/spring-beans.dtd"><font color="#002c99">http://www.springframework.org/dtd/spring-beans.dtd</font></a>"</font><font color="#008000">＞</font><br /><font color="#a52a2a"> 3 </font><br /><font color="#a52a2a"> 4 </font><font color="#008000">＜</font><font color="#008000">beans</font><font color="#008000">＞</font><br /><font color="#a52a2a"> 5 </font><br /><font color="#a52a2a"> 6 </font><font color="#008000">＜</font><font color="#008000">bean</font><font color="#008000"></font><font color="#008000">id</font>=<font color="#dd0000">"viewResolver"</font><font color="#008000"></font><font color="#008000">class</font>=<font color="#dd0000">"org.springframework.web.servlet.<br />          _view.InternalResourceViewResolver"</font><font color="#008000">＞</font><br /><font color="#a52a2a"> 7 </font><font color="#008000">＜</font><font color="#008000">property</font><font color="#008000"></font><font color="#008000">name</font>=<font color="#dd0000">"prefix"</font><font color="#008000"></font><font color="#008000">value</font>=<font color="#dd0000">"/WEB-INF/jsp/"</font><font color="#008000"> /＞</font><br /><font color="#a52a2a"> 8 </font><font color="#008000">＜</font><font color="#008000">property</font><font color="#008000"></font><font color="#008000">name</font>=<font color="#dd0000">"suffix"</font><font color="#008000"></font><font color="#008000">value</font>=<font color="#dd0000">".jsp"</font><font color="#008000"> /＞</font><br /><font color="#a52a2a"> 9 </font><font color="#008000">＜/bean＞</font><br /><font color="#a52a2a">10 </font><br /><font color="#a52a2a">11 </font><font color="#008000">＜</font><font color="#008000">bean</font><font color="#008000"></font><font color="#008000">id</font>=<font color="#dd0000">"simpleUrlHandlerMapping"</font><font color="#008000"><br /></font><font color="#008000">class</font>=<font color="#dd0000">"org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"</font><font color="#008000">＞</font><br /><font color="#a52a2a">12 </font><font color="#008000">＜</font><font color="#008000">property</font><font color="#008000"></font><font color="#008000">name</font>=<font color="#dd0000">"mappings"</font><font color="#008000">＞</font><br /><font color="#a52a2a">13 </font><font color="#008000">＜</font><font color="#008000">props</font><font color="#008000">＞</font><br /><font color="#a52a2a">14 </font><font color="#008000">＜</font><font color="#008000">prop</font><font color="#008000"></font><font color="#008000">key</font>=<font color="#dd0000">"/hello.do"</font><font color="#008000">＞</font>helloController<font color="#008000">＜/prop＞</font><br /><font color="#a52a2a">15 </font><font color="#008000">＜/props＞</font><br /><font color="#a52a2a">16 </font><font color="#008000">＜/property＞</font><br /><font color="#a52a2a">17 </font><font color="#008000">＜/bean＞</font><br /><font color="#a52a2a">18 </font><br /><font color="#a52a2a">19 </font><font color="#008000">＜</font><font color="#008000">bean</font><font color="#008000"></font><font color="#008000">id</font>=<font color="#dd0000">"helloController"</font><font color="#008000"></font><font color="#008000">class</font>=<font color="#dd0000">"com.ideawu.HelloController"</font><font color="#008000">＞</font><br /><font color="#a52a2a">20 </font><font color="#8080c0">＜!</font><font color="#8080c0">--</font><br /><font color="#a52a2a">21 </font><font color="#8080c0">        ＜property name="helloManager" ref="helloManager" /＞</font><br /><font color="#a52a2a">22 </font><font color="#8080c0">        --</font><font color="#8080c0">＞</font><br /><font color="#a52a2a">23 </font><font color="#008000">＜/bean＞</font><br /><font color="#a52a2a">24 </font><br /><font color="#a52a2a">25 </font><font color="#008000">＜/beans＞</font></pre><p>　　它配置了以下功能: </p><ul><li>配置 InternalResourceViewResolver， 它是 jsp 渲染模板的处理器. 如果你告诉 InternalResourceViewResolver 处理一个名为 hello 的模板时， 它会渲染 <strong>/WEB-INF/jsp/</strong>hello<strong>.jsp</strong> 文件. 把 jsp 文件放到 /WEB-INF/jsp/ 目录下是被鼓励的， 这样可以防止用户不经过 Controller 直接访问 jsp 文件从而出错(有些顽皮的人很喜欢这样做). 
</li><li>配置 SimpleUrlHandlerMapping， 在上面的配置文件中， /hello.do 的请求将被 helloController 处理. "/hello.do"和"helloController" 是变量， 你可以更改. 但是你注意到了吗， hello.do 以 .do 作为后缀名. 如果<strong>这里(本文的条件下)</strong>你 不使用.do 作为后缀名， 就没有程序来处理这个请求了. 因为 DispatcherServlet 将收到的请求转交给 SimpleUrlHandlerMapping， DispatcherServlet 收不到的请求， SimpleUrlHandlerMapping 当然也收不到了. 你可以在 props 标签内配置多个 prop 标签. 
</li><li>我们将在后面编写 com.ideawu.HelloController 类. </li></ul><p><br />上面， 我们在 web.xml 文件中告诉 ContextLoaderListener， 我们还有另外两个配置文件 /WEB-INF/database.xml 和 /WEB-INF/applicationContext.xml. </p><p></p><p><strong>　　applicationContext.xml:</strong></p><pre><font color="#a52a2a"> 1 </font><font color="#8080c0">＜?</font><font color="#008000">xml</font><font color="#008000"></font><font color="#008000">version</font>=<font color="#dd0000">"1.0"</font><font color="#008000"></font><font color="#008000">encoding</font>=<font color="#dd0000">"UTF-8"</font><font color="#8080c0">?＞</font><br /><font color="#a52a2a"> 2 </font><font color="#008000">＜!</font><font color="#008000">DOCTYPE</font> beans <font color="#008000">PUBLIC</font><font color="#dd0000">"-//SPRING//DTD BEAN//EN"</font><font color="#dd0000">"<br /><a href="http://www.springframework.org/dtd/spring-beans.dtd"><font color="#002c99">http://www.springframework.org/dtd/spring-beans.dtd</font></a>"</font><font color="#008000">＞</font><br /><font color="#a52a2a"> 3 </font><br /><font color="#a52a2a"> 4 </font><font color="#008000">＜</font><font color="#008000">beans</font><font color="#008000">＞</font><br /><font color="#a52a2a"> 5 </font><br /><font color="#a52a2a"> 6 </font><font color="#008000">＜</font><font color="#008000">bean</font><font color="#008000"></font><font color="#008000">id</font>=<font color="#dd0000">"propertyConfigurer"</font><font color="#008000"><br /></font><font color="#008000">class</font>=<font color="#dd0000">"org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"</font><font color="#008000">＞</font><br /><font color="#a52a2a"> 7 </font><font color="#008000">＜</font><font color="#008000">property</font><font color="#008000"></font><font color="#008000">name</font>=<font color="#dd0000">"locations"</font><font color="#008000">＞</font><br /><font color="#a52a2a"> 8 </font><font color="#008000">＜</font><font color="#008000">list</font><font color="#008000">＞</font><br /><font color="#a52a2a"> 9 </font><font color="#008000">＜</font><font color="#008000">value</font><font color="#008000">＞</font>/WEB-INF/jdbc.properties<font color="#008000">＜/value＞</font><br /><font color="#a52a2a">10 </font><font color="#008000">＜/list＞</font><br /><font color="#a52a2a">11 </font><font color="#008000">＜/property＞</font><br /><font color="#a52a2a">12 </font><font color="#008000">＜/bean＞</font><br /><font color="#a52a2a">13 </font><br /><font color="#a52a2a">14 </font><font color="#008000">＜/beans＞</font></pre><p>　　它配置了以下功能: </p><ul><li>读取 /WEB-INF/jdbc.properties 文件. 你可以在 list 标签中配置多个 value 标签. </li></ul><p><strong>　　database.xml:</strong></p><pre><font color="#a52a2a"> 1 </font><font color="#8080c0">＜?</font><font color="#008000">xml</font><font color="#008000"></font><font color="#008000">version</font>=<font color="#dd0000">"1.0"</font><font color="#008000"></font><font color="#008000">encoding</font>=<font color="#dd0000">"UTF-8"</font><font color="#8080c0">?＞</font><br /><font color="#a52a2a"> 2 </font><font color="#008000">＜!</font><font color="#008000">DOCTYPE</font> beans <font color="#008000">PUBLIC</font><font color="#dd0000">"-//SPRING//DTD BEAN//EN"</font><font color="#dd0000">"<br /><a href="http://www.springframework.org/dtd/spring-beans.dtd"><font color="#002c99">http://www.springframework.org/dtd/spring-beans.dtd</font></a>"</font><font color="#008000">＞</font><br /><font color="#a52a2a"> 3 </font><br /><font color="#a52a2a"> 4 </font><font color="#008000">＜</font><font color="#008000">beans</font><font color="#008000">＞</font><br /><font color="#a52a2a"> 5 </font><br /><font color="#a52a2a"> 6 </font><font color="#8080c0">＜!</font><font color="#8080c0">-- Remove this if your database setting is fine.</font><br /><font color="#a52a2a"> 7 </font><font color="#8080c0">    ＜bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"＞</font><br /><font color="#a52a2a"> 8 </font><font color="#8080c0">        ＜property name="driverClassName" value="${jdbc.driverClassName}"/＞</font><br /><font color="#a52a2a"> 9 </font><font color="#8080c0">        ＜property name="url" value="${jdbc.url}"/＞</font><br /><font color="#a52a2a">10 </font><font color="#8080c0">        ＜property name="username" value="${jdbc.username}"/＞</font><br /><font color="#a52a2a">11 </font><font color="#8080c0">        ＜property name="password" value="${jdbc.password}"/＞</font><br /><font color="#a52a2a">12 </font><font color="#8080c0">    ＜/bean＞</font><br /><font color="#a52a2a">13 </font><font color="#8080c0">    --</font><font color="#8080c0">＞</font><br /><font color="#a52a2a">14 </font><br /><font color="#a52a2a">15 </font><font color="#8080c0">＜!</font><font color="#8080c0">-- Transaction manager for a single JDBC DataSource</font><br /><font color="#a52a2a">16 </font><font color="#8080c0">    ＜bean id="transactionManager" <br />　　　　　　　class="org.springframework.jdbc.datasource.DataSourceTransactionManager"＞</font><br /><font color="#a52a2a">17 </font><font color="#8080c0">        ＜property name="dataSource" ref="dataSource"/＞</font><br /><font color="#a52a2a">18 </font><font color="#8080c0">    ＜/bean＞</font><br /><font color="#a52a2a">19 </font><font color="#8080c0">    --</font><font color="#8080c0">＞</font><br /><font color="#a52a2a">20 </font><br /><font color="#a52a2a">21 </font><font color="#8080c0">＜!</font><font color="#8080c0">--</font><br /><font color="#a52a2a">22 </font><font color="#8080c0">    ＜bean id="attributeManager" class="com.ideawu.core.AttributeManager"＞</font><br /><font color="#a52a2a">23 </font><font color="#8080c0">        ＜property name="dataSource" ref="dataSource"/＞</font><br /><font color="#a52a2a">24 </font><font color="#8080c0">    ＜/bean＞</font><br /><font color="#a52a2a">25 </font><font color="#8080c0">    --</font><font color="#8080c0">＞</font><br /><font color="#a52a2a">26 </font><br /><font color="#a52a2a">27 </font><font color="#008000">＜/beans＞</font></pre><p>　　它配置了以下功能(不过，已经注释掉了): </p><ul><li>配置数据库连接. 类似${jbbc.url}是一种访问变量的方法. 我们可以从 /WEB-INF/jdbc.properties 中找到这个变量的值. 如果你的数据库已经配置好， 就将第一个注释去掉. </li></ul><p><strong>　　jdbc.properties:</strong></p><pre><font color="#a52a2a">1 </font><span class="Identifier">jdbc.driverClassName</span><span class="jpropertiesDelimiter">=</span><span class="Constant">com.mysql.jdbc.Driver</span><br /><font color="#a52a2a">2 </font><span class="Identifier">jdbc.url</span><span class="jpropertiesDelimiter">=</span><span class="Constant">jdbc:mysql://localhost/test?useUnicode=true&amp;characterEncoding=UTF-8</span><br /><font color="#a52a2a">3 </font><span class="Identifier">jdbc.username</span><span class="jpropertiesDelimiter">=</span><span class="Constant">test</span><br /><font color="#a52a2a">4 </font><span class="Identifier">jdbc.password</span><span class="jpropertiesDelimiter">=</span><span class="Constant">12345</span></pre><p><strong>　　现在， 我们来编写 Java 代码吧.</strong></p><pre><font color="#a52a2a"> 1 </font><font color="#8080c0">/**</font><font color="#ff1493">*********************************************************</font><br /><font color="#a52a2a"> 2 </font><font color="#8080c0">*</font><font color="#ff1493"> Date: 2006-8-26</font><br /><font color="#a52a2a"> 3 </font><font color="#8080c0">*</font><font color="#ff1493"> File: HelloController.java</font><br /><font color="#a52a2a"> 4 </font><font color="#8080c0">*</font><font color="#ff1493"> Author: ideawu</font><br /><font color="#a52a2a"> 5 </font><font color="#8080c0">*</font><font color="#ff1493">*********************************************************</font><font color="#8080c0">*/</font><br /><font color="#a52a2a"> 6 </font><br /><font color="#a52a2a"> 7 </font><font color="#cd00cd">package</font> com.ideawu;<br /><font color="#a52a2a"> 8 </font><br /><font color="#a52a2a"> 9 </font><font color="#cd00cd">import</font> org.springframework.web.servlet.mvc.Controller;<br /><font color="#a52a2a">10 </font><font color="#cd00cd">import</font> org.springframework.web.servlet.ModelAndView;<br /><font color="#a52a2a">11 </font><br /><font color="#a52a2a">12 </font><font color="#cd00cd">import</font> javax.servlet.http.HttpServletRequest;<br /><font color="#a52a2a">13 </font><font color="#cd00cd">import</font> javax.servlet.http.HttpServletResponse;<br /><font color="#a52a2a">14 </font><br /><font color="#a52a2a">15 </font><font color="#8080c0">/**</font><br /><font color="#a52a2a">16 </font><font color="#8080c0"></font><font color="#8080c0">* </font><font color="#ff1493">@author</font><font color="#8080c0"> ideawu</font><br /><font color="#a52a2a">17 </font><font color="#8080c0"> *</font><br /><font color="#a52a2a">18 </font><font color="#8080c0"> */</font><br /><font color="#a52a2a">19 </font><font color="#008000">public</font><font color="#008000">class</font> HelloController <font color="#008000">implements</font> Controller {<br /><font color="#a52a2a">20 </font><font color="#8080c0">/*  </font><br /><font color="#a52a2a">21 </font><font color="#8080c0">    private HelloManager helloManager;</font><br /><font color="#a52a2a">22 </font><br /><font color="#a52a2a">23 </font><font color="#8080c0">    public void setHelloManager(HelloManager helloManager) {</font><br /><font color="#a52a2a">24 </font><font color="#8080c0">        this.helloManager = helloManager;</font><br /><font color="#a52a2a">25 </font><font color="#8080c0">    }</font><br /><font color="#a52a2a">26 </font><font color="#8080c0">*/</font><br /><font color="#a52a2a">27 </font><br /><font color="#a52a2a">28 </font><font color="#008000">public</font> ModelAndView handleRequest(HttpServletRequest request，<br /><font color="#a52a2a">29 </font>            HttpServletResponse response)<font color="#008000">throws</font> Exception{<br /><font color="#a52a2a">30 </font><br /><font color="#a52a2a">31 </font>        request.setAttribute(<font color="#dd0000">"hello_1"</font>， <font color="#dd0000">"你好啊， Spring!"</font>);<br /><font color="#a52a2a">32 </font>        request.setAttribute(<font color="#dd0000">"hello_2"</font>， <font color="#dd0000">"Hello World!"</font>);<br /><font color="#a52a2a">33 </font><br /><font color="#a52a2a">34 </font><font color="#008000">return</font><font color="#008000">new</font> ModelAndView(<font color="#dd0000">"hello"</font>);<br /><font color="#a52a2a">35 </font>    }<br /><font color="#a52a2a">36 </font><br /><font color="#a52a2a">37 </font>}<br /></pre><p>　　return new ModelAndView("hello"); 告诉 InternalResourceViewResolver jsp 模板的名字叫作 hello. request.setAttribute() 设置的对象我们可以在 jsp 文件中使用. </p><p><strong>　　hello.jsp:</strong></p><pre><font color="#a52a2a"> 1 </font><font color="#008000">＜%@ </font><font color="#008000">page</font><font color="#008000"></font><font color="#008000">contentType</font><font color="#008000">=</font><font color="#dd0000">"text/html; charset=UTF-8"</font><font color="#008000"> %＞</font><br /><font color="#a52a2a"> 2 </font><font color="#008000">＜%@ </font><font color="#008000">taglib</font><font color="#008000"></font><font color="#008000">prefix</font><font color="#008000">=</font><font color="#dd0000">"c"</font><font color="#008000"></font><font color="#008000">uri</font><font color="#008000">=</font><font color="#dd0000">"<a href="http://java.sun.com/jsp/jstl/core"><font color="#002c99">http://java.sun.com/jsp/jstl/core</font></a>"</font><font color="#008000"> %＞</font><br /><font color="#a52a2a"> 3 </font><font color="#008000">＜!DOCTYPE html PUBLIC </font><font color="#dd0000">"-//W3C//DTD XHTML 1.0 Transitional//EN"</font><font color="#008000"></font><font color="#dd0000">"<br />　　　　<a href="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><font color="#002c99">http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd</font></a>"</font><font color="#008000">＞</font><br /><font color="#a52a2a"> 4 </font><font color="#008000">＜</font><font color="#008000">html</font><font color="#008000"> xmlns=</font><font color="#dd0000">"<a href="http://www.w3.org/1999/xhtml"><font color="#002c99">http://www.w3.org/1999/xhtml</font></a>"</font><font color="#008000">＞</font><br /><font color="#a52a2a"> 5 </font><font color="#008000">＜</font><font color="#008000">head</font><font color="#008000">＞</font><br /><font color="#a52a2a"> 6 </font><font color="#008000">＜</font><font color="#008000">meta</font><font color="#008000"></font><font color="#008000">http-equiv</font><font color="#008000">=</font><font color="#dd0000">"Content-Type"</font><font color="#008000"></font><font color="#008000">content</font><font color="#008000">=</font><font color="#dd0000">"text/html; charset=utf-8"</font><font color="#008000"> /＞</font><br /><font color="#a52a2a"> 7 </font><font color="#008000">＜</font><font color="#008000">title</font><font color="#008000">＞</font>Hello World!<font color="#008000">＜/</font><font color="#008000">title</font><font color="#008000">＞</font><br /><font color="#a52a2a"> 8 </font><font color="#008000">＜/</font><font color="#008000">head</font><font color="#008000">＞</font><br /><font color="#a52a2a"> 9 </font><font color="#008000">＜</font><font color="#008000">body</font><font color="#008000">＞</font><br /><font color="#a52a2a">10 </font><br /><font color="#a52a2a">11 </font><font color="#008000">＜</font><font color="#008000">h2</font><font color="#008000">＞</font>${hello_1}<font color="#008000">＜/</font><font color="#008000">h2</font><font color="#008000">＞</font><br /><font color="#a52a2a">12 </font><br /><font color="#a52a2a">13 </font><font color="#008000">＜</font><font color="#008000">h2</font><font color="#008000">＞</font>${hello_2}<font color="#008000">＜/</font><font color="#008000">h2</font><font color="#008000">＞</font><br /><font color="#a52a2a">14 </font><br /><font color="#a52a2a">15 </font><font color="#008000">＜/</font><font color="#008000">body</font><font color="#008000">＞</font><br /><font color="#a52a2a">16 </font><font color="#008000">＜/</font><font color="#008000">html</font><font color="#008000">＞</font></pre><p>　　你可以下载整个 Web 应用程序. 在 Debian Linux， Tomcat 5.5.16， JDK1.5.0 下运行良好. 解压后得到一个 spring 文件夹， 放到你的 webapps 目录下， 在浏览器中输入 http://localhost:8080/spring/hello.do 就可以访问了。</p><img src ="http://www.blogjava.net/liaojiyong/aggbug/107416.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-03-30 09:51 <a href="http://www.blogjava.net/liaojiyong/archive/2007/03/30/107416.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring+Hibernate+Struts技术的一个分页程序(转)</title><link>http://www.blogjava.net/liaojiyong/archive/2007/03/30/107408.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Fri, 30 Mar 2007 01:43:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/03/30/107408.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/107408.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/03/30/107408.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/107408.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/107408.html</trackback:ping><description><![CDATA[
		<p>
				<span class="postbody">我用的是<span style="FONT-WEIGHT: bold">Spring+Hibernate+Struts</span>框架： <br /><br /><span style="FONT-WEIGHT: bold">这是我的DAO的核心代码</span><br />import org.springframework.orm.hibernate.support.HibernateDaoSupport; <br />// 用Spring支持的Hibernate方法，使Hibernate对数据库的操作继续瘦身 <br />public List getOfficeBySearchCriteria(final String hsql,final int pageNo,final int page_size) throws DataAccessException // hsql 是如："select office1 from Office as office1 order by office1.officename"；pageNo 是第几页；page_size是每页记录数 <br />{ <br />String sql; <br />int total_count=0; <br />List offices=new ArrayList(); <br />//offices= getHibernateTemplate().find("from Office office1 where office1.officename like ?", "%"+officeName+"%"); <br /><span style="FONT-WEIGHT: bold">offices= getHibernateTemplate().find(hsql); </span>//为了得到总记录数 <br />total_count=offices.size(); <br />crossPageInfo= crossPageBean.getCrossPageInfo(total_count,pageNo,page_size); <br /><br />sql=hsql+ " limit " + (pageNo-1)*page_size + "," +page_size; <br /><span style="FONT-WEIGHT: bold">offices= getHibernateTemplate().find(sql); </span>//为了得到页记录信息 System.out.println("The list offices size: "+offices.size()); <br />return offices; <br />} <br /><br />//其中crossPageBean.getCrossPageInfo只是得到页面的如：总页数、供多少页的信息等一般的翻页信息； <br /><br /><span style="FONT-WEIGHT: bold">我在Action中是这样调用的</span>： <br />public ActionForward execute( <br />ActionMapping mapping, <br />ActionForm form, <br />HttpServletRequest request, <br />HttpServletResponse response) <br />throws Exception <br />{ <br />CrossPageInfo crossPageInfo=new CrossPageInfo(); <br />String hsql="select office1 from Office office1 order by office1.officename"; <br />String pageNo=request.getParameter("pageNo"); <br />int pageNoi=1; <br />if(pageNo==null) <br />pageNo="1"; <br />pageNoi=Integer.parseInt(pageNo); <br />int pageSize=5; <br />//List offices=getOfficeService().getAllOffice(); <br />List offices=getOfficeService().getOfficeBySearchCriteria(hsql,pageNoi,pageSize); <br />crossPageInfo=getOfficeService().getCrossPageInfo(); <br />System.out.println("The CorssPgaeInfo :"+crossPageInfo.getPageNo()); <br />System.out.println(crossPageInfo.getPageSize()); <br /><br />request.setAttribute("offices",offices); <br />request.setAttribute("pageInfo",crossPageInfo); <br />return mapping.findForward("success"); <br />//throw new UnsupportedOperationException("Generated method 'execute(...)' not implemented."); <br />} <br /><br />//其中getOfficeService()只是提供接口服务的方法。 <br /><br /><br /><span style="FONT-WEIGHT: bold">我的表现页面是这样的</span>： <br /><br />&lt;%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %&gt; <br />&lt;%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %&gt; <br />&lt;%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %&gt; <br />&lt;%@ taglib uri="/WEB-INF/struts-template.tld" prefix="template" %&gt; <br />&lt;%@ page import="com.uplus.util.CrossPageInfo"%&gt; <br /><br />&lt;html&gt; <br />&lt;head&gt; <br />&lt;title&gt; <br />mySearchCList <br />&lt;/title&gt; <br /><br />&lt;/head&gt; <br />&lt;body bgcolor="#ffffff"&gt; <br />&lt;form name="form1" action="officesearch.do" method="post"&gt; <br />&lt;table &gt; <br />&lt;tr&gt; <br />&lt;td&gt;OfficeName:&lt;input name="officeName" type="text"&gt;&lt;/td&gt;&lt;td&gt;&lt;input type="submit" name="sb" value="Search"&gt;&lt;/td&gt; <br />&lt;/tr&gt; <br />&lt;/table&gt; <br />&lt;/form&gt; <br />&lt;br&gt;&lt;a href="/jsp/office/officeadd.jsp"&gt;Add&lt;/a&gt; <br /><br />&lt;table bgcolor="#DBE9F1" align="center" class="InputFrameMain" style="MARGIN: 0px" cellSpacing="1" cellPadding="0" BGALIGN="CENTER" BGVALIGn="middle" width="100%" VALIGN="middle" &gt; <br />&lt;tr&gt;&lt;td align="center"&gt;OfficeName&lt;/td&gt;&lt;td align="center"&gt;OfficePhone&lt;/td&gt;&lt;/tr&gt; <br />&lt;logic:iterate id="office" name="offices" &gt; <br />&lt;tr bgcolor="#ffffff"&gt; <br />&lt;td align="center"&gt;&lt;a href="officesee.do?id=&lt;bean:write name='office' property='id'/&gt;" target="_blank"&gt;&lt;bean:write name="office" property="officename"/&gt;&lt;/a&gt;&lt;/td&gt; <br />&lt;td align="center"&gt;&lt;bean:write name="office" property="officephone"/&gt;&lt;/td&gt; <br />&lt;td align="center"&gt;&lt;a href="officeedit.do?id=&lt;bean:write name='office' property='id'/&gt;" &gt;Update &lt;/a&gt; <br />&lt;td align="center"&gt;&lt;a href="officedel.do?id=&lt;bean:write name='office' property='id'/&gt;" onclick="return confirm('Would You Detele It? ')" &gt;Delete &lt;/a&gt; <br />&lt;/tr&gt; <br />&lt;/logic:iterate&gt; <br />&lt;/table&gt; <br />&lt;%CrossPageInfo cpInfo=(CrossPageInfo)request.getAttribute("pageInfo");%&gt; <br /><br />&lt;table width="100%" align="center" class="InputFrameMain" style="MARGIN: 0px" cellPadding="0" cellSpacing="0"&gt; <br />&lt;tr &gt;&lt;form action="officelist.do" method="post" onsubmit='return checkform2(this)'&gt; <br />&lt;td width=70%&gt;Total &lt;font color="blue"&gt;&lt;%=cpInfo.getTotalRow()%&gt;&lt;/font&gt;&amp;items found,Total&amp;&lt;font color="blue"&gt;&lt;%=cpInfo.getTotalPage()%&gt;&lt;/font&gt; Pages,Current No &lt;font color="blue"&gt;&lt;%=cpInfo.getPageNo()%&gt; &lt;/font&gt;Page. <br />Go to &lt;input name="pageNo" type="text" size="5" class="input"&gt;Page <br />&lt;input name="sb2" type="submit" class="button" value="Go"&gt; <br />&lt;/td&gt;&lt;/form&gt; <br />&lt;td width=30% align='left'&gt; <br />&lt;%if(cpInfo.getPageNo()&gt;1){%&gt; <br />&amp;&lt;a href="officelist.do?pageNo=1"&gt; <br />&lt;%}%&gt;First&lt;/a&gt; <br />&lt;%if(cpInfo.getPageNo()&gt;1){ %&gt; <br />&amp;&lt;a href="officelist.do?pageNo=&lt;%=cpInfo.getPageNo()-1%&gt;"&gt; <br />&lt;%}%&gt;Previous&lt;/a&gt; <br />&lt;%if(cpInfo.getPageNo()&lt;cpInfo.getTotalPage()){ %&gt; <br />&amp;&lt;a href="officelist.do?pageNo=&lt;%=cpInfo.getPageNo()+1%&gt;"&gt; <br />&lt;%}%&gt;Next&lt;/a&gt; <br />&lt;%if(cpInfo.getTotalPage()&gt;cpInfo.getPageNo()){%&gt; <br />&amp;&lt;a href="officelist.do?pageNo=&lt;%=cpInfo.getTotalPage()%&gt;"&gt; <br />&lt;%}%&gt;Last&lt;/a&gt;&lt;/td&gt; <br />&lt;/tr&gt; <br /><br />&lt;/table&gt; <br />&lt;/body&gt; <br />&lt;/html&gt; <br /><br /><br />大家可以看一下我的处理过程，<span style="FONT-WEIGHT: bold">其中在DAO里为了得到总计录数执行了一次次数据表查询HSQL；得到数据又执行了一次HSQL</span>，我觉得这样好像有些不太好，大家觉得怎样？大家提出宝贵的意见吧！</span>
				<span class="postbody">
				</span>
				<span class="gensmall">
						<br />
				</span>
		</p>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/107408.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-03-30 09:43 <a href="http://www.blogjava.net/liaojiyong/archive/2007/03/30/107408.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>反向控制和面向切面编程在Spring的应用(转)</title><link>http://www.blogjava.net/liaojiyong/archive/2007/03/30/107404.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Fri, 30 Mar 2007 01:31:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/03/30/107404.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/107404.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/03/30/107404.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/107404.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/107404.html</trackback:ping><description><![CDATA[针对传统的J2EE架构方案常常无法让人满意：程序过于复杂，难以测试和维护成本高。根据企业实际需求，本文探讨了一种轻量级的J2EE应用框架Spring ，它用更加轻量、更加灵活的基础设施取代了EJB。在此对Spring背后的反向控制原理和面向切面编程技术进行了比较深入研究，并与传统实现进行对比，显示了这种框架具有大大降低开发成本，可测试等优点。<br /><br /><strong>　　关键词</strong> Spring；反向控制；面向切面编程；POJO；依赖注入<br /><br clear="all" />　　<b>引言</b><br /><br />　　在J2EE的整个发展历程中，现在正是一个非常时刻。从很多方面来说，J2EE都是一个伟大的成功：它成功地在从前没有标准的地方建立了标准；大大提升了企业级软件的开放程度，并且得到了整个行业和开发者的广泛认可。然而，J2EE在一些方面已经开始捉襟见肘。J2EE应用开发的成本通常很高。J2EE应用项目至少和从前的非J2EE项目一样容易失败——如果不是更容易失败的话。这样的失败率高得让人难以接受。在这样的失败率之下，软件开发几乎变成了碰运气。而在J2EE遭遇失败的场景中，EJB通常都扮演着重要的角色。因此，J2EE社群不断地向着更简单的解决方案、更少使用EJB的方向发展<sup>[1]</sup>。然而，每个应用程序都需要一些基础设施，拒绝使用EJB并不意味着拒绝EJB所采用的基础设施解决方案。那么，如何利用现有的框架来提供这些基础设施服务呢，伴随着这个问题的提出，一个轻量级的J2EE解决方案出现了，这就是Spring Framework。<br /><br />　　Spring是为简化企业级系统开发而诞生的，Spring框架为J2EE应用常见的问题提供了简单、有效的解决方案，使用Spring，你可以用简单的POJO(Plain Old Java Object)来实现那些以前只有EJB才能实现的功能。这样不只是能简化服务器端开发，任何Java系统开发都能从Spring的简单、可测试和松耦合特征中受益。可以简单的说，Spring是一个轻量级的反向控制（IoC）和面向切面编程（AOP）容器框架<sup>[3]</sup>。Spring IoC，借助于依赖注入设计模式，使得开发者不用理会对象自身的生命周期及其关系，而且能够改善开发者对J2EE模式的使用；Spring AOP，借助于Spring实现的拦截器，开发者能够实现以声明的方式使用企业级服务，比如安全性服务、事务服务等。Spring IoC和 Spring ; AOP组合，一起形成了Spring，这样一个有机整体，使得构建轻量级的J2EE架构成为可能，而且事实证明，非常有效。没有Spring IoC的Spring AOP是不完善的，没有Spring AOP的Spring IoC是不健壮的。本文是以Spring架构的成功的实际商务系统项目为背景，阐述了反向控制原理和面向切面的编程技术在Spring框架中的应用，同时抽取适量代码示意具体应用，并和传统开发模式进行对比，展示了Spring framework的简单，高效，可维护等优点。<br /><br />　　<b>1、Spring IoC 1.1 反向控制原理 </b><br /><br />　　反向控制是Spring框架的核心。但是，反向控制是什么意思？到底控制的什么方面被反向了呢？2004年美国专家Martin Fowler发表了一篇论文《Inversion of Control Containers and the Dependency Injection pattern》阐述了这个问题，他总结说是获得依赖对象的方式反向了，根据这个启示，他还为反向控制提出了一个更贴切的名字：Dependency Injection(DI 依赖注入)。<br /><br />　　通常，应用代码需要告知容器或框架,让它们找到自身所需要的类,然后再由应用代码创建待使用的对象实例。因此，应用代码在使用实例之前，需要创建对象实例。然而，IoC模式中,创建对象实例的任务交给IoC容器或框架(实现了IoC设计模式的框架也被称为IoC容器)，使得应用代码只需要直接使用实例，这就是IoC。相对IoC 而言，“依赖注入”的确更加准确的描述了这种设计理念。所谓依赖注入，即组件之间的依赖关系由容器在运行期决定，形象的来说，即由容器动态的将某种依赖关系注入到组件之中。<br /><br />　　1.2 IoC在Spring中的实现 <br /><br />　　任何重要的系统都需要至少两个相互合作的类来完成业务逻辑。通常，每个对象都要自己负责得到它的合作（依赖）对象。你会发现，这样会导致代码耦合度高而且难于测试。使用IoC，对象的依赖都是在对象创建时由负责协调系统中各个对象的外部实体提供的，这样使软件组件松散连接成为可能。下面示意了Spring IoC 应用，步骤如下：<br /><br />　　（1）定义Action接口，并为其定义一个execute方法，以完成目标逻辑。多年前，GoF在《Design Pattern：Elements of Reusable Object-Oriented Software》一书中提出“Programming to an Interface，not an implementation”的原则，这里首先将业务对象抽象成接口，正是为了实施这个原则。<br /><br />　　（2）类UpperAction实现Action接口，在此类中，定义一个String型的域message，并提供相应的setter和getter方法，实现的execute方法如下：<br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e7e9e9" border="1"><tbody><tr><td>public String execute (String str) {<br />　return (getMessage () + str).toUpperCase () ;<br />}</td></tr></tbody></table><br />　　（3）编写Spring配置文件（bean.xml）<br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e7e9e9" border="1"><tbody><tr><td>＜beans＞<br />＜bean id="TheAction" class="net.chen.spring.qs.UpperAction"＞<br />＜property name="message"＞<br />＜value＞HeLLo＜/value＞<br />＜/property＞<br />＜/bean＞<br />＜/beans＞</td></tr></tbody></table><br />　　（4）测试代码<br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e7e9e9" border="1"><tbody><tr><td>public void testQuickStart () {<br />　ApplicationContext ctx=new<br />　FileSystemXmlApplicationContext ("bean.xml");<br />　Action a= (Action) ctx.getBean ("TheAction");<br />　System.out.println (a. execute ("Rod Johnson"));<br />}</td></tr></tbody></table><br />　　上面的测试代码中，我们根据"bean.xml"创建了一个ApplicationContext实例，并从此实例中获取我们所需的Action实现，运行测试代码，我们看到控制台输出：<br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e7e9e9" border="1"><tbody><tr><td>……<br />HELLO ROD JOHNSON</td></tr></tbody></table><br />　　仔细观察一下上面的代码，可以看到：<br /><br />　　（1）我们的组件并不需要实现框架指定的接口，因此可以轻松的将组件从Spring中脱离，甚至不需要任何修改，这在基于EJB框架实现的应用中是难以想象的。<br /><br />　　（2）组件间的依赖关系减少，极大改善了代码的可重用性。Spring的依赖注入机制，可以在运行期为组件配置所需资源，而无需在编写组件代码时就加以指定，从而在相当程度上降低了组件之间的耦合。<br /><br />　　Spring给我们带来了如此这般的好处，那么，反过来，让我们试想一下，如果不使用Spring框架，回到我们传统的编码模式，情况会是怎样呢？<br /><br />　　首先，我们必须编写一个配置文件读取类，以实现Message属性的可配置化。<br /><br />　　其次，得有一个Factory模式的实现，并结合配置文件的读写完成Action的动态加载。于是，我们实现了一个ActionFactory来实现这个功能：<br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e7e9e9" border="1"><tbody><tr><td>public class ActionFactory {<br />　public static Action getAction (String actionName) {Properties pro = new Properties ();<br />　try {<br />　　pro.load (new FileInputStream ("config.properties"));<br />　　String actionImplName =(String)pro.get(actionName);<br />　　String actionMessage =(String) pro.get (actionName+"_msg");<br />　　Object obj =Class.forName (actionImplName).newInstance ();<br />　　BeanUtils.setProperty(obj,"message",actionMessage);<br />　　return (Action) obj;<br />　} catch (FileNotFoundException e) {<br />　　……<br />　}<br />}</td></tr></tbody></table><br />　　配置文件则采用properties文件形式如下所示：<br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e7e9e9" border="1"><tbody><tr><td>TheAction=net.chen.spring.qs.UpperAction<br />TheAction_msg=HeLLo</td></tr></tbody></table><br />　　测试代码也作相应修改。现在不论实现的好坏，总之通过上面新增的多行代码，终于实现了类似的功能。如果现在有了一个新的需求，这样这个ActionFactory每次都新建一个类的实例，显然这对系统性能不利，考虑到我们的两个Action都是线程安全的，修改一下ActionFactory，保持系统中只有一个Action实例供其它线程调用。另外Action对象创建后，需要做一些初始化工作。修改一下ActionFactory，使其在创建Action实例之后，随即就调用Action.init方法执行初始化。Action的处理这样就差不多了。下面我们来看看另外一个Factory<br /><br />　　……<br /><br />　　往往这些系统开发中最常见的需求，会导致我们的代码迅速膨胀，而Spring IoC的出现，则大大缓解了这样的窘境。通过以上实例，可以看出，Spring IoC为我们提供了如下几方面的优势：<br /><br />　　（1）应用组件不需要在运行时寻找其协作者，因此更易于开发和编写应用；<br /><br />　　（2）由于借助于IoC容器管理组件的依赖关系，使得应用的单元测试和集成测试更利于展开；<br /><br />　　（3）通常，在借助于IoC容器关系业务对象的前提下，很少需要使用具体IoC容器提供的API，这使得集成现有的遗留应用成为可能。<br /><br />　　因此，通过使用IoC能够降低组件之间的耦合度，最终，能够提高类的重用性，利于测试，而且更利于整个产品或系统集成和配置。<img src ="http://www.blogjava.net/liaojiyong/aggbug/107404.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-03-30 09:31 <a href="http://www.blogjava.net/liaojiyong/archive/2007/03/30/107404.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring的事务管理2.0与1.2.8的区别(转)</title><link>http://www.blogjava.net/liaojiyong/archive/2007/03/30/107400.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Fri, 30 Mar 2007 01:24:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/03/30/107400.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/107400.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/03/30/107400.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/107400.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/107400.html</trackback:ping><description><![CDATA[
		<div class="postbody">
				<p>本文章比较了Spring自己带的JPetStore的例子，通过配置文件详细讲解了，Spring1.2.8与2.0如何实现声明式事务管理。</p>
				<p>
						<br />
						<font color="#ff0000" size="5">Spring1.2.8</font>
						<br />
				</p>
				<p>
						<br />Spring以前对一个事务拦截要通过代理实现下面的配置文件是从不同的文件中找来的，不是单独的一个Spring配置文件。</p>
				<p>
						<br /> &lt;!-- Transaction manager for a single JDBC DataSource --&gt;<br /> &lt;!-- 声明一个事务管理器 --&gt;<br /> &lt;bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"&gt;<br />  &lt;property name="dataSource" ref="dataSource"/&gt;<br /> &lt;/bean&gt;</p>
				<p>
						<br /> &lt;!-- 声明一个抽象Bean，这个Bean是不能实例化的，提供给其它需要AOP事务的Bean用，其它需要AOP事务的只要继承这个Bean就会被AOP接管--&gt;<br /> &lt;bean id="baseTransactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"<br />    abstract="true"&gt;<br />  &lt;property name="transactionManager" ref="transactionManager"/&gt;<br />  &lt;property name="transactionAttributes"&gt;<br />   &lt;props&gt;<br />    &lt;prop key="insert*"&gt;PROPAGATION_REQUIRED&lt;/prop&gt;<br />    &lt;prop key="update*"&gt;PROPAGATION_REQUIRED&lt;/prop&gt;<br />    &lt;prop key="*"&gt;PROPAGATION_REQUIRED,readOnly&lt;/prop&gt;<br />   &lt;/props&gt;<br />  &lt;/property&gt;<br /> &lt;/bean&gt;</p>
				<p> &lt;!-- 继承之前实现的抽象Bean，让这个Bean通过代理工厂生成，交给AOP托管。至于哪些方法被接管在控制Bean中已经配置了--&gt;<br /> &lt;bean id="petStore" parent="baseTransactionProxy"&gt;<br />  &lt;property name="target"&gt;<br />   &lt;bean class="org.springframework.samples.jpetstore.domain.logic.PetStoreImpl"&gt;<br />    &lt;property name="accountDao" ref="accountDao"/&gt;<br />    &lt;property name="categoryDao" ref="categoryDao"/&gt;<br />    &lt;property name="productDao" ref="productDao"/&gt;<br />    &lt;property name="itemDao" ref="itemDao"/&gt;<br />    &lt;property name="orderDao" ref="orderDao"/&gt;<br />   &lt;/bean&gt;<br />  &lt;/property&gt;<br />  &lt;!-- Uncomment the following in order to enable mail sending aspect --&gt;<br />  &lt;!--<br />  &lt;property name="postInterceptors"&gt;<br />   &lt;list&gt;<br />    &lt;ref bean="emailAdvisor"/&gt;<br />   &lt;/list&gt;<br />  &lt;/property&gt;<br />   --&gt;<br /> &lt;/bean&gt;</p>
				<p>
						<br />最早发表于 <a href="http://www.openj.cn/"><font color="#1d58d1">http://www.openj.cn</font></a></p>
				<p>
						<font color="#ff0000" size="5">Spring2.0</font> <br /><br /> 下面的配置与上面的配置完全对应</p>
				<p> &lt;!--这一个Bean的配置与之前完全一样，没有变化----&gt;<br /> &lt;bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"&gt;<br />  &lt;property name="dataSource" ref="dataSource"/&gt;<br /> &lt;/bean&gt;</p>
				<p> &lt;!--这一处与之前有了变化，在1.2.8版本中，此处的Bean被声明为由一个FactoryBean生成，而此处只是一个普通的Bean，要简单许多，透明性要好很多----&gt;<br /> &lt;bean id="petStore" class="org.springframework.samples.jpetstore.domain.logic.PetStoreImpl"&gt;<br />  &lt;property name="accountDao" ref="accountDao"/&gt;<br />  &lt;property name="categoryDao" ref="categoryDao"/&gt;<br />  &lt;property name="productDao" ref="productDao"/&gt;<br />  &lt;property name="itemDao" ref="itemDao"/&gt;<br />  &lt;property name="orderDao" ref="orderDao"/&gt;<br /> &lt;/bean&gt;</p>
				<p>
						<br /> &lt;!---下面的两处配置，才是整个事务AOP的核心，在1.2.8版本中，通过FactoryBean把事务对象（dataSource），与需要进行事务控制的对象PetStoreImpl串起来，对PetStoreImpl有侵入性-----&gt;<br /> &lt;!---而在之前的两处配置中，事务对象（dataSource）与，需要进行事务控制的对象PetStoreImpl没有什么关系，它们的关系全部体现在下面的两处配置中-----&gt;<br /> <br /> <br /> &lt;!---pointcut属性定义了哪此点需要去拦截，此处的配置的意思是所有的PetStoreFacade接口中的方法都要拦截，而拦截之后要如何处理则由advice-ref指定的Bean处理-----&gt;<br /> &lt;!---配置文件中各个属性的含义参考：<a href="http://www.redsaga.com/spring_ref/2.0/html/aop.html#aop-schema"><font color="#1d58d1">http://www.redsaga.com/spring_ref/2.0/html/aop.html#aop-schema</font></a> -----&gt;</p>
				<p> &lt;aop:config&gt;<br />  &lt;aop:advisor pointcut="execution(* *..PetStoreFacade.*(..))" advice-ref="txAdvice"/&gt; <br /> &lt;/aop:config&gt;</p>
				<p>
						<br /> <br /> &lt;!--下面的transaction-manager属性原配置中没有，如果缺少此配置，默认值就是“transactionManager”在此加上，让人看的更明白。--&gt;<br /> &lt;!-- 参考 <a href="http://blog.xmnow.cn/doc/cn/spring2.0-reference_final_zh_cn/ch09s05.html"><font color="#1d58d1">http://blog.xmnow.cn/doc/cn/spring2.0-reference_final_zh_cn/ch09s05.html</font></a> ---&gt;<br /> &lt;tx:advice id="txAdvice"  transaction-manager="transactionManager"&gt;<br />  &lt;tx:attributes&gt;<br />   &lt;tx:method name="insert*"/&gt;<br />   &lt;tx:method name="update*"/&gt;<br />   &lt;tx:method name="*" read-only="true"/&gt;<br />  &lt;/tx:attributes&gt;<br /> &lt;/tx:advice&gt;<br /></p>
		</div>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/107400.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-03-30 09:24 <a href="http://www.blogjava.net/liaojiyong/archive/2007/03/30/107400.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring2.0项目中的中文问题</title><link>http://www.blogjava.net/liaojiyong/archive/2007/01/11/93179.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Thu, 11 Jan 2007 07:10:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/01/11/93179.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/93179.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/01/11/93179.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/93179.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/93179.html</trackback:ping><description><![CDATA[Spring是一个非常优秀的开源项目，然而，跟其它任何优秀的系统产品一样，也存在着这样那样的问题，我们喜欢称为Bug。Spring中的Bug确实不少，今天为了充实“中文问题没商量”主题，举一个不算很重要，也比较简单理解的一个Bug示例。<br />　　这里提前申明，这个话题不是针对Spring项目，因此请“<a href="http://blog.csdn.net/easyjf/archive/2006/07/12/910060.aspx" target="_blank"><font color="#0000cc">春迷</font></a>”们自重、没事勿扰，文中不足之处欢迎大家批评指教。<br />　　我们知道，一个开源软件项目，给用户的单元测试最基本的要求是能全部通过测试，在Java中就是在运行单元测试的时候应该要看见一个绿条。Spring项目的单元测试写得非常好，也非常全面。然而，单元测试中却有一些问题，在中文路径上无法完全通过测试，必须放到英文路径下才能完全通过测试，因此，这属于一种“没商量”的中文问题。<br />　　<strong>单元测试：</strong><br />　　<strong>包：</strong>org.springframework.beans.factory.xml<br />　　<strong>类：</strong>XmlBeanFactoryTests<br />　　<strong>方法：</strong>testFileSystemResourceWithImport
<div>　　<strong>错误图示：</strong><br /> </div><p align="center"><img height="628" alt="" src="http://www.easyjf.com/upfile/20060819/11559978470071157793070.JPG" width="300" align="center" /></p><div><br /><strong>　　详细错误信息：</strong><br />org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from file [C:\Documents%20and%20Settings\Administrator\%e6%a1%8c%e9%9d%a2\spring\spring-framework-2.0-rc2\bin\org\springframework\beans\factory\xml\resource.xml]; nested exception is java.io.FileNotFoundException: C:\Documents%20and%20Settings\Administrator\%e6%a1%8c%e9%9d%a2\spring\spring-framework-2.0-rc2\bin\org\springframework\beans\factory\xml\resource.xml (系统找不到指定的路径。)<br />Caused by: java.io.FileNotFoundException: C:\Documents%20and%20Settings\Administrator\%e6%a1%8c%e9%9d%a2\spring\spring-framework-2.0-rc2\bin\org\springframework\beans\factory\xml\resource.xml (系统找不到指定的路径。)<br /> at java.io.FileInputStream.open(Native Method)<br /> at java.io.FileInputStream.&lt;init&gt;(FileInputStream.java:106)<br /> at org.springframework.core.io.FileSystemResource.getInputStream(FileSystemResource.java:85)<br /> at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:334)<br /> at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:315)<br /> at org.springframework.beans.factory.xml.XmlBeanFactory.&lt;init&gt;(XmlBeanFactory.java:73)<br /> at org.springframework.beans.factory.xml.XmlBeanFactory.&lt;init&gt;(XmlBeanFactory.java:61)<br /> at org.springframework.beans.factory.xml.XmlBeanFactoryTests.testFileSystemResourceWithImport(XmlBeanFactoryTests.java:946)<br /> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)<br /> at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)<br /> at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)<br /> at java.lang.reflect.Method.invoke(Method.java:585)<br /> at junit.framework.TestCase.runTest(TestCase.java:154)<br /> at junit.framework.TestCase.runBare(TestCase.java:127)<br /> at junit.framework.TestResult$1.protect(TestResult.java:106)<br /> at junit.framework.TestResult.runProtected(TestResult.java:124)<br /> at junit.framework.TestResult.run(TestResult.java:109)<br /> at junit.framework.TestCase.run(TestCase.java:118)<br /> at junit.framework.TestSuite.runTest(TestSuite.java:208)<br /> at junit.framework.TestSuite.run(TestSuite.java:203)<br /> at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:128)<br /> at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)<br /> at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)<br /> at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)<br /> at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)<br /> at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)</div><div><br />测试代码：<br />public void testFileSystemResourceWithImport() {<br />  String file = getClass().getResource("resource.xml").getFile();<br />  XmlBeanFactory xbf = new XmlBeanFactory(new FileSystemResource(file));<br />  // comes from "resourceImport.xml"<br />  ResourceTestBean resource1 = (ResourceTestBean) xbf.getBean("resource1");<br />  // comes from "resource.xml"<br />  ResourceTestBean resource2 = (ResourceTestBean) xbf.getBean("resource2");<br /> }</div><div> </div><div><strong>出错原因：<br /></strong>　　这个问题是笔者在参与开发EasyJWeb及EasyDBO框架中遇到过的问题，因此很容易就找到了问题的所在。Java的Class.getResource(name)返回的是一个URL，而URL.getFile默认情况下返回的是经过URL编码后的字符，会把中文等特殊字符变成类似%e6的形式。而一般io构造路径是没有自动解码功能的，所以在中文路径下要出现错误。</div><div> </div><div><strong>解决办法：</strong><br />　　在使用URL.getFile返回的路径时，使用前需要使用java.net.URLDecoder对路径进行一次解码操作。修改后的且能通过测试的方法如下：<br />public void testFileSystemResourceWithImport() {<br />  String file = getClass().getResource("resource.xml").getFile();<br />  try{<br />  file=java.net.URLDecoder.decode(file,"UTF-8");<br />  }<br />  catch(Exception e)<br />  {<br />   e.printStackTrace();<br />  } <br />  XmlBeanFactory xbf = new XmlBeanFactory(new FileSystemResource(file));<br />  // comes from "resourceImport.xml"<br />  ResourceTestBean resource1 = (ResourceTestBean) xbf.getBean("resource1");<br />  // comes from "resource.xml"<br />  ResourceTestBean resource2 = (ResourceTestBean) xbf.getBean("resource2");<br /> }</div><div> </div><div><strong>小结：<br /></strong>　　由于Spring开源项目的开发团队中，除了一些喜欢跟在Rod大叔的屁股后面唱中文版赞歌的“<a href="http://blog.csdn.net/easyjf/archive/2006/07/12/910060.aspx" target="_blank"><font color="#0000cc">春迷</font></a>”以外，当前似乎还没有中国人参与到正式的Spring开发小组中。因此，也许没有在中文路径下运行过测试用例，导致我这样的Spring初学者一不小心就遇上这样的问题。<br />　　问题是解决了，但是却是一种比较罕见的方式，而且Spring开发小组事先也许没有预想到或是故意忽略掉的问题，因此，可以称得上是“没商量”的中文问题。</div><img src ="http://www.blogjava.net/liaojiyong/aggbug/93179.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-01-11 15:10 <a href="http://www.blogjava.net/liaojiyong/archive/2007/01/11/93179.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring技巧之简洁配置(轉)</title><link>http://www.blogjava.net/liaojiyong/archive/2007/01/11/93171.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Thu, 11 Jan 2007 07:00:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/01/11/93171.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/93171.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/01/11/93171.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/93171.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/93171.html</trackback:ping><description><![CDATA[Spring2.0在配置上调整了不少地方，增加更加灵活、简洁的配置方式，本文通过两个简单的示例来演示。<br />      配置Apache的一个数据源连接池，在Spring 2.0以前的版本中，我们可以使用类似下面的配置：<br />&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"&gt;<br />&lt;beans&gt;<br />&lt;bean id="dataSource"<br />  class="org.apache.commons.dbcp.BasicDataSource"<br />  destroy-method="close"&gt;<br />  &lt;property name="driverClassName"&gt;<br />   &lt;value&gt;org.gjt.mm.mysql.Driver&lt;/value&gt;&lt;/property&gt;<br />  &lt;property name="url"&gt;<br />   &lt;value&gt;jdbc:mysql://127.0.0.1:3306/easyjf-bbs&lt;/value&gt; &lt;/property&gt;<br />  &lt;property name="username"&gt;&lt;value&gt;root&lt;/value&gt; &lt;/property&gt;<br />  &lt;property name="password"&gt;&lt;value&gt;mypass&lt;/value&gt;&lt;/property&gt;<br /> &lt;/bean&gt;<br />&lt;/beans&gt; <br />      在Spring2.0中，可以把&lt;value&gt;及&lt;ref&gt;两个标签作为其父级&lt;bean&gt;标签的一个属性来定义，这样使得配置文件更加简洁，如下所示：<br />&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"&gt;<br />&lt;beans&gt;<br />&lt;bean id="dataSource"<br />  class="org.apache.commons.dbcp.BasicDataSource"<br />  destroy-method="close"&gt;<br />  &lt;property name="driverClassName"<br />   value="org.gjt.mm.mysql.Driver" /&gt;<br />  &lt;property name="url"<br />   value="jdbc:mysql://127.0.0.1:3306/easyjf-bbs" /&gt;<br />  &lt;property name="username" value="root" /&gt;<br />  &lt;property name="password" value="mypass" /&gt;<br /> &lt;/bean&gt;<br />&lt;/beans&gt;<br /><br />      另外，Spring2.0中还有一个非常实用的解析器，SimplePropertyNamespaceHandle，若配置文件中引用http://www.springframework.org/schema/p命令空间，则将会使用SimplePropertyNamespaceHandle来处理这个Bean的定义，可以在Spring2.0中的Bean中以更简单的方式配置设值方法注入，如下所示：<br />&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />&lt;beans xmlns="http://www.springframework.org/schema/beans"<br /> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<br /> xmlns:p="http://www.springframework.org/schema/p"<br /> xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"&gt;<br /><br />&lt;bean id="dataSource"<br />  class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"<br />  p:driverClassName="org.gjt.mm.mysql.Driver"<br />  p:url="jdbc:mysql://127.0.0.1:3306/easyjf-bbs" p:username="root" p:password="mysql" /&gt;<br />&lt;/beans&gt;<br /><br />在上面的配置中，使用p:url则可以直接注入BasicDataSource的url属性值，可以使用p:url-ref属性来引用另外一个Bean。<br />    如，Spring2.0以前的一个DAO配置：<br />&lt;bean id="userDao" class="com.easyjf.bbs.dbo.springjdbc.UserDaoSpringJdbc"&gt;<br />       &lt;property name="dataSource"&gt;&lt;ref bean="dataSource"/&gt;&lt;/property&gt;<br />   &lt;/bean&gt;  <br />  使用简短属性方式，则改成如下：<br />&lt;bean id="userDao" class="com.easyjf.bbs.dbo.springjdbc.UserDaoSpringJdbc" p:dataSource-ref="dataSource" /&gt;<br /><br />Spring2.0比以前的版本配置更加灵活、简洁，如果手工书写配置，则比较实用。当然，老的配置方式有很多开发工具如MyEclipse等都能识别，不需要我们动手一点一点的录入配置文件，大多数工具对新的配置方式还不能识别，因此，请根据实际情况酌情使用。<br /><br />由于水平有限，文中不足之处欢迎广大Spring爱好者不吝指教，请“<a class="l2" href="http://blog.csdn.net/easyjf/archive/2006/07/12/910060.aspx" target="_blank">春迷</a>”勿拢! <img src ="http://www.blogjava.net/liaojiyong/aggbug/93171.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-01-11 15:00 <a href="http://www.blogjava.net/liaojiyong/archive/2007/01/11/93171.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring+hibernate 单元测试框架总结 （转）</title><link>http://www.blogjava.net/liaojiyong/archive/2006/09/01/67081.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Fri, 01 Sep 2006 05:43:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2006/09/01/67081.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/67081.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2006/09/01/67081.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/67081.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/67081.html</trackback:ping><description><![CDATA[
		<div class="postTitle"> </div>这两天的花费了一些时间在使用spring-mock进行spring的单元测试问题上，基本上对这个问题有了一个完整的解决方案<br />下面将对相关学习到和思考到的一些问题进行一下整理：<br />1、首先明确一下问题：要对什么进行单元测试？<br />我的问题是围绕这一个DAO展开，我定义了一个DAO接口XXXDAO,并且写了该DAO的实现XXXDAOImpl,然后使用spring对接口的实现进行管理：<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"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">bean </span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="XXXDAO"</span><span style="COLOR: #ff0000"> class</span><span style="COLOR: #0000ff">="com.easou.datastat.base.dao.impl.XXXDAOImpl"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="sessionFactory"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />      </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">ref </span><span style="COLOR: #ff0000">bean</span><span style="COLOR: #0000ff">="sessionFactory"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="hibernateTemplate"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />      </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">ref </span><span style="COLOR: #ff0000">bean</span><span style="COLOR: #0000ff">="hibernateTemplate"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">bean</span><span style="COLOR: #0000ff">&gt;</span></div><br />现在问题开始明确了，我要对XXXDAOImpl进行单元测试。这里需要指明一个问题就是单元测试，测试的是有实现代码的实现类，而不是接口。<br /><br />2、接着是下一个问题，如何取得Sping的上下文关系呢？<br />这里就需要用到spring-mock了，其中有一个测试基类是AbstractTransactionalDataSourceSpringContextTests<br />我让测试用例XXXDAOImplTestcase继承AbstractTransactionalDataSourceSpringContextTests,然后override其中的方法getConfigLocations()<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"><img id="Codehighlighter1_90_439_Open_Image" onclick="this.style.display='none'; Codehighlighter1_90_439_Open_Text.style.display='none'; Codehighlighter1_90_439_Closed_Image.style.display='inline'; Codehighlighter1_90_439_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_90_439_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_90_439_Closed_Text.style.display='none'; Codehighlighter1_90_439_Open_Image.style.display='inline'; Codehighlighter1_90_439_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> XXXDAOImplTestCase </span><span style="COLOR: #0000ff">extends</span><span style="COLOR: #000000"> AbstractTransactionalDataSourceSpringContextTests </span><span id="Codehighlighter1_90_439_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_90_439_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    @Override<br /><img id="Codehighlighter1_147_437_Open_Image" onclick="this.style.display='none'; Codehighlighter1_147_437_Open_Text.style.display='none'; Codehighlighter1_147_437_Closed_Image.style.display='inline'; Codehighlighter1_147_437_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_147_437_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_147_437_Closed_Text.style.display='none'; Codehighlighter1_147_437_Open_Image.style.display='inline'; Codehighlighter1_147_437_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">protected</span><span style="COLOR: #000000"> String[] getConfigLocations() </span><span id="Codehighlighter1_147_437_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id="Codehighlighter1_147_437_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> TODO get the spring context</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">        <br /><img id="Codehighlighter1_217_412_Open_Image" onclick="this.style.display='none'; Codehighlighter1_217_412_Open_Text.style.display='none'; Codehighlighter1_217_412_Closed_Image.style.display='inline'; Codehighlighter1_217_412_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_217_412_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_217_412_Closed_Text.style.display='none'; Codehighlighter1_217_412_Open_Image.style.display='inline'; Codehighlighter1_217_412_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        String[] config </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> String[]</span><span id="Codehighlighter1_217_412_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id="Codehighlighter1_217_412_Open_Text"><span style="COLOR: #000000">{</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">file:D:\\javawork\\workspace\\datastat\\docroot\\WEB-INF\\applicationContext.xml</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">file:D:\\javawork\\workspace\\datastat\\docroot\\WEB-INF\\applicationContext-base.xml</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> config;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div><br />不难看出，该方法是为了读入spring的上下文信息，这样的话这个测试用例就可以直接使用spirng中定义的bean了<br />但是这里需要注意一个问题*，就是文件路径的问题，这里为了能够清楚地说明文件的路径规则我引用了spring-mock官方的getConfigLocation方法说明<br />Subclasses must implement this method to return the locations of their config files. A plain path will be treated as class path location. E.g.: "org/springframework/whatever/foo.xml". Note however that you may prefix path locations with standard Spring resource prefixes. Therefore, a config location path prefixed with "classpath:" with behave the same as a plain path, but a config location such as "file:/some/path/path/location/appContext.xml" will be treated as a filesystem location.<br /><br />3 好了，该到最后一个问题了，取得Spirng上下问中定义的bean的实例来进行单元测试<br />这里有两种方法，一种是定义一个代测单元的对象，然后定义好get，set方法，AbstractTransactionalDataSourceSpringContextTests会自动根据Spring的上下文得到待测单元的具体实现。<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"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> ExQueryDAO exQqueryDAO;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    <br /><img id="Codehighlighter1_39_74_Open_Image" onclick="this.style.display='none'; Codehighlighter1_39_74_Open_Text.style.display='none'; Codehighlighter1_39_74_Closed_Image.style.display='inline'; Codehighlighter1_39_74_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_39_74_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_39_74_Closed_Text.style.display='none'; Codehighlighter1_39_74_Open_Image.style.display='inline'; Codehighlighter1_39_74_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />    </span><span id="Codehighlighter1_39_74_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/** */</span><span id="Codehighlighter1_39_74_Open_Text"><span style="COLOR: #008000">/**</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />     * </span><span style="COLOR: #808080">@return</span><span style="COLOR: #008000"> 返回 exQqueryDAO。<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />     </span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_112_137_Open_Image" onclick="this.style.display='none'; Codehighlighter1_112_137_Open_Text.style.display='none'; Codehighlighter1_112_137_Closed_Image.style.display='inline'; Codehighlighter1_112_137_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_112_137_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_112_137_Closed_Text.style.display='none'; Codehighlighter1_112_137_Open_Image.style.display='inline'; Codehighlighter1_112_137_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> ExQueryDAO getExQqueryDAO() </span><span id="Codehighlighter1_112_137_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id="Codehighlighter1_112_137_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> exQqueryDAO;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img id="Codehighlighter1_142_190_Open_Image" onclick="this.style.display='none'; Codehighlighter1_142_190_Open_Text.style.display='none'; Codehighlighter1_142_190_Closed_Image.style.display='inline'; Codehighlighter1_142_190_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_142_190_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_142_190_Closed_Text.style.display='none'; Codehighlighter1_142_190_Open_Image.style.display='inline'; Codehighlighter1_142_190_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />    </span><span id="Codehighlighter1_142_190_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/** */</span><span id="Codehighlighter1_142_190_Open_Text"><span style="COLOR: #008000">/**</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />     * </span><span style="COLOR: #808080">@param</span><span style="COLOR: #008000"> exQqueryDAO 要设置的 exQqueryDAO。<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />     </span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_244_281_Open_Image" onclick="this.style.display='none'; Codehighlighter1_244_281_Open_Text.style.display='none'; Codehighlighter1_244_281_Closed_Image.style.display='inline'; Codehighlighter1_244_281_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_244_281_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_244_281_Closed_Text.style.display='none'; Codehighlighter1_244_281_Open_Image.style.display='inline'; Codehighlighter1_244_281_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> setExQqueryDAO(ExQueryDAO exQqueryDAO) </span><span id="Codehighlighter1_244_281_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id="Codehighlighter1_244_281_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.exQqueryDAO </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> exQqueryDAO;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div><br />另外一种就是使用applicationContext.getBean("XXXDAO");的方法取得实例<br />XXXDAO xxxDAO = (XXXDAO)applicationContext.getBean("XXXDAO");<br /><br />接下来你就可以用这个bean的具体实现对相关方法进行unittest了<br /><br /><br /><br />这里补充一个问题就是单元测试的运行环境问题*，由于你可能在spring的配置文件中指定一些外部类所以你必须在junit的运行环境中指定使用到的classpath，下面是eclipse的junit配置classpath<br /><img height="639" alt="junit-classpath.JPG" src="http://www.blogjava.net/images/blogjava_net/rocket/8368/junit-classpath.JPG" width="885" border="0" /><br /><br /><br />最后我对整体的spring+hibernate的jsf框架进行了一下单元测试的框架总结，主要多了一个基本的BaseTestCase，用于统一读取applicationContext<br /><img height="785" alt="单元测试框架.jpg" src="http://www.blogjava.net/images/blogjava_net/rocket/单元测试框架.jpg" width="1052" border="0" /><br /><br />可以看到下面的pagebean和jsp页面以及相关的taglib的单元测试我还没有完成：），我将在今后几天继续研究相关的单元测试问题<br /><img src ="http://www.blogjava.net/liaojiyong/aggbug/67081.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2006-09-01 13:43 <a href="http://www.blogjava.net/liaojiyong/archive/2006/09/01/67081.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SpringMVC MultiActionController的使用-最简化教程（转）</title><link>http://www.blogjava.net/liaojiyong/archive/2006/09/01/67078.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Fri, 01 Sep 2006 05:41:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2006/09/01/67078.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/67078.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2006/09/01/67078.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/67078.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/67078.html</trackback:ping><description><![CDATA[Step 1：配置web.xml<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"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">&lt;?</span><span style="COLOR: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="COLOR: #0000ff">?&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">web-app&nbsp;</span><span style="COLOR: #ff0000">version</span><span style="COLOR: #0000ff">="2.4"</span><span style="COLOR: #ff0000">&nbsp;xmlns</span><span style="COLOR: #0000ff">="http://java.sun.com/xml/ns/j2ee"</span><span style="COLOR: #ff0000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;xmlns:xsi</span><span style="COLOR: #0000ff">="http://www.w3.org/2001/XMLSchema-instance"</span><span style="COLOR: #ff0000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;xsi:schemaLocation</span><span style="COLOR: #0000ff">="http://java.sun.com/xml/ns/j2ee&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">display-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">springapp</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">display-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">servlet</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">servlet-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">springMVC</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">servlet-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">servlet-class</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.springframework.web.servlet.DispatcherServlet<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">servlet-class</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">load-on-startup</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">1</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">load-on-startup</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">servlet</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">servlet-mapping</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">servlet-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">springMVC</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">servlet-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">url-pattern</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">/page/*</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">url-pattern</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">servlet-mapping</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">web-app</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span></div>
<font size=2>servlet-mapping定义所有以/page/开头的url请求都会被spring 的DispatcherServlet处理转发。默认情况下DispatcherServlet会读取&lt;servlet-name&gt;-servlet.xml文件的配置信息初始化，该文件中urlMapping的定义决定当前请求转发给哪个controller来处理。<br></font><br>Step2：<font size=2>定义/WEB-INF/springMVC-servlet.xml<br>&nbsp;
<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"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">&lt;?</span><span style="COLOR: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="COLOR: #0000ff">?&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;!</span><span style="COLOR: #ff00ff">DOCTYPE&nbsp;beans&nbsp;PUBLIC&nbsp;"-//SPRING//DTD&nbsp;BEAN//EN"&nbsp;"http://www.springframework.org/dtd/spring-beans.dtd"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">beans</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">&lt;!--</span><span style="COLOR: #008000">&nbsp;方法名解析器&nbsp;</span><span style="COLOR: #008000">--&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">bean&nbsp;</span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="InternalPathMethodNameResolver"</span><span style="COLOR: #ff0000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class</span><span style="COLOR: #0000ff">="org.springframework.web.servlet.mvc.multiaction.InternalPathMethodNameResolver"</span><span style="COLOR: #ff0000">&nbsp;</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">&lt;!--</span><span style="COLOR: #008000">&nbsp;视图解析器&nbsp;</span><span style="COLOR: #008000">--&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">bean&nbsp;</span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="viewResolver"</span><span style="COLOR: #ff0000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class</span><span style="COLOR: #0000ff">="org.springframework.web.servlet.view.InternalResourceViewResolver"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="viewClass"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">value</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">org.springframework.web.servlet.view.JstlView</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">value</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">bean</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">bean&nbsp;</span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="controller"</span><span style="COLOR: #ff0000">&nbsp;class</span><span style="COLOR: #0000ff">="com.controller.IndexController"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="methodNameResolver"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">ref&nbsp;</span><span style="COLOR: #ff0000">bean</span><span style="COLOR: #0000ff">="InternalPathMethodNameResolver"</span><span style="COLOR: #ff0000">&nbsp;</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">bean</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">bean&nbsp;</span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="urlMapping"</span><span style="COLOR: #ff0000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class</span><span style="COLOR: #0000ff">="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="mappings"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">props</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">prop&nbsp;</span><span style="COLOR: #ff0000">key</span><span style="COLOR: #0000ff">="/controller/*"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">controller</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">prop</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">props</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">bean</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">beans</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span></div>
<font color=#0000ff><font color=#000000>urlMapping定义</font>/controller/</font><font color=#000000>开头的url请求由名字为controller的控制器来处理，</font>因为是多动作处理器，所以要定义<font color=#0000ff><font color=#000000><font color=#0000ff>MethodNameResolver</font>来告诉springMVC应该调用controller的哪个方法，这里用的是<font color=#0000ff>InternalPathMethodNameResolver</font>，该方法名解释器会把整个URL中最后一个<font color=#0000ff>"/"</font>和最后一个<font color=#0000ff>"."</font>之间的部分作为要调用的方法名</font>。</font><br></font><br>Step3：<font size=2>定义controller类并继承MultiActionController&nbsp;<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"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">package</span><span style="COLOR: #000000">&nbsp;com.controller;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;java.io.IOException;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;java.util.HashMap;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;java.util.Map;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;javax.servlet.ServletException;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;javax.servlet.http.HttpServletRequest;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;javax.servlet.http.HttpServletResponse;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;org.springframework.web.servlet.ModelAndView;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;org.springframework.web.servlet.mvc.multiaction.MultiActionController;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img id=Codehighlighter1_426_940_Open_Image onclick="this.style.display='none'; Codehighlighter1_426_940_Open_Text.style.display='none'; Codehighlighter1_426_940_Closed_Image.style.display='inline'; Codehighlighter1_426_940_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_426_940_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_426_940_Closed_Text.style.display='none'; Codehighlighter1_426_940_Open_Image.style.display='inline'; Codehighlighter1_426_940_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;IndexController&nbsp;</span><span style="COLOR: #0000ff">extends</span><span style="COLOR: #000000">&nbsp;MultiActionController&nbsp;</span><span id=Codehighlighter1_426_940_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_426_940_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;ModelAndView&nbsp;method1(HttpServletRequest&nbsp;request,<br><img id=Codehighlighter1_557_682_Open_Image onclick="this.style.display='none'; Codehighlighter1_557_682_Open_Text.style.display='none'; Codehighlighter1_557_682_Closed_Image.style.display='inline'; Codehighlighter1_557_682_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_557_682_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_557_682_Closed_Text.style.display='none'; Codehighlighter1_557_682_Open_Image.style.display='inline'; Codehighlighter1_557_682_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpServletResponse&nbsp;respnose)&nbsp;</span><span style="COLOR: #0000ff">throws</span><span style="COLOR: #000000">&nbsp;ServletException,&nbsp;IOException&nbsp;</span><span id=Codehighlighter1_557_682_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_557_682_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Map&nbsp;model&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;HashMap();<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;model.put(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">message</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">你调用的是方法１</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;ModelAndView(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/index.jsp</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">model</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;model);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;ModelAndView&nbsp;method2(HttpServletRequest&nbsp;request,<br><img id=Codehighlighter1_813_938_Open_Image onclick="this.style.display='none'; Codehighlighter1_813_938_Open_Text.style.display='none'; Codehighlighter1_813_938_Closed_Image.style.display='inline'; Codehighlighter1_813_938_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_813_938_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_813_938_Closed_Text.style.display='none'; Codehighlighter1_813_938_Open_Image.style.display='inline'; Codehighlighter1_813_938_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpServletResponse&nbsp;respnose)&nbsp;</span><span style="COLOR: #0000ff">throws</span><span style="COLOR: #000000">&nbsp;ServletException,&nbsp;IOException&nbsp;</span><span id=Codehighlighter1_813_938_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_813_938_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Map&nbsp;model&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;HashMap();<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;model.put(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">message</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">你调用的是方法２</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;ModelAndView(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/index.jsp</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">model</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;model);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span></div>
</font><br><font size=2>通过配置文件，访问上面这个controller中某个方法的url即为：</font><a href="http://localhost:8080/page/controller/"><font size=2>localhost:8080/page/controller/</font></a><font size=2>方法名<br><br><br>Step4：/index.jsp<br></font>
<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"><font size=2><span style="COLOR: #000000; BACKGROUND-COLOR: #ffff00">&lt;%</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">@&nbsp;page&nbsp;language</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">=</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">java</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">&nbsp;pageEncoding</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">=</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">UTF-8</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span><span style="COLOR: #000000; BACKGROUND-COLOR: #ffff00">%&gt;</span></font><span style="COLOR: #000000"><br></span><font size=2><span style="COLOR: #000000; BACKGROUND-COLOR: #ffff00">&lt;%</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">@&nbsp;taglib&nbsp;prefix</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">=</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">c</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">&nbsp;uri</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">=</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">http://java.sun.com/jstl/core_rt</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">&nbsp;</span><span style="COLOR: #000000; BACKGROUND-COLOR: #ffff00">%&gt;</span></font><span style="COLOR: #000000"><br></span><font size=2><span style="COLOR: #000000; BACKGROUND-COLOR: #ffff00">&lt;%</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">@&nbsp;taglib&nbsp;prefix</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">=</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">fmt</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">&nbsp;uri</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">=</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">http://java.sun.com/jstl/fmt</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span><span style="COLOR: #000000; BACKGROUND-COLOR: #ffff00">%&gt;</span></font><font size=2><span style="COLOR: #000000">&nbsp;<br><br><br></span><span style="COLOR: #0000ff">&lt;!</span><span style="COLOR: #ff00ff">DOCTYPE&nbsp;HTML&nbsp;PUBLIC&nbsp;"-//W3C//DTD&nbsp;HTML&nbsp;4.01&nbsp;Transitional//EN"</span><span style="COLOR: #0000ff">&gt;</span></font><span style="COLOR: #000000"><br></span><font size=2><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">html</span><span style="COLOR: #0000ff">&gt;</span></font><span style="COLOR: #000000"><br></span><font size=2><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">head</span><span style="COLOR: #0000ff">&gt;&lt;/</span><span style="COLOR: #800000">head</span><span style="COLOR: #0000ff">&gt;</span></font><font size=2><span style="COLOR: #000000">&nbsp;&nbsp;<br></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">body</span><span style="COLOR: #0000ff">&gt;</span></font><span style="COLOR: #000000"><br><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;</font></span><font size=2><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">c:out&nbsp;</span><span style="COLOR: #ff0000">value</span><span style="COLOR: #0000ff">="${model.message}"</span><span style="COLOR: #0000ff">/&gt;</span></font><span style="COLOR: #000000"><br></span><font size=2><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">body</span><span style="COLOR: #0000ff">&gt;</span></font><span style="COLOR: #000000"><br></span><font size=2><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">html</span><span style="COLOR: #0000ff">&gt;</span></font></div>
<font size=2>因为<font color=#0000ff>InternalPathMethodNameResolver</font>方法名解释器会把整个URL中最后一个<font color=#0000ff>"/"</font>和最后一个<font color=#0000ff>"."</font>之间的部分作为要调用的方法名，所以你可以在这个URL后面加任意文件格式的后缀，比如：<br></font><a href="http://localhost:8080/page/controller/"><font size=2>localhost:8080/page/controller/</font></a><font size=2>method1.jsp<br>或<br></font><a href="http://localhost:8080/page/controller/"><font size=2>localhost:8080/page/controller/</font></a><font size=2>method2.html<br>很爽吧，和真实的URL地址一样。</font><br><br><font size=2>另：开发环境：MyEclipse5.0M2+tomcat5.5<br>　　需要用到spring.jar和jstl.jar两个包。<br><br>附：<a href="http://www.blogjava.net/Files/liaojiyong/TestController.rar" target=_blank>源代码下载</a></font> <img src ="http://www.blogjava.net/liaojiyong/aggbug/67078.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2006-09-01 13:41 <a href="http://www.blogjava.net/liaojiyong/archive/2006/09/01/67078.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SSH(Spring + Struts + Hibernate)小试（转）</title><link>http://www.blogjava.net/liaojiyong/archive/2006/07/21/59320.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Thu, 20 Jul 2006 17:45:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2006/07/21/59320.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/59320.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2006/07/21/59320.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/59320.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/59320.html</trackback:ping><description><![CDATA[
		<p>
				<font color="#000000">之前对Spring Struts Hibernate都稍有了解，Spring的IOC给我留下了很深的印象，容器管理的对象生成<br />方法极大地简化了程序逻辑，Spring也提供了用于Web的Spring MVC 框架，由于我感觉其易用性还是不及<br />Struts，所以我还是选择Struts作为前端WEB框架，Hibernate我一直没有在Web应用中试过，这次当然不会<br />错过机会了。</font>
		</p>
		<font color="#000000">
				<p>
						<br />开发环境的塔建我就不多说了，具体可以参考我以前的几篇日志。</p>
				<p>在Eclipse中新建一个动态Web工程，将Struts 、Spring、Hibernate需要的jar都添加到WEB-INF/lib目录下，<br />将Struts标签所需的tld文件、struts-config.xml文件（可以由StrutsIDE生成）添加到WEB-INF下，另外在<br />此目录下添加一个Spring的配置文件applicationContext.xml。</p>
				<p>
						<br />我参考的例子是夏昕的《深入浅出Hibernate》上的第6章，很好的一个论坛示例。</p>
				<p>首先按照书上的ER模型，在数据库（MySQL）中建立相应的数据库。</p>
				<p>
						<br />
						<font color="#a52a2a">create database forum;</font>
				</p>
				<p>
						<font color="#a52a2a">use forum;</font>
				</p>
				<p>
						<font color="#a52a2a">create table user(<br /> id int not null auto_increment primary key,<br /> name varchar(50),<br /> pwd varchar(50),<br /> email varchar(50)</font>
				</p>
				<p>
						<font color="#a52a2a">)type=innodb;</font>
				</p>
				<p>
						<br />
						<font color="#a52a2a">create table board(<br /> id int not null auto_increment primary key, <br /> parent_id int,<br /> create_by int not null,<br /> name varchar(50) not null,<br /> remark varchar(255),<br /> create_time datetime,</font>
				</p>
				<p>
						<font color="#a52a2a"> index(parent_id),<br /> index(create_by),</font>
				</p>
				<p>
						<font color="#a52a2a"> foreign key(parent_id) references board(id) on delete cascade,<br /> foreign key(create_by) references user(id) on delete no action<br /> <br />)type=innodb;</font>
				</p>
				<p>
						<br />
						<font color="#a52a2a">create table article(<br /> id int not null auto_increment primary key, <br /> parent_id int ,<br /> board_id int not null,<br /> article_type int not null,<br /> title varchar(255),<br /> body text,<br /> create_by int not null,</font>
				</p>
				<p>
						<font color="#a52a2a"> create_time datetime,<br /> hits int unsigned,<br /> bytes int unsigned,<br /> last_update_by int not null,<br /> last_update_time datetime,</font>
				</p>
				<p>
						<font color="#a52a2a"> index(parent_id),<br /> index(board_id),<br /> index(create_by),<br /> index(last_update_by),</font>
				</p>
				<p>
						<font color="#a52a2a"> foreign key(parent_id) references article(id) on delete no action,<br /> foreign key(board_id) references board(id) on delete cascade,<br /> foreign key(create_by) references user(id) on delete no action,<br /> foreign key(last_update_by) references user(id) on delete no action<br /> <br />)type=innodb;</font>
				</p>
				<p>之后，我选择了用Hibernate Sychonizer来生成映射文件和实体类，然后对生成的类进行修改（删掉了生成的Base类），<br />实际上Hibernate Sychonizer生成的映射文件也有错误，需要修改，我也是后来在使用中发现的。<br /><br /><font color="#ff0000">//User.hbm.xml</font></p>
				<p>
						<font color="#a52a2a">&lt;?xml version="1.0"?&gt;<br />&lt;!DOCTYPE hibernate-mapping PUBLIC<br /> "-//Hibernate/Hibernate Mapping DTD//EN"<br /> "</font>
						<a href="http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
								<font color="#a52a2a">http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd</font>
								<font color="#000080">
								</font>
						</a>
						<font color="#a52a2a">" &gt;</font>
				</p>
				<p>
						<font color="#a52a2a">&lt;hibernate-mapping package="com.lzy.forum.domain"&gt;<br /> &lt;class<br />  name="User"<br />  table="user"<br /> &gt;</font>
				</p>
				<p>
						<font color="#a52a2a">  &lt;id<br />   name="Id"<br />   type="integer"<br />   column="id"<br />  &gt;<br />   &lt;generator class="native"/&gt;<br />  &lt;/id&gt;</font>
				</p>
				<p>
						<font color="#a52a2a">  &lt;property<br />   name="Name"<br />   column="name"<br />   type="string"<br />   not-null="false"<br />   length="50"<br />  /&gt;<br />  &lt;property<br />   name="Pwd"<br />   column="pwd"<br />   type="string"<br />   not-null="false"<br />   length="50"<br />  /&gt;<br />  &lt;property<br />   name="Email"<br />   column="email"<br />   type="string"<br />   not-null="false"<br />   length="50"<br />  /&gt;<br /> </font>
				</p>
				<p>
						<font color="#a52a2a">  &lt;set name="ArticlesByLastUpdateBy" inverse="true" lazy="true"&gt;<br />   &lt;key column="last_update_by"/&gt;<br />   &lt;one-to-many class="Article"/&gt;<br />  &lt;/set&gt;</font>
				</p>
				<p>
						<font color="#a52a2a">  &lt;set name="ArticlesByCreateBy" inverse="true" lazy="true"&gt;<br />   &lt;key column="create_by"/&gt;<font color="#0000ff">【<font color="#0000ff">这里的create_by是后来修改的，Hibernate Sychonizer生成的有错，后面有几处同样的错误】</font><br /></font>   &lt;one-to-many class="Article"/&gt;<br />  &lt;/set&gt;</font>
				</p>
				<p>
						<font color="#a52a2a">  &lt;set name="Boards" inverse="true" lazy="true"&gt;<br />   &lt;key column="create_by"/&gt;<font color="#0000ff">【这里的create_by是后来修改的】</font><br /><br />   &lt;one-to-many class="Board"/&gt;<br />  &lt;/set&gt;</font>
				</p>
				<p>
						<br />
						<font color="#a52a2a"> &lt;/class&gt; <br />&lt;/hibernate-mapping&gt;</font>
				</p>
				<p>
						<font color="#ff0000">//User.java</font>
						<br />
						<font color="#0000ff">package com.lzy.forum.domain;</font>
				</p>
				<p>
						<br />
						<font color="#0000ff">public class User{<br /> private static final long serialVersionUID = 1L;</font>
				</p>
				<p>
						<font color="#0000ff">//  primary key<br /> private java.lang.Integer id;</font>
				</p>
				<p>
						<font color="#0000ff"> // fields<br /> private java.lang.String name;<br /> private java.lang.String pwd;<br /> private java.lang.String email;</font>
				</p>
				<p>
						<font color="#0000ff"> // collections<br /> private java.util.Set&lt;Article&gt; articlesByLastUpdateBy;<br /> private java.util.Set&lt;Article&gt; articlesByCreateBy;<br /> private java.util.Set&lt;Board&gt; boards;<br /> <br /> <br /> public java.util.Set&lt;Article&gt; getArticlesByCreateBy() {<br />  return articlesByCreateBy;<br /> }<br /> public void setArticlesByCreateBy(java.util.Set&lt;Article&gt; articlesByCreateBy) {<br />  this.articlesByCreateBy = articlesByCreateBy;<br /> }<br /> public java.util.Set&lt;Article&gt; getArticlesByLastUpdateBy() {<br />  return articlesByLastUpdateBy;<br /> }<br /> public void setArticlesByLastUpdateBy(<br />   java.util.Set&lt;Article&gt; articlesByLastUpdateBy) {<br />  this.articlesByLastUpdateBy = articlesByLastUpdateBy;<br /> }<br /> public java.util.Set&lt;Board&gt; getBoards() {<br />  return boards;<br /> }<br /> public void setBoards(java.util.Set&lt;Board&gt; boards) {<br />  this.boards = boards;<br /> }<br /> public java.lang.String getEmail() {<br />  return email;<br /> }<br /> public void setEmail(java.lang.String email) {<br />  this.email = email;<br /> }<br /> public java.lang.Integer getId() {<br />  return id;<br /> }<br /> public void setId(java.lang.Integer id) {<br />  this.id = id;<br /> }<br /> public java.lang.String getName() {<br />  return name;<br /> }<br /> public void setName(java.lang.String name) {<br />  this.name = name;<br /> }<br /> public java.lang.String getPwd() {<br />  return pwd;<br /> }<br /> public void setPwd(java.lang.String pwd) {<br />  this.pwd = pwd;<br /> }</font>
				</p>
				<p>
						<br />
						<font color="#0000ff">}</font>
						<br />
						<br />
						<font color="#ff0000">//Board.hbm.xml</font>
				</p>
				<p>
						<font color="#a52a2a">&lt;?xml version="1.0"?&gt;<br />&lt;!DOCTYPE hibernate-mapping PUBLIC<br /> "-//Hibernate/Hibernate Mapping DTD//EN"<br /> "</font>
						<a href="http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
								<font color="#a52a2a">http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd</font>
								<font color="#000080">
								</font>
						</a>
						<font color="#a52a2a">" &gt;</font>
				</p>
				<p>
						<font color="#a52a2a">&lt;hibernate-mapping package="com.lzy.forum.domain"&gt;<br /> &lt;class<br />  name="Board"<br />  table="board"<br /> &gt;<br />   &lt;meta attribute="sync-DAO"&gt;false&lt;/meta&gt;<br />  &lt;id<br />   name="Id"<br />   type="integer"<br />   column="id"<br />  &gt;<br />   &lt;generator class="native"/&gt;<br />  &lt;/id&gt;</font>
				</p>
				<p>
						<font color="#a52a2a">  &lt;property<br />   name="Name"<br />   column="name"<br />   type="string"<br />   not-null="true"<br />   length="50"<br />  /&gt;<br />  &lt;property<br />   name="Remark"<br />   column="remark"<br />   type="string"<br />   not-null="false"<br />   length="255"<br />  /&gt;<br />  &lt;property<br />   name="CreateTime"<br />   column="create_time"<br />   type="timestamp"<br />   not-null="false"<br />   length="19"<br />  /&gt;<br />  &lt;many-to-one<br />   name="CreateBy"<br />   column="create_by"<br />   class="User"<br />   not-null="true"<br />  &gt;<br />  &lt;/many-to-one&gt;<br />  &lt;many-to-one<br />   name="Parent"<br />   column="parent_id"<br />   class="Board"   <br />   not-null="false"<br />   lazy="false"&gt;<br />  &lt;/many-to-one&gt;<br /> </font>
				</p>
				<p>
						<font color="#a52a2a">  &lt;set name="Articles" inverse="true" lazy="true" order-by="id"&gt;<br />   &lt;key column="board_id"/&gt;<font color="#0000ff">【这里的board_id是后来修改的】</font><br />   &lt;one-to-many class="Article"/&gt;<br />  &lt;/set&gt;</font>
				</p>
				<p>
						<font color="#a52a2a">  &lt;set name="ChildBoards" inverse="true"  lazy="true" order-by="id"&gt;<br />   &lt;key column="parent_id"/&gt;<font color="#0000ff">【</font><font color="#0000ff">这里的parent_id是后来修改的】<br /></font>   &lt;one-to-many class="Board"/&gt;<br />  &lt;/set&gt;</font>
				</p>
				<p>
						<br />
						<font color="#a52a2a"> &lt;/class&gt; <br />&lt;/hibernate-mapping&gt;</font>
				</p>
				<p>
						<font color="#ff0000">//Board.java<br /></font>
						<font color="#0000ff">package com.lzy.forum.domain;</font>
				</p>
				<p>
						<font color="#0000ff">
						</font> </p>
				<p>
						<br />
						<font color="#0000ff">public class Board  {<br /> private static final long serialVersionUID = 1L;</font>
				</p>
				<p>
						<font color="#0000ff">//  primary key<br /> private java.lang.Integer id;</font>
				</p>
				<p>
						<font color="#0000ff"> // fields<br /> private java.lang.String name;<br /> private java.lang.String remark;<br /> private java.util.Date createTime;</font>
				</p>
				<p>
						<font color="#0000ff"> // many to one<br /> private com.lzy.forum.domain.User createBy;<br /> private com.lzy.forum.domain.Board parent;</font>
				</p>
				<p>
						<font color="#0000ff"> // collections<br /> private java.util.Set&lt;com.lzy.forum.domain.Article&gt; articles;<br /> private java.util.Set&lt;com.lzy.forum.domain.Board&gt; childBoards;<br /> <br /> <br /> public java.util.Set&lt;com.lzy.forum.domain.Article&gt; getArticles() {<br />  return articles;<br /> }<br /> public void setArticles(java.util.Set&lt;com.lzy.forum.domain.Article&gt; articles) {<br />  this.articles = articles;<br /> }<br /> public java.util.Set&lt;com.lzy.forum.domain.Board&gt; getChildBoards() {<br />  return childBoards;<br /> }<br /> public void setChildBoards(java.util.Set&lt;com.lzy.forum.domain.Board&gt; childBoards) {<br />  this.childBoards = childBoards;<br /> }<br /> public com.lzy.forum.domain.User getCreateBy() {<br />  return createBy;<br /> }<br /> public void setCreateBy(com.lzy.forum.domain.User createBy) {<br />  this.createBy = createBy;<br /> }<br /> public java.util.Date getCreateTime() {<br />  return createTime;<br /> }<br /> public void setCreateTime(java.util.Date createTime) {<br />  this.createTime = createTime;<br /> }<br /> public java.lang.Integer getId() {<br />  return id;<br /> }<br /> public void setId(java.lang.Integer id) {<br />  this.id = id;<br /> }<br /> public java.lang.String getName() {<br />  return name;<br /> }<br /> public void setName(java.lang.String name) {<br />  this.name = name;<br /> }<br /> public com.lzy.forum.domain.Board getParent() {<br />  return parent;<br /> }<br /> public void setParent(com.lzy.forum.domain.Board parent) {<br />  this.parent = parent;<br /> }<br /> public java.lang.String getRemark() {<br />  return remark;<br /> }<br /> public void setRemark(java.lang.String remark) {<br />  this.remark = remark;<br /> }</font>
				</p>
				<p>
						<br />
						<font color="#0000ff">}<br /></font>
						<br />
						<font color="#ff0000">//Article.hbm.xml</font>
				</p>
				<p>
						<font color="#a52a2a">&lt;?xml version="1.0"?&gt;<br />&lt;!DOCTYPE hibernate-mapping PUBLIC<br /> "-//Hibernate/Hibernate Mapping DTD//EN"<br /> "</font>
						<a href="http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
								<font color="#a52a2a">http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd</font>
								<font color="#000080">
								</font>
						</a>
						<font color="#a52a2a">" &gt;</font>
				</p>
				<p>
						<font color="#a52a2a">&lt;hibernate-mapping package="com.lzy.forum.domain"&gt;<br /> &lt;class<br />  name="Article"<br />  table="article"<br /> &gt;<br />  &lt;meta attribute="sync-DAO"&gt;false&lt;/meta&gt;<br />  &lt;id<br />   name="Id"<br />   type="integer"<br />   column="id"<br />  &gt;<br />   &lt;generator class="native"/&gt;<br />  &lt;/id&gt;</font>
				</p>
				<p>
						<font color="#a52a2a">  &lt;property<br />   name="ArticleType"<br />   column="article_type"<br />   type="integer"<br />   not-null="true"<br />   length="11"<br />  /&gt;<br />  &lt;property<br />   name="Title"<br />   column="title"<br />   type="string"<br />   not-null="false"<br />   length="255"<br />  /&gt;<br />  &lt;property<br />   name="Body"<br />   column="body"<br />   type="string"<br />   not-null="false"<br />  /&gt;<br />  &lt;property<br />   name="Hits"<br />   column="hits"<br />   type="integer"<br />   not-null="false"<br />   length="10"<br />  /&gt;<br />  &lt;property<br />   name="Bytes"<br />   column="bytes"<br />   type="integer"<br />   not-null="false"<br />   length="10"<br />  /&gt;<br />  &lt;property<br />   name="CreateTime"<br />   column="create_time"<br />   type="timestamp"<br />   not-null="false"<br />   length="19"<br />  /&gt;<br />  &lt;property<br />   name="LastUpdateTime"<br />   column="last_update_time"<br />   type="timestamp"<br />   not-null="false"<br />   length="19"<br />  /&gt;<br />  &lt;many-to-one<br />   name="LastUpdateBy"<br />   column="last_update_by"<br />   class="User"<br />   not-null="true"<br />  &gt;<br />  &lt;/many-to-one&gt;<br />  &lt;many-to-one<br />   name="CreateBy"<br />   column="create_by"<br />   class="User"<br />   not-null="true"<br />  &gt;<br />  &lt;/many-to-one&gt;<br />  &lt;many-to-one<br />   name="Parent"<br />   column="parent_id"<br />   class="Article"<br />   not-null="false"<br />  &gt;<br />  &lt;/many-to-one&gt;<br />  &lt;many-to-one<br />   name="Board"<br />   column="board_id"<br />   class="Board"<br />   not-null="true"<br />  &gt;<br />  &lt;/many-to-one&gt;<br /> </font>
				</p>
				<p>
						<font color="#a52a2a">  &lt;set name="Articles" inverse="true" lazy="false" order-by="id"&gt;<br />   &lt;key column="parent_id"/&gt;<font color="#0000ff">【这里的parent_id是后来修改的】</font><br />   &lt;one-to-many class="Article"/&gt;<br />  &lt;/set&gt;</font>
				</p>
				<p>
						<br />
						<font color="#a52a2a"> &lt;/class&gt; <br />&lt;/hibernate-mapping&gt;</font>
				</p>
				<p>
						<br />
						<br />
						<font color="#ff0000">//Article.java</font>
						<br />
						<font color="#0000ff">package com.lzy.forum.domain;</font>
				</p>
				<p>
						<font color="#0000ff">import java.util.Date;</font>
				</p>
				<p>
						<font color="#0000ff">
						</font> </p>
				<p>
						<br />
						<font color="#0000ff">public class Article  {<br /> private static final long serialVersionUID = 1L;<br /> // primary key<br /> private java.lang.Integer id;</font>
				</p>
				<p>
						<font color="#0000ff"> // fields<br /> private java.lang.Integer articleType;<br /> private java.lang.String title;<br /> private java.lang.String body;<br /> private java.lang.Integer hits;<br /> private java.lang.Integer bytes;<br /> private java.util.Date lastUpdateTime;<br /> private java.util.Date createTime;<br /> </font>
				</p>
				<p>
						<font color="#0000ff"> // many to one<br /> private com.lzy.forum.domain.User lastUpdateBy;<br /> private com.lzy.forum.domain.User createBy;<br /> private com.lzy.forum.domain.Article parent;<br /> private com.lzy.forum.domain.Board board;</font>
				</p>
				<p>
						<font color="#0000ff"> // collections<br /> private java.util.Set&lt;com.lzy.forum.domain.Article&gt; articles;</font>
				</p>
				<p>
						<font color="#0000ff"> public java.util.Set&lt;com.lzy.forum.domain.Article&gt; getArticles() {<br />  return articles;<br /> }</font>
				</p>
				<p>
						<font color="#0000ff"> public void setArticles(java.util.Set&lt;com.lzy.forum.domain.Article&gt; articles) {<br />  this.articles = articles;<br /> }</font>
				</p>
				<p>
						<font color="#0000ff"> public java.lang.Integer getArticleType() {<br />  return articleType;<br /> }</font>
				</p>
				<p>
						<font color="#0000ff"> public void setArticleType(java.lang.Integer articleType) {<br />  this.articleType = articleType;<br /> }</font>
				</p>
				<p>
						<font color="#0000ff"> public com.lzy.forum.domain.Board getBoard() {<br />  return board;<br /> }</font>
				</p>
				<p>
						<font color="#0000ff"> public void setBoard(com.lzy.forum.domain.Board board) {<br />  this.board = board;<br /> }</font>
				</p>
				<p>
						<font color="#0000ff"> public java.lang.String getBody() {<br />  return body;<br /> }</font>
				</p>
				<p>
						<font color="#0000ff"> public void setBody(java.lang.String body) {<br />  this.body = body;<br /> }</font>
				</p>
				<p>
						<font color="#0000ff"> public java.lang.Integer getBytes() {<br />  return bytes;<br /> }</font>
				</p>
				<p>
						<font color="#0000ff"> public void setBytes(java.lang.Integer bytes) {<br />  this.bytes = bytes;<br /> }</font>
				</p>
				<p>
						<font color="#0000ff"> public com.lzy.forum.domain.User getCreateBy() {<br />  return createBy;<br /> }</font>
				</p>
				<p>
						<font color="#0000ff"> public void setCreateBy(com.lzy.forum.domain.User createBy) {<br />  this.createBy = createBy;<br /> }</font>
				</p>
				<p>
						<font color="#0000ff"> public java.lang.Integer getHits() {<br />  return hits;<br /> }</font>
				</p>
				<p>
						<font color="#0000ff"> public void setHits(java.lang.Integer hits) {<br />  this.hits = hits;<br /> }</font>
				</p>
				<p>
						<font color="#0000ff"> public java.lang.Integer getId() {<br />  return id;<br /> }</font>
				</p>
				<p>
						<font color="#0000ff"> public void setId(java.lang.Integer id) {<br />  this.id = id;<br /> }</font>
				</p>
				<p>
						<font color="#0000ff"> public com.lzy.forum.domain.User getLastUpdateBy() {<br />  return lastUpdateBy;<br /> }</font>
				</p>
				<p>
						<font color="#0000ff"> public void setLastUpdateBy(com.lzy.forum.domain.User lastUpdateBy) {<br />  this.lastUpdateBy = lastUpdateBy;<br /> }</font>
				</p>
				<p>
						<font color="#0000ff"> public java.util.Date getLastUpdateTime() {<br />  return lastUpdateTime;<br /> }</font>
				</p>
				<p>
						<font color="#0000ff"> public void setLastUpdateTime(java.util.Date lastUpdateTime) {<br />  this.lastUpdateTime = lastUpdateTime;<br /> }</font>
				</p>
				<p>
						<font color="#0000ff"> public com.lzy.forum.domain.Article getParent() {<br />  return parent;<br /> }</font>
				</p>
				<p>
						<font color="#0000ff"> public void setParent(com.lzy.forum.domain.Article parent) {<br />  this.parent = parent;<br /> }</font>
				</p>
				<p>
						<font color="#0000ff"> public java.lang.String getTitle() {<br />  return title;<br /> }</font>
				</p>
				<p>
						<font color="#0000ff"> public void setTitle(java.lang.String title) {<br />  this.title = title;<br /> }<br /> public java.util.Date getCreateTime(){<br />  return createTime;<br /> }</font>
				</p>
				<p>
						<font color="#0000ff"> public void setCreateTime(java.util.Date createTime) {<br />  // TODO Auto-generated method stub<br />  this.createTime = createTime;<br /> }<br /> </font>
				</p>
				<p>
				</p>
		</font>
		<font color="#0000ff">}<br /><br /></font>
		<font color="#000000">接下来将会在web中加入Spring支持和为实体类提供DAO支持。<br /><p>Spring和Struts结合有几种方法，我选了最常用的PlugIn方式，在struts-config.xml中加入<br /><br /><font color="#a52a2a">&lt;plug-in className="org.springframework.web.struts.ContextLoaderPlugIn"&gt;<br />      &lt;set-property property="contextConfigLocation"<br />            value="/WEB-INF/action-servlet.xml" /&gt;<br /> &lt;/plug-in&gt;<br /><br /><font color="#000000">WEB-INF目录下的action-servlet.xml就是Spring的配置文件,下面给出的是整个的</font><font color="#ff0000">action-servlet.xml<font color="#000000">文件：</font><br /></font><br />&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />&lt;!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "<a href="http://www.springframework.org/dtd/spring-beans.dtd"><font color="#000080">http://www.springframework.org/dtd/spring-beans.dtd</font></a>"&gt;<br />&lt;beans&gt;<br /><br /></font><font color="#ff0000">//Data Source</font></p><p><font color="#a52a2a"> &lt;bean id="dataSource"<br />  class="org.springframework.jdbc.datasource.DriverManagerDataSource"&gt;<br />  &lt;property name="driverClassName"&gt;<br />   &lt;value&gt;com.mysql.jdbc.Driver&lt;/value&gt;<br />  &lt;/property&gt;<br />  &lt;property name="url"&gt;<br />   &lt;value&gt;jdbc:mysql://localhost:3306/forum&lt;/value&gt;<br />  &lt;/property&gt;<br />  &lt;property name="username"&gt;<br />   &lt;value&gt;test&lt;/value&gt;<br />  &lt;/property&gt;<br />  &lt;property name="password"&gt;<br />   &lt;null /&gt;<br />  &lt;/property&gt;<br /> &lt;/bean&gt;</font></p><font color="#a52a2a"><p><font color="#ff0000">// For Hibernate </font><br /> <font color="#a52a2a">&lt;bean id="sessionFactory"<br />  class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"&gt;<br />  &lt;property name="dataSource"&gt;<br />   &lt;ref local="dataSource" /&gt;<br />  &lt;/property&gt;<br />  &lt;property name="mappingResources"&gt;<br />   &lt;list&gt;<br />    &lt;value&gt;com/lzy/forum/domain/User.hbm.xml&lt;/value&gt;<br />    &lt;value&gt;com/lzy/forum/domain/Article.hbm.xml&lt;/value&gt;<br />    &lt;value&gt;com/lzy/forum/domain/Board.hbm.xml&lt;/value&gt;<br />   &lt;/list&gt;<br />  &lt;/property&gt;<br />  &lt;property name="hibernateProperties"&gt;<br />   &lt;props&gt;<br />    &lt;prop key="hibernate.dialect"&gt;<br />     org.hibernate.dialect.MySQLDialect<br />    &lt;/prop&gt;<br />    &lt;prop key="hibernate.show_sql"&gt;true&lt;/prop&gt;<br />   &lt;/props&gt;<br />  &lt;/property&gt;<br /> &lt;/bean&gt;</font></p><p><font color="#a52a2a"> &lt;bean id="transactionManager"<br />  class="org.springframework.orm.hibernate3.HibernateTransactionManager"&gt;<br />  &lt;property name="sessionFactory"&gt;<br />   &lt;ref local="sessionFactory" /&gt;<br />  &lt;/property&gt;<br /> &lt;/bean&gt;</font></p><p><font color="#a52a2a"></font> </p><p><font color="#ff0000">// For DAO</font><br /><font color="#a52a2a"> &lt;bean id="userDAO"<br />  class="com.lzy.forum.dao.impl.UserDAOHibernate"&gt;<br />  &lt;property name="sessionFactory"&gt;<br />   &lt;ref local="sessionFactory" /&gt;<br />  &lt;/property&gt;<br /> &lt;/bean&gt;</font></p><p><font color="#a52a2a"></font> </p><p><font color="#a52a2a"> &lt;bean id="boardDAO"<br />  class="com.lzy.forum.dao.impl.BoardDAOHibernate"&gt;<br />  &lt;property name="sessionFactory"&gt;<br />   &lt;ref local="sessionFactory" /&gt;<br />  &lt;/property&gt;<br /> &lt;/bean&gt;</font></p><p><font color="#a52a2a"> &lt;bean id="articleDAO"<br />  class="com.lzy.forum.dao.impl.ArticleDAOHibernate"&gt;<br />  &lt;property name="sessionFactory"&gt;<br />   &lt;ref local="sessionFactory" /&gt;<br />  &lt;/property&gt;<br /> &lt;/bean&gt;</font></p><p><font color="#a52a2a"><font color="#ff0000">//For Struts Action</font></font></p><p><font color="#a52a2a"> &lt;bean name="/regist" class="com.lzy.forum.action.RegistAction"<br />  singleton="false"&gt;<br />  &lt;property name="userDAO"&gt;<br />   &lt;ref local="userDAO" /&gt;<br />  &lt;/property&gt;</font></p><p><font color="#a52a2a"> &lt;/bean&gt;</font></p><p><br /><font color="#a52a2a"> &lt;bean name="/login" class="com.lzy.forum.action.LoginAction"<br />  singleton="false"&gt;<br />  &lt;property name="userDAO"&gt;<br />   &lt;ref local="userDAO" /&gt;<br />  &lt;/property&gt;</font></p><p><font color="#a52a2a"> &lt;/bean&gt;</font></p><p><font color="#a52a2a"> &lt;bean name="/boardManage"<br />  class="com.lzy.forum.action.BoardManageAction" singleton="false"&gt;<br />  &lt;property name="userDAO"&gt;<br />   &lt;ref local="userDAO" /&gt;<br />  &lt;/property&gt;<br />  &lt;property name="boardDAO"&gt;<br />   &lt;ref local="boardDAO" /&gt;<br />  &lt;/property&gt;</font></p><p><font color="#a52a2a"> &lt;/bean&gt;</font></p><p><font color="#a52a2a"> &lt;bean name="/boardNavigate"<br />  class="com.lzy.forum.action.BoardNavigateAction" singleton="false"&gt;<br />  &lt;property name="boardDAO"&gt;<br />   &lt;ref local="boardDAO" /&gt;<br />  &lt;/property&gt;</font></p><p><font color="#a52a2a"> &lt;/bean&gt;</font></p><p> &lt;bean name="/boardDisplay"<br />  class="com.lzy.forum.action.BoardDisplayAction" singleton="false"&gt;<br />  &lt;property name="boardDAO"&gt;<br />   &lt;ref local="boardDAO" /&gt;<br />  &lt;/property&gt;</p><p> &lt;/bean&gt;</p><p> &lt;bean name="/articleManage"<br />  class="com.lzy.forum.action.ArticleManageAction" singleton="false"&gt;<br />  &lt;property name="userDAO"&gt;<br />   &lt;ref local="userDAO" /&gt;<br />  &lt;/property&gt;<br />  &lt;property name="boardDAO"&gt;<br />   &lt;ref local="boardDAO" /&gt;<br />  &lt;/property&gt;<br />  &lt;property name="articleDAO"&gt;<br />   &lt;ref local="articleDAO" /&gt;<br />  &lt;/property&gt;</p><p><br /> &lt;/bean&gt;</p><p><br />&lt;/beans&gt;<br /><br /><font color="#000000">经过这样的配置之后，Hibernate事务交由Spring管理，sessionFactory从Spring容器获得。下面通过其中的一个DAO实例来看看这样做带来的方便。<br /></font><br /><br /><font color="#ff0000">//BoardDAO.java<br /></font><br /><font color="#0000ff">package com.lzy.forum.dao;</font></p><p><font color="#0000ff">import java.util.ArrayList;</font></p><p><font color="#0000ff">import com.lzy.forum.domain.Board;</font></p><p><font color="#0000ff">public interface BoardDAO {<br /> <br /> public boolean isBoardExist(String name);<br /> <br /> public void addBoard(Board board);<br /> <br /> public void deleteBoard(Board board);<br /> <br /> public Board loadBoard(int id);<br /> <br /> public Board loadBoard(String name);<br /> <br /> public Board loadBoardWithArticles(int id);<br /> <br /> public ArrayList getRootBoardsList();<br /> <br /> <br /> <br />}<br /><br /><br /><font color="#ff0000">//BoardDAOHibernate.java</font><br /><br />package com.lzy.forum.dao.impl;</font></p><p><font color="#0000ff">import java.util.ArrayList;<br />import java.util.Iterator;<br />import java.util.ListIterator;<br />import java.util.Set;</font></p><p><font color="#0000ff">import org.hibernate.Hibernate;<br />import org.springframework.orm.hibernate3.support.HibernateDaoSupport;</font></p><p><font color="#0000ff">import com.lzy.forum.dao.BoardDAO;<br />import com.lzy.forum.domain.Board;</font></p><p><font color="#0000ff">public class BoardDAOHibernate extends HibernateDaoSupport implements BoardDAO {</font></p><p><font color="#0000ff"> public void deleteBoard(Board board) {<br />  // TODO Auto-generated method stub<br />  this.getHibernateTemplate().delete(board);<br /> }</font></p><p><font color="#0000ff"> public void addBoard(Board board) {<br />  // TODO Auto-generated method stub<br />  this.getHibernateTemplate().saveOrUpdate(board);</font></p><p><font color="#0000ff"> }</font></p><p><font color="#0000ff"> public boolean isBoardExist(String name) {<br />  // TODO Auto-generated method stub<br />  ArrayList list = (ArrayList) this.getHibernateTemplate().find(<br />    "from Board where name = ? ", new Object[] { name });<br />  if (list.size() &gt; 0) {<br />   // System.out.println("find it");<br />   return true;<br />  }<br />  return false;<br /> }</font></p><p><font color="#0000ff"> public Board loadBoard(int id) {<br />  // TODO Auto-generated method stub<br />  ArrayList list = (ArrayList) this.getHibernateTemplate().find(<br />    "from Board where id = ? ", new Object[] { id });</font></p><p><font color="#0000ff">  Board b = null;<br />  if (list.size() &gt; 0) {<br />   b = (Board) list.get(0);<br />  }</font></p><p><font color="#0000ff">  return b;<br /> }</font></p><p><font color="#0000ff"> public Board loadBoard(String name) {<br />  // TODO Auto-generated method stub<br />  ArrayList list = (ArrayList) this.getHibernateTemplate().find(<br />    "from Board where name = ? ", new Object[] { name });</font></p><p><font color="#0000ff">  Board b = null;<br />  if (list.size() &gt; 0) {<br />   b = (Board) list.get(0);<br />  }</font></p><p><font color="#0000ff">  return b;<br /> }</font></p><p><font color="#0000ff"> public ArrayList getRootBoardsList() {<br />  // TODO Auto-generated method stub<br />  ArrayList list = (ArrayList) this.getHibernateTemplate().find(<br />    "from Board b left join fetch b.ChildBoards where b.Parent = null order by b.id");<br />  System.out.println(list.size() + " root boards found ");<br />  </font></p><p><font color="#0000ff">  ListIterator index = list.listIterator();<br />  while (index.hasNext()) {</font></p><p><font color="#0000ff">   Board s = (Board) index.next();<br />   //this.getSession(true);<br />   //Hibernate.initialize(s.getChildBoards());<br />   ///*<br />    Set children  = (Set) s.getChildBoards();<br />    Iterator it = children.iterator();<br />    <br />    while(it.hasNext()){<br />    Board b = (Board)it.next();<br />    //Hibernate.initialize(b);<br />    System.out.println(b.getName());<br />    }<br />    //*/</font></p><p><font color="#0000ff">   //System.out.println(children.size() + "child(ren) found ");<br />   //s.setChildBoards(s.getChildBoards());<br />  }</font></p><p><font color="#0000ff">  return list;<br /> }</font></p><p><font color="#0000ff"> public Board loadBoardWithArticles(int id) {<br />  // TODO Auto-generated method stub<br />  ArrayList list = (ArrayList) this.getHibernateTemplate().find(<br />    "from Board b left join fetch b.Articles where b.Id = ? ", new Object[] { id });</font></p><p><font color="#0000ff">  Board b = null;<br />  if (list.size() &gt; 0) {<br />   b = (Board) list.get(0);<br />  }</font></p><p><font color="#0000ff">  return b;<br /><br /></font><font color="#0000ff"> }</font></p><p><font color="#0000ff"><br />}<br /><br /><br /><font color="#000000">BoardDAOHibernate继承 HibernateDaoSupport后，通过</font><font color="#0000ff"><font color="#000000">getHibernateTemplate()得到一个HibernateTemplate实例，然后执行CRUD操作，非常简单。需要注意的是，由于执行一次CRUD操作后，Hibernate session关闭，如果有使用延迟加载策略的对象没有加载，在后面的Web层很容易出现如下错误：<br /></font><font style="BACKGROUND-COLOR: #ffffff" color="#ff0000">failed to lazily initialize a collection of role<br /><font color="#000000">从网上搜到的解决方法是Open Session In View，<br /></font><font color="#0000ff">&lt;filter&gt; <br />     &lt;filter-name&gt;hibernateFilter&lt;/filter-name&gt; <br />     &lt;filter-class&gt; org.springframework.orm.hibernate3.support.OpenSessionInViewFilter <br />     &lt;/filter-class&gt; </font></font></font></font></p><p><font style="BACKGROUND-COLOR: #ffffff" color="#0000ff">     &lt;!-- singleSession默认为true,若设为false则等于没用OpenSessionInView --&gt; <br />    &lt;init-param&gt; <br />       &lt;param-name&gt;singleSession&lt;/param-name&gt; <br />       &lt;param-value&gt;true&lt;/param-value&gt; <br />    &lt;/init-param&gt; <br />  &lt;/filter&gt; </font></p><p><font color="#0000ff"><font color="#0000ff"><font style="BACKGROUND-COLOR: #ffffff" color="#ff0000"><font color="#000000"><font color="#0000ff">   &lt;filter-mapping&gt; <br />     &lt;filter-name&gt;hibernateFilter&lt;/filter-name&gt; <br />     &lt;url-pattern&gt;*.do&lt;/url-pattern&gt; <br />   &lt;/filter-mapping&gt; <br /></font>我试了试，还是有一些问题，所以后来还是放弃了这种方法，所有在Web层中需要的对象都必须在Business层中加载完成。如下面的代码所示：<br /><br /></font><font color="#0000ff">ArrayList list = (ArrayList) this.getHibernateTemplate().find(<br />    "from Board b left join fetch b.Articles where b.Id = ? ", new Object[] { id });<br /><br /><br /></font><font color="#000000">这样Hibernate和Spring的结合也算完成了。其他的一些DAO类和实现代码我没有给出，但是大同小异，和Board的实现类似。<br /><br /><br />最后将是Struts 和Spring的结合，将在下一篇给出。<br /><br />前面通过PlugIn我们实现了Spring Context的加载，不过仅仅加载Context并没有什么实际 <br />意义，我们还需要修改配置，将Struts Action交给Spring容器进行管理。下面将通过一个Regsit <br />实例加以说明。 <br /><br />首先准备好regist.jsp和login.jsp,在regist.jsp中 的form有name,password,password2,email域。 <br /><br />在struts-config.xml中添加配置： <br /><br />&lt;form-bean name="registForm" type="com.lzy.forum.form.RegistForm" /&gt; <br /><br />&lt;action path="/regist" name="registForm" <br />type="org.springframework.web.struts.DelegatingActionProxy" <br /><br />validate="true" input="/regist.jsp" scope="request"&gt; <br />&lt;forward name="failure" path="/regist.jsp" /&gt; <br />&lt;forward name="success" path="/login.jsp" /&gt; <br />&lt;/action&gt; <br /><br /><br />RegistForm,RegistAction按照原来Struts的方法去写,我在RegistAction中加入了一个UserDAO对象 <br />userDAO，这个对象由Spring注入。 <br /><br />&lt;bean name="/regist" class="com.lzy.forum.action.RegistAction" <br />singleton="false"&gt; <br />&lt;property name="userDAO"&gt; <br />&lt;ref local="userDAO" /&gt; <br />&lt;/property&gt; <br />&lt;/bean&gt; <br /><br />基本上SSH的架构已经完成，经确认后可以自己测试一下了。</font></font></font></font></p></font></font>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/59320.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2006-07-21 01:45 <a href="http://www.blogjava.net/liaojiyong/archive/2006/07/21/59320.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring之Hello World (转)</title><link>http://www.blogjava.net/liaojiyong/archive/2006/07/21/59318.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Thu, 20 Jul 2006 17:41:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2006/07/21/59318.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/59318.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2006/07/21/59318.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/59318.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/59318.html</trackback:ping><description><![CDATA[
		<div class="postTitle">
				<a id="viewpost1_TitleUrl" href="/felicity/archive/2005/12/14/23948.html">
						<font color="#000080">Spring之Hello World</font>
				</a>
		</div>
		<div class="postText">
				<p>1.下载Spring相关的开发包<br />下载地址：<a href="http://sourceforge.net/project/showfiles.php?group_id=73357"><font color="#000080">http://sourceforge.net/project/showfiles.php?group_id=73357</font></a><br />有spring-framework-1.2.6-with-dependencies.zip，一個是spring-framework-1.2.6.zip，最好下载with－dependencies的，里面有另外一些附加包，下载后解压缩，dist目录下是spring自身的jar，lib目录下是附加的jar。<br />2.新建Java Project，将spring.jar（dist目录下）和commons-logging.jar（lib目录下）添加到project的build path中。<br />3.新建POJO Bean类：HelloBean<br />//HelloBean.java<br />/**<br /> * <br /> */<br />package com.lzy;</p>
				<p>/**<br /> * @author lzy<br /> *<br /> */<br />public class HelloBean{<br /> <br /> private String hello;<br /> <br /> public void sayHello(){<br />  System.out.println(this.getHello());<br /> }</p>
				<p> /**<br />  * @return Returns the hello.<br />  */<br /> public String getHello() {<br />  return hello;<br /> }</p>
				<p> /**<br />  * @param hello The hello to set.<br />  */<br /> public void setHello(String hello) {<br />  this.hello = hello;<br /> }<br /> </p>
				<p>}</p>
				<p>
						<br />4.新建文件bean.xml，将在这个XML文件中为一个HelloBean的实例的hello属性赋值。<br />//bean.xml<br />&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "<a href="http://www.springframework.org/dtd/spring-beans.dtd"><font color="#000080">http://www.springframework.org/dtd/spring-beans.dtd</font></a>"&gt;<br />&lt;beans&gt;<br />&lt;description&gt;Spring Quick Start&lt;/description&gt;<br />&lt;bean id="helloBean" class="com.lzy.HelloBean"&gt; <br />  &lt;property name="hello"&gt;<br />   &lt;value&gt;hello world&lt;/value&gt;<br />  &lt;/property&gt;<br />&lt;/bean&gt;<br />&lt;/beans&gt;</p>
				<p>5.新建测试类：TestSpring<br />//TestSpring.java<br />/**<br /> * <br /> */<br />package com.lzy;</p>
				<p>import java.util.Locale;</p>
				<p>import org.springframework.context.ApplicationContext;<br />import org.springframework.context.support.FileSystemXmlApplicationContext;</p>
				<p>/**<br /> * @author lzy<br /> *<br /> */<br />public class TestSpring {</p>
				<p> /**<br />  * @param args<br />  */<br /> public static void main(String[] args) {<br />  // TODO Auto-generated method stub<br />  <br />  ApplicationContext ctx=new FileSystemXmlApplicationContext("bean.xml");<br />    HelloBean hello=(HelloBean)ctx.getBean("helloBean");<br />  hello.sayHello();<br /> }</p>
				<p>}</p>
				<p>
						<br />6.运行测试类：<br />    如果没有出错，输出中将会看到“hello world”。<br /></p>
		</div>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/59318.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2006-07-21 01:41 <a href="http://www.blogjava.net/liaojiyong/archive/2006/07/21/59318.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>