2008年1月11日 星期五

Integration ThinWire and Spring 、 JPA

ThinWire:RIA Ajax GUI Framework用此框架開發Web應用程序,其外觀像是在模擬桌面GUI應用的程序。採用事件驅動的GUI開發的模式且支持大部分主要的流覽器。而所有程式都是用 Java 語言编寫,用標準的 Sun javac 编譯器將程式編譯為 Web應用程式。

Spring 、JPA 在此就不作詳細之介紹。


下載ThinWire 後將其Web、Spring、ThinWire相關的 jar library 放置/WEB-INF/lib 中後,該文章即將說明該如何整合Spring 和 ThinWire 且透過JPA來存取資料庫。這次整合的重點只有幾個檔案設定applicationContext.xml、web.xml 為這次主要的設定檔。

applicationContext.xml 主要設定如下:
  <class="org.springframework.orm.jpa.support.persistenceannotationbeanpostprocessor"/>
宣告Spring support jpa 元件

<bean id="personService" class="thinwrie.test.service.PersonServiceImpl"/>

程式主要實做

<bean id="entityManagerFactory" class="org.springframework.orm.jpa. LocalContainerEntityManagerFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="jpaVendorAdapter"> <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> <property name="database" value="MYSQL" /> <property name="showSql" value="true" /> </bean> </property> </bean>
設定entityManagerFactory

<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource"
/>
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url"
value="jdbc:mysql://localhost/plain?useUnicode=true&characterEncoding=utf-8"
/>
<property name="username" value="root"/>
<property name="password" value=""/>
</bean>

設定資料庫

<bean id="transactionManager"
class="org.springframework.orm.jpa.JpaTransactionManager"
>
<property name="entityManagerFactory"
ref="entityManagerFactory"
/>
</bean>

<tx:annotation-driven transaction-manager="transactionManager" />
設定transactionManager


設定好之後,回想一下要如何取得Spring 的Service呢?對!就是透過Spring ApplicationContext
之前都會透過下列的敘述來取得我們所需要的Bean
WebApplicationContext appCtx = WebApplicationContextUtils.getWebApplicationContext( servletContext );但是在ThinWire 中並沒有提供可得到WebApplicationContext 的方法,所以透過ContextLoaderListener 這元件我們就可以辦到了


首先先建立繼承ContextLoaderListener 的Class

然後再建立另一各Class 來讀取Sping Bean 的 Method


這可以讓我們隨時可以用來取得Spring Bean.

接下來設定Web.xml



1. 設定所建立的
StaticContextLoaderListener Class
<listener> <listener-class>thinwrie.test.app.StaticContextLoaderListener</listener-class> </listener>

2. 設定
ThinWire 所需要的設定

<servlet> <servlet-name>thinwire </servlet-name> <servlet-class>thinwire.render.web.WebServlet </servlet-class> <init-param> <param-name>mainClass </param-name> <param-value>thinwrie.ez.app.SayHi </param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>thinwire </servlet-name> <url-pattern>/ </url-pattern> </servlet-mapping>
這麼一來所需要的佈署就準備好了,接下來就可以開始撰寫囉

1. 我們利用Spring 所支援的JPA來建立一各 Person 的Calss 如下圖所示

2.建立這Person 的 interface :

3.建立PersonService 的實做


4.最後我們利用ThinWire建立一各簡單的範例

public class SayHi { public static void main(String[] args)
{
// TODO Auto-generated method stub
final Dialog dialog = new Dialog("Simple ThinWire Application");
final GridBox gbx = new GridBox();

gbx.setBounds(25, 25, 300, 120);

gbx.setVisibleHeader(true);

GridBox.Column idcol = new GridBox.Column();
idcol.setName("ID");
idcol.setVisible(false);

GridBox.Column col1 = new GridBox.Column();
col1.setName("First Name");
col1.setVisible(true);
GridBox.Column col2 = new GridBox.Column();

col2.setName("Last Name");
col2.setVisible(true);

gbx.getColumns().add(idcol);
gbx.getColumns().add(col1);
gbx.getColumns().add(col2); PersonService fs = (PersonService) Spring.getBean("personService");
List personlist = fs.findAll();
for (int r = 0; r < personlist.size(); r++)
{

GridBox.Row row = new GridBox.Row();
Person ps = (Person)personlist.get(r);
String temp_first_name = ps.getFirst_name();
String temp_last_name = ps.getLast_name();

row.add(ps.getId());

row.add(temp_first_name); row.add(temp_last_name);
gbx.getRows().add(row);
}

dialog.getChildren().add(gbx);

dialog.setVisible(true);
}
}




然後將Tomcat 跑起來後 即會出現下圖所示之視窗



有人也許對我上面所舉的Person 的範例很眼熟,沒錯,我是利用Struts2官方網站所提供的範例,藉由這範例讓大家更能了解到核心技術採用好與否,更能選擇出更多更有彈性的UI,所以我將透過ThinWire也可以呈現模擬桌面化UI。

這是我第一篇的文章,有寫不好的地方請大家多多包含與指教。



沒有留言: