日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

spring and hibernate,spring and tapestry整合篇

 duduwolf 2005-08-06

目前java開源框架真可以說是琳瑯滿目,最近一個(gè)多星期一直在接觸spring、hibernate、tapestry。將最近一個(gè)多星期以來的學(xué)習(xí)匯總一下,以便日后查閱,也方便大家學(xué)習(xí)。

簡單的介紹到處都是,對(duì)于spring、hibernate、tapestry是干什么用的,我就不多介紹了。大致能夠知道springIOC/DI概念(AOP方面我也理解不好,暫時(shí))、hibernate的基本概念,如對(duì)象持久,ORM,POJO這些概念,tapestry重在組件。我想懂這些并且做個(gè)簡單小例子,理解本文應(yīng)該就沒什么大問題了。

我的開發(fā)環(huán)境是eclipse3.1+tomcat5.0.18+jdk1.4.2/jdk1.5 +mysql+這些相關(guān)jar

注:spring1.2+hibernate2.1+tapestry3.0.3

對(duì)于eclipse的操作這里不做詳細(xì)介紹,下面會(huì)給出整合代碼。

建立項(xiàng)目如together,引入需要的包,方便起見就把spring.jar引入,因?yàn)樗容^全,它沒有包含mock(主要是測(cè)試用的)??傊前堰@些都導(dǎo)進(jìn)到你的project里來。別import時(shí)候找不到就可以了。

Springhibernate結(jié)合部分:

數(shù)據(jù)庫準(zhǔn)備工作:如mysql,建庫為learn,建表為customer,包含字段(aidusername,password)分別為intvarchar型。

相關(guān)代碼(代碼存放位置):

spring-hibernate.xml(與src保持同級(jí))

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www./dtd/spring-beans.dtd">

<beans>

    <description>test spring and hibernate</description>

    <!-- datasource -->

    <bean id="datasource"

       class="org.apache.commons.dbcp.BasicDataSource"

       destroy-method="close">

       <property name="driverClassName">

           <value>com.mysql.jdbc.Driver</value>

       </property>

       <property name="url">

           <value>jdbc:mysql://localhost/learn</value>

       </property>

       <property name="username">

           <value>root</value>

       </property>

       <property name="password">

           <value></value>

       </property>

    </bean>

    <!-- hibernate support -->

    <bean id="sessionFactory"

       class="org.springframework.orm.hibernate.LocalSessionFactoryBean">

       <property name="dataSource">

           <ref local="datasource" />

       </property>

       <property name="mappingResources">

           <list>

              <value>yunguang/learn/springandhibernate/Customer.hbm.xml</value>

           </list>

       </property>

       <property name="hibernateProperties">

           <props>

              <prop key="hibernate.dialect">

                  net.sf.hibernate.dialect.MySQLDialect

              </prop>

              <prop key="hibernate.show_sql">true</prop>

           </props>

       </property>

    </bean>

    <!-- hibernate dao -->

    <bean id="hibernatedao" class="yunguang.spring.dao.TestDao">

       <property name="sessionFactory">

           <ref local="sessionFactory" />

       </property>

    </bean>

</beans>

customer.hbm.xmlyunguang.learn.springandhibernate包下

<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"

"http://hibernate./hibernate-mapping-2.0.dtd">

<hibernate-mapping>

    <class name="yunguang.learn.springandhibernate.Customer" table="customer">

       <id name="id" column="aid">

           <generator class="increment" />

       </id>

       <property name="username" column="username" />

       <property name="password" column="password" />

    </class>

</hibernate-mapping>

 

/*

 * Created on 2005-7-6

 *

 * TODO To change the template for this generated file go to

 * Window - Preferences - Java - Code Style - Code Templates

 */

package yunguang.learn.springandhibernate;

 

/**

 * @author Administrator

 *

 * TODO To change the template for this generated type comment go to Window -

 * Preferences - Java - Code Style - Code Templates

 */

public class Customer {

     private int id;

 

     private String username;

 

     private String password;

 

     public int getId() {

            return id;

     }

 

     public String getPassword() {

            return password;

     }

 

     public String getUsername() {

            return username;

     }

 

     public void setId(int id) {

            this.id = id;

     }

 

     public void setPassword(String password) {

            this.password = password;

     }

 

     public void setUsername(String username) {

            this.username = username;

     }

}

 

 

單元測(cè)試類

