<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>待到道成日，纵横天地间！</title>
	<atom:link href="http://www.guloulou.com/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.guloulou.com</link>
	<description>追随我心：狂热的开发爱好者！</description>
	<lastBuildDate>Mon, 23 Aug 2010 11:21:12 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>26，27两讲采用@Resource注入报错原因</title>
		<link>http://www.guloulou.com/?p=1996</link>
		<comments>http://www.guloulou.com/?p=1996#comments</comments>
		<pubDate>Mon, 09 Aug 2010 09:21:30 +0000</pubDate>
		<dc:creator>guloulou</dc:creator>
				<category><![CDATA[传智播客Spring2.5自学笔记]]></category>
		<category><![CDATA[J2EE1.4]]></category>
		<category><![CDATA[J2EE5]]></category>
		<category><![CDATA[JMS 目标对象]]></category>
		<category><![CDATA[NAM0006]]></category>
		<category><![CDATA[Spring2.5]]></category>
		<category><![CDATA[web-app_2_4.xsd]]></category>
		<category><![CDATA[web-app_2_5.xsd]]></category>
		<category><![CDATA[传智播客]]></category>
		<category><![CDATA[笔记]]></category>
		<category><![CDATA[自学]]></category>
		<category><![CDATA[错误]]></category>
		<category><![CDATA[黎活明]]></category>

		<guid isPermaLink="false">http://www.guloulou.com/?p=1996</guid>
		<description><![CDATA[上两讲每次运行，结果不错，但控制台会打印类似如下错误；详见27讲（http://www.guloulou.com/?p=1991）
deployed with moduleid = DemoSSH
NAM0006: 未找到 JMS 目标对象: cn.itcast.service.impl.PersonServiceBean/sessionFactor... ]]></description>
			<content:encoded><![CDATA[<p>上两讲每次运行，结果不错，但控制台会打印类似如下错误；详见27讲（<a href="http://www.guloulou.com/?p=1991">http://www.guloulou.com/?p=1991</a>）</p>
<blockquote><p>deployed with moduleid = DemoSSH<br />
NAM0006: 未找到 JMS 目标对象: cn.itcast.service.impl.PersonServiceBean/sessionFactory<br />
javax.naming.NameNotFoundException</p></blockquote>
<p>后来突然想到黎活明老师讲解时强调要建立J2EE1.4的工程。我不会是建立了J2EE5的工程了吧。两个版本对servlet的支持不一样；一查，果然如此。且看两个版本默认的 web.xml 开始定义</p>
<p>J2EE1.4的web.xml</p>
<blockquote><p>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;web-app version="2.4"<br />
 xmlns="http://java.sun.com/xml/ns/j2ee"<br />
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<br />
 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee<br />
 http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"&gt;</p></blockquote>
<p>J2EE5的web.xml</p>
<blockquote><p>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"&gt; </p></blockquote>
<p>这个错误让俺查找了一整天。还是基础知识没掌握好。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.guloulou.com/?feed=rss2&amp;p=1996</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>27_传智播客Spring2.5视频教程_Struts与Spring集成方案1(Struts集成Spring)</title>
		<link>http://www.guloulou.com/?p=1991</link>
		<comments>http://www.guloulou.com/?p=1991#comments</comments>
		<pubDate>Thu, 05 Aug 2010 14:21:08 +0000</pubDate>
		<dc:creator>guloulou</dc:creator>
				<category><![CDATA[传智播客Spring2.5自学笔记]]></category>
		<category><![CDATA[@Resource]]></category>
		<category><![CDATA[action]]></category>
		<category><![CDATA[ActionServlet]]></category>
		<category><![CDATA[antlr-2.7.2.jar]]></category>
		<category><![CDATA[antlr-2.7.6.jar]]></category>
		<category><![CDATA[contextLoaderListener]]></category>
		<category><![CDATA[forward]]></category>
		<category><![CDATA[getWebApplicationContext]]></category>
		<category><![CDATA[javax.naming.NameNotFoundException]]></category>
		<category><![CDATA[JMS错误]]></category>
		<category><![CDATA[jsp]]></category>
		<category><![CDATA[listener]]></category>
		<category><![CDATA[NAM0006]]></category>
		<category><![CDATA[Spring2.5]]></category>
		<category><![CDATA[struts]]></category>
		<category><![CDATA[WebApplicationContext]]></category>
		<category><![CDATA[xml方式注入]]></category>
		<category><![CDATA[传智播客]]></category>
		<category><![CDATA[自学]]></category>
		<category><![CDATA[请求]]></category>
		<category><![CDATA[集成]]></category>
		<category><![CDATA[黎活明]]></category>

		<guid isPermaLink="false">http://www.guloulou.com/?p=1991</guid>
		<description><![CDATA[27_传智播客Spring2.5视频教程_Struts与Spring集成方案1(Struts集成Spring)

业务层木有问题了。现在我们开发view层、ctrl层；集成struts
添加jar包

bsf-2.3.0.jar                       
commons-beanuti... ]]></description>
			<content:encoded><![CDATA[<div id="WizHtmlContentId"><strong>27_传智播客Spring2.5视频教程_Struts与Spring集成方案1(Struts集成Spring)<br />
</strong></div>
<div>业务层木有问题了。现在我们开发view层、ctrl层；集成struts</div>
<div><strong>添加jar包</strong></div>
<blockquote style="margin-right: 0px;" dir="ltr">
<div>bsf-2.3.0.jar                       <br />
commons-beanutils-1.8.0.jar         <br />
commons-chain-1.2.jar               <br />
commons-digester-1.8.jar            <br />
commons-fileupload-1.1.1.jar        <br />
commons-io-1.1.jar                  <br />
commons-logging-1.0.4.jar           <br />
commons-validator-1.3.1.jar         <br />
jstl-1.0.2.jar                      <br />
oro-2.0.8.jar                       <br />
standard-1.0.6.jar                  <br />
struts-core-1.3.10.jar              <br />
struts-el-1.3.10.jar                <br />
struts-extras-1.3.10.jar            <br />
struts-faces-1.3.10.jar             <br />
struts-mailreader-dao-1.3.10.jar    <br />
struts-scripting-1.3.10.jar         <br />
struts-taglib-1.3.10.jar            <br />
struts-tiles-1.3.10.jar            <br />
<!--WizHtmlContent--></div>
</blockquote>
<div><strong>注意</strong>没有添加antlr-2.7.2.jar这个语法分析包，因为在hibernate中已有antlr-2.7.6.jar；</div>
<div><strong>使用listener实例化容器</strong></div>
<div>原来我们Spring容器的实例化，是在单元测试中手工编码实例化的；现在我们采用Spring容器提供的监听器listener来实例化Spring容器；</div>
<blockquote style="margin-right: 0px;" dir="ltr">
<div>&lt;context-param&gt;</div>
<div>    &lt;param-name&gt;contextConfigLocation&lt;/param-name&gt;</div>
<div>    &lt;param-value&gt;classpath:beans.xml&lt;/param-value&gt;</div>
<div>&lt;/context-param&gt;</div>
<div>&lt;!-- 对Spring容器进行实例化 --&gt;</div>
<div>&lt;listener&gt;</div>
<div>    &lt;listener-class&gt;org.springframework.web.context.contextLoaderListener&lt;/listener-class&gt;</div>
<div>&lt;/listener&gt;</div>
</blockquote>
<div><strong>在web容器中配置struts</strong></div>
<blockquote style="margin-right: 0px;" dir="ltr">
<div>&lt;servlet&gt;</div>
<div>    &lt;servlet-name&gt;struts&lt;/servlet-name&gt;</div>
<div>    &lt;servlet-class&gt;org.apache.struts.action.ActionServlet&lt;/servlet-class&gt;</div>
<div>    &lt;init-param&gt;</div>
<div>        &lt;param-name&gt;config&lt;/param-name&gt;</div>
<div>        &lt;param-value&gt;/WEB-INF/struts-config.xml&lt;/param-value&gt;</div>
<div>    &lt;/init-param&gt;</div>
<div>    &lt;load-on-startup&gt;0&lt;/load-on-startup&gt;</div>
<div>&lt;/servlet&gt;</div>
<div>&lt;servlet-mapping&gt;</div>
<div>    &lt;servlet-name&gt;struts&lt;/servlet-name&gt;</div>
<div>    &lt;url-pattern&gt;*.do&lt;/url-pattern&gt;</div>
<div>&lt;/servlet-mapping&gt;</div>
</blockquote>
<div> </div>
<div><strong>新建struts配置文件:struts-config.xml</strong></div>
<blockquote style="margin-right: 0px;" dir="ltr">
<div>&lt;?xml version="1.0" encoding="UTF-8"?&gt;</div>
<div>&lt;!DOCTYPE struts-config PUBLIC<br />
"-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"<br />
"http://struts.apache.org/dtds/struts-config_1_3.dtd"&gt;</div>
<div>&lt;struts-config&gt;<br />
&lt;/struts-config&gt;</div>
</blockquote>
<div><strong>创建action：PersonAction.java</strong></div>
<blockquote style="margin-right: 0px;" dir="ltr">
<div>public class PersonAction extends Action {</div>
<div> </div>
<div>    @Override<br />
    public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {<br />
        return super.execute(mapping, form, request, response);<br />
    }</div>
<div> </div>
<div>}</div>
</blockquote>
<div><strong>配置action，配置forward</strong></div>
<blockquote style="margin-right: 0px;" dir="ltr">
<div>&lt;action path="/person/list" type="cn.itcast.web.action.PersonAction" validate="false"&gt;<br />
    &lt;forward name="list" path="/WEB-INF/page/personlist.jsp" /&gt;<br />
&lt;/action&gt;</div>
</blockquote>
<div><strong>创建jsp:personlist.jsp</strong></div>
<blockquote style="margin-right: 0px;" dir="ltr">
<div>&lt;c:forEach items="${persons}" var="person"&gt;<br />
    ID=${person.id},name=${person.name}<br />
&lt;/c:forEach&gt;</div>
</blockquote>
<div dir="ltr"><strong>集成Struts的思路</strong></div>
<div>流程：请求--&gt;action-&gt;forward-&gt;jsp</div>
<div>action中调用service层的业务方法，处理请求，然后根据forward配置跳转到对应jsp</div>
<div><strong>上源码：</strong></div>
<div><strong>bean.xml</strong></div>
<blockquote style="margin-right: 0px;" dir="ltr">
<div>&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:context="http://www.springframework.org/schema/context"<br />
       xmlns:tx="http://www.springframework.org/schema/tx"<br />
       xmlns:aop="http://www.springframework.org/schema/aop"<br />
       xsi:schemaLocation="http://www.springframework.org/schema/beans<br />
       http://www.springframework.org/schema/beans/spring-beans-2.5.xsd<br />
       http://www.springframework.org/schema/tx<br />
       http://www.springframework.org/schema/tx/spring-tx-2.5.xsd<br />
       http://www.springframework.org/schema/aop<br />
       http://www.springframework.org/schema/aop/spring-aop-2.5.xsd<br />
       http://www.springframework.org/schema/context<br />
       http://www.springframework.org/schema/context/spring-context.xsd"&gt;<br />
    &lt;context:property-placeholder location="classpath:jdbc.properties"/&gt;<br />
    &lt;bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"&gt;<br />
        &lt;property name="driverClassName" value="${driverClassName}" /&gt;<br />
        &lt;property name="url" value="${url}" /&gt;<br />
        &lt;property name="username" value="${username}" /&gt;<br />
        &lt;property name="password" value="${password}"/&gt;<br />
        &lt;!-- 连接池启动时的初始值 --&gt;<br />
        &lt;property name="initialSize" value="${initialSize}" /&gt;<br />
        &lt;!-- 连接池的最大值 --&gt;<br />
        &lt;property name="maxActive" value="${maxActive}"/&gt;<br />
        &lt;!-- 最大空闲值.当经过一个高峰时间后，连接池可以慢慢将已经用不到的连接慢慢释放一部分，一直减少到maxIdle为止 --&gt;<br />
        &lt;property name="maxIdle" value="${maxIdle}"/&gt;<br />
        &lt;!-- 最小空闲值，当空闲的连接数少于阀值时，连接池就会去申请一些连接，以免洪峰来时来不及申请 --&gt;<br />
        &lt;property name="minIdle" value="${minIdle}" /&gt;<br />
    &lt;/bean&gt;<br />
    &lt;bean id = "sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"&gt;<br />
        &lt;property name="dataSource" ref="dataSource" /&gt;<br />
        &lt;property name="mappingResources"&gt;<br />
            &lt;list&gt;<br />
                &lt;value&gt;cn/itcast/bean/Person.hbm.xml&lt;/value&gt; &lt;!-- 可以有多个Hibernate实体bean的映射文件 --&gt;<br />
            &lt;/list&gt;<br />
        &lt;/property&gt;<br />
        &lt;property name="hibernateProperties"&gt;<br />
            &lt;value&gt;<br />
                hibernate.dialect=org.hibernate.dialect.MySQL5Dialect<br />
                hibernate.hbm2ddl.auto=update<br />
                hibernate.show_sql=false<br />
                hibernate.format_sql=false<br />
            &lt;/value&gt;<br />
        &lt;/property&gt;<br />
    &lt;/bean&gt;<br />
    &lt;!-- Spring 针对Hibernate提供的事务管理器 --&gt;<br />
    &lt;bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"&gt;<br />
        &lt;property name="sessionFactory" ref="sessionFactory"/&gt;<br />
    &lt;/bean&gt;<br />
    &lt;bean id="personService" class="cn.itcast.service.impl.PersonServiceBean" /&gt;<br />
    &lt;!-- 采用注解的方式进行事务声明 --&gt;<br />
    &lt;tx:annotation-driven transaction-manager="txManager"/&gt;<br />
    &lt;context:annotation-config/&gt;</div>
<div> </div>
<div>&lt;/beans&gt;</div>
</blockquote>
<div><strong>jdbc.properties</strong></div>
<blockquote style="margin-right: 0px;" dir="ltr">
<div># To change this template, choose Tools | Templates<br />
# and open the template in the editor.<br />
driverClassName =org.gjt.mm.mysql.Driver<br />
url=jdbc:mysql://localhost:3306/itcast?useUnicode=true&amp;characterEncoding=UTF-8<br />
username=root<br />
password=<br />
initialSize =1<br />
maxActive=500<br />
maxIdle=2<br />
minIdle=1</div>
</blockquote>
<div><strong>Person.hbm.xml</strong></div>
<blockquote style="margin-right: 0px;" dir="ltr">
<div>&lt;?xml version="1.0" encoding="UTF-8"?&gt;</div>
<div> </div>
<div>&lt;!--<br />
    Document : Person.hbm.xml<br />
    Created on : 2010年7月31日, 上午1:42<br />
    Author : kang.cunhua<br />
    Description:<br />
        Purpose of the document follows.<br />
--&gt;</div>
<div> </div>
<div>&lt;!DOCTYPE hibernate-mapping PUBLIC<br />
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"<br />
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"&gt;<br />
&lt;hibernate-mapping package="cn.itcast.bean"&gt;<br />
    &lt;class name="Person" table="person"&gt;<br />
        &lt;id name="id" type="integer"&gt;<br />
            &lt;generator class="native"/&gt;<br />
        &lt;/id&gt;<br />
        &lt;property name="name" length="10" not-null="true"/&gt;<br />
    &lt;/class&gt;<br />
&lt;/hibernate-mapping&gt;</div>
</blockquote>
<div><strong>Person.java</strong></div>
<blockquote style="margin-right: 0px;" dir="ltr">
<div>package cn.itcast.bean;</div>
<div> </div>
<div>/**<br />
 *<br />
 * @author kang.cunhua<br />
 */<br />
public class Person {</div>
<div> </div>
<div>    private Integer id;<br />
    private String name;</div>
<div> </div>
<div>    public Person() {<br />
    }</div>
<div> </div>
<div>    public Person(String name) {</div>
<div> </div>
<div>        this.name = name;<br />
    }</div>
<div> </div>
<div>    public Person(Integer id, String name) {<br />
        this.id = id;<br />
        this.name = name;<br />
    }</div>
<div> </div>
<div>    /**<br />
     * @return the id<br />
     */<br />
    public Integer getId() {<br />
        return id;<br />
    }</div>
<div> </div>
<div>    /**<br />
     * @param id the id to set<br />
     */<br />
    public void setId(Integer id) {<br />
        this.id = id;<br />
    }</div>
<div> </div>
<div>    /**<br />
     * @return the name<br />
     */<br />
    public String getName() {<br />
        return name;<br />
    }</div>
<div> </div>
<div>    /**<br />
     * @param name the name to set<br />
     */<br />
    public void setName(String name) {<br />
        this.name = name;<br />
    }<br />
}</div>
</blockquote>
<div><strong>PersonService.java</strong></div>
<blockquote style="margin-right: 0px;" dir="ltr">
<div>package cn.itcast.service;</div>
<div> </div>
<div>import cn.itcast.bean.Person;<br />
import java.util.List;</div>
<div> </div>
<div>/**<br />
 *<br />
 * @author kang.cunhua<br />
 */<br />
public interface PersonService {</div>
<div> </div>
<div>    /**<br />
     * 保存person<br />
     * @param person<br />
     */<br />
    public void save(Person person);</div>
<div> </div>
<div>    /**<br />
     * 更新person<br />
     * @param person<br />
     */<br />
    public void update(Person person);</div>
<div> </div>
<div>    /**<br />
     * 获取person<br />
     * @param personid<br />
     * @return<br />
     */<br />
    public Person getPerson(Integer personid);<br />
    /**<br />
     * 获取所有person<br />
     * @return<br />
     */<br />
    public List&lt;Person&gt; getPersons();<br />
    /**<br />
     * 删除指定id的person<br />
     * @param personid<br />
     */<br />
    public void delete (Integer personid);<br />
}</div>
</blockquote>
<div><strong>PersonServiceBean.java</strong></div>
<blockquote style="margin-right: 0px;" dir="ltr">
<div>package cn.itcast.service.impl;</div>
<div> </div>
<div>import cn.itcast.bean.Person;<br />
import cn.itcast.service.PersonService;<br />
import java.util.List;<br />
import javax.annotation.Resource;<br />
import org.hibernate.SessionFactory;<br />
import org.springframework.transaction.annotation.Propagation;</div>
<div> </div>
<div> </div>
<div>import org.springframework.transaction.annotation.Transactional;</div>
<div> </div>
<div>/**<br />
 *<br />
 * @author kang.cunhua<br />
 */<br />
@Transactional<br />
public class PersonServiceBean implements PersonService {</div>
<div> </div>
<div>    @Resource<br />
    private SessionFactory sessionFactory;</div>
<div> </div>
<div>    @Override<br />
    public void save(Person person) {<br />
        sessionFactory.getCurrentSession().persist(person);<br />
    }</div>
<div> </div>
<div>    @Override<br />
    public void update(Person person) {<br />
        sessionFactory.getCurrentSession().merge(person);<br />
    }</div>
<div> </div>
<div>    @Override<br />
    @Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)<br />
    public Person getPerson(Integer personid) {<br />
        return (Person) sessionFactory.getCurrentSession().get(Person.class, personid);</div>
<div> </div>
<div>    }</div>
<div> </div>
<div>    @Override<br />
    @Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)<br />
    public List&lt;Person&gt; getPersons() {</div>
<div> </div>
<div>        return sessionFactory.getCurrentSession().createQuery("from Person").list();<br />
    }</div>
<div> </div>
<div>    @Override<br />
    public void delete(Integer personid) {<br />
        sessionFactory.getCurrentSession().delete(<br />
                sessionFactory.getCurrentSession().load(Person.class, personid)<br />
                );<br />
    }<br />
}</div>
</blockquote>
<div><strong>-------以上源码和上一讲一样---------</strong></div>
<div><strong>web.xml</strong></div>
<blockquote style="margin-right: 0px;" dir="ltr">
<div>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"&gt;<br />
    &lt;session-config&gt;<br />
        &lt;session-timeout&gt;<br />
            30<br />
        &lt;/session-timeout&gt;<br />
    &lt;/session-config&gt;<br />
    &lt;!-- 配置Spring start --&gt;<br />
    &lt;context-param&gt;<br />
        &lt;param-name&gt;contextConfigLocation&lt;/param-name&gt;<br />
        &lt;param-value&gt;classpath:beans.xml&lt;/param-value&gt;<br />
    &lt;/context-param&gt;<br />
    &lt;!-- 对Spring容器进行实例化 --&gt;<br />
    &lt;listener&gt;<br />
        &lt;listener-class&gt;org.springframework.web.context.ContextLoaderListener&lt;/listener-class&gt;</div>
<div> </div>
<div> </div>
<div>    &lt;/listener&gt;<br />
    &lt;!-- 配置Spring end --&gt;<br />
    &lt;!-- 配置Struts start --&gt;<br />
    &lt;servlet&gt;<br />
        &lt;servlet-name&gt;struts&lt;/servlet-name&gt;<br />
        &lt;servlet-class&gt;org.apache.struts.action.ActionServlet&lt;/servlet-class&gt;<br />
        &lt;init-param&gt;<br />
            &lt;param-name&gt;config&lt;/param-name&gt;<br />
            &lt;param-value&gt;/WEB-INF/struts-config.xml&lt;/param-value&gt;<br />
        &lt;/init-param&gt;<br />
        &lt;load-on-startup&gt;0&lt;/load-on-startup&gt;<br />
    &lt;/servlet&gt;<br />
    &lt;servlet-mapping&gt;<br />
        &lt;servlet-name&gt;struts&lt;/servlet-name&gt;<br />
        &lt;url-pattern&gt;*.do&lt;/url-pattern&gt;<br />
    &lt;/servlet-mapping&gt;<br />
    &lt;!-- 配置Struts end --&gt;</div>
<div> </div>
<div>    &lt;welcome-file-list&gt;<br />
        &lt;welcome-file&gt;index.jsp&lt;/welcome-file&gt;<br />
    &lt;/welcome-file-list&gt;<br />
&lt;/web-app&gt;</div>
</blockquote>
<div><strong>struts-config.xml</strong></div>
<blockquote style="margin-right: 0px;" dir="ltr">
<div>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;!DOCTYPE struts-config PUBLIC<br />
"-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"<br />
"http://struts.apache.org/dtds/struts-config_1_3.dtd"&gt;</div>
<div> </div>
<div>&lt;struts-config&gt;<br />
    &lt;action-mappings&gt;<br />
        &lt;action path="/person/list" type="cn.itcast.web.action.PersonAction" validate="false"&gt;<br />
            &lt;forward name="list" path="/WEB-INF/page/personlist.jsp" /&gt;<br />
        &lt;/action&gt;<br />
    &lt;/action-mappings&gt;<br />
&lt;/struts-config&gt;</div>
</blockquote>
<div><strong>PersonAction.java</strong></div>
<blockquote style="margin-right: 0px;" dir="ltr">
<div>package cn.itcast.web.action;</div>
<div> </div>
<div>import cn.itcast.service.PersonService;<br />
import javax.servlet.http.HttpServletRequest;<br />
import javax.servlet.http.HttpServletResponse;<br />
import org.apache.struts.action.Action;<br />
import org.apache.struts.action.ActionForm;<br />
import org.apache.struts.action.ActionForward;<br />
import org.apache.struts.action.ActionMapping;<br />
import org.springframework.web.context.WebApplicationContext;<br />
import org.springframework.web.context.support.WebApplicationContextUtils;</div>
<div> </div>
<div>/**<br />
 *<br />
 * @author kang.cunhua<br />
 */<br />
public class PersonAction extends Action {</div>
<div> </div>
<div>    @Override<br />
    public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {<br />
        WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(this.getServlet().getServletContext());<br />
        PersonService personService = (PersonService) ctx.getBean("personService");<br />
        request.setAttribute("persons", personService.getPersons());<br />
        return mapping.findForward("list");<br />
    }</div>
<div> </div>
<div>}</div>
</blockquote>
<div><strong>personlist.jsp (</strong>/WEB-INF/page/personlist.jsp<strong>)</strong></div>
<blockquote style="margin-right: 0px;" dir="ltr">
<div>&lt;%-- <br />
    Document : personlist<br />
    Created on : 2010-8-5, 16:40:59<br />
    Author : kang.cunhua<br />
--%&gt;</div>
<div> </div>
<div>&lt;%@page language="java" import="java.util.*" contentType="text/html" pageEncoding="UTF-8"%&gt;<br />
&lt;%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %&gt;<br />
&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"<br />
   "http://www.w3.org/TR/html4/loose.dtd"&gt;</div>
<div> </div>
<div>&lt;html&gt;<br />
    &lt;head&gt;<br />
        &lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"&gt;<br />
        &lt;title&gt;list&lt;/title&gt;<br />
    &lt;/head&gt;<br />
    &lt;body&gt;<br />
        &lt;h1&gt;列出所有人的list!&lt;/h1&gt;<br />
        &lt;c:forEach items="${persons}" var="person"&gt;<br />
            ID=${person.id},name=${person.name}<br />
        &lt;/c:forEach&gt;<br />
    &lt;/body&gt;<br />
&lt;/html&gt;</div>
</blockquote>
<div dir="ltr"><strong>首页：index.jsp</strong></div>
<blockquote style="margin-right: 0px;" dir="ltr">
<div>&lt;%-- <br />
    Document : index<br />
    Created on : 2010-7-31, 0:21:03<br />
    Author : kang.cunhua<br />
--%&gt;</div>
<div> </div>
<div>&lt;%@page contentType="text/html" pageEncoding="UTF-8"%&gt;<br />
&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"<br />
   "http://www.w3.org/TR/html4/loose.dtd"&gt;</div>
<div> </div>
<div>&lt;html&gt;<br />
    &lt;head&gt;<br />
        &lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"&gt;<br />
        &lt;title&gt;JSP Page&lt;/title&gt;<br />
    &lt;/head&gt;<br />
    &lt;body&gt;<br />
        &lt;h1&gt;Hello SSH's World!&lt;/h1&gt;<br />
        &lt;a href="person/list.do"&gt;PersonList&lt;/a&gt;<br />
    &lt;/body&gt;<br />
&lt;/html&gt;</div>
</blockquote>
<div><strong>题外话：</strong></div>
<div>此处我如果给PersonServiceBean采用注解（@Resource）的方式注入sessionFaction的话（以上代码），就会报JMS错误，但不影响结果；</div>
<div>采用xml方式注入，就不会报错；</div>
<div>我采用环境的是JDK6+netbeans6.8+glassfish2；</div>
<div><strong>报错如下：</strong></div>
<blockquote style="margin-right: 0px;" dir="ltr">
<div>deployed with moduleid = DemoSSH<br />
NAM0006: 未找到 JMS 目标对象: cn.itcast.service.impl.PersonServiceBean/sessionFactory<br />
javax.naming.NameNotFoundException<br />
javax.naming.NameNotFoundException<br />
        at com.sun.enterprise.naming.TransientContext.resolveContext(TransientContext.java:268)<br />
        at com.sun.enterprise.naming.TransientContext.lookup(TransientContext.java:191)<br />
        at com.sun.enterprise.naming.SerialContextProviderImpl.lookup(SerialContextProviderImpl.java:74)<br />
        at com.sun.enterprise.naming.LocalSerialContextProviderImpl.lookup(LocalSerialContextProviderImpl.java:111)<br />
        at com.sun.enterprise.naming.SerialContext.lookup(SerialContext.java:409)<br />
        at javax.naming.InitialContext.lookup(InitialContext.java:392)<br />
        at com.sun.enterprise.naming.NamingManagerImpl.bindObjects(NamingManagerImpl.java:391)<br />
        at com.sun.enterprise.web.WebModuleContextConfig.configureResource(WebModuleContextConfig.java:228)<br />
        at com.sun.enterprise.web.WebModuleContextConfig.lifecycleEvent(WebModuleContextConfig.java:164)<br />
        at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:159)<br />
        at org.apache.catalina.core.StandardContext.start(StandardContext.java:5276)<br />
        at com.sun.enterprise.web.WebModule.start(WebModule.java:345)<br />
        at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:986)<br />
        at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:970)<br />
        at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:704)<br />
        at com.sun.enterprise.web.WebContainer.loadWebModule(WebContainer.java:1649)<br />
        at com.sun.enterprise.web.WebContainer.loadWebModule(WebContainer.java:1254)<br />
        at com.sun.enterprise.server.WebModuleDeployEventListener.moduleDeployed(WebModuleDeployEventListener.java:182)<br />
        at com.sun.enterprise.server.WebModuleDeployEventListener.moduleDeployed(WebModuleDeployEventListener.java:278)<br />
        at com.sun.enterprise.admin.event.AdminEventMulticaster.invokeModuleDeployEventListener(AdminEventMulticaster.java:1005)<br />
        at com.sun.enterprise.admin.event.AdminEventMulticaster.handleModuleDeployEvent(AdminEventMulticaster.java:992)<br />
        at com.sun.enterprise.admin.event.AdminEventMulticaster.processEvent(AdminEventMulticaster.java:470)<br />
        at com.sun.enterprise.admin.event.AdminEventMulticaster.multicastEvent(AdminEventMulticaster.java:182)<br />
        at com.sun.enterprise.admin.server.core.DeploymentNotificationHelper.multicastEvent(DeploymentNotificationHelper.java:308)<br />
        at com.sun.enterprise.deployment.phasing.DeploymentServiceUtils.multicastEvent(DeploymentServiceUtils.java:231)<br />
        at com.sun.enterprise.deployment.phasing.ServerDeploymentTarget.sendStartEvent(ServerDeploymentTarget.java:298)<br />
        at com.sun.enterprise.deployment.phasing.ApplicationStartPhase.runPhase(ApplicationStartPhase.java:132)<br />
        at com.sun.enterprise.deployment.phasing.DeploymentPhase.executePhase(DeploymentPhase.java:108)<br />
        at com.sun.enterprise.deployment.phasing.PEDeploymentService.executePhases(PEDeploymentService.java:966)<br />
        at com.sun.enterprise.deployment.phasing.PEDeploymentService.start(PEDeploymentService.java:609)<br />
        at com.sun.enterprise.deployment.phasing.PEDeploymentService.start(PEDeploymentService.java:653)<br />
        at com.sun.enterprise.admin.mbeans.ApplicationsConfigMBean.start(ApplicationsConfigMBean.java:773)<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:597)<br />
        at com.sun.enterprise.admin.MBeanHelper.invokeOperationInBean(MBeanHelper.java:390)<br />
        at com.sun.enterprise.admin.MBeanHelper.invokeOperationInBean(MBeanHelper.java:373)<br />
        at com.sun.enterprise.admin.config.BaseConfigMBean.invoke(BaseConfigMBean.java:477)<br />
        at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:836)<br />
        at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:761)<br />
        at sun.reflect.GeneratedMethodAccessor13.invoke(Unknown Source)<br />
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)<br />
        at java.lang.reflect.Method.invoke(Method.java:597)<br />
        at com.sun.enterprise.admin.util.proxy.ProxyClass.invoke(ProxyClass.java:90)<br />
        at $Proxy1.invoke(Unknown Source)<br />
        at com.sun.enterprise.admin.server.core.jmx.SunoneInterceptor.invoke(SunoneInterceptor.java:304)<br />
        at com.sun.enterprise.interceptor.DynamicInterceptor.invoke(DynamicInterceptor.java:170)<br />
        at com.sun.enterprise.admin.jmx.remote.server.callers.InvokeCaller.call(InvokeCaller.java:69)<br />
        at com.sun.enterprise.admin.jmx.remote.server.MBeanServerRequestHandler.handle(MBeanServerRequestHandler.java:155)<br />
        at com.sun.enterprise.admin.jmx.remote.server.servlet.RemoteJmxConnectorServlet.processRequest(RemoteJmxConnectorServlet.java:122)<br />
        at com.sun.enterprise.admin.jmx.remote.server.servlet.RemoteJmxConnectorServlet.doPost(RemoteJmxConnectorServlet.java:193)<br />
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:754)<br />
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:847)<br />
        at org.apache.catalina.core.ApplicationFilterChain.servletService(ApplicationFilterChain.java:427)<br />
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:315)<br />
        at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:287)<br />
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:218)<br />
        at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:648)<br />
        at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593)<br />
        at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:94)<br />
        at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:98)<br />
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:222)<br />
        at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:648)<br />
        at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593)<br />
        at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:587)<br />
        at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1093)<br />
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:166)<br />
        at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:648)<br />
        at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593)<br />
        at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:587)<br />
        at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1093)<br />
        at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:291)<br />
        at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.invokeAdapter(DefaultProcessorTask.java:666)<br />
        at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.doProcess(DefaultProcessorTask.java:597)<br />
        at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.process(DefaultProcessorTask.java:872)<br />
        at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.executeProcessorTask(DefaultReadTask.java:341)<br />
        at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:263)<br />
        at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:214)<br />
        at com.sun.enterprise.web.connector.grizzly.TaskBase.run(TaskBase.java:264)<br />
        at com.sun.enterprise.web.connector.grizzly.WorkerThreadImpl.run(WorkerThreadImpl.java:117)<br />
log4j:WARN No appenders could be found for logger (org.springframework.core.CollectionFactory).<br />
log4j:WARN Please initialize the log4j system properly.<br />
PWC1412：WebModule[/DemoSSH] ServletContext.log():Initializing Spring root WebApplicationContext</div>
</blockquote>
<div><strong>xml方式注入：</strong></div>
<div><strong>xml文件：beans.xml</strong></div>
<blockquote style="margin-right: 0px;" dir="ltr">
<div>&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:context="http://www.springframework.org/schema/context"<br />
       xmlns:tx="http://www.springframework.org/schema/tx"<br />
       xmlns:aop="http://www.springframework.org/schema/aop"<br />
       xsi:schemaLocation="http://www.springframework.org/schema/beans<br />
       http://www.springframework.org/schema/beans/spring-beans-2.5.xsd<br />
       http://www.springframework.org/schema/tx<br />
       http://www.springframework.org/schema/tx/spring-tx-2.5.xsd<br />
       http://www.springframework.org/schema/aop<br />
       http://www.springframework.org/schema/aop/spring-aop-2.5.xsd<br />
       http://www.springframework.org/schema/context<br />
       http://www.springframework.org/schema/context/spring-context.xsd"&gt;<br />
    &lt;context:property-placeholder location="classpath:jdbc.properties"/&gt;<br />
    &lt;bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"&gt;<br />
        &lt;property name="driverClassName" value="${driverClassName}" /&gt;<br />
        &lt;property name="url" value="${url}" /&gt;<br />
        &lt;property name="username" value="${username}" /&gt;<br />
        &lt;property name="password" value="${password}"/&gt;<br />
        &lt;!-- 连接池启动时的初始值 --&gt;<br />
        &lt;property name="initialSize" value="${initialSize}" /&gt;<br />
        &lt;!-- 连接池的最大值 --&gt;<br />
        &lt;property name="maxActive" value="${maxActive}"/&gt;<br />
        &lt;!-- 最大空闲值.当经过一个高峰时间后，连接池可以慢慢将已经用不到的连接慢慢释放一部分，一直减少到maxIdle为止 --&gt;<br />
        &lt;property name="maxIdle" value="${maxIdle}"/&gt;<br />
        &lt;!-- 最小空闲值，当空闲的连接数少于阀值时，连接池就会去申请一些连接，以免洪峰来时来不及申请 --&gt;<br />
        &lt;property name="minIdle" value="${minIdle}" /&gt;<br />
    &lt;/bean&gt;<br />
    &lt;bean id = "sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"&gt;<br />
        &lt;property name="dataSource" ref="dataSource" /&gt;<br />
        &lt;property name="mappingResources"&gt;<br />
            &lt;list&gt;<br />
                &lt;value&gt;cn/itcast/bean/Person.hbm.xml&lt;/value&gt; &lt;!-- 可以有多个Hibernate实体bean的映射文件 --&gt;<br />
            &lt;/list&gt;<br />
        &lt;/property&gt;<br />
        &lt;property name="hibernateProperties"&gt;<br />
            &lt;value&gt;<br />
                hibernate.dialect=org.hibernate.dialect.MySQL5Dialect<br />
                hibernate.hbm2ddl.auto=update<br />
                hibernate.show_sql=false<br />
                hibernate.format_sql=false<br />
            &lt;/value&gt;<br />
        &lt;/property&gt;<br />
    &lt;/bean&gt;<br />
    &lt;!-- Spring 针对Hibernate提供的事务管理器 --&gt;<br />
    &lt;bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"&gt;<br />
        &lt;property name="sessionFactory" ref="sessionFactory"/&gt;<br />
    &lt;/bean&gt;<br />
    &lt;bean id="personService" class="cn.itcast.service.impl.PersonServiceBean" &gt;<br />
        &lt;property name="sessionFactory" ref="sessionFactory"/&gt;<br />
    &lt;/bean&gt;<br />
    &lt;bean id="personList" class="cn.itcast.web.action.PersonAction"/&gt;<br />
    &lt;!-- 采用注解的方式进行事务声明 --&gt;<br />
    &lt;tx:annotation-driven transaction-manager="txManager"/&gt;<br />
    &lt;context:annotation-config/&gt;</div>
<div> </div>
<div>&lt;/beans&gt;</div>
</blockquote>
<div><strong>PersonServiceBean.java</strong></div>
<div> </div>
<blockquote style="margin-right: 0px;" dir="ltr">
<div>package cn.itcast.service.impl;</div>
<div> </div>
<div>import cn.itcast.bean.Person;<br />
import cn.itcast.service.PersonService;<br />
import java.util.List;<br />
import org.hibernate.SessionFactory;<br />
import org.springframework.transaction.annotation.Propagation;</div>
<div> </div>
<div> </div>
<div>import org.springframework.transaction.annotation.Transactional;</div>
<div> </div>
<div>/**<br />
 *<br />
 * @author kang.cunhua<br />
 */<br />
