玩JPETSTORE的可以看看
March 02, 2007
根據petclinic項目手把手教你剖析SpringFramework源代碼-日志篇[轉]
根據petclinic項目手把手教你剖析SpringFramework源代碼-mvc篇[轉]
關鍵詞:SpringFramework,mvc
二.SpringFramework的mvc
既然petclinic是個web?application,我們當然從web.xml文件入手了。首先當然welcome-file-list條目了,該條目指出index.jsp是網站的入口。index.jsp寫得很簡單,只有3行。如下所示:
<%@?include?file="/WEB-INF/jsp/includes.jsp"?%>
<%--?Redirected?because?we?can't?set?the?welcome?page?to?a?virtual?URL.?--%>
<c:redirect?url="/welcome.htm"/>
根據petclinic項目手把手教你剖析SpringFramework源代碼-準備篇[轉]
關鍵詞:SpringFramework,mvc
自 從用上hibernate這種o/r?mapping的工具后,我就再也不想用ejb了,原來的那套以ejb為重心的j2ee設計模式,自然也不合我的口 味了。在這個時候,我找到了Spring,一個輕量級的j2ee?framework.從數據訪問層到表示層,Spring都提供了一個很不錯的解決方 案。經過一段時間的研究之后,對Spring終于有所了解,我愿意把對SpringFramework的研究經歷寫下來,供大家參考。我用的開發環境是: mysql+tomcat5.0(weblogic7.0)+eclipse
其他開發環境我想應該是大同小異的。在開始研究之前,建議把spring的參考文檔的第三章Beans?and?the?ApplicationContext和第九章Web?framework仔細研讀一番,在研究的過程中再回頭參考一下文檔。
January 25, 2007
用 Spring 更好地處理 Struts 動作三種整合 Struts 應用程序與 Spring 的方式
Spring 的創立者 Rod Johnson 以一種批判的眼光看待 Java? 企業軟件開發,并且提議很多企業難題都能夠通過戰略地使用 IOC 模式(也稱作依賴注入)來解決。當 Rod 和一個具有奉獻精神的開放源碼開發者團隊將這個理論應用于實踐時,結果就產生了 Spring 框架。簡言之,Spring 是一個輕型的容器,利用它可以使用一個外部 XML 配置文件方便地將對象連接在一起。每個對象都可以通過顯示一個 JavaBean 屬性收到一個到依賴對象的引用,留給您的簡單任務就只是在一個 XML 配置文件中把它們連接好。
原文鏈接:http://www-128.ibm.com/developerworks/cn/java/j-sr2.html
基于Spring框架的WebSphere應用開發[轉]
概覽
輕量級的企業應用開發越來越受到廣大J2EE應用開發者的追捧,而Spring框架又是輕量級容器的杰出代 表。由于Spring的使用日漸廣泛,因此已有許多基于WebSphere應用服務器(WAS)的應用采用了Spring框架。本文首先介紹使用 Spring開發Web應用的基本問題,然后結合WebSphere應用服務器,講述Spring應用如何結合容器提供的服務。文章目的是與大家一起探討 如何更好的采用Spring框架開發基于WebSphere應用服務器的應用。
1、Spring框架的主要思想描述
Spring框架的核心思想我們可以用兩個字來描述,那就是"解耦"。應用程序的各個部分之間(包括代碼內部和代碼與平臺之間)盡量形成一種松耦合的結 構,使得應用程序有更多的靈活性。應用內部的解耦主要通過一種稱為控制反轉(IOC)的技術來實現??刂品崔D的基本思想就是本來由應用程序本身來主動控制 的調用等邏輯轉變成由外部配置文件來被動控制。通常我們用一個所謂的好萊塢原則(Don't call me. I will call you.)來比喻這種控制反轉的關系。由于控制反轉的概念相對比較廣泛,很多應用服務器實際上也實現了不同程度的控制反轉技術,只是這些應用服務器對應用 程序的侵入性太強。因此Martin Fowler專門寫了一篇文章討論控制反轉這個概念,并提出一個描述更為準確的概念,叫依賴注入(Dependency Injection)。
Spring框架中的各個部分都充分使用了這種依賴注入的技術實現,從而給應用以最大的靈活度。實際上,這種依賴注入的參數化應用控制并不是 Spring的首創,比如IBM的多渠道應用整合平臺(Branch Transformation Toolkit,BTT)很早就采用了這種外部參數化控制的技術。BTT中的"對象工廠"與Spring框架中的BeanFactory也有著異曲同工之 妙。
Spring框架另外一個比較重要的技術是它對于面向切面的編程(AOP)的支持。隨著應用復雜度的逐漸上升和對應用靈活性要求 的提高,IT邏輯和業務邏輯盡量分離的呼聲也越來越高。AOP技術作為實現這種分離的一種比較好的途徑而越來越受到大家的重視。Spring提供的是一種 動態AOP實現,也即通過代理模式動態地在目標對象的方法前后插入相應的處理代碼。應用程序與底層應用服務器平臺的解耦也可以借助AOP技術來實現。 Spring內置的AOP支持是一種錦上添花的功能。它使得一些本來必須由容器支持的功能,比如事務控制可以脫離開容器運行,從而達到"瘦身"的目的。這 也是為什么Spring框架常被人成為輕量級容器的一個原因。
Spring框架可以與許多已有的框架技術結合使用。J2EE技術應用的一 個重要特點是相關的開源社區非?;钴S。Web應用的不同層次都有非常多優秀的開源框架存在。比如Web層的Struts,OR映射層的Hibernate 等。Spring框架并不重新發明輪子,它的出現不是為了替代這些已有的框架。相反,Spring框架在設計上可以獨立構建應用或者結合已有的框架一起構 建應用。另外一個值得指出的地方是Spring框架的幾大模塊之間相互耦合度很小,因此Spring框架的使用可以根據實際需要選其部分模塊循序漸進的使 用,而非必須統統照搬。
2、基于Spring的Web應用基礎
2.1 Web應用的典型層次
Web應用一般在邏輯上根據功能分為以下幾層:
1.展示層
這一層主要如何生成展示給最終用戶的界面,盡可能少的包含業務邏輯處理。對于基于J2EE的Web應用,JSP是其最為常見的一種技術。Spring對 于展示層的支持非常靈活,除了直接支持JSP之外,它還支持基于FreeMarker模板,基于Velocity模板或其它文檔類型的界面等的表現層實 現。
2.業務層
業務層一般包含主要的業務邏輯,尤其是與用例相對應的那些業務邏輯。另外,這一層也適合包含事務管理和安全控制方面的邏輯。良好的業務層設計可以使得展示層可以采用不同的技術而不影響業務層。業務層的功能上可以類比于J2EE技術中的無狀態會話BEAN層次。
3.數據訪問對象(DAO)接口層
DAO實際上就是數據接口層,在應用中建議通過接口來體現。DAO的存在使得數據訪問可以與底層持久化層的具體實現相分離。一般在DAO接口中主要就是 實現數據對象的查詢、存儲、刪除等操作。從理論上講,DAO層與底層數據的存儲方式是獨立的,也就是說并不一定要求是關系型數據庫。Spring框架在設 計的時候也考慮到了其它非關系型數據庫數據源的情況。
4.持久業務對象
持久業務對象是問題域中業務對象的持久化 表示,比如一個用戶對象,一個銀行帳戶等。我們一般通過某種O/R映射技術來實現這些業務對象的持久化。持久業務對象是可以包含業務邏輯的,與業務層所包 含的業務邏輯不同的地方是持久業務對象所包含的是與具體業務對象直接相關且更為通用的業務邏輯。
5.企業信息系統
企業信息系統泛指Web應用需要連接的后臺系統,一般可以分為三大類,即ERP系統,企業傳統的遺留系統和關系型數據庫。大部分Web應用都是基于關系型數據庫的,這也是像Spring等常見框架所主要考慮的企業信息系統。
設計良好的Web應用在層次一般是上一層依賴下一層,但是下一層不依賴上一層。我們可以暫時概括為"向下而不向上依賴原則"。為了使得不同層次之間的依賴降到最低,建議使用接口耦合。這一點又是Spring框架發揮它外部配置優勢的地方。
2.2 MVC的選擇
雖然說MVC這種模式早在Java語言出現前就有了,但是這種模式在J2EE時代才大行其道,為廣大Web應用開發者所接受。對于各種基于MVC的框架而言,其要解決的問題主要可以分為以下幾部分:
1.將Web頁面中的輸入封裝成一個數據對象,比如像Struts的表單BEAN,Spring MVC中的命令類等。
2.根據請求的不同,由負責分發的控制器來映射和調用相應的邏輯處理單元,并將上面的數據對象作為參數傳入。
3.邏輯處理單元完成相應的處理之后又把結果放入一個數據對象。
4.在選擇的展現界面中把返回的數據對象通過某種方式顯示出來。
在使用Spring構建MVC的時候,可以選擇直接使用Spring自己的MVC實現,或者利用Spring對已有的一些MVC框架的支持。比如 Spring可以支持Struts,WebWork等,與它們結合使用。Spring引以為傲的非侵入的特性在Spring MVC上表現得并不如人意。它與Servlet API的耦合度較其它部分高,而且需要使用一些Spring的接口和類。
Spring MVC的主要分發器實現是org.springframework.web.servlet.DispatcherServlet,這是Spring MVC的訪問入口。Spring提供SimpleFormController,AbstractCommandController等類來幫助應用構建 各種控制器動作,并用ModelAndView類來聯系展示和邏輯返回數據。如上節所述,Spring MVC能夠支持不同的界面展示技術,而且界面的展示和其后面控制器的實現是分離的,也即界面展示技術的變化不用修改控制器的實現,只需要利用Spring 的控制反轉技術修改外部配置文件即可。比如,在使用JSP展示技術時,外部配置文件的viewResolver定義如下:
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass"> <value>org.springframework.web.servlet.view.JstlView</value> </property> <property name="prefix"><value>/view/</value></property> <property name="suffix"><value>.jsp</value></property> </bean> |
如果切換到FreeMaker模板技術,那么除了頁面模板的修改之外,主要就是把對應的外部配置文件更改一下即可,如下所示。具體的展示邏輯部分不用做什么修改。
<bean id="viewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver"> <property name="viewClass"> <value> org.springframework.web.servlet.view.freemarker.FreeMarkerView </value> </property> <property name="suffix"><value>.ftl</value></property> </bean> <bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"> <property name="templateLoaderPath"> <value>/view/</value> </property> </bean> |
如果不使用Spring的MVC框架而想結合已有的一些MVC框架,Spring也是支持的。Spring對于常見的MVC框架都提供了支持,包括 Struts,WebWork,Tapestry和JSF等。結合使用這些框架的一個好處是可以使用一些已有的熟悉的技術,另外結合Spring的AOP 攔截器可以相對比較容易地處理框架動作共有的事情,比如動作的日志處理等。如果選擇這些MVC框架,那么在使用框架的配置文件和應用的Spring配置文 件都需要做相應的修改。比如使用Struts的時候,Struts-config.xml配置文件中的映射動作類型一般會設置成 org.springframework.web.struts.DelegatingActionProxy,或者設置控制器為 org.springframework.web.struts.DelegatingRequestProcessor。然后需要在相應應的 WebApplicationContext中定義與Struts Action對應的Bean。這樣就可以充分利用Spring的控制反轉技術來管理Struts的Action了。
另外在使用這些框 架的時候要解決的一個問題是上下文的裝載。比如使用Struts,可以使用ContextLoaderPlugin來裝載Web上下文。這個 ContextLoaderPlugin替換了原來通過DispacherServlet裝載的方式。需要在struts-config.xml文件中添 加如下條目:<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn"/>。這種方式可以使 Spring的Web上下文隨著Struts ActionServlet的初始化而裝載。
因此,如果用戶已有的應用是基于某個 MVC框架,或者用戶熟悉某個框架,那么可以利用Spring對這些框架的支持結合使用。因為我們的目的本來就是為了解決問題而不是為了使用某種技術。但 是對其它用戶而言,如果不是對已有的一些MVC框架比較熟悉的話,那就直接使用Spring的MVC框架就可以了。
從Jpetstore 開始IBATIS之旅[轉]
前 一陣在研究O/R MAPPING,覺得HIBERNATE和IBATIS都是好東西,但IBATIS更容易上手,而且跟數據庫打交道的時候只需把SQL 語句配置在XML里即可,不象HIBERNAMTE要寫復合其規范的HQL。當然現在HIBERNATE大行其道肯定是有道理的,我過一陣子也打算好好學 習一下。
技術發展的太快,學習方法是很重要的。(看來開源確實促進了生產力的發展啊,由此推斷,共產主義社會肯定會實現的啦。)我認為必須摒棄抱本書按部就班的學 習方法,而應該是STUDY IN ACTION,在實踐中學習,缺啥補啥,大不了不斷重構好了。當然前提是有一定的技術積累了。 為了學習IBATIS,除了大致看了一下IBATIS的官方文檔,我把主要精力放在研究作者的范例JPETSTORE上了,大家可以道 WWW.IBATIS.COM去下載4.0版本的例子,3.X的不要下了,代碼寫的沒有4.0的優美。 然后再去下載MYSQL,TOMCAT,安裝調試讓JETSTORE跑起來。這個過程我就不講了,大家動動腦筋找點成就感吧。工欲善其事,必先利其器。我 用的是JBUILDER9,因為我以前用DELPHI的對BORLAND的產品有感情啊(當然BORLAND不會對我有感情,因為。。。。。。^_^,中 國特色)。建一個新項目,保存后關掉PROJECT,然后把JPETSTORE的代碼包拷貝到:project rc\下,再打開剛才的項目,順利的話你就能看到項目下的一堆包啦?,F在編譯肯定是有問題的,別急別急,在項目里加載上JPETSTORE源碼LIB目錄 下的所有.JAR和SERVLET.JAR,為了連MYSQL,你還得加載MYSQL的JDBC驅動。具體做法,你可以在JBUILDER9 Tools\config libraries 新建三個LIB,比如IBATISLIB里放上JPETSTORE源碼LIB目錄下的所有.JAR,servlet就不要建了,JB9里帶了,再建一個 MYSQLLIB放上MYSQL的JDBC驅動的.jar,然后修改JPETSTORE源碼SRC\PROPERTIES\ database.properties的內容,例如,我的是driver=org.gjt.mm.mysql.Driverurl=jdbc: mysql://localhost/jpetstoreusername=jpetstorepassword=ibatis9977現在MAKE PROJECT應該可以通過了。好啦,打開com.ibatis.jpetstore底下的所有.java文件吧。Domain目錄下放的是 JAVABEAN,一般是跟表相對應的。Persistence目錄下放的是DAO接口和具體實現類,DAO即數據訪問對象(DATA ACCESS OBJECT),是用來跟數據庫打交道的。IBATIS的O/R MAPPING的使用方法也就在這個目錄里面。Presentation目錄下放的是FORMBEAN,后面還要說到JPETSTORE范例對 STRUTS的創造性使用。Service目錄下放的是SERVICE類,通過SERVICE對象調用DAO對象的方法來訪問數據庫的,這是一種常用的設 計模式。 常見的STRUTS編程應該是一個動作對應一個ACTION,例如寫一個交友網站,用戶登錄和用戶查詢就得寫分別寫兩個ACTION來處理。而 JPETSTORE的作者克林頓(Clinton Begin,名字夠響亮的)寫了一個ACTION動態的調用FORMBEAN的不同方法來處理不同的動作。代碼如下,注意execute()的寫法!
public class BeanAction extends Action {
public ActionForward execute(ActionMapping mapping,
ActionForm form, HttpServletRequest request,
HttpServletResponse response)
throws Exception {
String forward = "success";
try {
ActionContext.initialize(request, response);
if (form != null) {
// Explicit Method Mapping
Method method = null;
String methodName = mapping.getParameter();
if (methodName != null && !"*".equals(methodName)) {
try {
method = form.getClass().getMethod(methodName,
null); forward = (String) method.invoke(form, null);
} catch (Exception e) {
throw new BeanActionException("Error dispatching
bean action via method parameter ('" + methodName + "').
Cause: " + e, e);
}
}
// Path Based Method Mapping
if (method == null && !"*".equals(methodName)) {
methodName = mapping.getPath();
if (methodName.length() > 1) {
int slash = methodName.lastIndexOf("/") + 1;
methodName = methodName.substring(slash);
if (methodName.length() > 0) {
try {
method = form.getClass().getMethod
(methodName, null);
forward = (String) method.invoke(form, null);
} catch (Exception e) {
throw new BeanActionException("Error dispatching
bean action via URL pattern ('" + methodName + "').
Cause: " + e, e);
}
}
}
}
}
} catch (Exception e) {
request.setAttribute("BeanActionException", e);
throw e;
}
return mapping.findForward(forward);
}
}
也 就是通過對struts-config.xml的配置信息的讀取來決定調用的方法,或者是不調用任何方法。例如: 當ACTIONSERVLET收到請求/shop/viewCategory.shtml,(JPETSTORE里后綴定義的是“.shtml”)調用 catalogBean的viewCategory方法。怎么樣,有創意吧,如果你愿意,就再也不用寫那么多的ACTION了。下面談一談IBATIS的 O/R MAPPING吧。請大家打開目錄your project\com\ibatis\jpetstore\persistence qlmapdao ql,看到了什么?除了配置文件sql-map-config.xml以外,是一些和JAVABEAN相對應的XML,打開sql-map- config.xml和Acount.xml看看吧,再返到your project\com\ibatis\jpetstore\persistence目錄,打開dao.xml發現他們的關系了吧。可能這時你搞不清這些 XML有什么用處,別急,IBATIS官方文檔里說的很清楚(有中文版的哦)。我大致說一下跟JAVABEAN對應的那些XML文件的作用吧,比如 Acount.xml,是映射JAVABEAN和數據庫的表的文件。你可以按照IBATIS的規范在里面寫任意的SQL語句,參數和返回值可以是基本類型 及其包裝類,MAP,自定義的類。最常用的當然是返回自定義類實例了。不過如果返回值是自定義的類實例的話,你就需要先定義resultMap,比如: <resultMap id="accountResult" class="account"> <result property="username" column="USERID"/> <result property="email" column="EMAIL"/> <result property="firstName" column="FIRSTNAME"/> <result property="lastName" column="LASTNAME"/> <result property="status" column="STATUS"/> <result property="address1" column="ADDR1"/> <result property="address2" column="ADDR2"/> <result property="city" column="CITY"/> <result property="state" column="STATE"/> <result property="zip" column="ZIP"/> <result property="country" column="COUNTRY"/> <result property="phone" column="PHONE"/> <result property="languagePreference" column="LANGPREF"/> <result property="favouriteCategoryId" column="FAVCATEGORY" /> <result property="listOption" column="MYLISTOPT" /> <result property="bannerOption" column="BANNEROPT" /> <result property="bannerName" column="BANNERNAME" /> <resultMap>然后再引用:<select id="getAccountByUsername" resultMap="accountResult" parameterClass="string"> select SIGNON.USERNAME as USERID, ACCOUNT.EMAIL, ACCOUNT.FIRSTNAME, ACCOUNT.LASTNAME, ACCOUNT.STATUS, ACCOUNT.ADDR1, ACCOUNT.ADDR2, ACCOUNT.CITY, ACCOUNT.STATE, ACCOUNT.ZIP, ACCOUNT.COUNTRY, ACCOUNT.PHONE, PROFILE.LANGPREF, PROFILE.FAVCATEGORY, PROFILE.MYLISTOPT, PROFILE.BANNEROPT, BANNERDATA.BANNERNAME from ACCOUNT, PROFILE, SIGNON, BANNERDATA where ACCOUNT.USERID = #value# and SIGNON.USERNAME = ACCOUNT.USERID and PROFILE.USERID = ACCOUNT.USERID and PROFILE.FAVCATEGORY = BANNERDATA.FAVCATEGORY <select>再打開AccountSqlMapDao.java看看:
public Account getAccount(String username) { return (Account) queryForObject("getAccountByUsername", username); }
思考一下,看明白其中的關聯了吧。打開AccountService.JAVA:
public Account getAccount(String username) {
return accountDao.getAccount(username);
}
打開AccountBean.java:
public String newAccount() {
try {
accountService.insertAccount(account);
account = accountService.getAccount
(account.getUsername());//在這調用的
myList = catalogService.getProductListByCategory
(account.getFavouriteCategoryId());
authenticated = true;
repeatedPassword = null;
return "success";
} catch (Exception e) {
throw new BeanActionException ("There was a problem
creating your Account Information. Cause: " + e, e); }
}
看了半天,寫個例子試試吧
package com.ibatis.jpetstore.service;
import com.ibatis.dao.client.DaoManager;
import com.ibatis.jpetstore.domain.*;
import com.ibatis.jpetstore.persistence.DaoConfig;
import com.ibatis.common.util.PaginatedList;
import com.ibatis.jpetstore.persistence.iface.*;
import java.util.*;
public class IbatisTest {
private DaoManager daoManager =
DaoConfig.getDaomanager();
private AccountDao accountDao;
public IbatisTest() {
accountDao = (AccountDao) daoManager.getDao
(AccountDao.class);
Account account=accountDao.getAccount("j2ee", "j2ee");
System.out.println(account.getFirstName());
}
public static void main(String[] args) {
IbatisTest ibatisTest=new IbatisTest();
}
}
你 還可以試試insert,update,delete。IBATIS里可是支持分頁的,用起來很爽的,大家有空還是花點功夫鉆研一下吧。關于DEBUG: 我前兩天照搬JPETSTORE的架構試著寫了一個交友網站,基本上挺順利,只是感覺DEBUG比較麻煩,通常為了找一個錯花上幾個小時。 JBUILDER帶的DEBUG我沒用過,但可是肯定肯定和DELPHI上的DEBUG是有天壤之別的。而且JUNIT我也是剛開始學,也沒用上。這里, 我把自己比較土的辦法介紹一下:一,當你寫了新的O/R MAPPING的時候,可以先寫個包含MAIN方法的類測試一下,就向我上面的測試例子一樣。二,當你想跟蹤變量值的時候,你可以利用IBATIS帶的工 具類ActionContext把變量寫到SESSION里,比如你有你個FORMBEAN:UserBean.java,其中有一個方法是處理用戶登錄 的,你為了跟蹤用戶的用戶名和密碼,可以這樣寫:
public String logon() {
try {
user = userService.getUser(user.getUsername(),
user.getPassword());
if (user== null ) {
clear();
return "failure";
} else {
user.setPassword(null);
authenticated = true;
user.setMessageCount
(messageService.getMessageNewCount(user.getUserId()));
ActionContext.getActionContext().setSimpleMessage
("newCount="+newCount.toString()+"
toUserId="+user.getUserId());//寫入SESSION
return " failure ";}//導入到Error.jsp
}catch (Exception e){
throw new BeanActionException ("There was a problem
logoning your Account Information. Cause: " + e, e);
}
}
當然你需要包含下面的語句
import com.ibatis.struts.ActionContext;
Error.jsp:
<%@ taglib uri="struts-logic" prefix="logic" %>
<%@ taglib uri="struts-bean" prefix="bean" %>
<%@ taglib uri="struts-html" prefix="html" %>
<%@ page import="java.io.PrintWriter"%>
<logic:present name="message">
<bean:write
name="message" />
</logic:present>
//輸出你需要的信息
<logic:present name="errors">
<logic:iterate id="error" name="errors">
<bean:write name="error" />
</logic:iterate>
</logic:present>
<logic:notPresent name="BeanActionException">
<logic:notPresent name="message">
Something happened...
But no further information was provided.
</logic:notPresent>
</logic:notPresent>
<logic:present name="BeanActionException">>
Error!
name="BeanActionException"
property="class.name"/>
<bean:write name="BeanActionException"
property="message"/>
</logic:present>
<logic:present name="BeanActionException">
Stack
<%
Exception e = (Exception)request.getAttribute
("BeanActionException");
e.printStackTrace(new PrintWriter(out));
%>
</logic:present>
三, 為跟蹤變量,你還可以利用LOG4J把變量值寫到LOG里去,這種方法很常見,不明白就去www.google.com查吧。四,為避免寫 javabean出現大小寫或其他的錯誤,強烈建議不要把BEAN當做普通CLASS來寫,要用IDE 新建一個BEAN,這樣IDE會幫你找出很多錯誤。我就吃了不少苦頭。入門了嗎?有問題請留言。為了貼上XML費了老鼻子勁,不容易啊。我要開始研究 SPRING和HIBERNATE啦。
在Win2003+Tomcat+MySQL下運行JPetStore
早就聽說JPetStore是一個非常優秀的J2EE開發的例子!在上周終于有時間把它配置成功,還沒來得及仔細研究,在這里先說一下如何在Win2003+Tomcat下運行JPetStore。
在這里,T)Pw#oMX的提J育+H專無軟Q我認為您的Java水平和我一樣糟糕,我以前做.net,現在Java剛剛開始學習,大約兩周左右的時間,如果您的Java水平比我高,那我不要看這篇文章了,看了只能浪費您的時間。
第一步:配置JDK和MySQL
我相信您已經配置好了,BCwT4.I;49SJTZT@7專什么,還沒有,^-^,比我還笨哪,^-^!那您看看我寫的《搭建Java開發環境》吧,那里詳細的說明了如何搭建Java開發環境!
最好把 jdk下的lib/tools.jar 復制一份到 Tomcat的common/lib 下(以后做其它項目也會用到的)。
第二步:下載JPetStore
在http://www.ibatis.com/jpetstore/jpetstore.html頁面上提供了JPetStore的下載,
第三步:創建JPetStore數據庫
把iBATIS_JPetStore-
jpetstore-mysql-dataload.sql,
jpetstore-mysql-create-user.sql
三個文件拷貝到MySQL的bin目錄下,到MySQL的命令提示符下分別運行這三個文件:
mysql -uroot –p < jpetstore-mysql-schema.sql
mysql -uroot –p < jpetstore-mysql-dataload.sql
mysql -uroot –p < jpetstore-mysql-create-user.sql
以上三個文件分別是創建數據庫JPetStore,導入數據,分配權限。如果你安裝了MySQL的管理工具,您也可以在您按裝的管理工具下運行這三個文件。
第四步:部屬JPetStore
把iBATIS_JPetStore-
####################################
# Database Connectivity Properties
####################################
driver=org.gjt.mm.mysql.Driver
url=jdbc:mysql://localhost:3306/jpetstore
username=jpetstore
password=ibatis9977
重啟Tomcat,
建議您下載最新版本,但注意,JDK和MySQL也要用相應版本。當前版本號:
在IE地址欄里輸入:
http://localhost:8080/jpetstore/
看到畫面了吧?點擊“
Enter the Store
”看到鸚鵡了吧?都看到了,在點擊測試幾個連接,沒問題,那好,配置成功!!!
January 12, 2007
Spring框架快速入門之簡介
Spring 是一個開源框架,是為了解決企業應用程序開發復雜性而創建的。框架的主要優勢之一就是其分層架構,分層架構允許您選擇使用哪一個組件,同時為 J2EE 應用程序開發提供集成的框架。
在這篇由三部分組成的 Spring 系列 的第 1 部分中,我將介紹 Spring 框架。我先從框架底層模型的角度描述該框架的功能,然后將討論兩個最有趣的模塊:Spring 面向方面編程(AOP)和控制反轉 (IOC) 容器。接著將使用幾個示例演示 IOC 容器在典型應用程序用例場景中的應用情況。這些示例還將成為本系列后面部分進行的展開式討論的基礎,在本文的后面部分,將介紹 Spring 框架通過 Spring AOP 實現 AOP 構造的方式。
Spring 框架
Spring 框架是一個分層架構,由 7 個定義良好的模塊組成。Spring 模塊構建在核心容器之上,核心容器定義了創建、配置和管理 bean 的方式,如圖 1 所示。
圖 1. Spring 框架的 7 個模塊
組成 Spring 框架的每個模塊(或組件)都可以單獨存在,或者與其他一個或多個模塊聯合實現。每個模塊的功能如下:
☆ 核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要組件是 BeanFactory,它是工廠模式的實現。BeanFactory 使用控制反轉 (IOC) 模式將應用程序的配置和依賴性規范與實際的應用程序代碼分開。
☆ Spring 上下文:Spring 上下文是一個配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企業服務,例如 JNDI、EJB、電子郵件、國際化、校驗和調度功能。
☆ Spring AOP: 通過配置管理特性,Spring AOP 模塊直接將面向方面的編程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何對象支持 AOP。Spring AOP 模塊為基于 Spring 的應用程序中的對象提供了事務管理服務。通過使用 Spring AOP,不用依賴 EJB 組件,就可以將聲明性事務管理集成到應用程序中。
☆ Spring DAO:JDBC DAO 抽象層提供了有意義的異常層次結構,可用該結構來管理異常處理和不同數據庫供應商拋出的錯誤消息。異常層次結構簡化了錯誤處理,并且極大地降低了需要編寫 的異常代碼數量(例如打開和關閉連接)。Spring DAO 的面向 JDBC 的異常遵從通用的 DAO 異常層次結構。
☆ Spring ORM:Spring 框架插入了若干個 ORM 框架,從而提供了 ORM 的對象關系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有這些都遵從 Spring 的通用事務和 DAO 異常層次結構。
☆ Spring Web 模塊:Web 上下文模塊建立在應用程序上下文模塊之上,為基于 Web 的應用程序提供了上下文。所以,Spring 框架支持與 Jakarta Struts 的集成。Web 模塊還簡化了處理多部分請求以及將請求參數綁定到域對象的工作。
☆ Spring MVC 框架:MVC 框架是一個全功能的構建 Web 應用程序的 MVC 實現。通過策略接口,MVC 框架變成為高度可配置的,MVC 容納了大量視圖技術,其中包括 JSP、Velocity、Tiles、iText 和 POI。
Spring 框架的功能可以用在任何 J2EE 服務器中,大多數功能也適用于不受管理的環境。Spring 的核心要點是:支持不綁定到特定 J2EE 服務的可重用業務和數據訪問對象。毫無疑問,這樣的對象可以在不同 J2EE 環境 (Web 或 EJB)、獨立應用程序、測試環境之間重用。
IOC 和 AOP
控制反轉模式(也稱作依賴性介入)的基本概念是:不創建對象,但是描述創建它們的方式。在代碼中不直接與對象和服務連接,但在配置文件中描述哪一個組件需要哪一項服務。容器 (在 Spring 框架中是 IOC 容器) 負責將這些聯系在一起。
在典型的 IOC 場景中,容器創建了所有對象,并設置必要的屬性將它們連接在一起,決定什么時間調用方法。下表列出了 IOC 的一個實現模式。
類型 1 | 服務需要實現專門的接口,通過接口,由對象提供這些服務,可以從對象查詢依賴性(例如,需要的附加服務) |
類型 2 | 通過 JavaBean 的屬性(例如 setter 方法)分配依賴性 |
類型 3 | 依賴性以構造函數的形式提供,不以 JavaBean 屬性的形式公開 |
Spring 框架的 IOC 容器采用類型 2 和類型3 實現。
面向方面的編程
面向方面的編程,即 AOP,是一種編程技術,它允許程序員對橫切關注點或橫切典型的職責分界線的行為(例如日志和事務管理)進行模塊化。AOP 的核心構造是方面,它將那些影響多個類的行為封裝到可重用的模塊中。
AOP 和 IOC 是補充性的技術,它們都運用模塊化方式解決企業應用程序開發中的復雜問題。在典型的面向對象開發方式中,可能要將日志記錄語句放在所有方法和 Java 類中才能實現日志功能。在 AOP 方式中,可以反過來將日志服務模塊化,并以聲明的方式將它們應用到需要日志的組件上。當然,優勢就是 Java 類不需要知道日志服務的存在,也不需要考慮相關的代碼。所以,用 Spring AOP 編寫的應用程序代碼是松散耦合的。
AOP 的功能完全集成到了 Spring 事務管理、日志和其他各種特性的上下文中。
IOC 容器
Spring 設計的核心是 org.springframework.beans 包,它的設計目標是與 JavaBean 組件一起使用。這個包通常不是由用戶直接使用,而是由服務器將其用作其他多數功能的底層中介。下一個最高級抽象是 BeanFactory 接口,它是工廠設計模式的實現,允許通過名稱創建和檢索對象。BeanFactory 也可以管理對象之間的關系。
BeanFactory 支持兩個對象模型。
□ 單態 模型提供了具有特定名稱的對象的共享實例,可以在查詢時對其進行檢索。Singleton 是默認的也是最常用的對象模型。對于無狀態服務對象很理想。
□ 原型 模型確保每次檢索都會創建單獨的對象。在每個用戶都需要自己的對象時,原型模型最適合。
bean 工廠的概念是 Spring 作為 IOC 容器的基礎。IOC 將處理事情的責任從應用程序代碼轉移到框架。正如我將在下一個示例中演示的那樣,Spring 框架使用 JavaBean 屬性和配置數據來指出必須設置的依賴關系。
BeanFactory 接口
因為 org.springframework.beans.factory.BeanFactory 是一個簡單接口,所以可以針對各種底層存儲方法實現。最常用的 BeanFactory 定義是 XmlBeanFactory,它根據 XML 文件中的定義裝入 bean,如清單 1 所示。
清單 1. XmlBeanFactory
BeanFactory factory = new XMLBeanFactory(new FileInputSteam("mybean.xml")); |
在 XML 文件中定義的 Bean 是被消極加載的,這意味在需要 bean 之前,bean 本身不會被初始化。要從 BeanFactory 檢索 bean,只需調用 getBean() 方法,傳入將要檢索的 bean 的名稱即可,如清單 2 所示。
清單 2. getBean()
MyBean mybean = (MyBean) factory.getBean("mybean"); |
每個 bean 的定義都可以是 POJO (用類名和 JavaBean 初始化屬性定義) 或 FactoryBean。FactoryBean 接口為使用 Spring 框架構建的應用程序添加了一個間接的級別。
IOC 示例
理解控制反轉最簡單的方式就是看它的實際應用。在對由三部分組成的 Spring 系列 的第 1 部分進行總結時,我使用了一個示例,演示了如何通過 Spring IOC 容器注入應用程序的依賴關系(而不是將它們構建進來)。
我用開啟在線信用帳戶的用例作為起點。對于該實現,開啟信用帳戶要求用戶與以下服務進行交互:
☆ 信用級別評定服務,查詢用戶的信用歷史信息。
☆ 遠程信息鏈接服務,插入客戶信息,將客戶信息與信用卡和銀行信息連接起來,以進行自動借記(如果需要的話)。
☆ 電子郵件服務,向用戶發送有關信用卡狀態的電子郵件。
三個接口
對于這個示例,我假設服務已經存在,理想的情況是用松散耦合的方式把它們集成在一起。以下清單顯示了三個服務的應用程序接口。
清單 3. CreditRatingInterface
public interface CreditRatingInterface { public boolean getUserCreditHistoryInformation(ICustomer iCustomer); } |
清單 3 所示的信用級別評定接口提供了信用歷史信息。它需要一個包含客戶信息的 Customer 對象。該接口的實現是由 CreditRating 類提供的。
清單 4. CreditLinkingInterface
public interface CreditLinkingInterface { public String getUrl(); public void setUrl(String url); public void linkCreditBankAccount() throws Exception ; } |
? 信用鏈接接口將信用歷史信息與銀行信息(如果需要的話)連接在一起,并插入用戶的信用卡信息。信用鏈接接口是一個遠程服務,它的查詢是通過 getUrl() 方法進行的。URL 由 Spring 框架的 bean 配置機制設置,我稍后會討論它。該接口的實現是由 CreditLinking 類提供的。
清單 5. EmailInterface
public interface EmailInterface { public void sendEmail(ICustomer iCustomer); public String getFromEmail(); public void setFromEmail(String fromEmail) ; public String getPassword(); public void setPassword(String password) ; public String getSmtpHost() ; public void setSmtpHost(String smtpHost); public String getUserId() ; public void setUserId(String userId); } |
EmailInterface 負責向客戶發送關于客戶信用卡狀態的電子郵件。郵件配置參數(例如 SMPT 主機、用戶名、口令)由前面提到的 bean 配置機制設置。Email 類提供了該接口的實現。
Spring 使其保持松散
這些接口就位之后,接下來要考慮的就是如何用松散耦合方式將它們集成在一起。在清單6中可以看到信用卡帳戶用例的實現。
注意,所有的 setter 方法都是由 Spring 的配置 bean 實現的。所有的依賴關系(也就是三個接口)都可以由 Spring 框架用這些 bean 注入。createCreditCardAccount() 方法會用服務去執行其余實現。在清單7中可以看到 Spring 的配置文件。我用箭頭突出了這些定義。
運行應用程序
要運行示例應用程序,首 先必須 下載 Spring 框架 及其所有依賴文件。接下來,將框架釋放到(比如說)磁盤 c:\,這會創建 C:\spring-framework-1.2-rc2 (適用于當前發行版本) 這樣的文件夾。在繼續后面的操作之前,還必須下載和釋放 Apache Ant。
接下來,將源代碼釋放到文件夾,例如 c:\ 盤,然后創建 SpringProject。將 Spring 庫(即 C:\spring-framework-1.2-rc2\dist 下的 spring.jar 和 C:\spring-framework-1.2-rc2\lib\jakarta-commons 下的 commons-logging.jar)復制到 SpringProject\lib 文件夾中。完成這些工作之后,就有了必需的構建依賴關系集。
打開命令提示符,將當前目錄切換到 SpringProject,在命令提示符中輸入以下命令:build。
這會構建并運行 CreateCreditAccountClient 類,類的運行將創建 Customer 類對象并填充它,還會調用 CreateCreditCardAccount 類創建并鏈接信用卡帳戶。CreateCreditAccountClient 還會通過 ClassPathXmlApplicationContext 裝入 Spring 配置文件。裝入 bean 之后,就可以通過 getBean() 方法訪問它們了,如清單 8 所示。
清單 8. 裝入 Spring 配置文件
ClassPathXmlApplicationContext appContext =
??????????????????? new ClassPathXmlApplicationContext(new String[] {
???? "springexample-creditaccount.xml"
??? });
CreateCreditCardAccountInterface creditCardAccount =
??????????????????? (CreateCreditCardAccountInterface)
?appContext.getBean("createCreditCard");
結束語
在這篇由三部分組成的 Spring 系列 的第一篇文章中,我介紹了 Spring 框架的基礎。我從討論組成 Spring 分層架構的 7 個模塊開始,然后深入介紹了其中兩個模塊:Spring AOP 和 IOC 容器。
由于學習的最佳方法是實踐,所以我用一個工作示例介紹了 IOC 模式 (像 Spring 的 IOC 容器實現的那樣)如何用松散耦合的方式將分散的系統集成在一起。在這個示例中可以看到,將依賴關系或服務注入工作中的信用卡帳戶應用程序,要比從頭開始構 建它們容易得多。
November 01, 2006
spring事務探索 [轉]
posted on 2007-04-01 13:50 金家寶 閱讀(2199) 評論(0) 編輯 收藏 所屬分類: J2EE技術實例