package test.junit;

 

import junit.framework.TestCase;

import junit.textui.TestRunner;

 

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.FileSystemXmlApplicationContext;

 

import yunguang.learn.springandhibernate.Customer;

import yunguang.spring.dao.ITestDao;

 

public class TestDaoTest extends TestCase {

 

     public void testInsertTest(){

            ApplicationContext beans = new FileSystemXmlApplicationContext("spring-hibernate.xml");

//          XmlBeanFactory beans = new XmlBeanFactory(new FileInputStream(

//                        "spring-hibernate.xml"));

            ITestDao tests = (ITestDao) beans.getBean("hibernatedao");

            Customer customer = new Customer();

            customer.setId(55);

            customer.setUsername("yunguangtest==================");

            customer.setPassword("passwordsdlkjfklsd");

            tests.insertTest(customer);

     }

 

     public static void main(String[] args) {

            TestRunner.run(TestDaoTest.class);

     }

}

 

eclipse中的junite運(yùn)行這一單元測(cè)試。即可一路跑綠,查看數(shù)據(jù)庫完成插入操作。

小結(jié):

核心為spring-hibernate.xml,利用spring的依賴注入的特性。不用單獨(dú)配置hibernate的配置文件(hibernate.cfg.xmlhibernate.properties)。其他部分見代碼吧!如果單獨(dú)都能各自都能理解,則看上面代碼不會(huì)有什么太大障礙。

 

 

springtapestry結(jié)合部分:

相關(guān)代碼(代碼存放位置):

前提當(dāng)然是建立web project,才能使tapestry發(fā)揮其作用,才能完整此例子的練習(xí)。這里我只是在tomcat下建立deploy并且簡單測(cè)試了一下:

Web.xml:(這個(gè)文件我想大家都知道放在哪里吧。呵呵)

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE web-app

      PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"

      "http://java./dtd/web-app_2_3.dtd">

<!-- generated by Spindle, http://spindle. -->

 

<web-app>

 

     <display-name>together</display-name>

     <!--        Redirect it to the servlet mapping address /h-->

 

 

 

 

     <!--

            <filter>

            <filter-name>redirect</filter-name>

            <filter-class>org.apache.tapestry.RedirectFilter</filter-class>

            </filter>

           

            <filter-mapping>

            <filter-name>redirect</filter-name>

            <url-pattern>/</url-pattern>

            </filter-mapping>

            <listener>

            <listener-class>

            org.springframework.web.context.ContextLoaderListener

            </listener-class>

            </listener>

     -->

 

 

     <context-param>

            <param-name>contextConfigLocation</param-name>

            <param-value>/WEB-INF/springandtapestry.xml</param-value>

     </context-param>

     <servlet>

            <servlet-name>context</servlet-name>

            <servlet-class>

                   org.springframework.web.context.ContextLoaderServlet

            </servlet-class>

            <load-on-startup>1</load-on-startup>

     </servlet>

 

     <servlet>

            <servlet-name>together</servlet-name>

            <servlet-class>

                   org.apache.tapestry.ApplicationServlet

            </servlet-class>

     </servlet>

     <servlet-mapping>

            <servlet-name>together</servlet-name>

            <url-pattern>/app</url-pattern>

     </servlet-mapping>

 

     <session-config>

            <session-timeout>15</session-timeout>

     </session-config>

 

     <welcome-file-list>

            <welcome-file>Home.html</welcome-file>

     </welcome-file-list>

 

</web-app>

 

Springandtapestry.xml(這個(gè)和web.xml 放在同個(gè)目錄下,即web-inf目錄下)

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"

"http://www./dtd/spring-beans.dtd">

<beans>

     <bean id="aBean" class="yunguang.learn.springandtapestry.Bean"></bean>

</beans>

 

Together. application(與project同名的xml文件。這是tapestry的要求)

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE application PUBLIC

  "-//Apache Software Foundation//Tapestry Specification 3.0//EN"

  "http://jakarta./tapestry/dtd/Tapestry_3_0.dtd">

<!-- generated by Spindle, http://spindle. -->

<application name="together" engine-class="yunguang.learn.springandtapestry.MyEngine">

    <description>

        add a description

    </description>

        <page name="Home" specification-path="Home.page"/>

    </application>

 

Home.html(在你的tapestry能夠訪問到的默認(rèn)目錄)