@Transactional<br />
public class PersonServiceBean implements PersonService {</div>
<div> </div>
<div> </div>
<div>    private SessionFactory sessionFactory;</div>
<div> </div>
<div>    @Override<br />
    public void save(Person person) {<br />
        getSessionFactory().getCurrentSession().persist(person);<br />
    }</div>
<div> </div>
<div>    @Override<br />
    public void update(Person person) {<br />
        getSessionFactory().getCurrentSession().merge(person);<br />
    }</div>
<div> </div>
<div>    @Override<br />
    @Transactional(propagation = Propagation.NOT_SUPPORTED, readOnly = true)<br />
    public Person getPerson(Integer personid) {<br />
        return (Person) getSessionFactory().getCurrentSession().get(Person.class, personid);</div>
<div> </div>
<div>    }</div>
<div> </div>
<div>    @Override<br />
    @Transactional(propagation = Propagation.NOT_SUPPORTED, readOnly = true)<br />
    public List&lt;Person&gt; getPersons() {</div>
<div> </div>
<div>        return getSessionFactory().getCurrentSession().createQuery("from Person").list();<br />
    }</div>
<div> </div>
<div>    @Override<br />
    public void delete(Integer personid) {<br />
        getSessionFactory().getCurrentSession().delete(<br />
                getSessionFactory().getCurrentSession().load(Person.class, personid));<br />
    }</div>
<div> </div>
<div>    /**<br />
     * @return the sessionFactory<br />
     */<br />
    public SessionFactory getSessionFactory() {<br />
        return sessionFactory;<br />
    }</div>
<div> </div>
<div>    /**<br />
     * @param sessionFactory the sessionFactory to set<br />
     */<br />
    public void setSessionFactory(SessionFactory sessionFactory) {<br />
        this.sessionFactory = sessionFactory;<br />
    }<br />
}</div>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.guloulou.com/?feed=rss2&amp;p=1991</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>26_传智播客Spring2.5视频教程_Spring集成的Hibernate编码与测试</title>
		<link>http://www.guloulou.com/?p=1985</link>
		<comments>http://www.guloulou.com/?p=1985#comments</comments>
		<pubDate>Wed, 04 Aug 2010 18:42:09 +0000</pubDate>
		<dc:creator>guloulou</dc:creator>
				<category><![CDATA[传智播客Spring2.5自学笔记]]></category>
		<category><![CDATA[annotation-config]]></category>
		<category><![CDATA[annotation-driven]]></category>
		<category><![CDATA[HibernateTransactionManager]]></category>
		<category><![CDATA[junit4]]></category>
		<category><![CDATA[LocalSessionFactoryBean]]></category>
		<category><![CDATA[sessionFactory.getCurrentSession().createQuery]]></category>
		<category><![CDATA[sessionFactory.getCurrentSession().delete]]></category>
		<category><![CDATA[sessionFactory.getCurrentSession().get]]></category>
		<category><![CDATA[sessionFactory.getCurrentSession().load]]></category>
		<category><![CDATA[sessionFactory.getCurrentSession().merge]]></category>
		<category><![CDATA[setUpBeforeClass()]]></category>
		<category><![CDATA[传智播客]]></category>
		<category><![CDATA[传智播客Hibernate自学笔记]]></category>
		<category><![CDATA[黎活明]]></category>

		<guid isPermaLink="false">http://www.guloulou.com/?p=1985</guid>
		<description><![CDATA[26_传智播客Spring2.5视频教程_Spring集成的Hibernate编码与测试
 
开发完业务方法，一定要进行单元测试；
junit4中setUpBeforeClass()方法是可以在单元测试实例被构建出来之后，就先执行的方法。我们... ]]></description>
			<content:encoded><![CDATA[<div id="WizHtmlContentId">26_传智播客Spring2.5视频教程_Spring集成的Hibernate编码与测试</div>
<div> </div>
<div><strong>开发完业务方法，一定要进行单元测试；</strong></div>
<div>junit4中setUpBeforeClass()方法是可以在单元测试实例被构建出来之后，就先执行的方法。我们可以在这个方法中做一些初始化操作；</div>
<div> </div>
<div><strong>实体bean必须要保留默认构造函数（没有参数的）；</strong></div>
<div>bean.xml中配置 <strong>hibernate.hbm2ddl.auto=update</strong> 可以根据配置的元数据自动生成表</div>
<div>--------</div>
<div>单元测试后，确定业务层没有问题，就可以进行struts的集成了；<br />
------------</div>
<div><strong>强烈建议</strong>有兴趣的童鞋自行对照视频学习；个人笔力所限，不能尽显黎活明老师所讲解的开发思想；个人学习这套视频受益匪浅！</div>
<div><strong>给出源码：</strong></div>
<div><strong>beans.xml</strong></div>
<blockquote style="margin-right: 0px;" dir="ltr">
<div>&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:context="http://www.springframework.org/schema/context"<br />
       xmlns:tx="http://www.springframework.org/schema/tx"<br />
       xmlns:aop="http://www.springframework.org/schema/aop"<br />
       xsi:schemaLocation="http://www.springframework.org/schema/beans<br />
       http://www.springframework.org/schema/beans/spring-beans-2.5.xsd<br />
       http://www.springframework.org/schema/tx<br />
       http://www.springframework.org/schema/tx/spring-tx-2.5.xsd<br />
       http://www.springframework.org/schema/aop<br />
       http://www.springframework.org/schema/aop/spring-aop-2.5.xsd<br />
       http://www.springframework.org/schema/context<br />
       http://www.springframework.org/schema/context/spring-context.xsd"&gt;<br />
    &lt;context:property-placeholder location="classpath:jdbc.properties"/&gt;<br />
    &lt;bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"&gt;<br />
        &lt;property name="driverClassName" value="${driverClassName}" /&gt;<br />
        &lt;property name="url" value="${url}" /&gt;<br />
        &lt;property name="username" value="${username}" /&gt;<br />
        &lt;property name="password" value="${password}"/&gt;<br />
        &lt;!-- 连接池启动时的初始值 --&gt;<br />
        &lt;property name="initialSize" value="${initialSize}" /&gt;<br />
        &lt;!-- 连接池的最大值 --&gt;<br />
        &lt;property name="maxActive" value="${maxActive}"/&gt;<br />
        &lt;!-- 最大空闲值.当经过一个高峰时间后，连接池可以慢慢将已经用不到的连接慢慢释放一部分，一直减少到maxIdle为止 --&gt;<br />
        &lt;property name="maxIdle" value="${maxIdle}"/&gt;<br />
        &lt;!-- 最小空闲值，当空闲的连接数少于阀值时，连接池就会去申请一些连接，以免洪峰来时来不及申请 --&gt;<br />
        &lt;property name="minIdle" value="${minIdle}" /&gt;<br />
    &lt;/bean&gt;<br />
    &lt;bean id = "sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"&gt;<br />
        &lt;property name="dataSource" ref="dataSource" /&gt;<br />
        &lt;property name="mappingResources"&gt;<br />
            &lt;list&gt;<br />
                &lt;value&gt;cn/itcast/bean/Person.hbm.xml&lt;/value&gt; &lt;!-- 可以有多个Hibernate实体bean的映射文件 --&gt;<br />
            &lt;/list&gt;<br />
        &lt;/property&gt;<br />
        &lt;property name="hibernateProperties"&gt;<br />
            &lt;value&gt;<br />
                hibernate.dialect=org.hibernate.dialect.MySQL5Dialect<br />
                hibernate.hbm2ddl.auto=update<br />
                hibernate.show_sql=false<br />
                hibernate.format_sql=false<br />
            &lt;/value&gt;<br />
        &lt;/property&gt;<br />
    &lt;/bean&gt;<br />
    &lt;!-- Spring 针对Hibernate提供的事务管理器 --&gt;<br />
    &lt;bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"&gt;<br />
        &lt;property name="sessionFactory" ref="sessionFactory"/&gt;<br />
    &lt;/bean&gt;<br />
    &lt;bean id="personService" class="cn.itcast.service.impl.PersonServiceBean" /&gt;<br />
    &lt;!-- 采用注解的方式进行事务声明 --&gt;<br />
    &lt;tx:annotation-driven transaction-manager="txManager"/&gt;<br />
    &lt;context:annotation-config/&gt;</div>
<div> </div>
<div>&lt;/beans&gt;</div>
</blockquote>
<div dir="ltr"><strong>jdbc.properties</strong></div>
<blockquote style="margin-right: 0px;" dir="ltr">
<div dir="ltr"># To change this template, choose Tools | Templates<br />
# and open the template in the editor.<br />
driverClassName =org.gjt.mm.mysql.Driver<br />
url=jdbc:mysql://localhost:3306/itcast?useUnicode=true&amp;characterEncoding=UTF-8<br />
username=root<br />
password=<br />
initialSize =1<br />
maxActive=500<br />
maxIdle=2<br />
minIdle=1</div>
</blockquote>
<div dir="ltr"><strong>Person.hbm.xml</strong></div>
<blockquote style="margin-right: 0px;" dir="ltr">
<div dir="ltr">&lt;?xml version="1.0" encoding="UTF-8"?&gt;</div>
<div dir="ltr"> </div>
<div dir="ltr">&lt;!--<br />
    Document : Person.hbm.xml<br />
    Created on : 2010年7月31日, 上午1:42<br />
    Author : kang.cunhua<br />
    Description:<br />
        Purpose of the document follows.<br />
--&gt;</div>
<div dir="ltr"> </div>
<div dir="ltr">&lt;!DOCTYPE hibernate-mapping PUBLIC<br />
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"<br />
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"&gt;<br />
&lt;hibernate-mapping package="cn.itcast.bean"&gt;<br />
    &lt;class name="Person" table="person"&gt;<br />
        &lt;id name="id" type="integer"&gt;<br />
            &lt;generator class="native"/&gt;<br />
        &lt;/id&gt;<br />
        &lt;property name="name" length="10" not-null="true"/&gt;<br />
    &lt;/class&gt;<br />
&lt;/hibernate-mapping&gt;</div>
</blockquote>
<div dir="ltr"><strong>Person.java</strong></div>
<blockquote style="margin-right: 0px;" dir="ltr">
<div dir="ltr">package cn.itcast.bean;</div>
<div dir="ltr"> </div>
<div dir="ltr">/**<br />
 *<br />
 * @author kang.cunhua<br />
 */<br />
public class Person {</div>
<div dir="ltr"> </div>
<div dir="ltr">    private Integer id;<br />
    private String name;</div>
<div dir="ltr"> </div>
<div dir="ltr">    public Person() {<br />
    }</div>
<div dir="ltr"> </div>
<div dir="ltr">    public Person(String name) {</div>
<div dir="ltr"> </div>
<div dir="ltr">        this.name = name;<br />
    }</div>
<div dir="ltr"> </div>
<div dir="ltr">    public Person(Integer id, String name) {<br />
        this.id = id;<br />
        this.name = name;<br />
    }</div>
<div dir="ltr"> </div>
<div dir="ltr">    /**<br />
     * @return the id<br />
     */<br />
    public Integer getId() {<br />
        return id;<br />
    }</div>
<div dir="ltr"> </div>
<div dir="ltr">    /**<br />
     * @param id the id to set<br />
     */<br />
    public void setId(Integer id) {<br />
        this.id = id;<br />
    }</div>
<div dir="ltr"> </div>
<div dir="ltr">    /**<br />
     * @return the name<br />
     */<br />
    public String getName() {<br />
        return name;<br />
    }</div>
<div dir="ltr"> </div>
<div dir="ltr">    /**<br />
     * @param name the name to set<br />
     */<br />
    public void setName(String name) {<br />
        this.name = name;<br />
    }<br />
}</div>
</blockquote>
<div dir="ltr"><strong>PersonService.java</strong></div>
<blockquote style="margin-right: 0px;" dir="ltr">
<div dir="ltr">package cn.itcast.service;</div>
<div dir="ltr"> </div>
<div dir="ltr">import cn.itcast.bean.Person;<br />
import java.util.List;</div>
<div dir="ltr"> </div>
<div dir="ltr">/**<br />
 *<br />
 * @author kang.cunhua<br />
 */<br />
public interface PersonService {</div>
<div dir="ltr"> </div>
<div dir="ltr">    /**<br />
     * 保存person<br />
     * @param person<br />
     */<br />
    public void save(Person person);</div>
<div dir="ltr"> </div>
<div dir="ltr">    /**<br />
     * 更新person<br />
     * @param person<br />
     */<br />
    public void update(Person person);</div>
<div dir="ltr"> </div>
<div dir="ltr">    /**<br />
     * 获取person<br />
     * @param personid<br />
     * @return<br />
     */<br />
    public Person getPerson(Integer personid);<br />
    /**<br />
     * 获取所有person<br />
     * @return<br />
     */<br />
    public List&lt;Person&gt; getPersons();<br />
    /**<br />
     * 删除指定id的person<br />
     * @param personid<br />
     */<br />
    public void delete (Integer personid);<br />
}</div>
</blockquote>
<div dir="ltr"><strong>PersonServiceBean.java</strong></div>
<blockquote style="margin-right: 0px;" dir="ltr">
<div dir="ltr">package cn.itcast.service.impl;</div>
<div dir="ltr"> </div>
<div dir="ltr">import cn.itcast.bean.Person;<br />
import cn.itcast.service.PersonService;<br />
import java.util.List;<br />
import javax.annotation.Resource;<br />
import org.hibernate.SessionFactory;<br />
import org.springframework.transaction.annotation.Propagation;</div>
<div dir="ltr"> </div>
<div dir="ltr"> </div>
<div dir="ltr">import org.springframework.transaction.annotation.Transactional;</div>
<div dir="ltr"> </div>
<div dir="ltr">/**<br />
 *<br />
 * @author kang.cunhua<br />
 */<br />
@Transactional<br />
public class PersonServiceBean implements PersonService {</div>
<div dir="ltr"> </div>
<div dir="ltr">    @Resource<br />
    private SessionFactory sessionFactory;</div>
<div dir="ltr"> </div>
<div dir="ltr">    @Override<br />
    public void save(Person person) {<br />
        sessionFactory.getCurrentSession().persist(person);<br />
    }</div>
<div dir="ltr"> </div>
<div dir="ltr">    @Override<br />
    public void update(Person person) {<br />
        sessionFactory.getCurrentSession().merge(person);<br />
    }</div>
<div dir="ltr"> </div>
<div dir="ltr">    @Override<br />
    @Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)<br />
    public Person getPerson(Integer personid) {<br />
        return (Person) sessionFactory.getCurrentSession().get(Person.class, personid);</div>
<div dir="ltr"> </div>
<div dir="ltr">    }</div>
<div dir="ltr"> </div>
<div dir="ltr">    @Override<br />
    @Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)<br />
    public List&lt;Person&gt; getPersons() {</div>
<div dir="ltr"> </div>
<div dir="ltr">        return sessionFactory.getCurrentSession().createQuery("from Person").list();<br />
    }</div>
<div dir="ltr"> </div>
<div dir="ltr">    @Override<br />
    public void delete(Integer personid) {<br />
        sessionFactory.getCurrentSession().delete(<br />
                sessionFactory.getCurrentSession().load(Person.class, personid)<br />
                );<br />
    }<br />
}</div>
</blockquote>
<div dir="ltr">单元测试：</div>
<div dir="ltr"><strong>PersonServiceBeanTest.java</strong></div>
<blockquote style="margin-right: 0px;" dir="ltr">
<div dir="ltr">/*<br />
 * To change this template, choose Tools | Templates<br />
 * and open the template in the editor.<br />
 */</div>
<div dir="ltr"> </div>
<div dir="ltr">package cn.itcast.service.impl;</div>
<div dir="ltr"> </div>
<div dir="ltr">import cn.itcast.bean.Person;<br />
import cn.itcast.service.PersonService;<br />
import java.util.List;<br />
import org.junit.After;<br />
import org.junit.AfterClass;<br />
import org.junit.Before;<br />
import org.junit.BeforeClass;<br />
import org.junit.Test;<br />
import org.springframework.beans.BeansException;<br />
import org.springframework.context.ApplicationContext;<br />
import org.springframework.context.support.ClassPathXmlApplicationContext;</div>
<div dir="ltr"> </div>
<div dir="ltr">/**<br />
 *<br />
 * @author kang.cunhua<br />
 */<br />
