目前java開源框架真可以說是琳瑯滿目,最近一個(gè)多星期一直在接觸spring、hibernate、tapestry。將最近一個(gè)多星期以來的學(xué)習(xí)匯總一下,以便日后查閱,也方便大家學(xué)習(xí)。 簡單的介紹到處都是,對(duì)于spring、hibernate、tapestry是干什么用的,我就不多介紹了。大致能夠知道spring的IOC/DI概念(AOP方面我也理解不好,暫時(shí))、hibernate的基本概念,如對(duì)象持久,ORM,POJO這些概念,tapestry重在組件。我想懂這些并且做個(gè)簡單小例子,理解本文應(yīng)該就沒什么大問題了。 我的開發(fā)環(huán)境是eclipse3.1+tomcat 注:spring1.2+hibernate2.1+tapestry 對(duì)于eclipse的操作這里不做詳細(xì)介紹,下面會(huì)給出整合代碼。 建立項(xiàng)目如together,引入需要的包,方便起見就把spring.jar引入,因?yàn)樗容^全,它沒有包含mock(主要是測(cè)試用的)??傊前堰@些都導(dǎo)進(jìn)到你的project里來。別import時(shí)候找不到就可以了。 Spring和hibernate結(jié)合部分: 數(shù)據(jù)庫準(zhǔn)備工作:如mysql,建庫為learn,建表為customer,包含字段(aid,username,password)分別為int,varchar型。 相關(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.xml(yunguang.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 * * 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.xml和hibernate.properties)。其他部分見代碼吧!如果單獨(dú)都能各自都能理解,則看上面代碼不會(huì)有什么太大障礙。
spring和tapestry結(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部分,通過定義map的global。然后在home.page中可以進(jìn)行通過global.appContext.getBean("aBean")對(duì)home.java中abstract屬性進(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!
|
|