小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

在 WAS CE v2.1 上開(kāi)發(fā) Java EE 應(yīng)用

 gyb98 2011-03-15

在 WAS CE v2.1 上開(kāi)發(fā) Java EE 應(yīng)用

馬 云鋒 (mayunf@cn.ibm.com), 軟件工程師, EMC

簡(jiǎn)介: WAS CE v2.1 是 IBM 推出的通過(guò) Java EE 5 認(rèn)證的開(kāi)源應(yīng)用服務(wù)器,它實(shí)現(xiàn)了所有 Java EE 5 中所包含的新技術(shù)。本文將通過(guò)開(kāi)發(fā)一個(gè)完整的應(yīng)用來(lái)展示這些新技術(shù),以及這些新技術(shù)在 WAS CE v2.1 上的部署和運(yùn)行。

發(fā)布日期: 2008 年 12 月 15 日 
級(jí)別: 初級(jí) 
訪問(wèn)情況 770 次瀏覽 
建議: 0 (添加評(píng)論)

1 star2 stars3 stars4 stars5 stars 平均分 (共 3 個(gè)評(píng)分 )

Java EE 5 中的新技術(shù)

Java EE 5 是 Java 企業(yè)級(jí)應(yīng)用規(guī)范的最新標(biāo)準(zhǔn),它在以往版本的基礎(chǔ)上進(jìn)行了大范圍的改進(jìn),吸取了開(kāi)源領(lǐng)域廣泛使用的技術(shù)(例如 POJO,IoC),降低了 Java EE 的學(xué)習(xí)難度,簡(jiǎn)化了企業(yè)級(jí)應(yīng)用程序的開(kāi)發(fā),提高了開(kāi)發(fā)效率。

以下是 Java EE 5 中引入的五個(gè)比較重要的技術(shù):

  • Java Annotation 不是 Java EE 5 中的技術(shù),它是 Java 5 的一個(gè)新的特性。但是在 Java EE 5 中大量的使用了 Annotation,因?yàn)樗氖褂?,極大的簡(jiǎn)化了 Java EE 應(yīng)用程序的開(kāi)發(fā)和維護(hù)。
  • Java Server Faces (JSF)是對(duì) JSP 技術(shù)的一種擴(kuò)展和增強(qiáng),它已經(jīng)存在了一段時(shí)間,但并沒(méi)有被包含在 J2EE 規(guī)范中,用戶需要在他們的 Web 應(yīng)用中包含 JSF 的 jar 文件來(lái)支持 JSF 技術(shù)。Java EE 5 中包含了最新的 JSF 1.2 規(guī)范,從而在 WAS CE v2.1 上開(kāi)發(fā) JSF的應(yīng)用也變得更加容易。
  • Java Persistence API (JPA)是用來(lái)代替 J2EE 中 Entity Bean 的一種技術(shù)規(guī)范。在 Java EE 5 中,Entity Bean 規(guī)范沒(méi)有進(jìn)行任何更新,舊的 Entity Bean 在 Java EE 5 中還被支持,但新添加的 JPA 是將來(lái) Java EE 中持久化技術(shù)的方向。使用 JPA 開(kāi)發(fā)數(shù)據(jù)庫(kù)應(yīng)用也變得更加簡(jiǎn)單和容易。
  • Enterprise Java Bean (EJB) 3.0 是對(duì) EJB 技術(shù)的一次比較大的改動(dòng)。EJB 3.0 充分利用了 Java Annotation,提供了一個(gè)新的 EJB 編程模型,從而簡(jiǎn)化了 EJB 應(yīng)用程序的開(kāi)發(fā)。
  • JAX-WS 2.0 是 JAX-RPC 1.1 的一個(gè)后繼版本,JAX-RPC 不會(huì)再有新的版本,而 JAX-WS 2.0 會(huì)成為 Java EE 5 中實(shí)現(xiàn) Web Service 的技術(shù)。

本文將通過(guò)開(kāi)發(fā)一個(gè)網(wǎng)上商店的具體示例,向您展示如何在 WAS CE 中使用以上技術(shù)。

開(kāi)發(fā)示例簡(jiǎn)介

為了在 WAS CE v2.1 中展示以上所提到的新技術(shù),我們假設(shè)了一個(gè)網(wǎng)上商店:Ollivanders (Harry Potter 的魔法世界中最好的魔杖商店),簡(jiǎn)稱(chēng) OlliShop。OlliShop 提供了簡(jiǎn)單的 Web 界面,用戶可以用此 Web 界面注冊(cè)、登錄和購(gòu)買(mǎi)魔杖;另外 OlliShop 向第三方集成商提供了 WebService 接口,可以通過(guò) SOAP 協(xié)議來(lái)調(diào)用 OlliShop 的服務(wù)。您可以下載本例的源代碼。

網(wǎng)上商店的架構(gòu)如圖 1 所示:


圖 1. OlliShop 的架構(gòu)圖
 

OlliShop 由 5 個(gè)功能模塊組成:

  1. ShopWEB 是 OlliShop 的用戶界面,用戶只能通過(guò)瀏覽器來(lái)訪問(wèn)此模塊。ShopWEB 模塊使用了 JSF 技術(shù)。
  2. ShopWS 是 OlliShop 的 Web Service 接口,它提供了其它應(yīng)用程序通過(guò) Web Service 的方式訪問(wèn) OlliShop 的服務(wù)。此模塊使用了 JAX-WS 技術(shù)。
  3. ShopUtil 是一個(gè)工具包,包含一些公用的工具類(lèi)以供其它模塊使用。
  4. ShopEJB 是業(yè)務(wù)實(shí)現(xiàn)模塊,主要包括一個(gè)無(wú)狀態(tài) Session Bean,供 ShopWEB 和 ShopWS 調(diào)用。此模塊使用了 EJB 3.0 技術(shù)。
  5. ShopJPA 是數(shù)據(jù)庫(kù)訪問(wèn)模塊,它通過(guò) ORM 機(jī)制把對(duì)數(shù)據(jù)庫(kù)的操作轉(zhuǎn)換成對(duì)對(duì)象的操作。此模塊使用了 JPA 技術(shù)。

配置 Eclipse 環(huán)境

WAS CE 作為一個(gè)開(kāi)源的應(yīng)用服務(wù)器,選擇一個(gè)免費(fèi)且強(qiáng)大的開(kāi)發(fā)工具是很必要的,Eclipse 就是一個(gè)不錯(cuò)的選擇。WAS CE 提供了一個(gè) Eclipse 插件,可以通過(guò)此插件來(lái)管理 WAS CE 應(yīng)用服務(wù)器,開(kāi)發(fā)、部署和調(diào)試 Java EE 的應(yīng)用,再配合 Eclipse 中的 WTP(Web Tools Platform)插件,對(duì)于一個(gè)小規(guī)模的應(yīng)用,這樣的 IDE 已經(jīng)可以勝任。

本文使用的 Eclipse 環(huán)境如下:

  1. Eclipse 3.4
  2. Eclipse WTP 3.0M2
  3. WAS CE Server adapter 2.1,此插件可以從以下網(wǎng)址下載:http://public.dhe.ibm.com/software/websphere/wasce/updates/

在 Eclipse 的 J2EE 視圖中的 Servers view 處創(chuàng)建 WAS CE 服務(wù)器,如圖 2 所示。


圖2. Eclipse中的WAS CE Server
 

現(xiàn)在我們開(kāi)發(fā) Java EE 應(yīng)用程序的環(huán)境已經(jīng)準(zhǔn)備好了,可以開(kāi)始 OlliShop 應(yīng)用的開(kāi)發(fā)了。OlliShop 包含了多個(gè)模塊,是一個(gè)典型的 EAR 應(yīng)用程序,整個(gè) OlliShop 的工程視圖如圖 3,它包括 6 個(gè)工程。在后面的描述中我們將會(huì)具體介紹每一個(gè)工程。


圖 3. OlliShop 中包含的工程
 

創(chuàng)建 ShopEAR 工程

通過(guò) Eclipse 中的 "Enterprise Application Project" 向?qū)?chuàng)建一個(gè) EAR 工程。需要注意的是,創(chuàng)建工程時(shí)需要選擇上面創(chuàng)建的 IBM WAS CE v2.1 作為 Target Runtime,如圖 4 所示。以下的所有工程除了 ShopUtil 外都需要 IBM WAS CE v2.1 作為 Target Runtime。


圖 4. 創(chuàng)建 ShopEAR 工程
 

此工程創(chuàng)建后會(huì)自動(dòng)在 EarContent\META-INF\ 目錄下生成 WAS CE 的部署計(jì)劃:geronimo-application.xml。雙擊此文件可以打開(kāi)此部署計(jì)劃的編輯界面,通過(guò)此編輯界面可以很容易的操作此部署計(jì)劃。

創(chuàng)建 ShopJPA 工程

通過(guò) Eclipse 中的 ”JPA Project” 向?qū)?chuàng)建 ShopJPA 工程。創(chuàng)建過(guò)程中可以把此工程加入到上面創(chuàng)建的 ShopEAR 工程中。此工程創(chuàng)建后,Eclipse 會(huì)轉(zhuǎn)換到 JPA 視圖。此時(shí)我們需要使用數(shù)據(jù)庫(kù)了,因此我們需要先創(chuàng)建數(shù)據(jù)庫(kù)。

創(chuàng)建數(shù)據(jù)庫(kù)

WAS CE 中默認(rèn)的內(nèi)置數(shù)據(jù)庫(kù)為 Derby,我們的 OlliShop 應(yīng)用就是使用了此數(shù)據(jù)庫(kù)。通過(guò)J2EE 視圖中的 Servers view,可以啟動(dòng) WAS CE。通過(guò) http://localhost:8080/console/ 進(jìn)入 WAS CE 的管理控制臺(tái),默認(rèn)的用戶名/口令為 system/manager。通過(guò)此控制臺(tái)可以管理Derby 數(shù)據(jù)庫(kù),單擊左邊菜單欄中的 "DB Manager" 進(jìn)入數(shù)據(jù)庫(kù)管理界面,創(chuàng)建名為 "shop" 的數(shù)據(jù)庫(kù),然后可以使用以下腳本創(chuàng)建所需要的表:

清單 1. 創(chuàng)建數(shù)據(jù)庫(kù)腳本

CREATE TABLE Users (
    ID INTEGER NOT NULL,
    UserName VARCHAR(250) NOT NULL,
   Password VARCHAR(250) NOT NULL
);
CREATE TABLE Goods (
   ID INTEGER NOT NULL,
   Name VARCHAR(250) NOT NULL,
   Price DECIMAL(14, 2) NOT NULL,
   Quantity DOUBLE NOT NULL
);
CREATE INDEX Users_ID ON Users(ID);
CREATE INDEX Goods_ID ON Goods(ID);

創(chuàng)建數(shù)據(jù)源

JPA 需要通過(guò)數(shù)據(jù)源才能訪問(wèn)到相應(yīng)的數(shù)據(jù)庫(kù),在 WAS CE 中有兩種方式創(chuàng)建數(shù)據(jù)源:通過(guò)管理控制臺(tái)創(chuàng)建和通過(guò)部署計(jì)劃創(chuàng)建。在這里我們使用第二種方式,所以需要修改在 ShopEAR 中的部署計(jì)劃:geroniom-application.xml。

在 geronimo-application.xml 中添加以下代碼:

清單2. geronimo-application.xml

<ext-module>
    <connector>ShopDataSource</connector>
    <external-path xmlns:dep="http://geronimo./xml/ns/deployment-1.2">
        <dep:groupId>org.tranql</dep:groupId>
        <dep:artifactId>tranql-connector-derby-embed-local</dep:artifactId>
        <dep:type>rar</dep:type>
    </external-path>
    <connector xmlns="http://geronimo./xml/ns/j2ee/connector-1.2">
        <resourceadapter>
            <outbound-resourceadapter>
                <connection-definition>
                   <connectionfactory-interface>
javax.sql.DataSource
</connectionfactory-interface>
                    <connectiondefinition-instance>
                        <name>jdbc/ShopDataSource</name>
                        <config-property-setting name="UserName">
                        </config-property-setting>
                        <config-property-setting name="Password">
                        </config-property-setting>
                        <config-property-setting name="DatabaseName">
shop
</config-property-setting>
                        <config-property-setting name="CreateDatabase">
true
</config-property-setting>
                        <connectionmanager>
                            <single-pool>
                                <max-size>100</max-size>
                                <min-size>0</min-size>
                               <blocking-timeout-milliseconds>
5000
</blocking-timeout-milliseconds>
                                <idle-timeout-minutes>30</idle-timeout-minutes>
                                <match-one/>
                            </single-pool>
                        </connectionmanager>
                    </connectiondefinition-instance>
                </connection-definition>
            </outbound-resourceadapter>
        </resourceadapter>>
    </connector>
</ext-module>

從以上代碼可以看出此數(shù)據(jù)源指定的數(shù)據(jù)庫(kù)為 shop,創(chuàng)建的數(shù)據(jù)源的 JNDI 的名字為jdbc/ShopDataSource。

創(chuàng)建 JPA Entity Bean

Eclipse 提供了一個(gè)創(chuàng)建 JPA Entity Bean 的工具,此工具能夠根據(jù)數(shù)據(jù)庫(kù)中表的設(shè)置創(chuàng)建出相應(yīng)的 Entity Bean。為了使用此工具,需要先在 Eclipse 中連接到 Derby 數(shù)據(jù)庫(kù),在 JPA 視圖的 Data Source Explorer 中創(chuàng)建到 Derby 的連接。步驟如下:

1. 在 "Database" 的右鍵菜單中選擇 "New …"

2. 選擇 “Generic JDBC Connection”

3. 輸入連接的名字:Derby

4. 選擇 “Derby Client JDBC Driver”,Derby JDBC Driver位于:%WASCE_HOME%\repository\org\apache\derby\derbyclient\10.2.2.0\derbyclient-10.2.2.0.jar。輸入以下連接屬性:

Database:shop

URL:jdbc:derby://localhost:1527/shop;create=true

User Name:user

Password:app

5. 連接剛創(chuàng)建的 Derby。

現(xiàn)在可以通過(guò) Derby 連接創(chuàng)建相應(yīng)的 Entity Bean 了。在 shop 數(shù)據(jù)庫(kù)中只有兩個(gè)表:users 和 goods。我們先創(chuàng)建一個(gè)類(lèi) com.ibm.wasce.shop.entity.User,此時(shí)在 JPA 視圖中就可以把此類(lèi)映射到數(shù)據(jù)庫(kù)中的表 users,如圖5所示。


圖 5. User 類(lèi)映射到表 users
 

在 User類(lèi) 中添加 3 個(gè)屬性:id、userName、password,然后把它們映射到 users 表中的字段,如圖 6 所示。


圖6. 映射屬性 id 到表 users 中的字段 id
 

用戶登錄時(shí),需要從數(shù)據(jù)庫(kù)中根據(jù)用戶輸入的用戶名查詢(xún)?cè)撚脩魜?lái)驗(yàn)證用戶名和密碼。在傳統(tǒng)的應(yīng)用中,我們需要從數(shù)據(jù)源中得到 Connection,然后執(zhí)行 SQL 語(yǔ)句,從返回的數(shù)據(jù)集中獲得數(shù)據(jù),再生產(chǎn)相應(yīng)的 User 對(duì)象。在 EJB 3.0 中,這項(xiàng)工作已經(jīng)大大簡(jiǎn)化,主要是因?yàn)槭褂昧?Annotation NamedQueries 和 EJB QL。通過(guò) NamedQueries,只需要再聲明一個(gè) EJB QL,就可以得到相應(yīng)的 User 對(duì)象,開(kāi)發(fā)人員不再需要關(guān)心數(shù)據(jù)庫(kù)連接和數(shù)據(jù)轉(zhuǎn)換等繁瑣的事情。EJB QL 是和 SQL 很像的一種語(yǔ)言,只是它要操作的不是數(shù)據(jù)庫(kù)中的表,而是 JPA Entity Bean。

最終生成的 User 類(lèi)如下:

清單3. 生成 JPA 實(shí)體 Bean

@NamedQueries ( {
      @NamedQuery ( name = "getUserByName",
               query = "select u from User u where u.userName= :name"
                     )
                     })
                     @Entity
                     @Table(name="USERS", schema = "APP")
                     public class User {
                          @Id
                          @GeneratedValue
                          private Integer id;
                          private String userName;
                          private String password;
                          // 以下的setter/getter方法省略

通過(guò)以上的方式,我們創(chuàng)建了與表 goods 相對(duì)應(yīng)的 JPA Entity Bean。

創(chuàng)建 ShopEJB 工程

接下來(lái),我們將通過(guò) Eclipse 中的 “EJB Project” 向?qū)?chuàng)建 ShopEJB 工程,同時(shí)把新創(chuàng)建的工程加入到 ShopEAR 中。

此工程中的 EJB 采用 EJB 3.0 的方式開(kāi)發(fā)。在傳統(tǒng)的EJB編程模型中,每一個(gè)Bean需要兩個(gè)接口和一個(gè)類(lèi)來(lái)組成:Remote(或Local)接口、Home 接口和 Bean 實(shí)現(xiàn)類(lèi),而且這三個(gè)類(lèi)之間需要通過(guò)某種編碼約定來(lái)規(guī)范,在部署時(shí)再由 EJB 容器生產(chǎn)一些魔術(shù)代碼(Magic Codes)把它們之間的調(diào)用關(guān)系連起來(lái)。而在 EJB 3.0 中的實(shí)現(xiàn)則顯得更加簡(jiǎn)單和直接,一個(gè) EJB 只需要一個(gè)接口和一個(gè)類(lèi):Remote(或 Local)接口和實(shí)現(xiàn) Remote(或 Local)接口的類(lèi)。另外一個(gè)區(qū)別是在 EJB 3.0 中部署描述符(ejb-jar.xml)也不再是必須的了,我們可以通過(guò) Annotation 的方式來(lái)定義這些元數(shù)據(jù)。

以下是 ShopBean 的 Local 接口,它是一個(gè)普通的 Java 接口。如果是 Remote 接口,則需要加上 Annotation @Remote。

清單 4. ShopBean 的 Local 接口

public interface ShopBean {
    public boolean login( String name, String password );
    public List listGoods();
    public Good getGoodById( int id );
}

以下是 ShopBean 的實(shí)現(xiàn)類(lèi)。在此類(lèi)中,唯一能感覺(jué)到它和 EJB 相關(guān)的地方就是 @Stateless,其它的地方和普通的 Java 類(lèi)沒(méi)有區(qū)別。此類(lèi)主要用來(lái)實(shí)現(xiàn)操作在 ShopJPA 中開(kāi)發(fā)的 Entity Bean。EntityManager 是 JPA 中最重要的一個(gè)接口,應(yīng)用程序主要通過(guò)它來(lái)添加、修改和查詢(xún) Entity Bean。通過(guò) Annotation @PersistenceContext,WAS CE 中的 EJB 容器會(huì)把一個(gè) EntityManager 的實(shí)例賦給此類(lèi)中的em對(duì)象,這就是在 EJB 3.0 中被廣泛使用的依賴(lài)注入(Dependency Injection)的方法。在這個(gè)類(lèi)中,也用到了在 ShopJPA 中定義的 NamedQuery。

清單 5. ShopBean 的實(shí)現(xiàn)

@Stateless
public class ShopBeanImpl implements ShopBean {
    @PersistenceContext
    private EntityManager em;
    public Good getGoodById(int id) {
    Query query = em.createNamedQuery( "getGoodByID" );
    query.setParameter("id", id);
    return (Good)query.getSingleResult();
    }
    public List listGoods() {
        Query query = em.createNamedQuery( "getAllGoods" ); 
        return query.getResultList();
    }    
    public boolean login(String name, String password) {
        try {
                Query query = em.createNamedQuery( "getUserByName" );
                query.setParameter( "name", name );
                User user = (User)query.getSingleResult();
                return user != null && user.getPassword().equals( password );
            } catch ( Exception e ) {
                return false;
                }
    }

創(chuàng)建 ShopUtil 工程

通過(guò) Eclipse 中的 "Java Project" 向?qū)?chuàng)建 ShopUtil 工程??梢栽?ShopEAR 工程的屬性管理頁(yè)面中,把 ShopUtil 工程加入到 ShopEAR 中。

此工程提供了 ShopWEB 和 ShopWS 訪問(wèn) EJB 的功能,而不需要在兩個(gè) Web 工程中分別定義。它使用 JNDI 的方式訪問(wèn) EJB,如清單 6 所示:

清單 6. 使用 JNDI 訪問(wèn) EJB

private EJBLocator() {
  try {
        InitialContext rootContext = new InitialContext();
        shopbean = (ShopBean)rootContext.lookup( "java:comp/env/ejb/shopbean" );
      } catch ( NamingException ne ) {
            ne.printStackTrace();
             } 
 }

接下來(lái),我們將創(chuàng)建兩個(gè) Web 工程。在創(chuàng)建的兩個(gè) Web 工程中需要進(jìn)行以下設(shè)置才可以使用:

  1. 在 Web 工程的屬性中:"Java Build Path" -> "Projects" 中添加 ShopUtil 工程。
  2. 添加以下一行到 Web 工程的文件:WebContent\META-INF\ MANIFEST.MF;Class-Path: ShopUtil.jar

創(chuàng)建 ShopWEB 工程

在創(chuàng)建此工程前,需要先根據(jù) WTP 的文檔來(lái)設(shè)置 Java Server Faces,WAS CE v2.1 提供了JSF 所需要的以下兩個(gè) Jar 文件:

  1. %WASCE_HOME%\repository\org\apache\myfaces\core\myfaces-api\1.2.0\myfaces-api-1.2.0.jar
  2. %WASCE_HOME%\repository\org\apache\myfaces\core\myfaces-impl\1.2.0\myfaces-impl-1.2.0.jar

設(shè)置完 JSF 后,通過(guò) Eclipse 中的 “Dynamic Web Project” 向?qū)?chuàng)建 ShopWEB 工程,Configurations-> JavaServer Faces v1.2 Project,同時(shí)把新創(chuàng)建的工程加入到 ShopEAR 中。

新生成的工程中會(huì)包含 JSF 的配置文件:faces-config.xml,雙擊此文件可打開(kāi) JSF 配置編輯器,如圖 7 所示。


圖 7. faces-config.xml 的編輯器
 

通過(guò)此編輯器中的 ManageBean 頁(yè)面,可以生成 JSF 中的 Managed Bean。在本例中,有兩個(gè)Managed Bean:GoodsBean 和 LoginBean。

WST 還提供了一個(gè) JSF 頁(yè)面編輯器,可以進(jìn)行可視化的開(kāi)發(fā)。在本例中,有兩個(gè)頁(yè)面:一個(gè)登錄頁(yè)面和一個(gè)顯示商品列表的頁(yè)面。其中登錄頁(yè)面的編輯如圖 8 所示。


圖 8. JSF 的可視化編輯頁(yè)面
 

本例中的業(yè)務(wù)邏輯是用戶正確登錄后會(huì)自動(dòng)轉(zhuǎn)到商品列表頁(yè)面,否則將返回到登錄頁(yè)面。這種頁(yè)面跳轉(zhuǎn)的邏輯也可以通過(guò)可視化的方式來(lái)進(jìn)行設(shè)置,如圖 9 所示。


圖 9. 頁(yè)面跳轉(zhuǎn)邏輯編輯頁(yè)面
 

創(chuàng)建 ShopWS 工程

通過(guò) Eclipse 中的 "EJB Project" 向?qū)?chuàng)建 ShopWS 工程,同時(shí)把新創(chuàng)建的工程加入到ShopEAR 中。

通過(guò) JAX-WS 的方式來(lái)開(kāi)發(fā) Web Service 簡(jiǎn)化了很多工作。在本例中,我們開(kāi)發(fā)了一個(gè)通過(guò)商品編號(hào)來(lái)查詢(xún)商品價(jià)格的 Web Service。此 Service 只需要使用一個(gè)接口和一個(gè)實(shí)現(xiàn)類(lèi),在部署時(shí),WAS CE 會(huì)根據(jù)接口和類(lèi)中的 Annotation 來(lái)生成相應(yīng)的 WSDL 文件。

以下是此 Service 的接口,使用了 Annotation @WebService

清單 7. ShopService 接口

@WebService(name="ShopServicePortType", 
    targetNamespace = "http://shop.wasce.ibm.com")
    public interface ShopService {
        public double getPriceById( int goodsId );
    }

以下是此 Service 的實(shí)現(xiàn)類(lèi):

清單 8. ShopService 的實(shí)現(xiàn)

@WebService(serviceName = "ShopService",
    portName="ShopServicePort",
    endpointInterface = "com.ibm.wasce.shop.ws.ShopService",
    targetNamespace = "http://shop.wasce.ibm.com")
    public class ShopServiceImpl implements ShopService {
        public double getPriceById( int goodsId ) {
            ShopBean shopbean = EJBLocator.getInstance().getShopBean();
            Good good = shopbean.getGoodById(goodsId);
            return 20;
        }
    }

以上定義的 Web Service 需要通過(guò) Servlet 的方式發(fā)布,所以需要在 web.xml 中進(jìn)行以下配置:

清單 9. 在 web.xml 中配置 ShopService

<servlet>
    <display-name>ShopService</display-name>
    <servlet-name>ShopService</servlet-name>
    <servlet-class>
        com.ibm.wasce.shop.ws.ShopServiceImpl
    </servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>ShopService</servlet-name>
    <url-pattern>/shopservice</url-pattern>
</servlet-mapping>

雖然類(lèi) com.ibm.wasce.shop.ws.ShopServiceImpl 不是一個(gè) Servlet,它沒(méi)有繼承javax.servlet.http.HttpServlet,但是在部署的時(shí)候,WAS CE 的部署程序會(huì)對(duì) ShopServiceImpl進(jìn)行解析,并且生成一個(gè) Servlet 來(lái)包裝 ShopServiceImpl,這樣就可以通過(guò)地址 /shopservice來(lái)訪問(wèn)到此 Web Service。

也可以通過(guò) JAX-WS 的方式來(lái)調(diào)用上面生成的 Web Service,代碼如下:

清單 10. 調(diào)用 ShopService

public static double getPriceById( int goodsId) throws Exception {
    URL url = new URL("http://localhost:8080/ShopWS/shopservice?wsdl");
    QName qname = new QName("http://shop.wasce.ibm.com", "ShopService");
    Service service = Service.create(url, qname);
    ShopService shopservice = (ShopService)service.getPort(ShopService.class);
    double price = shopservice.getPriceById( goodsId );
    return price;
}

運(yùn)行

在 Eclipse 中開(kāi)發(fā)完以上模塊后,就可以部署此應(yīng)用。我們可以通過(guò)兩種方式來(lái)部署:通過(guò)Eclipse 部署或者從 Eclipse 中導(dǎo)出 EAR 后通過(guò)命令行部署。

第一種方式:通過(guò) Eclipse 部署

  1. 在 Eclipse 中的 Server 視圖,右擊 WASCE Server,選擇Add and Remove Projects ...
  2. 添加 ShopEAR 到 Configured projects 列表中
  3. 點(diǎn)擊 Finish

第二種方式:通過(guò)命令行部署

  1. 右擊 ShopEAR 工程,選擇 Export
  2. 選擇“Java EE”-> EAR file
  3. 指定要保存的目錄和文件名,例如 d:\temp\ShopEAR.ear
  4. 用以下命令部署導(dǎo)出的 ear 文件

%WASCE_HOME%\bin\deploy --username system --password manager deploy d:\temp\ShopEAR.ear

部署此應(yīng)用后,可以通過(guò) http://localhost:8080/ShopWEB/ 來(lái)訪問(wèn) OlliShop 的主頁(yè),默認(rèn)的用戶名/密碼為 user1/user1

對(duì)于 Web Service,可以通過(guò) http://localhost:8080/ShopWS/shopservice?wsdl 來(lái)訪問(wèn) shopservice的 WSDL 文件,可以通過(guò)http://localhost:8080/ShopWS/invokeshopservice.jsp 來(lái)調(diào)用此 Web Service。

總結(jié)

WAS CE v2.1 作為一款免費(fèi)的 Java EE 5 應(yīng)用服務(wù)器,結(jié)合 Eclipse 強(qiáng)大的 WST 工具,為廣大開(kāi)發(fā)人員提供了快速的開(kāi)發(fā)環(huán)境,也為中小型企業(yè)實(shí)踐 Java EE 5 的應(yīng)用提供了一個(gè)很好的平臺(tái)。


下載

描述名字大小下載方法
代碼示例OlliShop.zip49 KBHTTP

關(guān)于下載方法的信息


參考資料

學(xué)習(xí)

  • WebSphere Application Server Community Edition V2.1 中的新增功能:本文主要講述了 WebSphere Application Server Community Edition V2.1 中的新增功能,包括使用 Gshell 執(zhí)行 Geronimo 命令、在您自己的服務(wù)器集基礎(chǔ)上創(chuàng)建多個(gè)服務(wù)器組裝,以及通過(guò)專(zhuān)家模式和新的 Monitoring Portlet 完全控制服務(wù)器的能力。 

  • 從 Apache Tomcat Version 6.0 遷移到 WAS CE V2.1 :本文將逐步地指導(dǎo)您將一個(gè)應(yīng)用程序部署到 Tomcat 6.0,然后遷移代碼并將其部署到 WebSphere Application Server Community Edition V2.1。并通過(guò)該示例應(yīng)用程序突出說(shuō)明了這兩種實(shí)現(xiàn)之間的一些顯著差異。 

  • 使用 WAS CE 開(kāi)發(fā) JPA 應(yīng)用程序:本教程將向您介紹如何用 JPA 開(kāi)發(fā) WAS CE 目標(biāo)平臺(tái)下的 Java EE 5 應(yīng)用。本教程通過(guò)一個(gè)示例應(yīng)用程序的開(kāi)發(fā)過(guò)程,將帶您了解如何創(chuàng)建 JPA 項(xiàng)目和持久生成類(lèi),如何配置持久單元以及如何部署和運(yùn)行 Web 應(yīng)用程序。 

  • WAS CE 產(chǎn)品文檔:本網(wǎng)站向您提供了 WAS CE 不同版本的產(chǎn)品幫助文檔。 

  • Eclipse 網(wǎng)站:本網(wǎng)站向您提供了 開(kāi)源開(kāi)發(fā)工具 Eclipse 最新。 

  • Geronimo 專(zhuān)題:為您提供了 Apache Geronimo 相關(guān)的技術(shù)文章、教程、下載等資源。 

  • WAS CE 專(zhuān)欄:為您提供了開(kāi)源應(yīng)用服務(wù)器 WAS CE 相關(guān)的技術(shù)文章、教程、下載等資源。 

獲得產(chǎn)品和技術(shù)

關(guān)于作者

中國(guó)軟件開(kāi)發(fā)中心的軟件工程師,所在團(tuán)隊(duì)目前從事 WebSphere Application Server Community Edition 產(chǎn)品相關(guān)的開(kāi)發(fā)測(cè)試、售后服務(wù)和客戶技術(shù)支持等工作。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(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)論公約

    類(lèi)似文章 更多