public class PersonServiceBeanTest {<br />
    private static PersonService personService;</div>
<div dir="ltr"> </div>
<div dir="ltr">    public PersonServiceBeanTest() {<br />
    }</div>
<div dir="ltr"> </div>
<div dir="ltr">    @BeforeClass<br />
    public static void setUpClass() throws Exception {<br />
        try {<br />
            ApplicationContext cxt = new ClassPathXmlApplicationContext("beans.xml");<br />
            personService = (PersonService) cxt.getBean("personService");<br />
        } catch (BeansException beansException) {<br />
            beansException.printStackTrace();<br />
        }<br />
    }</div>
<div dir="ltr"> </div>
<div dir="ltr">    @AfterClass<br />
    public static void tearDownClass() throws Exception {<br />
    }</div>
<div dir="ltr"> </div>
<div dir="ltr">    @Before<br />
    public void setUp() {<br />
    }</div>
<div dir="ltr"> </div>
<div dir="ltr">    @After<br />
    public void tearDown() {<br />
    }</div>
<div dir="ltr"> </div>
<div dir="ltr">    /**<br />
     * Test of save method, of class PersonServiceBean.<br />
     */<br />
    @Test<br />
    public void testSave() {<br />
        System.out.println("save");<br />
        personService.save(new Person("小张"));</div>
<div dir="ltr"> </div>
<div dir="ltr">    }</div>
<div dir="ltr"> </div>
<div dir="ltr">    /**<br />
     * Test of update method, of class PersonServiceBean.<br />
     */<br />
    @Test<br />
    public void testUpdate() {<br />
        System.out.println("update");<br />
        Person person = personService.getPerson(1);<br />
        person.setName("小丽");<br />
        personService.update(person);</div>
<div dir="ltr"> </div>
<div dir="ltr"> </div>
<div dir="ltr">    }</div>
<div dir="ltr"> </div>
<div dir="ltr">    /**<br />
     * Test of getPerson method, of class PersonServiceBean.<br />
     */<br />
    @Test<br />
    public void testGetPerson() {<br />
        System.out.println("getPerson");<br />
        Person person = personService.getPerson(1);<br />
        System.out.println("person:" + person.getName());</div>
<div dir="ltr"> </div>
<div dir="ltr">    }</div>
<div dir="ltr"> </div>
<div dir="ltr">    /**<br />
     * Test of getPersons method, of class PersonServiceBean.<br />
     */<br />
    @Test<br />
    public void testGetPersons() {<br />
        System.out.println("getPersons");<br />
        List &lt;Person&gt; persons = personService.getPersons();<br />
        for(Person person:persons){<br />
            System.out.println("person:" + person.getName());<br />
        }</div>
<div dir="ltr"> </div>
<div dir="ltr">    }</div>
<div dir="ltr"> </div>
<div dir="ltr">    /**<br />
     * Test of delete method, of class PersonServiceBean.<br />
     */<br />
    @Test<br />
    public void testDelete() {<br />
        personService.delete(1);<br />
        System.out.println("delete");</div>
<div dir="ltr"> </div>
<div dir="ltr">    }</div>
<div dir="ltr"> </div>
<div dir="ltr">}</div>
</blockquote>
<p><!--WizHtmlContent--></p>
]]></content:encoded>
			<wfw:commentRss>http://www.guloulou.com/?feed=rss2&amp;p=1985</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>25_传智播客Spring2.5视频教程_搭建和配置Spring与Hibernate整合的环境</title>
		<link>http://www.guloulou.com/?p=1984</link>
		<comments>http://www.guloulou.com/?p=1984#comments</comments>
		<pubDate>Wed, 04 Aug 2010 18:41:56 +0000</pubDate>
		<dc:creator>guloulou</dc:creator>
				<category><![CDATA[传智播客Spring2.5自学笔记]]></category>
		<category><![CDATA[antlr-2.7.2.jar]]></category>
		<category><![CDATA[antlr-2.7.6.jar]]></category>
		<category><![CDATA[aspectjrt.jar]]></category>
		<category><![CDATA[aspectjweaver.jar]]></category>
		<category><![CDATA[cglib-nodep-2.1_3.jar]]></category>
		<category><![CDATA[common-annotations.jar]]></category>
		<category><![CDATA[commons-dbcp.jar]]></category>
		<category><![CDATA[commons-logging.jar]]></category>
		<category><![CDATA[commons-pool.jar]]></category>
		<category><![CDATA[ehcache-1.2.3.jar]]></category>
		<category><![CDATA[hibernate3.jar]]></category>
		<category><![CDATA[HttpSession]]></category>
		<category><![CDATA[log4j-1.2.15.jar]]></category>
		<category><![CDATA[org.hibernate.cache.EhCacheProvider]]></category>
		<category><![CDATA[org.hibernate.dialect.MySQL5Dialect]]></category>
		<category><![CDATA[session]]></category>
		<category><![CDATA[sessionFaction]]></category>
		<category><![CDATA[slf4j-log4j12.jar]]></category>
		<category><![CDATA[spring-webmvc-struts.jar]]></category>
		<category><![CDATA[spring.jar]]></category>
		<category><![CDATA[Spring2.5]]></category>
		<category><![CDATA[业务层]]></category>
		<category><![CDATA[传智播客]]></category>
		<category><![CDATA[传智播客Hibernate自学笔记]]></category>
		<category><![CDATA[单元测试]]></category>
		<category><![CDATA[整合]]></category>
		<category><![CDATA[显示层]]></category>
		<category><![CDATA[环境]]></category>
		<category><![CDATA[黎活明]]></category>

		<guid isPermaLink="false">http://www.guloulou.com/?p=1984</guid>
		<description><![CDATA[25_传智播客Spring2.5视频教程_搭建和配置Spring与Hibernate整合的环境
Spring2.5+Hibernate3.3+Struts1.3整合开发
Hibernate核心安装包下的：
hibernate3.jar
lib\required\*.jar
lib\optional\ehcache-1.2.3.jar
Hibernage注解安装包... ]]></description>
			<content:encoded><![CDATA[<div>25_传智播客Spring2.5视频教程_搭建和配置Spring与Hibernate整合的环境</div>
<div><strong>Spring2.5+Hibernate3.3+Struts1.3整合开发</strong></div>
<div><strong>Hibernate核心安装包下的：</strong></div>
<div>hibernate3.jar</div>
<div>lib\required\*.jar</div>
<div>lib\optional\ehcache-1.2.3.jar</div>
<div><strong>Hibernage注解安装包下的：</strong></div>
<div>lib\test\slf4j-log4j12.jar</div>
<div><strong>Spring安装包下的：</strong></div>
<div>dist\spring.jar</div>
<div>dist\modules\spring-webmvc-struts.jar</div>
<div>lib\jakarta-commons\commons-logging.jar、commons-dbcp.jar、commons-pool.jar</div>
<div>lib\aspectj\aspectjweaver.jar、aspectjrt.jar</div>
<div>lib\cglib\cglib-nodep-2.1_3.jar</div>
<div>lib\j2ee\common-annotations.jar</div>
<div>lib\log4j\log4j-1.2.15.jar</div>
<div><strong>Struts</strong></div>
<div>下载struts-1.3.8-lib.zip,需要使用到解压目录下的所有jar，建议把jstl-1.0.2.jar和standard-1.0.2.jar更换为1.1版本。Spring中已经存在一个antlr-2.7.6.jar，所以把struts中的antlr-2.7.2.jar删除，避免jar冲突；</div>
<div><strong>数据库驱动jar</strong><br />
<strong>建议：</strong></div>
<div>分步整合，先整合Spring+Hibernate，然后再整合Struts；</div>
<div>我们在整合Spring和Hibernate时，需要将sessionFaction交给Spring管理；</div>
<div>------------------</div>
<div><strong>网摘：</strong></div>
<div>在Hibernate的设计者的头脑中，他们将session看作介于数据连接与事务管理一种中间接口。我们可以将session想象成一个持久对象的缓冲区，<strong>Hibernate能检测到这些持久对象的改变，并及时刷新数据库。</strong>我们有时也称Session是一个持久层管理器，因为它包含这一些持久层相关的操作，诸如存储持久对象至数据库，以及从数据库从获得它们。</div>
<div><strong>Hibernate   的session不同于JSP应用中的HttpSession。当我们使用session这个术语时，我们指的是Hibernate中的session，而我们以后会将HttpSesion对象称为用户session。</strong></div>
<div>------------------</div>
<div>Hibernate二级缓存的配置</div>
<blockquote style="margin-right: 0px;" dir="ltr">
<div>&lt;bean id = "sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"&gt;</div>
<div>    &lt;property name="dataSource" ref="dataSource" /&gt;</div>
<div>    &lt;property name="mappingResources"&gt;</div>
<div>        &lt;list&gt;</div>
<div>            &lt;value&gt;cn/itcast/bean/Person.hbm.xml&lt;/value&gt;</div>
<div>        &lt;/list&gt;</div>
<div>    &lt;/property&gt;</div>
<div>    &lt;property name="hibernateProperties"&gt;</div>
<div>        &lt;value&gt;</div>
<div>            hibernate.dialect=org.hibernate.dialect.MySQL5Dialect</div>
<div>            hibernate.hbm2ddl.auto=update</div>
<div>            hibernate.show_sql=false</div>
<div>            hibernate.format_sql=false</div>
<div>            hibernate.cache.use_second_level_cache=true</div>
<div>            hibernate.cache.use_query_cache=false</div>
<div>            hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider</div>
<div>        &lt;/value&gt;</div>
<div>    &lt;/property&gt;</div>
<div>&lt;/bean&gt;</div>
</blockquote>
<div>-------------------</div>
<div><strong>Hibernate实体Bean模板</strong></div>
<blockquote style="margin-right: 0px;" dir="ltr">
<div>&lt;?xml version="1.0" encoding="UTF-8"?&gt;</div>
<div> </div>
<div>&lt;!DOCTYPE hibernate-mapping PUBLIC<br />
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"<br />
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"&gt;<br />
&lt;hibernate-mapping package="cn.itcast.bean"&gt;<br />
    &lt;class name="Person" table="person"&gt;<br />
        &lt;id name="id" type="integer"&gt;<br />
            &lt;generator class="native"/&gt;<br />
        &lt;/id&gt;<br />
        &lt;property name="name" length="10" not-null="true"/&gt;<br />
    &lt;/class&gt;<br />
&lt;/hibernate-mapping&gt;<br />
-----------------------</div>
</blockquote>
<div><strong>通过Spring使用sessionFaction</strong></div>
<div>接下来，我们要做 在业务层（DAO，视频中DAO层和Service层合并在一起了，实际开发中并不推荐这么做），怎么通过Spring使用sessionFaction；</div>
<blockquote style="margin-right: 0px;" dir="ltr">
<div>    &lt;bean id = "sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"&gt;<br />
        &lt;property name="dataSource" ref="dataSource" /&gt;<br />
        &lt;property name="mappingResources"&gt;<br />
            &lt;list&gt;<br />
                &lt;value&gt;cn/itcast/bean/Person.hbm.xml&lt;/value&gt; &lt;!-- 可以有多个Hibernate实体bean的映射文件 --&gt;<br />
            &lt;/list&gt;<br />
        &lt;/property&gt;<br />
        &lt;property name="hibernateProperties"&gt;<br />
            &lt;value&gt;<br />
                hibernate.dialect=org.hibernate.diaect.MySQL5Dialect<br />
                hibernate.hbm2ddl.auto=update<br />
                hibernate.show_sql=false<br />
                hibernate.format_sql=false<br />
            &lt;/value&gt;<br />
        &lt;/property&gt;<br />
    &lt;/bean&gt;<br />
    &lt;!-- Spring 针对Hibernate提供的事务管理器 --&gt;<br />
    &lt;bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"&gt;<br />
        &lt;property name="sessionFactory" ref="sessionFactory"/&gt;<br />
    &lt;/bean&gt;<br />
    &lt;!-- 采用注解的方式进行事务声明 --&gt;<br />
    &lt;tx:annotation-driven transaction-manager="txManager"/&gt;<br />
    &lt;context:annotation-config/&gt;</div>
</blockquote>
<div dir="ltr">心得：</div>
<div dir="ltr">这一讲主要讲解Spring和Hibernate集成时环境搭建；下一讲会做一些编码测试；再接下来会是Struts的集成；</div>
<div dir="ltr">黎活明老师讲解的整合思路，也是我们需要学习的实际项目开发应遵循的一些顺序：<strong>先业务层，再单元测试；最后显示层；</strong></div>
<div dir="ltr">一步步的集成讲解也是让我们能够掌握集成的原理；再碰上其他框架集成时的一些方法技巧；</div>
<div dir="ltr">下一讲给出整合Spring和Hibernate的测试编码；</div>
<div dir="ltr"> </div>
<div dir="ltr"> </div>
<p><!--WizHtmlContent--></p>
]]></content:encoded>
			<wfw:commentRss>http://www.guloulou.com/?feed=rss2&amp;p=1984</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>24_传智播客Spring2.5视频教程_使用Spring配置文件实现事务管理</title>
		<link>http://www.guloulou.com/?p=1981</link>
		<comments>http://www.guloulou.com/?p=1981#comments</comments>
		<pubDate>Fri, 30 Jul 2010 06:29:35 +0000</pubDate>
		<dc:creator>guloulou</dc:creator>
				<category><![CDATA[传智播客Spring2.5自学笔记]]></category>
		<category><![CDATA[advice-ref]]></category>
		<category><![CDATA[aop:advisor]]></category>
		<category><![CDATA[aop:pointcut id]]></category>
		<category><![CDATA[expression]]></category>
		<category><![CDATA[pointcut-ref]]></category>
		<category><![CDATA[propagation]]></category>
		<category><![CDATA[read-only]]></category>
		<category><![CDATA[Spring2.5]]></category>
		<category><![CDATA[transaction-manager]]></category>
		<category><![CDATA[tx:advice]]></category>
		<category><![CDATA[tx:attributes]]></category>
		<category><![CDATA[tx:method]]></category>
		<category><![CDATA[事务管理]]></category>
		<category><![CDATA[传智播客]]></category>
		<category><![CDATA[配置文件]]></category>

		<guid isPermaLink="false">http://www.guloulou.com/?p=1981</guid>
		<description><![CDATA[24_传智播客Spring2.5视频教程_使用Spring配置文件实现事务管理
采用基于XML方式配置事务
&#60;bean id="txManager" class="org.springframework.jdbc.datasourceTransactionManager"&#62;
    &#60;property name="dataSource" ref="dat... ]]></description>
			<content:encoded><![CDATA[<div>24_传智播客Spring2.5视频教程_使用Spring配置文件实现事务管理</div>
<div><strong>采用基于XML方式配置事务</strong></div>
<div>&lt;bean id="txManager" class="org.springframework.jdbc.datasourceTransactionManager"&gt;</div>
<div>    &lt;property name="dataSource" ref="dataSource"&gt;</div>
<div>&lt;/bean&gt;</div>
<div>&lt;aop:config&gt;</div>
<div>    &lt;aop:pointcut id="transactionPointcut" expression="execution(* cn.itcast.service..*.*(..))" /&gt;</div>
<div>    &lt;aop:advisor advice-ref="txAdvice" pointcut-ref="transactionPointcut" /&gt;</div>
<div>&lt;/aop:config&gt;<br />
&lt;tx:advice id="txAdvice" transaction-manager="txManager"&gt;</div>
<div>    &lt;tx:attributes&gt;</div>
<div>        &lt;tx:method name="get*" read-only="true" propagation="NOT_SUPPORTED" /&gt;</div>
<div>        &lt;tx:method name="*" /&gt;</div>
<div>    &lt;/tx:attributes&gt;</div>
<div>&lt;/tx:advice&gt;</div>
<div>-----------------------</div>
<div>上一讲说的是使用注解的方式来管理事务，这一讲讲解采用配置文件的方式管理事务</div>
<div>在切入点定义事务通知：&lt;aop:advisor advice-ref="txAdvice" pointcut-ref="transactionPointcut" /&gt;</div>
<div>为所有查询方法指定只读且不需要事务管理&lt;tx:method name="get*" read-only="true" propagation="NOT_SUPPORTED" /&gt;</div>
<div>其他的，看代码吧。easy的；</div>
<div><strong>上代码</strong>：</div>
<div><strong>beans.xml</strong></div>
<blockquote style="margin-right: 0px;" dir="ltr">
<div>&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:context="http://www.springframework.org/schema/context"<br />
       xmlns:tx="http://www.springframework.org/schema/tx"<br />
       xmlns:aop="http://www.springframework.org/schema/aop"<br />
       xsi:schemaLocation="http://www.springframework.org/schema/beans<br />
       http://www.springframework.org/schema/beans/spring-beans-2.5.xsd<br />
       http://www.springframework.org/schema/tx<br />
       http://www.springframework.org/schema/tx/spring-tx-2.5.xsd<br />
       http://www.springframework.org/schema/aop<br />
       http://www.springframework.org/schema/aop/spring-aop-2.5.xsd<br />
       http://www.springframework.org/schema/context<br />
       http://www.springframework.org/schema/context/spring-context.xsd"&gt;<br />
    &lt;context:property-placeholder location="classpath:jdbc.properties"/&gt;<br />
    &lt;bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"&gt;<br />
        &lt;property name="driverClassName" value="${driverClassName}" /&gt;<br />
        &lt;property name="url" value="${url}" /&gt;<br />
        &lt;property name="username" value="${username}" /&gt;<br />
        &lt;property name="password" value="${password}"/&gt;<br />
        &lt;!-- 连接池启动时的初始值 --&gt;<br />
        &lt;property name="initialSize" value="${initialSize}" /&gt;<br />
        &lt;!-- 连接池的最大值 --&gt;<br />
        &lt;property name="maxActive" value="${maxActive}"/&gt;<br />
        &lt;!-- 最大空闲值.当经过一个高峰时间后，连接池可以慢慢将已经用不到的连接慢慢释放一部分，一直减少到maxIdle为止 --&gt;<br />
        &lt;property name="maxIdle" value="${maxIdle}"/&gt;<br />
        &lt;!-- 最小空闲值，当空闲的连接数少于阀值时，连接池就会去申请一些连接，以免洪峰来时来不及申请 --&gt;<br />
        &lt;property name="minIdle" value="${minIdle}" /&gt;</div>
<div> </div>
<div>    &lt;/bean&gt;<br />
    &lt;bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"&gt;<br />
        &lt;property name="dataSource" ref="dataSource" /&gt;<br />
    &lt;/bean&gt;<br />
    &lt;!-- 采用@Transactional注解方式使用事务 --&gt;<br />
    &lt;tx:annotation-driven transaction-manager="txManager" /&gt;<br />
    &lt;aop:config&gt;<br />
        &lt;aop:pointcut id="transactionPointcut" expression="execution(* cn.itcast.service..*.*(..))" /&gt;<br />
        &lt;aop:advisor advice-ref="txAdvice" pointcut-ref="transactionPointcut" /&gt;<br />
    &lt;/aop:config&gt;<br />
    &lt;tx:advice id="txAdvice" transaction-manager="txManager"&gt;<br />
        &lt;tx:attributes&gt;<br />
            &lt;tx:method name="get*" read-only="true" propagation="NOT_SUPPORTED" /&gt;<br />
            &lt;tx:method name="*" /&gt;<br />
        &lt;/tx:attributes&gt;<br />
    &lt;/tx:advice&gt;</div>
<div> </div>
<div>    &lt;bean id="personService" class="cn.itcast.service.impl.PersonServiceBean" &gt;<br />
        &lt;property name="dataSource" ref="dataSource"&gt;&lt;/property&gt;<br />
    &lt;/bean&gt;</div>
<div> </div>
<div>&lt;/beans&gt;</div>
</blockquote>
<div dir="ltr"><strong>PersonServiceBean.java</strong></div>
<blockquote style="margin-right: 0px;" dir="ltr">
<div dir="ltr">package cn.itcast.service.impl;</div>
<div dir="ltr"> </div>
<div dir="ltr">import cn.itcast.bean.Person;<br />
import cn.itcast.service.PersonService;<br />
import java.util.List;<br />
import javax.sql.DataSource;<br />
import org.springframework.jdbc.core.JdbcTemplate;<br />
import org.springframework.transaction.annotation.Transactional;</div>
<div dir="ltr"> </div>
<div dir="ltr">/**<br />
 *<br />
 * @author kang.cunhua<br />
 */</div>
<div dir="ltr"> </div>
<div dir="ltr">public class PersonServiceBean implements PersonService {</div>
<div dir="ltr"> </div>
<div dir="ltr">    private JdbcTemplate jdbcTemplate;</div>
<div dir="ltr"> </div>
<div dir="ltr">    @Override<br />
    public void save(Person person) {<br />
        System.out.println("俺是save(Person person)方法！");<br />
        jdbcTemplate.update("insert into person(name) values(?)",<br />
                new Object[]{person.getName()},<br />
                new int[]{java.sql.Types.VARCHAR});</div>
<div dir="ltr"> </div>
<div dir="ltr">    }</div>
<div dir="ltr"> </div>
<div dir="ltr">    @Override<br />
    public void update(Person person) {<br />
        System.out.println("俺是update(Person person)方法！");<br />
        jdbcTemplate.update("update person set name=? where id=?",<br />
                new Object[]{person.getName(), person.getId()},<br />
                new int[]{java.sql.Types.VARCHAR, java.sql.Types.INTEGER});</div>
<div dir="ltr"> </div>
<div dir="ltr">    }</div>
<div dir="ltr"> </div>
<div dir="ltr">    @Override<br />
    public Person getPerson(Integer personid) {<br />
        System.out.println("俺是getPerson(Integer personid)方法！");<br />
        return (Person) jdbcTemplate.queryForObject("select * from person where id=?", new Object[]{personid},<br />
                new int[]{java.sql.Types.INTEGER},<br />
                new PersonRowMapper());<br />
    }</div>
<div dir="ltr"> </div>
<div dir="ltr">    @Override<br />
    public List&lt;Person&gt; getPersons() {<br />
        System.out.println("俺是getPersons()方法！");<br />
        return (List&lt;Person&gt;) jdbcTemplate.query("select * from person", new PersonRowMapper());<br />
    }</div>
<div dir="ltr"> </div>
<div dir="ltr">    @Override<br />
    public void delete(Integer personid) {<br />
        System.out.println("俺是delete(Integer personid)方法！");<br />
        jdbcTemplate.update("delete from person where id=?",<br />
                new Object[]{personid},<br />
                new int[]{java.sql.Types.INTEGER});<br />
        jdbcTemplate.update("delete from personss where id=10"); // 此处故意写错表名，测试两个方法是否在同一个事务中执行<br />
        // throw new RuntimeException("运行期例外"); // 抛出运行期例外，测试事务回滚！<br />
    }</div>
<div dir="ltr"> </div>
<div dir="ltr">    /**<br />
     * @param dataSource the dataSource to set<br />
     */<br />
    public void setDataSource(DataSource dataSource) {<br />
        this.jdbcTemplate = new JdbcTemplate(dataSource);<br />
    }<br />
}</div>
</blockquote>
<div dir="ltr"><strong>PersonServiceBeanTest.java</strong></div>
<blockquote style="margin-right: 0px;" dir="ltr">
<div dir="ltr">package cn.itcast.service.impl;</div>
<div dir="ltr"> </div>
<div dir="ltr">import cn.itcast.bean.Person;<br />
import cn.itcast.service.PersonService;<br />
import org.junit.AfterClass;<br />
import org.junit.Before;<br />
import org.junit.BeforeClass;<br />
import org.junit.Test;<br />
import org.springframework.context.ApplicationContext;<br />
import org.springframework.context.support.ClassPathXmlApplicationContext;</div>
<div dir="ltr"> </div>
<div dir="ltr">/**<br />
 *<br />
 * @author kang.cunhua<br />
 */<br />
public class PersonServiceBeanTest {</div>
<div dir="ltr"> </div>
<div dir="ltr">    private static PersonService personService;</div>
<div dir="ltr"> </div>
<div dir="ltr">    public PersonServiceBeanTest() {<br />
    }</div>
<div dir="ltr"> </div>
<div dir="ltr">    @BeforeClass<br />
    public static void setUpClass() throws Exception {<br />
        ApplicationContext cxt = new ClassPathXmlApplicationContext("beans.xml");<br />
        personService = (PersonService) cxt.getBean("personService");<br />
    }</div>
<div dir="ltr"> </div>
<div dir="ltr">    @AfterClass<br />
    public static void tearDownClass() throws Exception {<br />
    }</div>
<div dir="ltr"> </div>
<div dir="ltr">    @Before<br />
    public void setUp() {<br />
    }</div>
<div dir="ltr"> </div>
<div dir="ltr">    /**<br />
     * Test of save method, of class PersonServiceBean.<br />
     */<br />
    @Test<br />
    public void testSave() {<br />
        for (int i = 10; i &lt; 15; i++) {<br />
            personService.save(new Person("传智播客" + i));<br />
        }</div>
<div dir="ltr"> </div>
<div dir="ltr">    }</div>
<div dir="ltr"> </div>
<div dir="ltr">    /**<br />
     * Test of getPerson method, of class PersonServiceBean.<br />
     */<br />
    @Test<br />
    public void testGetPerson() {<br />
        Person person = personService.getPerson(2);<br />
        System.out.println(" testGetPerson() ：" + person.getName());<br />
    }</div>
<div dir="ltr"> </div>
<div dir="ltr">    /**<br />
     * Test of update method, of class PersonServiceBean.<br />
     */<br />
    @Test<br />
    public void testUpdate() {<br />
        Person person = personService.getPerson(2);<br />
        person.setName("张**");<br />
        personService.update(person);</div>
<div dir="ltr"> </div>
<div dir="ltr">    }</div>
<div dir="ltr"> </div>
<div dir="ltr">    /**<br />
     * Test of getPersons method, of class PersonServiceBean.<br />
     */<br />
    @Test<br />
    public void testGetPersons() {<br />
        for (Person person:personService.getPersons()) {<br />
            System.out.println("testGetPersons():" + person.getName());<br />
        }<br />
    }</div>
<div dir="ltr"> </div>
<div dir="ltr">    /**<br />
     * Test of delete method, of class PersonServiceBean.<br />
     */<br />
    @Test<br />
    public void testDelete() {<br />
        personService.delete(7);<br />
    }<br />
}</div>
</blockquote>
<div dir="ltr">注：其余代码和前两讲一样；</div>
<p><!--WizHtmlContent--></p>
]]></content:encoded>
			<wfw:commentRss>http://www.guloulou.com/?feed=rss2&amp;p=1981</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>23_传智播客Spring2.5视频教程_使用Spring注解方式管理事务与传播行为详解</title>
		<link>http://www.guloulou.com/?p=1978</link>
		<comments>http://www.guloulou.com/?p=1978#comments</comments>
		<pubDate>Thu, 29 Jul 2010 15:39:34 +0000</pubDate>
		<dc:creator>guloulou</dc:creator>
				<category><![CDATA[传智播客Spring2.5自学笔记]]></category>
		<category><![CDATA[@Transactional]]></category>
		<category><![CDATA[commit]]></category>
		<category><![CDATA[Exception]]></category>
		<category><![CDATA[MANDATORY]]></category>
		<category><![CDATA[NESTED]]></category>
		<category><![CDATA[Never]]></category>
		<category><![CDATA[NOT_SUPPORTED]]></category>
		<category><![CDATA[Read Commited]]></category>
		<category><![CDATA[Read Uncommited]]></category>
		<category><![CDATA[Repeatable Read]]></category>
		<category><![CDATA[required]]></category>
		<category><![CDATA[REQUIRESNEW]]></category>
		<category><![CDATA[rollback]]></category>
		<category><![CDATA[rollbackFor]]></category>
		<category><![CDATA[RuntimeException]]></category>
		<category><![CDATA[Savepoint]]></category>
		<category><![CDATA[Serializable]]></category>
		<category><![CDATA[Spring2.5]]></category>
		<category><![CDATA[SUPPORTS]]></category>
		<category><![CDATA[不可重复读]]></category>
		<category><![CDATA[事务]]></category>
		<category><![CDATA[传播]]></category>
		<category><![CDATA[传智播客]]></category>
		<category><![CDATA[可重复读]]></category>
		<category><![CDATA[幻读]]></category>
		<category><![CDATA[快照技术]]></category>
		<category><![CDATA[数据库]]></category>
		<category><![CDATA[注解]]></category>
		<category><![CDATA[脏读]]></category>
		<category><![CDATA[隔离级别]]></category>
		<category><![CDATA[黎活明]]></category>

		<guid isPermaLink="false">http://www.guloulou.com/?p=1978</guid>
		<description><![CDATA[23_传智播客Spring2.5视频教程_使用Spring注解方式管理事务与传播行为详解
前面讲解到使用@Transactionl对业务方法进行事务管理；执行业务方法前打开事务，执行完毕后关闭事务；那么，
Q：Spring什... ]]></description>
			<content:encoded><![CDATA[<div>23_传智播客Spring2.5视频教程_使用Spring注解方式管理事务与传播行为详解</div>
<div>前面讲解到使用@Transactionl对业务方法进行事务管理；执行业务方法前打开事务，执行完毕后关闭事务；那么，</div>
<div><strong>Q：Spring什么时候决定事务提交，什么时候决定事务回滚（失败）呢？</strong></div>
<div><strong>A：</strong>Spring默认时对运行期例外回滚，对用户例外（比如check）不回滚；</div>
<div><strong>check例外</strong>，一个方法抛出的例外需要调用者捕获的话，就是check例外；</div>
<div>一个方法抛出的例外，不需要调用者捕获的话，就是<strong>非check例外</strong>；如运行期例外；</div>
<div>---------------</div>
<div><strong>运行期例外 // unchecked；默认回滚</strong></div>
<div><strong>Service层代码：</strong></div>
<blockquote style="margin-right: 0px;" dir="ltr">
<div>public void delete( Integer personid ){</div>
<div>    jdbcTemplate.update("delete from person where id=?", new Object[]{personid} ,</div>
<div>    new int[] {java.sql.Types.INTEGER});    </div>
<div>
<div>    throw new RuntimeException("运行期例外");</div>
<p>}</p>
</div>
</blockquote>
<div>此时<strong>单元测试</strong>时调用是不需要check该异常的</div>
<blockquote style="margin-right: 0px;" dir="ltr">
<div>@Test public void delete(){</div>
<div>    personService.delete(6);</div>
<div>}</div>
</blockquote>
<div> </div>
<div><strong>需要check的例外 // checked； 默认不回滚</strong></div>
<div><strong>Service层代码：</strong> </div>
<blockquote style="margin-right: 0px;" dir="ltr">
<div>
<div>public void delete( Integer personid ) throws Exception{</div>
<div>    jdbcTemplate.update("delete from person where id=?", new Object[]{personid} ,</div>
<div>    new int[] {java.sql.Types.INTEGER});    </div>
<div>
<div>    throw new Exception("非运行期例外");</div>
<p>}</p>
</div>
</div>
</blockquote>
<div><strong>单元测试如下：</strong></div>
<blockquote style="margin-right: 0px;" dir="ltr">
<div>@Test public void delete(){</div>
<div>    try{</div>
<div>        personService.delete(6);</div>
<div>    }catch (Exception e){</div>
<div>        e.printStackTrace();</div>
<div>    }</div>
<div>}</div>
</blockquote>
<div><strong>如果需要check的例外需要回滚，则需要设置@Transactional参数</strong></div>
<blockquote style="margin-right: 0px;" dir="ltr">
<div>
<div>
<div>@Transactional ( rollbackFor=Exception.class )</div>
<div>public void delete( Integer personid ) throws Exception{</div>
<div>    jdbcTemplate.update("delete from person where id=?", new Object[]{personid} ,</div>
<div>    new int[] {java.sql.Types.INTEGER});    </div>
<div>
<div>    throw new Exception("非运行期例外");</div>
<p>}</p>
</div>
</div>
</div>
</blockquote>
<div><strong>当某个方法不需要事务是怎么处理？</strong></div>
<div>比如，getPerson(Integer personid)方法就不需要开启事务。开启事务是需要消耗性能的；</div>
<div>这时，我们需要是使用@Transactional(propagation=Propagation.NOT_SUPPORTED)来指明该方法不需要事务处理；<strong>NOT_SUPPORTED为事务传播属性；</strong></div>
<div><strong>事务传播属性</strong></div>
<div><strong>REQUIRED</strong>:业务方法需要在一个事务中运行，如果方法运行时已经处在一个事务中，那么如何加入到该事务，否则为自己创建一个新事务；// 默认80%都是这种事务传播行为；</div>
<div><strong>NOT_SUPPORTED</strong>:声明方法不需要事务，如果方法没有关联到一个事务，容器不会为它开启事务。如果方法在一个事务中被调用，该事务会被挂起，在方法调用结束后，原先的事务便会恢复执行。</div>
<div><strong>REQUIRESNEW</strong>:属性表明不管是否存在事务，业务方法总会为自己发起一个新的事务。如果方法已经运行在一个事务中，则原有事务会被挂起，新的事务会被创建，知道方法执行结束，新事务才算结束，原先的事务才会恢复执行。</div>
<div><strong>MANDATORY</strong>:该属性指定业务方法只能在一个已经存在的事务中执行，业务方法不能发起自己的事务。如果业务方法在没有事务的环境下调用，容器就会抛出例外。</div>
<div><strong>SUPPORTS</strong>:这一事务属性表明，如果业务方法在某个事物范围内被调用，则方法称为该事务的一部分。如果业务方法在事务范围外被调用，则方法在某有事务的环境下执行。</div>
<div><strong>Never</strong>:执行业务方法绝对不能在事务范围内执行。如果业务方法在某个事物中执行，容器会抛出例外，只有业务方法没有关联到任何事务，才能正常执行。</div>
<div><strong>NESTED</strong>:如果一个活动的事务存在，则运行在一个嵌套的事务中。如果没有活动事务，则按REQUIRED属性执行，它使用了一个单独的事务，这个事务拥有多个可以回滚的保存点。内部事务的回滚不会对外部事务造成影响。它只对DataSourceTransactionManager事务管理器起效；</div>
<div>另，</div>
<div>前几种<strong>REQUIRED</strong>，<strong>NOT_SUPPORTED</strong>，<strong>REQUIRESNEW</strong>，<strong>MANDATORY</strong>，<strong>SUPPORTS</strong>，<strong>Never</strong>在EJB中也有体现（Spring借鉴EJB的地方）；最后一种<strong>NESTED</strong>为Spring独有；</div>
<div>----------------</div>
<div><strong>事务传播属性NESTED介绍</strong></div>
<blockquote style="margin-right: 0px;" dir="ltr">
<div>@Resource OtherService otherService;</div>
<div>public void xxx(){</div>
<div>    stmt.executeUpdate("update person set name='888' where id = 1");</div>
<div>    otherService.update();// OtherService的update方法的事务传播属性为<strong>NESTED</strong></div>
<div>    stmt.executeUpdate("delete from person where id = 9");</div>
<div>}</div>
</blockquote>
<div><strong>上面的xxx()方法事务在内部执行的过程</strong></div>
<blockquote style="margin-right: 0px;" dir="ltr">
<div>Connection conn = null;</div>
<div>try {</div>
<div>    conn.setAutoCommit(false);</div>
<div>    Statement stmt = conn.createStatement();</div>
<div>    stmt.executeUpdate("update person set name = '888' where id = 1");</div>
<div>    <span style="color: #ff6600;">Savepoint savepoint = conn.setSavepoint();</span></div>
<div>    try{</div>
<div>        conn.createStatement().executeUpdate("update person set name = '222' where sid = 2");</div>
<div>    }catch(Exception ex){</div>
<div>        <span style="color: #ff6600;">conn.rollback(savepoint);</span></div>
<div>    }</div>
<div>    stmt.executeUpdate("delete from person where id = 9");</div>
<div>    conn.commit();</div>
<div>    stmt.close();</div>
<div>}catch (Exception e){</div>
<div>    <span style="color: #ff6600;">conn.rollback();</span></div>
<div>}finally{</div>
<div>    try{</div>
<div>        if(null != conn &amp;&amp; !conn.isClosed()) conn.close();</div>
<div>    }catch( SQLException e){</div>
<div>        e.printStackTrace();</div>
<div>    }</div>
<div>}</div>
</blockquote>
<div><strong>总结：</strong></div>
<div>内部事务不会影响到外部事物的结果；</div>
<div>但外部事务如果失败，内部事务同样也要回滚；</div>
<div>----------------</div>
<div><strong>数据库系统提供了四种事务隔离级别</strong></div>
<div>数据库系统提供了四种事务隔离级别供用户选择。不同的隔离级别采用不同的锁类型来实现，在四种隔离级别中，Serializable的隔离级别最高，Read Uncommited的隔离级别最低。大多数据库默认的隔离界别为Read Commited，如SQL Server 2000，当然也有少部分数据库默认的隔离级别为Repeatable Read，如Mysql；SQL Server 2005提供了默认的Read Commited的隔离级别，当然也通过快照技术提供了Repeatable Read隔离级别（推荐使用后者）的支持;</div>
<ul>
<li>Read Uncommited：读未提交数据（会出现脏读，不可重复读和幻读）；</li>
<li>Read Commited：读提交数据（会出现不可重复读和幻读）；</li>
<li>Repeatable Read：可重复读（会出现幻读）</li>
<li>Serializable：串行化</li>
</ul>
<div>脏读：一个事务读取到另一个事务未提交的更新数据；</div>
<div>不可重复读：在同一事务中，多次读取同一数据返回的结果有所不同。换句话说就是，后续读取可以读到另一事务已经提交的更新数据。相反，“可重复读”在同一事务中多次读取数据时，能够保证所读数据一样，也就是，后续读取不能读到另一事务已经提交的更新数据。</div>
<div>----------------</div>
<div>快照技术实现可重复读</div>
<div>----------------</div>
<div>代码：</div>
<div><strong>创建表：person.sql</strong></div>
<blockquote style="margin-right: 0px;" dir="ltr">
<div>/*<br />
Navicat MySQL Data Transfer</div>
<div> </div>
<div>Source Server : localhost<br />
Source Server Version : 50133<br />
Source Host : localhost:3306<br />
Source Database : itcast</div>
<div> </div>
<div>Target Server Type : MYSQL<br />
Target Server Version : 50133<br />
File Encoding : 65001</div>
<div> </div>
<div>Date: 2010-07-23 15:54:58<br />
*/</div>
<div> </div>
<div>SET FOREIGN_KEY_CHECKS=0;<br />
-- ----------------------------<br />
-- Table structure for `person`<br />
-- ----------------------------<br />
DROP TABLE IF EXISTS `person`;<br />
CREATE TABLE `person` (<br />
  `id` int(11) NOT NULL AUTO_INCREMENT,<br />
  `name` varchar(20) DEFAULT NULL,<br />
  PRIMARY KEY (`id`)<br />
) ENGINE=InnoDB DEFAULT CHARSET=utf8;</div>
<div> </div>
<div>-- ----------------------------<br />
-- Records of person<br />
-- ----------------------------</div>
</blockquote>
<div dir="ltr"><strong>PersonServiceBean.java</strong></div>
<blockquote style="margin-right: 0px;" dir="ltr">
<div dir="ltr">package cn.itcast.service.impl;</div>
<div dir="ltr"> </div>
<div dir="ltr">import cn.itcast.bean.Person;<br />
import cn.itcast.service.PersonService;<br />
import java.util.List;<br />
import javax.sql.DataSource;<br />
import org.springframework.jdbc.core.JdbcTemplate;<br />
import org.springframework.transaction.annotation.Transactional;</div>
<div dir="ltr"> </div>
<div dir="ltr">/**<br />
 *<br />
 * @author kang.cunhua<br />
 */<br />
@Transactional<br />
public class PersonServiceBean implements PersonService {</div>
<div dir="ltr"> </div>
<div dir="ltr">    private JdbcTemplate jdbcTemplate;</div>
<div dir="ltr"> </div>
<div dir="ltr">    @Override<br />
    public void save(Person person) {<br />
        System.out.println("俺是save(Person person)方法！");<br />
        jdbcTemplate.update("insert into person(name) values(?)",<br />
                new Object[]{person.getName()},<br />
                new int[]{java.sql.Types.VARCHAR});</div>
<div dir="ltr"> </div>
<div dir="ltr">    }</div>
<div dir="ltr"> </div>
<div dir="ltr">    @Override<br />
    public void update(Person person) {<br />
        System.out.println("俺是update(Person person)方法！");<br />
        jdbcTemplate.update("update person set name=? where id=?",<br />
                new Object[]{person.getName(), person.getId()},<br />
                new int[]{java.sql.Types.VARCHAR, java.sql.Types.INTEGER});</div>
<div dir="ltr"> </div>
<div dir="ltr">    }</div>
<div dir="ltr"> </div>
<div dir="ltr">    @Override<br />
    public Person getPerson(Integer personid) {<br />
        System.out.println("俺是getPerson(Integer personid)方法！");<br />
        return (Person) jdbcTemplate.queryForObject("select * from person where id=?", new Object[]{personid},<br />
                new int[]{java.sql.Types.INTEGER},<br />
                new PersonRowMapper());<br />
    }</div>
<div dir="ltr"> </div>
<div dir="ltr">    @Override<br />
    public List&lt;Person&gt; getPersons() {<br />
        System.out.println("俺是getPersons()方法！");<br />
        return (List&lt;Person&gt;) jdbcTemplate.query("select * from person", new PersonRowMapper());<br />
    }</div>
<div dir="ltr"> </div>
<div dir="ltr">    @Override<br />
    public void delete(Integer personid) {<br />
        System.out.println("俺是delete(Integer personid)方法！");<br />
        jdbcTemplate.update("delete from person where id=?",<br />
                new Object[]{personid},<br />
                new int[]{java.sql.Types.INTEGER});<br />
        throw new RuntimeException("运行期例外"); // 抛出运行期例外，测试事务回滚！<br />
    }</div>
<div dir="ltr"> </div>
<div dir="ltr">    /**<br />
     * @param dataSource the dataSource to set<br />
     */<br />
    public void setDataSource(DataSource dataSource) {<br />
        this.jdbcTemplate = new JdbcTemplate(dataSource);<br />
    }<br />
}</div>
</blockquote>
<div dir="ltr"><strong>PersonServiceBeanTest.java</strong></div>
<blockquote style="margin-right: 0px;" dir="ltr">
<div dir="ltr">package cn.itcast.service.impl;</div>
<div dir="ltr"> </div>
<div dir="ltr">import cn.itcast.bean.Person;<br />
import cn.itcast.service.PersonService;<br />
import org.junit.AfterClass;<br />
import org.junit.Before;<br />
import org.junit.BeforeClass;<br />
import org.junit.Test;<br />
import org.springframework.context.ApplicationContext;<br />
import org.springframework.context.support.ClassPathXmlApplicationContext;</div>
<div dir="ltr"> </div>
<div dir="ltr">/**<br />
 *<br />
 * @author kang.cunhua<br />
 */<br />
public class PersonServiceBeanTest {</div>
<div dir="ltr"> </div>
<div dir="ltr">    private static PersonService personService;</div>
<div dir="ltr"> </div>
<div dir="ltr">    public PersonServiceBeanTest() {<br />
    }</div>
<div dir="ltr"> </div>
<div dir="ltr">    @BeforeClass<br />
    public static void setUpClass() throws Exception {<br />
        ApplicationContext cxt = new ClassPathXmlApplicationContext("beans.xml");<br />
        personService = (PersonService) cxt.getBean("personService");<br />
    }</div>
<div dir="ltr"> </div>
<div dir="ltr">    @AfterClass<br />
    public static void tearDownClass() throws Exception {<br />
    }</div>
<div dir="ltr"> </div>
<div dir="ltr">    @Before<br />
    public void setUp() {<br />
    }</div>
<div dir="ltr"> </div>
<div dir="ltr">    /**<br />
     * Test of save method, of class PersonServiceBean.<br />
     */<br />
    @Test<br />
    public void testSave() {<br />
        for (int i = 0; i &lt; 5; i++) {<br />
            personService.save(new Person("传智播客" + i));<br />
        }</div>
<div dir="ltr"> </div>
<div dir="ltr">    }</div>
<div dir="ltr"> </div>
<div dir="ltr">    /**<br />
     * Test of getPerson method, of class PersonServiceBean.<br />
     */<br />
    @Test<br />
    public void testGetPerson() {<br />
        Person person = personService.getPerson(2);<br />
        System.out.println(" testGetPerson() ：" + person.getName());<br />
    }</div>
<div dir="ltr"> </div>
<div dir="ltr">    /**<br />
     * Test of update method, of class PersonServiceBean.<br />
     */<br />
    @Test<br />
    public void testUpdate() {<br />
        Person person = personService.getPerson(2);<br />
        person.setName("张**");<br />
        personService.update(person);</div>
<div dir="ltr"> </div>
<div dir="ltr">    }</div>
<div dir="ltr"> </div>
<div dir="ltr">    /**<br />
     * Test of getPersons method, of class PersonServiceBean.<br />
     */<br />
    @Test<br />
    public void testGetPersons() {<br />
        for (Person person:personService.getPersons()) {<br />
            System.out.println("testGetPersons():" + person.getName());<br />
        }<br />
    }</div>
<div dir="ltr"> </div>
<div dir="ltr">    /**<br />
     * Test of delete method, of class PersonServiceBean.<br />
     */<br />
    @Test<br />
    public void testDelete() {<br />
        personService.delete(5);<br />
    }<br />
}</div>
</blockquote>
<div dir="ltr">另，代码变动不大。其余代码和上一讲一样。主要是事务理念的理解。为今后的应用打下基础。</div>
<div dir="ltr"> </div>
<p><!--WizHtmlContent--></p>
]]></content:encoded>
			<wfw:commentRss>http://www.guloulou.com/?feed=rss2&amp;p=1978</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>22_传智播客Spring2.5视频教程_Spring集成的jdbc编码和事务管理</title>
		<link>http://www.guloulou.com/?p=1974</link>
		<comments>http://www.guloulou.com/?p=1974#comments</comments>
		<pubDate>Mon, 26 Jul 2010 06:46:45 +0000</pubDate>
		<dc:creator>guloulou</dc:creator>
				<category><![CDATA[传智播客Spring2.5自学笔记]]></category>
		<category><![CDATA[@Transactional]]></category>
		<category><![CDATA[context:property-placeholder]]></category>
		<category><![CDATA[DAO层]]></category>
		<category><![CDATA[JDBC]]></category>
		<category><![CDATA[JdbcTemplate]]></category>
		<category><![CDATA[jdbcTemplate.update]]></category>
		<category><![CDATA[RowMapper]]></category>
		<category><![CDATA[Spring2.5]]></category>
		<category><![CDATA[TRUNCATE]]></category>
		<category><![CDATA[tx:annotation-driven]]></category>
		<category><![CDATA[事务]]></category>
		<category><![CDATA[传智播客]]></category>
		<category><![CDATA[笔记]]></category>
		<category><![CDATA[自学]]></category>
		<category><![CDATA[黎活明]]></category>

		<guid isPermaLink="false">http://www.guloulou.com/?p=1974</guid>
		<description><![CDATA[22_传智播客Spring2.5视频教程_Spring集成的jdbc编码和事务管理
使用Spring的JdbcTemplate完善JDBC数据库CRUD

private JdbcTemplate jdbcTemplate;
    /**
     * @param dataSource the dataSource to set
     */
    public ... ]]></description>
			<content:encoded><![CDATA[<div><strong>22_传智播客Spring2.5视频教程_Spring集成的jdbc编码和事务管理</strong></div>
<div><strong>使用Spring的JdbcTemplate完善JDBC数据库CRUD</strong></div>
<blockquote style="margin-right: 0px;" dir="ltr">
<div>private JdbcTemplate jdbcTemplate;<br />
    /**<br />
     * @param dataSource the dataSource to set<br />
     */<br />
    public void setDataSource(DataSource dataSource) {<br />
        this.jdbcTemplate = new JdbcTemplate(dataSource);<br />
    }</div>
<div>..............</div>
<div>@Override<br />
    public void save(Person person) {<br />
        System.out.println("俺是save(Person person)方法！");<br />
        jdbcTemplate.update("insert into person(name) values(?)",<br />
                new Object[]{person.getName()},<br />
                new int[]{java.sql.Types.VARCHAR});</p>
<div> </div>
<p>    }</p>
<div>.................</div>
<p>@Override<br />
    public Person getPerson(Integer personid) {<br />
        System.out.println("俺是getPerson(Integer personid)方法！");<br />
        return (Person) jdbcTemplate.queryForObject("select * from person where id=?", new Object[]{personid},<br />
                new int[]{java.sql.Types.INTEGER},<br />
                new PersonRowMapper());<br />
    }</p>
</div>
</blockquote>
<div><strong>getPerson(Integer personid)使用到RowMapper接口</strong></div>
<blockquote style="margin-right: 0px;" dir="ltr">
<div>public class PersonRowMapper implements RowMapper {</div>
<div> </div>
<div>    @Override<br />
    public Object mapRow(ResultSet rs, int i) throws SQLException {<br />
        Person person = new Person(rs.getString("name"));<br />
        person.setId(rs.getInt("id"));<br />
        return person;<br />
    }</div>
<div>}</div>
</blockquote>
<div><strong>spring提供的事务注解</strong></div>
<div>如果不是用spring提供的事务注解，默认情况下，业务bean中的方法每条sql都是在各自独立的事务中执行的；</div>
<div>使用@Transactional的话，在调用方法业务bean中方法前会打开事务，在调用后会关闭事务。确保业务bean中方法内部是在一个事务中执行的；// 这些设定在实际开发中 会很有用的。</div>
<div><strong>保留表结构，清楚所有数据：</strong></div>
<div>TRUNCATE TABLE person<br />
<strong>上代码：</strong></div>
<div><strong>beans.xml</strong></div>
<blockquote style="margin-right: 0px;" dir="ltr">
<div>&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:context="http://www.springframework.org/schema/context"<br />
       xmlns:tx="http://www.springframework.org/schema/tx"<br />
       xmlns:aop="http://www.springframework.org/schema/aop"<br />
       xsi:schemaLocation="http://www.springframework.org/schema/beans<br />
       http://www.springframework.org/schema/beans/spring-beans-2.5.xsd<br />
       http://www.springframework.org/schema/tx<br />
       http://www.springframework.org/schema/tx/spring-tx-2.5.xsd<br />
       http://www.springframework.org/schema/aop<br />
       http://www.springframework.org/schema/aop/spring-aop-2.5.xsd<br />
       http://www.springframework.org/schema/context<br />
       http://www.springframework.org/schema/context/spring-context.xsd"&gt;<br />
    &lt;context:property-placeholder location="classpath:jdbc.properties"/&gt;<br />
    &lt;bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"&gt;<br />
        &lt;property name="driverClassName" value="${driverClassName}" /&gt;<br />
        &lt;property name="url" value="${url}" /&gt;<br />
        &lt;property name="username" value="${username}" /&gt;<br />
        &lt;property name="password" value="${password}"/&gt;<br />
        &lt;!-- 连接池启动时的初始值 --&gt;<br />
        &lt;property name="initialSize" value="${initialSize}" /&gt;<br />
        &lt;!-- 连接池的最大值 --&gt;<br />
        &lt;property name="maxActive" value="${maxActive}"/&gt;<br />
        &lt;!-- 最大空闲值.当经过一个高峰时间后，连接池可以慢慢将已经用不到的连接慢慢释放一部分，一直减少到maxIdle为止 --&gt;<br />
        &lt;property name="maxIdle" value="${maxIdle}"/&gt;<br />
        &lt;!-- 最小空闲值，当空闲的连接数少于阀值时，连接池就会去申请一些连接，以免洪峰来时来不及申请 --&gt;<br />
        &lt;property name="minIdle" value="${minIdle}" /&gt;</div>
<div> </div>
<div>    &lt;/bean&gt;<br />
    &lt;bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"&gt;<br />
        &lt;property name="dataSource" ref="dataSource" /&gt;<br />
    &lt;/bean&gt;<br />
    &lt;!-- 采用@Transactional注解方式使用事务 --&gt;<br />
    &lt;tx:annotation-driven transaction-manager="txManager" /&gt;<br />
    &lt;bean id="personService" class="cn.itcast.service.impl.PersonServiceBean" &gt;<br />
        &lt;property name="dataSource" ref="dataSource"&gt;&lt;/property&gt;<br />
    &lt;/bean&gt;</div>
<div> </div>
<div>&lt;/beans&gt;</div>
</blockquote>
<div><strong>jdbc.properties</strong></div>
<blockquote style="margin-right: 0px;" dir="ltr">
<div># To change this template, choose Tools | Templates<br />
# and open the template in the editor.<br />
driverClassName =org.gjt.mm.mysql.Driver<br />
url=jdbc:mysql://localhost:3306/itcast?useUnicode=true&amp;characterEncoding=UTF-8<br />
username=root<br />
password=<br />
initialSize =1<br />
maxActive=500<br />
maxIdle=2<br />
minIdle=1</div>
</blockquote>
<div><strong>Person.java</strong></div>
<blockquote style="margin-right: 0px;" dir="ltr">
<div>package cn.itcast.bean;</div>
<div> </div>
<div>/**<br />
 *<br />
 * @author kang.cunhua<br />
 */<br />
public class Person {</div>
<div> </div>
<div>    private Integer id;<br />
    private String name;</div>
<div> </div>
<div>    public Person() {<br />
    }</div>
<div> </div>
<div>    public Person(String name) {</div>
<div> </div>
<div>        this.name = name;<br />
    }</div>
<div> </div>
<div>    public Person(Integer id, String name) {<br />
        this.id = id;<br />
        this.name = name;<br />
    }</div>
<div> </div>
<div>    /**<br />
     * @return the id<br />
     */<br />
    public Integer getId() {<br />
        return id;<br />
    }</div>
<div> </div>
<div>    /**<br />
     * @param id the id to set<br />
     */<br />
    public void setId(Integer id) {<br />
        this.id = id;<br />
    }</div>
<div> </div>
<div>    /**<br />
     * @return the name<br />
     */<br />
    public String getName() {<br />
        return name;<br />
    }</div>
<div> </div>
<div>    /**<br />
     * @param name the name to set<br />
     */<br />
    public void setName(String name) {<br />
        this.name = name;<br />
    }<br />
}</div>
</blockquote>
<div><strong>PersonService.java</strong></div>
<blockquote style="margin-right: 0px;" dir="ltr">
<div>package cn.itcast.service;</div>
<div> </div>
<div>import cn.itcast.bean.Person;<br />
import java.util.List;</div>
<div> </div>
<div>/**<br />
 *<br />
 * @author kang.cunhua<br />
 */<br />
public interface PersonService {</div>
<div> </div>
<div>    /**<br />
     * 保存person<br />
     * @param person<br />
     */<br />
    public void save(Person person);</div>
<div> </div>
<div>    /**<br />
     * 更新person<br />
     * @param person<br />
     */<br />
    public void update(Person person);</div>
<div> </div>
<div>    /**<br />
     * 获取person<br />
     * @param personid<br />
     * @return<br />
     */<br />
    public Person getPerson(Integer personid);<br />
    /**<br />
     * 获取所有person<br />
     * @return<br />
     */<br />
    public List&lt;Person&gt; getPersons();<br />
    /**<br />
     * 删除指定id的person<br />
     * @param personid<br />
     */<br />
    public void delete (Integer personid);<br />
}</div>
</blockquote>
<div><strong>PersonRowMapper.java</strong></div>
<blockquote style="margin-right: 0px;" dir="ltr">
<div>package cn.itcast.service.impl;</div>
<div> </div>
<div>import cn.itcast.bean.Person;<br />
import java.sql.ResultSet;<br />
import java.sql.SQLException;<br />
import org.springframework.jdbc.core.RowMapper;</div>
<div> </div>
<div>/**<br />
 *<br />
 * @author kang.cunhua<br />
 */<br />
public class PersonRowMapper implements RowMapper {</div>
<div> </div>
<div>    @Override<br />
    public Object mapRow(ResultSet rs, int i) throws SQLException {<br />
        Person person = new Person(rs.getString("name"));<br />
        person.setId(rs.getInt("id"));<br />
        return person;<br />
    }</div>
<div>}</div>
</blockquote>
<div><strong>PersonServiceBean.java</strong></div>
<blockquote style="margin-right: 0px;" dir="ltr">
<div>package cn.itcast.service.impl;</div>
<div> </div>
<div>import cn.itcast.bean.Person;<br />
import cn.itcast.service.PersonService;<br />
import java.util.List;<br />
import javax.sql.DataSource;<br />
import org.springframework.jdbc.core.JdbcTemplate;<br />
import org.springframework.transaction.annotation.Transactional;</div>
<div> </div>
<div>/**<br />
 *<br />
 * @author kang.cunhua<br />
 */<br />
@Transactional<br />
public class PersonServiceBean implements PersonService {</div>
<div> </div>
<div>    private JdbcTemplate jdbcTemplate;</div>
<div> </div>
<div>    @Override<br />
    public void save(Person person) {<br />
        System.out.println("俺是save(Person person)方法！");<br />
        jdbcTemplate.update("insert into person(name) values(?)",<br />
                new Object[]{person.getName()},<br />
                new int[]{java.sql.Types.VARCHAR});</div>
<div> </div>
<div>    }</div>
<div> </div>
<div>    @Override<br />
    public void update(Person person) {<br />
        System.out.println("俺是update(Person person)方法！");<br />
        jdbcTemplate.update("update person set name=? where id=?",<br />
                new Object[]{person.getName(), person.getId()},<br />
                new int[]{java.sql.Types.VARCHAR, java.sql.Types.INTEGER});</div>
<div> </div>
<div>    }</div>
<div> </div>
<div>    @Override<br />
    public Person getPerson(Integer personid) {<br />
        System.out.println("俺是getPerson(Integer personid)方法！");<br />
        return (Person) jdbcTemplate.queryForObject("select * from person where id=?", new Object[]{personid},<br />
                new int[]{java.sql.Types.INTEGER},<br />
                new PersonRowMapper());<br />
    }</div>
<div> </div>
<div>    @Override<br />
    public List&lt;Person&gt; getPersons() {<br />
        System.out.println("俺是getPersons()方法！");<br />
        return (List&lt;Person&gt;) jdbcTemplate.query("select * from person", new PersonRowMapper());<br />
    }</div>
<div> </div>
<div>    @Override<br />
    public void delete(Integer personid) {<br />
        System.out.println("俺是delete(Integer personid)方法！");<br />
        jdbcTemplate.update("delete from person where id=?",<br />
                new Object[]{personid},<br />
                new int[]{java.sql.Types.INTEGER});<br />
    }</div>
<div> </div>
<div>    /**<br />
     * @param dataSource the dataSource to set<br />
     */<br />
    public void setDataSource(DataSource dataSource) {<br />
        this.jdbcTemplate = new JdbcTemplate(dataSource);<br />
    }<br />
}</div>
</blockquote>
<div><strong>PersonServiceBeanTest.java</strong></div>
<blockquote style="margin-right: 0px;" dir="ltr">
<div>package cn.itcast.service.impl;</div>
<div> </div>
<div>import cn.itcast.bean.Person;<br />
import cn.itcast.service.PersonService;<br />
import org.junit.AfterClass;<br />
import org.junit.Before;<br />
import org.junit.BeforeClass;<br />
import org.junit.Test;<br />
import org.springframework.context.ApplicationContext;<br />
import org.springframework.context.support.ClassPathXmlApplicationContext;</div>
<div> </div>
<div>/**<br />
 *<br />
 * @author kang.cunhua<br />
 */<br />
public class PersonServiceBeanTest {</div>
<div> </div>
<div>    private static PersonService personService;</div>
<div> </div>
<div>    public PersonServiceBeanTest() {<br />
    }</div>
<div> </div>
<div>    @BeforeClass<br />
    public static void setUpClass() throws Exception {<br />
        ApplicationContext cxt = new ClassPathXmlApplicationContext("beans.xml");<br />
        personService = (PersonService) cxt.getBean("personService");<br />
    }</div>
<div> </div>
<div>    @AfterClass<br />
    public static void tearDownClass() throws Exception {<br />
    }</div>
<div> </div>
<div>    @Before<br />
    public void setUp() {<br />
    }</div>
<div> </div>
<div>    /**<br />
     * Test of save method, of class PersonServiceBean.<br />
     */<br />
    @Test<br />
    public void testSave() {<br />
        for (int i = 0; i &lt; 5; i++) {<br />
            personService.save(new Person("传智播客" + i));<br />
        }</div>
<div> </div>
<div>    }</div>
<div> </div>
<div>    /**<br />
     * Test of getPerson method, of class PersonServiceBean.<br />
     */<br />
    @Test<br />
    public void testGetPerson() {<br />
        Person person = personService.getPerson(2);<br />
        System.out.println(" testGetPerson() ：" + person.getName());<br />
    }</div>
<div> </div>
<div>    /**<br />
     * Test of update method, of class PersonServiceBean.<br />
     */<br />
    @Test<br />
    public void testUpdate() {<br />
        Person person = personService.getPerson(2);<br />
        person.setName("张**");<br />
        personService.update(person);</div>
<div> </div>
<div>    }</div>
<div> </div>
<div>    /**<br />
     * Test of getPersons method, of class PersonServiceBean.<br />
     */<br />
    @Test<br />
    public void testGetPersons() {<br />
        for (Person person:personService.getPersons()) {<br />
            System.out.println("testGetPersons():" + person.getName());<br />
        }<br />
    }</div>
<div> </div>
<div>    /**<br />
     * Test of delete method, of class PersonServiceBean.<br />
     */<br />
    @Test<br />
    public void testDelete() {<br />
        personService.delete(1);<br />
    }<br />
}</div>
</blockquote>
<div><strong>输出：</strong></div>
<blockquote style="margin-right: 0px;" dir="ltr">
<div>2010-7-26 14:17:32 org.springframework.context.support.AbstractApplicationContext prepareRefresh<br />
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@1decdec: display name [org.springframework.context.support.ClassPathXmlApplicationContext@1decdec]; startup date [Mon Jul 26 14:17:32 CST 2010]; root of context hierarchy<br />
2010-7-26 14:17:32 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions<br />
信息: Loading XML bean definitions from class path resource [beans.xml]<br />
2010-7-26 14:17:33 org.springframework.context.support.AbstractApplicationContext obtainFreshBeanFactory<br />
信息: Bean factory for application context [org.springframework.context.support.ClassPathXmlApplicationContext@1decdec]: org.springframework.beans.factory.support.DefaultListableBeanFactory@193722c<br />
2010-7-26 14:17:33 org.springframework.core.io.support.PropertiesLoaderSupport loadProperties<br />
信息: Loading properties file from class path resource [jdbc.properties]<br />
2010-7-26 14:17:33 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons<br />
信息: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@193722c: defining beans [org.springframework.beans.factory.config.PropertyPlaceholderConfigurer#0,dataSource,txManager,org.springframework.aop.config.internalAutoProxyCreator,org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#0,org.springframework.transaction.interceptor.TransactionInterceptor#0,org.springframework.transaction.config.internalTransactionAdvisor,personService]; root of factory hierarchy<br />
俺是save(Person person)方法！<br />
俺是save(Person person)方法！<br />
俺是save(Person person)方法！<br />
俺是save(Person person)方法！<br />
俺是save(Person person)方法！<br />
俺是getPerson(Integer personid)方法！<br />
 testGetPerson() ：传智播客1<br />
俺是getPerson(Integer personid)方法！<br />
俺是update(Person person)方法！<br />
俺是getPersons()方法！<br />
testGetPersons():传智播客0<br />
testGetPersons():张**<br />
testGetPersons():传智播客2<br />
testGetPersons():传智播客3<br />
testGetPersons():传智播客4<br />
俺是delete(Integer personid)方法！</div>
</blockquote>
<div>视频给出的代码并没有DAO层，直接在service层进行了一些DAO层的操作。个人觉得还是独立出来dao层比较好。维护和扩展方便。可以参考俺上一讲的笔记后边作出的改进。</div>
<p><!--WizHtmlContent--></p>
]]></content:encoded>
			<wfw:commentRss>http://www.guloulou.com/?feed=rss2&amp;p=1974</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>脑残翻译成英文是虾米--再次见证汉语的博大精深和英语的幽默</title>
		<link>http://www.guloulou.com/?p=1971</link>
		<comments>http://www.guloulou.com/?p=1971#comments</comments>
		<pubDate>Mon, 26 Jul 2010 05:04:25 +0000</pubDate>
		<dc:creator>guloulou</dc:creator>
				<category><![CDATA[Diary : 日记]]></category>
		<category><![CDATA[brain]]></category>
		<category><![CDATA[left]]></category>
		<category><![CDATA[right]]></category>
		<category><![CDATA[博大精深]]></category>
		<category><![CDATA[幽默]]></category>
		<category><![CDATA[汉语]]></category>
		<category><![CDATA[翻译]]></category>
		<category><![CDATA[脑残]]></category>
		<category><![CDATA[英文]]></category>

		<guid isPermaLink="false">http://www.guloulou.com/?p=1971</guid>
		<description><![CDATA[Your brain has two parts: 
one is left, and another is right. 
Your left brain has nothing right,
Your right brain has nothing left.
-------------------
据说是对中文网络名词[脑残]的翻译。
很传神。
许久没见到这么牛的翻译... ]]></description>
			<content:encoded><![CDATA[<div>Your brain has two parts: <br />
one is left, and another is right. <br />
Your left brain has nothing right,<br />
Your right brain has nothing left.</div>
<div>-------------------</div>
<div>据说是对中文网络名词[脑残]的翻译。</div>
<div>很传神。</div>
<div>许久没见到这么牛的翻译了。</div>
<p><!--WizHtmlContent--></p>
]]></content:encoded>
			<wfw:commentRss>http://www.guloulou.com/?feed=rss2&amp;p=1971</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>21_传智播客Spring2.5视频教程_搭建和配置Spring与jdbc整合的环境</title>
		<link>http://www.guloulou.com/?p=1966</link>
		<comments>http://www.guloulou.com/?p=1966#comments</comments>
		<pubDate>Sun, 25 Jul 2010 05:06:04 +0000</pubDate>
		<dc:creator>guloulou</dc:creator>
				<category><![CDATA[传智播客Spring2.5自学笔记]]></category>
		<category><![CDATA[@interface]]></category>
		<category><![CDATA[@Service]]></category>
		<category><![CDATA[@Transactional@Service]]></category>
		<category><![CDATA[aspectjweaver.jar]]></category>
		<category><![CDATA[cglib-nodep-2.1_3.jar]]></category>
		<category><![CDATA[common-annotations.jar;spring.jar;mysql-connector-java-3.1.13-bin.jar]]></category>
		<category><![CDATA[commons-dbcp.jar]]></category>
		<category><![CDATA[commons-logging.jar]]></category>
		<category><![CDATA[commons-pool.jar;aspectjrt.jar]]></category>
		<category><![CDATA[connection()]]></category>
		<category><![CDATA[dao]]></category>
		<category><![CDATA[DataSource]]></category>
		<category><![CDATA[dataSource.getConnection()]]></category>
		<category><![CDATA[DataSourceTransactionManager]]></category>
		<category><![CDATA[JDBC]]></category>
		<category><![CDATA[jdbcutil]]></category>
		<category><![CDATA[ResultSet]]></category>
		<category><![CDATA[spring-tx-2.5.xsd]]></category>
		<category><![CDATA[Spring2.5]]></category>
		<category><![CDATA[SQLException]]></category>
		<category><![CDATA[Statement]]></category>
		<category><![CDATA[tx]]></category>
		<category><![CDATA[事务]]></category>
		<category><![CDATA[传智播客]]></category>
		<category><![CDATA[整合]]></category>
		<category><![CDATA[环境]]></category>
		<category><![CDATA[笔记]]></category>
		<category><![CDATA[自学]]></category>

		<guid isPermaLink="false">http://www.guloulou.com/?p=1966</guid>
		<description><![CDATA[Update：2010.07.25,结合之前学习李勇老师的JDBC教程和自己的想法，初步实现了插入数据库操作！
 
21_传智播客Spring2.5视频教程_搭建和配置Spring与jdbc整合的环境
Spring+JDBC组合开发
使用Spring+JDBC集... ]]></description>
			<content:encoded><![CDATA[<div><strong>Update</strong>：2010.07.25,结合之前学习李勇老师的JDBC教程和自己的想法，初步实现了插入数据库操作！</div>
<div> </div>
<div><strong>21_传智播客Spring2.5视频教程_搭建和配置Spring与jdbc整合的环境</strong></div>
<div><strong>Spring+JDBC组合开发</strong></div>
<div>使用Spring+JDBC集成步骤如下：</div>
<div><strong>配置数据源，如</strong></div>
<blockquote style="margin-right: 0px;" dir="ltr">
<div>&lt;bean id="dataSource" class="org.apache.dbcp.BasicDataSource" destroy-method="close"&gt;</div>
<div>    &lt;property name="driverClassName" value="org.gjt.mm.mysql.Driver" /&gt;</div>
<div>    &lt;property name="url" value="jdbc:mysql://localhost:3306/itcast?useUnicode=true&amp;amp;characterEncoding=UTF-8" /&gt;</div>
<div>    &lt;property name="username" value="root" /&gt;</div>
<div>    &lt;property name="password" value="123456" /&gt;</div>
<div>    &lt;!-- ........略 --&gt;</div>
<div>&lt;/bean&gt;</div>
</blockquote>
<div><strong>配置事务</strong><br />
配置事务时，需要在xml配置文件中引入用于声明食物的tx命名空间（见下页），事务的配置方式有两种：注解方式和基于XML配置方式。</div>
<div><strong>本讲先讲解配置数据源：</strong></div>
<div>添加jar包支持：commons-dbcp.jar、commons-logging.jar、commons-pool.jar;aspectjrt.jar、aspectjweaver.jar、cglib-nodep-2.1_3.jar、common-annotations.jar;spring.jar;mysql-connector-java-3.1.13-bin.jar</div>
<div><strong>在spring配置文件中引入用于声明事务的tx命名空间</strong></div>
<div>&lt;beans xmlns="http://www.springframework.org/schema/beans"<br />
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<br />
       xmlns:context="http://www.springframework.org/schema/context"<br />
       <span style="color: #ff0000;">xmlns:tx="http://www.springframework.org/schema/tx"<br />
</span>       xmlns:aop="http://www.springframework.org/schema/aop"<br />
       xsi:schemaLocation="http://www.springframework.org/schema/beans<br />
       http://www.springframework.org/schema/beans/spring-beans-2.5.xsd<br />
       <span style="color: #ff0000;">http://www.springframework.org/schema/tx<br />
       http://www.springframework.org/schema/tx/spring-tx-2.5.xsd <br />
</span>       http://www.springframework.org/schema/aop<br />
       http://www.springframework.org/schema/aop/spring-aop-2.5.xsd</div>
<div>       http://www.springframework.org/schema/context</div>
<div>       http://www.springframework.org/schema/context/spring-context-2.5.xsd"&gt;</div>
<div>&lt;/beans&gt;</div>
<div><strong>采用注解方式配置事务</strong></div>
<div><strong>采用注解方式</strong></div>
<div>&lt;bean id = "txManager" class = "org.springframework.jdbc,datasource.DataSourceTransactionManager"&gt;</div>
<div>    &lt;propertyname="dataSource" ref="dataSource" /&gt;</div>
<div>&lt;/bean&gt;</div>
<div>&lt;!-- 采用@Transactional注解方式使用事务 --&gt;</div>
<div>&lt;tx:annotation-driven transaction-manager="txManager" /&gt;</div>
<div> </div>
<div>@Service @Transactional</div>
<div>public class PersonServiceBean implements PersonService {</div>
<div>}</div>
<div>且看源码：</div>
<div><strong>创建表：person.sql</strong></div>
<blockquote style="margin-right: 0px;" dir="ltr">
<div>/*<br />
Navicat MySQL Data Transfer</div>
<div> </div>
<div>Source Server : localhost<br />
Source Server Version : 50133<br />
Source Host : localhost:3306<br />
Source Database : itcast</div>
<div> </div>
<div>Target Server Type : MYSQL<br />
Target Server Version : 50133<br />
File Encoding : 65001</div>
<div> </div>
<div>Date: 2010-07-23 15:54:58<br />
*/</div>
<div> </div>
<div>SET FOREIGN_KEY_CHECKS=0;<br />
-- ----------------------------<br />
-- Table structure for `person`<br />
-- ----------------------------<br />
DROP TABLE IF EXISTS `person`;<br />
CREATE TABLE `person` (<br />
  `id` int(11) NOT NULL AUTO_INCREMENT,<br />
  `name` varchar(20) DEFAULT NULL,<br />
  PRIMARY KEY (`id`)<br />
) ENGINE=InnoDB DEFAULT CHARSET=utf8;</div>
<div> </div>
<div>-- ----------------------------<br />
-- Records of person<br />
-- ----------------------------</div>
</blockquote>
<div><strong>beans.xml</strong></div>
<blockquote style="margin-right: 0px;" dir="ltr">
<div>&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:context="http://www.springframework.org/schema/context"<br />
       xmlns:tx="http://www.springframework.org/schema/tx"<br />
       xmlns:aop="http://www.springframework.org/schema/aop"<br />
       xsi:schemaLocation="http://www.springframework.org/schema/beans<br />
       http://www.springframework.org/schema/beans/spring-beans-2.5.xsd<br />
       http://www.springframework.org/schema/tx<br />
       http://www.springframework.org/schema/tx/spring-tx-2.5.xsd<br />
       http://www.springframework.org/schema/aop<br />
       http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"&gt;<br />
    &lt;bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"&gt;<br />
        &lt;property name="driverClassName" value="org.gjt.mm.mysql.Driver" /&gt;<br />
        &lt;property name="url" value="jdbc:mysql://localhost:3306/itcast?useUnicode=true&amp;amp;characterEncoding=UTF-8" /&gt;<br />
        &lt;property name="username" value="root" /&gt;<br />
        &lt;property name="password" value=""/&gt;<br />
        &lt;!-- 连接池启动时的初始值 --&gt;<br />
        &lt;property name="initialSize" value="1" /&gt;<br />
        &lt;!-- 连接池的最大值 --&gt;<br />
        &lt;property name="maxActive" value="500"/&gt;<br />
        &lt;!-- 最大空闲值.当经过一个高峰时间后，连接池可以慢慢将已经用不到的连接慢慢释放一部分，一直减少到maxIdle为止 --&gt;<br />
        &lt;property name="maxIdle" value="2"/&gt;<br />
        &lt;!-- 最小空闲值，当空闲的连接数少于阀值时，连接池就会去申请一些连接，以免洪峰来时来不及申请 --&gt;<br />
        &lt;property name="minIdle" value="1" /&gt;</div>
<div> </div>
<div>    &lt;/bean&gt;<br />
    &lt;bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"&gt;<br />
        &lt;property name="dataSource" ref="dataSource" /&gt;<br />
    &lt;/bean&gt;<br />
    &lt;!-- 采用@Transactional注解方式使用事务 --&gt;<br />
    &lt;tx:annotation-driven transaction-manager="txManager" /&gt;<br />
    &lt;bean id="personService" class="cn.itcast.service.impl.PersonServiceBean" &gt;<br />
        &lt;property name="dataSource" ref="dataSource"&gt;&lt;/property&gt;<br />
    &lt;/bean&gt;</div>
<div>&lt;/beans&gt;</div>
</blockquote>
<div><strong>Person.java</strong></div>
<blockquote style="margin-right: 0px;" dir="ltr">
<div>package cn.itcast.bean;</div>
<div> </div>
<div>/**<br />
 *<br />
 * @author kang.cunhua<br />
 */<br />
public class Person {</div>
<div> </div>
<div>    private Integer id;<br />
    private String name;</div>
<div> </div>
<div>    public Person() {<br />
    }</div>
<div> </div>
<div>    public Person(Integer id, String name) {<br />
        this.id = id;<br />
        this.name = name;<br />
    }</div>
<div> </div>
<div>    /**<br />
     * @return the id<br />
     */<br />
    public Integer getId() {<br />
        return id;<br />
    }</div>
<div> </div>
<div>    /**<br />
     * @param id the id to set<br />
     */<br />
    public void setId(Integer id) {<br />
        this.id = id;<br />
    }</div>
<div> </div>
<div>    /**<br />
     * @return the name<br />
     */<br />
    public String getName() {<br />
        return name;<br />
    }</div>
<div> </div>
<div>    /**<br />
     * @param name the name to set<br />
     */<br />
    public void setName(String name) {<br />
        this.name = name;<br />
    }<br />
}</div>
</blockquote>
<div><strong>PersonService.java</strong></div>
<blockquote style="margin-right: 0px;" dir="ltr">
<div>package cn.itcast.service;</div>
<div> </div>
<div>import cn.itcast.bean.Person;<br />
import java.util.List;</div>
<div> </div>
<div>/**<br />
 *<br />
 * @author kang.cunhua<br />
 */<br />
public interface PersonService {</div>
<div> </div>
<div>    /**<br />
     * 保存person<br />
     * @param person<br />
     */<br />
    public void save(Person person);</div>
<div> </div>
<div>    /**<br />
     * 更新person<br />
     * @param person<br />
     */<br />
    public void update(Person person);</div>
<div> </div>
<div>    /**<br />
     * 获取person<br />
     * @param personid<br />
     * @return<br />
     */<br />
    public String getPerson(Integer personid);<br />
    /**<br />
     * 获取所有person<br />
     * @return<br />
     */<br />
    public List&lt;Person&gt; getPersons();<br />
    /**<br />
     * 删除指定id的person<br />
     * @param personid<br />
     */<br />
    public void delete (Integer personid);<br />
}</div>
</blockquote>
<div dir="ltr"><strong>PersonServiceBean.java</strong></div>
<blockquote style="margin-right: 0px;" dir="ltr">
<div dir="ltr">package cn.itcast.service.impl;</div>
<div dir="ltr"> </div>
<div dir="ltr">import cn.itcast.bean.Person;<br />
import cn.itcast.service.PersonService;<br />
import java.util.List;<br />
import javax.sql.DataSource;</div>
<div dir="ltr"> </div>
<div dir="ltr"> </div>
<div dir="ltr">/**<br />
 *<br />
 * @author kang.cunhua<br />
 */<br />
public class PersonServiceBean implements PersonService {<br />
    private DataSource dataSource;</div>
<div dir="ltr"> </div>
<div dir="ltr">    @Override<br />
    public void save(Person person) {<br />
        System.out.println("俺是save(Person person)方法！");</div>
<div dir="ltr"> </div>
<div dir="ltr">    }</div>
<div dir="ltr"> </div>
<div dir="ltr">    @Override<br />
    public void update(Person person) {<br />
        System.out.println("俺是update(Person person)方法！");</div>
<div dir="ltr"> </div>
<div dir="ltr">    }</div>
<div dir="ltr"> </div>
<div dir="ltr">    @Override<br />
    public String getPerson(Integer personid) {<br />
        System.out.println("俺是getPerson(Integer personid)方法！");<br />
         return null;<br />
    }</div>
<div dir="ltr"> </div>
<div dir="ltr">    @Override<br />
    public List&lt;Person&gt; getPersons() {<br />
        System.out.println("俺是getPersons()方法！");<br />
         return null;<br />
    }</div>
<div dir="ltr"> </div>
<div dir="ltr">    @Override<br />
    public void delete(Integer personid) {<br />
        System.out.println("俺是delete(Integer personid)方法！");<br />
    }</div>
<div dir="ltr"> </div>
<div dir="ltr">    /**<br />
     * @param dataSource the dataSource to set<br />
     */<br />
    public void setDataSource(DataSource dataSource) {<br />
        this.dataSource = dataSource;<br />
    }</div>
<div dir="ltr"> </div>
<div dir="ltr">}</div>
</blockquote>
<div dir="ltr"><strong>PersonServiceBeanTest.java</strong></div>
<blockquote style="margin-right: 0px;" dir="ltr">
<div dir="ltr">package cn.itcast.service.impl;</div>
<div dir="ltr"> </div>
<div dir="ltr">import cn.itcast.service.PersonService;<br />
import org.junit.AfterClass;<br />
import org.junit.Before;<br />
import org.junit.BeforeClass;<br />
import org.junit.Test;<br />
import org.springframework.context.ApplicationContext;<br />
import org.springframework.context.support.ClassPathXmlApplicationContext;</div>
<div dir="ltr"> </div>
<div dir="ltr">/**<br />
 *<br />
 * @author kang.cunhua<br />
 */<br />
public class PersonServiceBeanTest {<br />
    private static PersonService personService;</div>
<div dir="ltr"> </div>
<div dir="ltr">    public PersonServiceBeanTest() {<br />
    }</div>
<div dir="ltr"> </div>
<div dir="ltr">    @BeforeClass<br />
    public static void setUpClass() throws Exception {<br />
        ApplicationContext cxt = new ClassPathXmlApplicationContext("beans.xml");<br />
        personService = (PersonService) cxt.getBean("personService");<br />
    }</div>
<div dir="ltr"> </div>
<div dir="ltr">    @AfterClass<br />
    public static void tearDownClass() throws Exception {<br />
    }</div>
<div dir="ltr"> </div>
<div dir="ltr">    @Before<br />
    public void setUp() {<br />
    }</div>
<div dir="ltr"> </div>
<div dir="ltr">    /**<br />
     * Test of save method, of class PersonServiceBean.<br />
     */<br />
    @Test<br />
    public void testSave() {</div>
<div dir="ltr"> </div>
<div dir="ltr"> </div>
<div dir="ltr">        personService.save(null);</div>
<div dir="ltr"> </div>
<div dir="ltr">    }</div>
<div dir="ltr"> </div>
<div dir="ltr">    /**<br />
     * Test of update method, of class PersonServiceBean.<br />
     */<br />
    @Test<br />
    public void testUpdate() {<br />
        personService.update(null);<br />
    }</div>
<div dir="ltr"> </div>
<div dir="ltr">    /**<br />
     * Test of getPerson method, of class PersonServiceBean.<br />
     */<br />
    @Test<br />
    public void testGetPerson() {<br />
        personService.getPerson(1);<br />
    }</div>
<div dir="ltr"> </div>
<div dir="ltr">    /**<br />
     * Test of getPersons method, of class PersonServiceBean.<br />
     */<br />
    @Test<br />
    public void testGetPersons() {<br />
        personService.getPersons();<br />
    }</div>
<div dir="ltr"> </div>
<div dir="ltr">    /**<br />
     * Test of delete method, of class PersonServiceBean.<br />
     */<br />
    @Test<br />
    public void testDelete() {<br />
        personService.delete(1);<br />
    }</div>
<div dir="ltr"> </div>
<div dir="ltr">    /**<br />
     * Test of setDataSource method, of class PersonServiceBean.<br />
     */<br />
    @Test<br />
    public void testSetDataSource() {<br />
    }<br />
}</div>
</blockquote>
<div dir="ltr"><strong>输出：</strong></div>
<blockquote style="margin-right: 0px;" dir="ltr">
<div dir="ltr">2010-7-23 16:03:10 org.springframework.context.support.AbstractApplicationContext prepareRefresh<br />
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@fa7e74: display name [org.springframework.context.support.ClassPathXmlApplicationContext@fa7e74]; startup date [Fri Jul 23 16:03:10 CST 2010]; root of context hierarchy<br />
2010-7-23 16:03:10 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions<br />
信息: Loading XML bean definitions from class path resource [beans.xml]<br />
2010-7-23 16:03:10 org.springframework.context.support.AbstractApplicationContext obtainFreshBeanFactory<br />
信息: Bean factory for application context [org.springframework.context.support.ClassPathXmlApplicationContext@fa7e74]: org.springframework.beans.factory.support.DefaultListableBeanFactory@4cee32<br />
2010-7-23 16:03:10 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons<br />
信息: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@4cee32: defining beans [dataSource,txManager,org.springframework.aop.config.internalAutoProxyCreator,org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#0,org.springframework.transaction.interceptor.TransactionInterceptor#0,org.springframework.transaction.config.internalTransactionAdvisor,personService]; root of factory hierarchy<br />
俺是save(Person person)方法！<br />
俺是update(Person person)方法！<br />
俺是getPerson(Integer personid)方法！<br />
俺是getPersons()方法！<br />
俺是delete(Integer personid)方法！</div>
</blockquote>
<div dir="ltr">-----------------------------青春靓丽阳光活力分割线--------------------------------</div>
<div dir="ltr">以上代码稍微比视频上的多一些；视频上讲解到搭建环境后，就结束了。也没有结合JDBC做一些单元测试；下一讲看了开头，貌似开始讲Spring的JDBC实现了。so，我补充了单元测试，以及需要的方法。初步模拟了一下方法调用。但并没有实际连数据库；</div>
<div dir="ltr">-----------------------------青春靓丽阳光活力分割线--------------------------------</div>
<div dir="ltr">以下的代码是今天2010.07.25补充的。觉得自己应该把整体的代码做个简单连接数据库测试。于是，翻了翻之前李勇老师的JDBC笔记，结合自己的想法，做了些许分层。整合在这一讲中了。</div>
<div dir="ltr">引入DAO、JdbcUtils，重新设计Service层；废话不说了，且看代码：</div>
<div dir="ltr">
<div><strong>创建表：person.sql</strong></div>
<blockquote dir="ltr">
<div>/*<br />
Navicat MySQL Data Transfer</div>
<div> </div>
<div>Source Server : localhost<br />
Source Server Version : 50133<br />
Source Host : localhost:3306<br />
Source Database : itcast</div>
<div> </div>
<div>Target Server Type : MYSQL<br />
Target Server Version : 50133<br />
File Encoding : 65001</div>
<div> </div>
<div>Date: 2010-07-23 15:54:58<br />
*/</div>
<div> </div>
<div>SET FOREIGN_KEY_CHECKS=0;<br />
-- ----------------------------<br />
-- Table structure for `person`<br />
-- ----------------------------<br />
DROP TABLE IF EXISTS `person`;<br />
CREATE TABLE `person` (<br />
  `id` int(11) NOT NULL AUTO_INCREMENT,<br />
  `name` varchar(20) DEFAULT NULL,<br />
  PRIMARY KEY (`id`)<br />
) ENGINE=InnoDB DEFAULT CHARSET=utf8;</div>
<div> </div>
<div>-- ----------------------------<br />
-- Records of person<br />
-- ----------------------------</div>
</blockquote>
</div>
<div dir="ltr"><strong> beans.xml</strong></div>
<div dir="ltr">
<blockquote><p>&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:context="http://www.springframework.org/schema/context"<br />
       xmlns:tx="http://www.springframework.org/schema/tx"<br />
       xmlns:aop="http://www.springframework.org/schema/aop"<br />
       xsi:schemaLocation="http://www.springframework.org/schema/beans<br />
       http://www.springframework.org/schema/beans/spring-beans-2.5.xsd<br />
       http://www.springframework.org/schema/tx<br />
       http://www.springframework.org/schema/tx/spring-tx-2.5.xsd<br />
       http://www.springframework.org/schema/aop<br />
       http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"&gt;<br />
    &lt;bean id="dataSource" destroy-method="close"&gt;<br />
        &lt;property name="driverClassName" value="org.gjt.mm.mysql.Driver" /&gt;<br />
        &lt;property name="url" value="jdbc:mysql://localhost:3306/itcast?useUnicode=true&amp;amp;characterEncoding=UTF-8" /&gt;<br />
        &lt;property name="username" value="root" /&gt;<br />
        &lt;property name="password" value=""/&gt;<br />
        &lt;!-- 连接池启动时的初始值  --&gt;<br />
        &lt;property name="initialSize" value="1" /&gt;<br />
        &lt;!-- 连接池的最大值 --&gt;<br />
        &lt;property name="maxActive" value="500"/&gt;<br />
        &lt;!-- 最大空闲值.当经过一个高峰时间后，连接池可以慢慢将已经用不到的连接慢慢释放一部分，一直减少到maxIdle为止 --&gt;<br />
        &lt;property name="maxIdle" value="2"/&gt;<br />
        &lt;!-- 最小空闲值，当空闲的连接数少于阀值时，连接池就会去申请一些连接，以免洪峰来时来不及申请 --&gt;<br />
        &lt;property name="minIdle" value="1" /&gt;</p>
<p>    &lt;/bean&gt;<br />
    &lt;bean id="txManager"&gt;<br />
        &lt;property name="dataSource" ref="dataSource" /&gt;<br />
    &lt;/bean&gt;<br />
    &lt;!-- 采用@Transactional注解方式使用事务 --&gt;<br />
    &lt;tx:annotation-driven transaction-manager="txManager" /&gt;<br />
    &lt;bean id="jdbcUtils" &gt;<br />
        &lt;property name="dataSource" ref="dataSource"&gt;&lt;/property&gt;<br />
    &lt;/bean&gt;<br />
    &lt;bean id="personDao" &gt;<br />
        &lt;property name="jdbcUtils" ref="jdbcUtils"&gt;&lt;/property&gt;<br />
    &lt;/bean&gt;<br />
    &lt;bean id="personService" &gt;<br />
        &lt;property name="personDao" ref="personDao"&gt;&lt;/property&gt;<br />
    &lt;/bean&gt;</p>
<p>&lt;/beans&gt;</p></blockquote>
<p><strong>Person.java</strong></p>
<blockquote><p>package cn.itcast.bean;</p>
<p>/**<br />
 *<br />
 * @author kang.cunhua<br />
 */<br />
public class Person {</p>
<p>    private Integer id;<br />
    private String name;</p>
<p>    public Person() {<br />
    }</p>
<p>    public Person(Integer id, String name) {<br />
        this.id = id;<br />
        this.name = name;<br />
    }</p>
<p>    /**<br />
     * @return the id<br />
     */<br />
    public Integer getId() {<br />
        return id;<br />
    }</p>
<p>    /**<br />
     * @param id the id to set<br />
     */<br />
    public void setId(Integer id) {<br />
        this.id = id;<br />
    }</p>
<p>    /**<br />
     * @return the name<br />
     */<br />
    public String getName() {<br />
        return name;<br />
    }</p>
<p>    /**<br />
     * @param name the name to set<br />
     */<br />
    public void setName(String name) {<br />
        this.name = name;<br />
    }<br />
}</p></blockquote>
<p><strong>PersonDao.java</strong></p>
<blockquote><p>package cn.itcast.dao;</p>
<p>import cn.itcast.bean.Person;<br />
import java.util.List;</p>
<p>/**<br />
 *<br />
 * @author kang.cunhua<br />
 */<br />
public interface PersonDao {<br />
    /**<br />
     * 保存person<br />
     * @param person<br />
     */<br />
    public void save(Person person);</p>
<p>    /**<br />
     * 更新person<br />
     * @param person<br />
     */<br />
    public void update(Person person);</p>
<p>    /**<br />
     * 获取person<br />
     * @param personid<br />
     * @return<br />
     */<br />
    public String getPerson(Integer personid);<br />
    /**<br />
     * 获取所有person<br />
     * @return<br />
     */<br />
    public List&lt;Person&gt; getPersons();<br />
    /**<br />
     * 删除指定id的person<br />
     * @param personid<br />
     */<br />
    public void delete (Integer personid);</p>
<p>}</p></blockquote>
<p><strong>PersonDaoBean.java</strong></p>
<blockquote><p>package cn.itcast.dao.impl;</p>
<p>import cn.itcast.bean.Person;<br />
import cn.itcast.dao.PersonDao;<br />
import cn.itcast.utils.JdbcUtils;<br />
import java.sql.Connection;<br />
import java.sql.PreparedStatement;<br />
import java.sql.ResultSet;<br />
import java.sql.SQLException;<br />
import java.util.List;<br />
import java.util.logging.Level;<br />
import java.util.logging.Logger;</p>
<p>/**<br />
 *<br />
 * @author kang.cunhua<br />
 */<br />
public class PersonDaoBean implements PersonDao {</p>
<p>    private JdbcUtils jdbcUtils;</p>
<p>    @Override<br />
    public void save(Person person) {<br />
        Connection conn = null;<br />
        PreparedStatement ps = null;<br />
        ResultSet rs = null;<br />
        String sql = "insert into person(name) values (?) ";<br />
        try {<br />
            conn = jdbcUtils.getConnection();<br />
            ps = conn.prepareStatement(sql);<br />
            ps.setString(1, person.getName());<br />
            ps.execute();</p>
<p>        } catch (SQLException ex) {<br />
            Logger.getLogger(PersonDaoBean.class.getName()).log(Level.SEVERE, null, ex);<br />
        } finally {<br />
   JdbcUtils.free(rs, ps, conn);<br />
  }<br />
        System.out.println("俺是save(Person person)方法！");<br />
    }</p>
<p>    @Override<br />
    public void update(Person person) {<br />
        System.out.println("俺是update(Person person)方法！");<br />
    }</p>
<p>    @Override<br />
    public String getPerson(Integer personid) {<br />
        System.out.println("俺是getPerson(Integer personid)方法！");<br />
        return null;<br />
    }</p>
<p>    @Override<br />
    public List&lt;Person&gt; getPersons() {<br />
        System.out.println("俺是getPersons()方法！");<br />
        return null;<br />
    }</p>
<p>    @Override<br />
    public void delete(Integer personid) {<br />
        System.out.println("俺是getPersons()方法！");<br />
    }</p>
<p>    /**<br />
     * @param jdbcUtils the jdbcUtils to set<br />
     */<br />
    public void setJdbcUtils(JdbcUtils jdbcUtils) {<br />
        this.jdbcUtils = jdbcUtils;<br />
    }<br />
}</p></blockquote>
<p><strong>PersonService.java</strong></p>
<blockquote><p>package cn.itcast.service;</p>
<p>import cn.itcast.bean.Person;<br />
import java.util.List;</p>
<p>/**<br />
 *<br />
 * @author kang.cunhua<br />
 */<br />
public interface PersonService {<br />
    public void regist(Person person);<br />
    public List retrieve();<br />
}</p></blockquote>
<p><strong>PersonServiceBean.java</strong></p>
<blockquote><p>package cn.itcast.service.impl;</p>
<p>import cn.itcast.bean.Person;<br />
import cn.itcast.service.PersonService;<br />
import cn.itcast.dao.PersonDao;<br />
import java.util.List;</p>
<p>/**<br />
 *<br />
 * @author kang.cunhua<br />
 */<br />
public class PersonServiceBean implements PersonService {</p>
<p>    private PersonDao personDao;</p>
<p>    @Override<br />
    public void regist(Person person) {<br />
        personDao.save(person);<br />
    }</p>
<p>    @Override<br />
    public List retrieve() {<br />
        return personDao.getPersons();</p>
<p>    }</p>
<p>    /**<br />
     * @param personDao the personDao to set<br />
     */<br />
    public void setPersonDao(PersonDao personDao) {<br />
        this.personDao = personDao;<br />
    }<br />
}</p></blockquote>
<p><strong>JdbcUtil.java</strong></p>
<blockquote><p>package cn.itcast.utils;</p>
<p>import java.sql.Connection;<br />
import java.sql.ResultSet;<br />
import java.sql.SQLException;<br />
import java.sql.Statement;<br />
import javax.sql.DataSource;</p>
<p>/**<br />
 *<br />
 * @author kang.cunhua<br />
 */<br />
public class JdbcUtils {</p>
<p>    private DataSource dataSource;</p>
<p>    public Connection getConnection() throws SQLException {<br />
        return dataSource.getConnection();<br />
    }</p>
<p>    /**<br />
     * @param dataSource the dataSource to set<br />
     */<br />
    public void setDataSource(DataSource dataSource) {<br />
        this.dataSource = dataSource;<br />
    }</p>
<p>    public static void free(ResultSet rs, Statement st, Connection conn) {<br />
        try {<br />
            if (rs != null) {<br />
                rs.close();<br />
            }<br />
        } catch (SQLException e) {<br />
            e.printStackTrace();<br />
        } finally {<br />
            try {<br />
                if (st != null) {<br />
                    st.close();<br />
                }<br />
            } catch (SQLException e) {<br />
                e.printStackTrace();<br />
            } finally {<br />
                if (conn != null) {<br />
                    try {<br />
                        conn.close();<br />
                        // myDataSource.free(conn);<br />
                    } catch (Exception e) {<br />
                        e.printStackTrace();<br />
                    }<br />
                }<br />
            }<br />
        }<br />
    }<br />
}</p></blockquote>
<p><strong>单元测试：PersonServiceBeanTest.java</strong></p>
<blockquote><p>package cn.itcast.service.impl;</p>
<p>import cn.itcast.bean.Person;<br />
import cn.itcast.service.PersonService;<br />
import org.junit.AfterClass;<br />
import org.junit.Before;<br />
import org.junit.BeforeClass;<br />
import org.junit.Test;<br />
import org.springframework.context.ApplicationContext;<br />
import org.springframework.context.support.ClassPathXmlApplicationContext;</p>
<p>/**<br />
 *<br />
 * @author kang.cunhua<br />
 */<br />
public class PersonServiceBeanTest {</p>
<p>    private static PersonService personService;</p>
<p>    public PersonServiceBeanTest() {<br />
    }</p>
<p>    @BeforeClass<br />
    public static void setUpClass() throws Exception {<br />
        ApplicationContext cxt = new ClassPathXmlApplicationContext("beans.xml");<br />
        personService = (PersonService) cxt.getBean("personService");<br />
    }</p>
<p>    @AfterClass<br />
    public static void tearDownClass() throws Exception {<br />
    }</p>
<p>    @Before<br />
    public void setUp() {<br />
    }</p>
<p>    /**<br />
     * Test of save method, of class PersonServiceBean.<br />
     */<br />
    @Test<br />
    public void testSave() {<br />
        Person person = new Person();<br />
        person.setName("郭德纲");<br />
        personService.regist(person);<br />
    }</p>
<p>    /**<br />
     * Test of update method, of class PersonServiceBean.<br />
     */<br />
    @Test<br />
    public void testRetrievee() {<br />
        personService.retrieve();<br />
    }<br />
}</p></blockquote>
<p> </p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.guloulou.com/?feed=rss2&amp;p=1966</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>20_传智播客Spring2.5视频教程_aspectj的切入点语法定义细节</title>
		<link>http://www.guloulou.com/?p=1964</link>
		<comments>http://www.guloulou.com/?p=1964#comments</comments>
		<pubDate>Wed, 21 Jul 2010 08:52:46 +0000</pubDate>
		<dc:creator>guloulou</dc:creator>
				<category><![CDATA[传智播客Spring2.5自学笔记]]></category>
		<category><![CDATA[!void]]></category>
		<category><![CDATA[aop:pointcut]]></category>
		<category><![CDATA[aspectj]]></category>
		<category><![CDATA[beans.xml]]></category>
		<category><![CDATA[Spring2.5]]></category>
		<category><![CDATA[举例]]></category>
		<category><![CDATA[传智播客]]></category>
		<category><![CDATA[切入点]]></category>
		<category><![CDATA[语法]]></category>
		<category><![CDATA[黎活明]]></category>

		<guid isPermaLink="false">http://www.guloulou.com/?p=1964</guid>
		<description><![CDATA[拦截所有方法：(* cn.itcast.service.impl.PersonServiceBean.*(..))只拦截返回值为String的方法：(java.lang.String cn.itcast.service.impl.PersonServiceBean.*(..))要求输入参数第一必须是String类型。后续不管有没有参数(* c... ]]></description>
			<content:encoded><![CDATA[<p>拦截所有方法：<br />(* cn.itcast.service.impl.PersonServiceBean.*(..))<br />只拦截返回值为String的方法：<br />(java.lang.String cn.itcast.service.impl.PersonServiceBean.*(..))<br />要求输入参数第一必须是String类型。后续不管有没有参数<br />(* cn.itcast.service.impl.PersonServiceBean.*(java.lang.String,..))<br />要求拦截所有返回值不是void的方法；<br />(!void cn.itcast.service.impl.PersonServiceBean.*(..))</p>
<p>针对最后一种需求，且看源代码：<br /><b>beans.xml</b><br />
<blockquote>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />&lt;beans xmlns="http://www.springframework.org/schema/beans"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlns:aop="http://www.springframework.org/schema/aop"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xsi:schemaLocation="http://www.springframework.org/schema/beans<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; http://www.springframework.org/schema/beans/spring-beans-2.5.xsd<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; http://www.springframework.org/schema/aop<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;aop:aspectj-autoproxy/&gt;<br />&nbsp;&nbsp;&nbsp; &lt;bean id="personService" class="cn.itcast.service.impl.PersonServiceBean"/&gt;<br />&nbsp;&nbsp;&nbsp; &lt;bean id="aspetbean" class="cn.itcast.aop.MyInterceptor"/&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;aop:config&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;aop:aspect id="asp" ref="aspetbean"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;aop:pointcut id="mycut" expression="execution(!void cn.itcast.service.impl.PersonServiceBean.*(..))"/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;aop:before pointcut-ref="mycut" method="doAccessCheck"/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;aop:after-returning pointcut-ref="mycut" method="doAfterReturning" /&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;aop:after-throwing pointcut-ref="mycut" method="doAfterThrowing"/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;aop:after pointcut-ref="mycut" method="doAfter"/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;aop:around pointcut-ref="mycut" method="doBasicProfiling"/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/aop:aspect&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/aop:config&gt;<br />&lt;/beans&gt;</p></blockquote>
<p><b>MyInterceptorTest.java</b><br />
<blockquote>package cn.itcast.aop;</p>
<p>import cn.itcast.service.PersonService;<br />import org.junit.BeforeClass;<br />import org.junit.Test;<br />import org.springframework.context.ApplicationContext;<br />import org.springframework.context.support.ClassPathXmlApplicationContext;</p>
<p>/**<br />&nbsp;*<br />&nbsp;* @author kang.cunhua<br />&nbsp;*/<br />public class MyInterceptorTest {</p>
<p>&nbsp;&nbsp;&nbsp; public MyInterceptorTest() {<br />&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; @BeforeClass<br />&nbsp;&nbsp;&nbsp; public static void setUpClass() throws Exception {<br />&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; /**<br />&nbsp;&nbsp;&nbsp;&nbsp; * Test of doAccessCheck method, of class MyInterceptor.<br />&nbsp;&nbsp;&nbsp;&nbsp; */<br />&nbsp;&nbsp;&nbsp; @Test<br />&nbsp;&nbsp;&nbsp; public void testDoAccessCheck() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ApplicationContext cxt = new ClassPathXmlApplicationContext("beans.xml");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PersonService personService = (PersonService) cxt.getBean("personService");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; personService.save("xxx");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("-----------------");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; personService.getPersonName(2);<br />&nbsp;&nbsp;&nbsp; }<br />}</p></blockquote>
<p><b>输出如下：</b><br />
<blockquote>2010-7-21 16:47:15 org.springframework.context.support.AbstractApplicationContext prepareRefresh<br />信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@cdfc9c: display name [org.springframework.context.support.ClassPathXmlApplicationContext@cdfc9c]; startup date [Wed Jul 21 16:47:15 CST 2010]; root of context hierarchy<br />2010-7-21 16:47:16 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions<br />信息: Loading XML bean definitions from class path resource [beans.xml]<br />2010-7-21 16:47:16 org.springframework.context.support.AbstractApplicationContext obtainFreshBeanFactory<br />信息: Bean factory for application context [org.springframework.context.support.ClassPathXmlApplicationContext@cdfc9c]: org.springframework.beans.factory.support.DefaultListableBeanFactory@ba9340<br />2010-7-21 16:47:16 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons<br />信息: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@ba9340: defining beans [org.springframework.aop.config.internalAutoProxyCreator,personService,aspetbean,org.springframework.aop.aspectj.AspectJPointcutAdvisor#0,org.springframework.aop.aspectj.AspectJPointcutAdvisor#1,org.springframework.aop.aspectj.AspectJPointcutAdvisor#2,org.springframework.aop.aspectj.AspectJPointcutAdvisor#3,org.springframework.aop.aspectj.AspectJPointcutAdvisor#4,mycut]; root of factory hierarchy<br />我是save()方法！<br />-----------------<br />前置通知触发:<br />进入方法<br />我是getPersonName()方法！<br />后置通知触发:<br />最终通知触发！！<br />退出方法</p></blockquote>
<p>除了beans.xml有少许改动，其他代码和上一讲一致；</p>
<p></p>
]]></content:encoded>
			<wfw:commentRss>http://www.guloulou.com/?feed=rss2&amp;p=1964</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