<span jwcid="$Content$">

<table width="337" border="1">

     <tr align="center">

            <td><span jwcid="@Insert" value="ognl:aBean.amethod" /></td>

     </tr>

</table>

</span>

Home.page(與home.html同級(jí))

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE page-specification PUBLIC

  "-//Apache Software Foundation//Tapestry Specification 3.0//EN"

  "http://jakarta./tapestry/dtd/Tapestry_3_0.dtd">

<page-specification class="yunguang.learn.springandtapestry.Home">

    <property-specification name="aBean" type="yunguang.learn.springandtapestry.IBean">

        global.appContext.getBean("aBean")

    </property-specification>

</page-specification>

 

相關(guān)類文件:

package yunguang.learn.springandtapestry;

 

public interface IBean {

     public String getAmethod();

}

 

package yunguang.learn.springandtapestry;

 

public class Bean implements IBean {

 

     public String getAmethod() {

            // do something;

            System.out

                          .println("================================================test a amethod=============================================");

            return "===================test===========================";

     }

}

 

package yunguang.learn.springandtapestry;

 

public class Global {

 

}

 

 

package yunguang.learn.springandtapestry;

 

import java.util.Map;

 

import org.apache.tapestry.engine.BaseEngine;

import org.apache.tapestry.request.RequestContext;

import org.springframework.context.ApplicationContext;

import org.springframework.web.context.support.WebApplicationContextUtils;

 

public class MyEngine extends BaseEngine {

     public static final String APPLICATION_CONTEXT_KEY = "appContext";

 

     protected void setupForRequest(RequestContext context) {

            super.setupForRequest(context);

            Map global = (Map) getGlobal();

            ApplicationContext ac = (ApplicationContext) global

                          .get(APPLICATION_CONTEXT_KEY);

            if (ac == null) {

                   ac = WebApplicationContextUtils.getWebApplicationContext(context

                                 .getServlet().getServletContext());

                   System.out.println("測(cè)試" + ac);                 global.put(APPLICATION_CONTEXT_KEY, ac);

                  

            }

     }

}

 

package yunguang.learn.springandtapestry;

 

import org.apache.tapestry.event.PageEvent;

import org.apache.tapestry.event.PageRenderListener;

import org.apache.tapestry.html.BasePage;

import org.springframework.web.context.WebApplicationContext;

import org.springframework.web.context.support.WebApplicationContextUtils;

 

public abstract class Home extends BasePage implements PageRenderListener {

     public abstract IBean getABean();

 

      /** 當(dāng)頁面表現(xiàn)之前,首先運(yùn)行這個(gè)方法 */

     public void pageBeginRender(PageEvent event)  {

            WebApplicationContext appContext = WebApplicationContextUtils

                          .getWebApplicationContext(getRequestCycle().getRequestContext()

                                        .getServlet().getServletContext());

            IBean bean = (IBean) appContext.getBean("aBean");

            //bean.getAmethod();

     }

}

 

小結(jié):

核心在于利用engine部分,通過定義mapglobal。然后在home.page中可以進(jìn)行通過global.appContext.getBean("aBean")對(duì)home.javaabstract屬性進(jìn)行賦值。

另外:

<context-param>

            <param-name>contextConfigLocation</param-name>

            <param-value>/WEB-INF/springandtapestry.xml</param-value>

     </context-param>

這部分是個(gè)小小重點(diǎn)!如果把此xml文件改成spring默認(rèn)的xml文件,則不需要此配置參數(shù)過程。

一個(gè)小疑惑是:在home.html"ognl:aBean.Amethod"中的amethod中的a大小寫都可以。我覺得應(yīng)該小寫a是正確的,但是錯(cuò)誤的寫成大寫A了居然也可以正常顯示。還是看看tapestry源代碼吧。以后再寫了!

 

 

希望本文對(duì)你有所幫助。至于其中原理,我想可以通過breakpoint方式一步一步跟下去就明白了。

當(dāng)然完成本文例子需要有基本的spring、hibernate、tapestry知識(shí)。而高手們就不要見笑了。就當(dāng)看看笑話吧!

 

其實(shí)距離真正結(jié)合還差一步,因?yàn)椴]有通過tapestry作為view,而spring作為主體框架,實(shí)現(xiàn)hibernate的對(duì)象持久。邏輯清了,下面也就不難了。GOOD LUCK!

 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多