390 likes | 687 Views
Java と XML による BtoB EC サイトの構築. 日立ソフトウェアエンジニアリング(株) インターネットビジネス推進部 中野 明彦. はじめに. 弊社(日立ソフト)のご紹介 横浜に本社 携帯端末からメインフレームまでのソフトウェア開発 「インターネットビジネス推進部」にて取り組んでいること Java (特に最近はサーバサイドに注力) パッケージ開発 システム・インテグレード. アジェンダ. Assam Commerce Server ( ACS) の概要 ACS の BtoC 機能 ACS のフレームワーク・アーキテクチャ
E N D
JavaとXMLによるBtoB ECサイトの構築 日立ソフトウェアエンジニアリング(株) インターネットビジネス推進部 中野 明彦
はじめに • 弊社(日立ソフト)のご紹介 • 横浜に本社 • 携帯端末からメインフレームまでのソフトウェア開発 • 「インターネットビジネス推進部」にて取り組んでいること • Java(特に最近はサーバサイドに注力) • パッケージ開発 • システム・インテグレード
アジェンダ • Assam Commerce Server(ACS)の概要 • ACSのBtoC機能 • ACSのフレームワーク・アーキテクチャ • ACSのBtoB機能
ACSとは • ECサイト構築用のパッケージ・ソフト • 弊社ECサイト「@Buy24-Software」がベース http://www.abuy24.com/soft • ビジネスモデル • BtoCモデル・・・商品陳列型販売サイト • BtoBモデル・・・インターネット調達システムとの連動 • テクノロジ • J2EE(Servlet、JSP、JavaBeans、XML)-α • Webアプリケーション・サーバ
サポートするプラットフォーム Assam Commerce Server WebSphere WebLogic DB2 Oracle WindowsNT Solaris AIX HP-UX
ACSのBtoC機能 • フロントエンド機能 • 商品カタログ • ショッピング・カート • 商品購入(決済機能) • 会員機能 など • バックエンド機能 • 商品管理 • オーダー管理 • 会員管理 など
Servlet-JSP-JavaBeansの役割分担 <<boundary>> JSP <<command>> JavaBeans DataSource <<controller>> Servlet <<entity>> JavaBeans
ServletAPIの差異の吸収 • Servletのバージョンの違いによるAPIの非互換性 • アプリケーション・サーバによりサポートされるServletAPIのバージョンが異なる • WebSphere3.0 ⇒ ServletAPI2.1 • WebLogic5.1 ⇒ ServletAPI2.2 • 抽象クラス(CommandContext)を用意 • ACSが規定するServletAPIのインタフェースを定義
HttpServletRequest (from javax.servlet) HttpServletResponse (from javax.servlet) ServletContext (from javax.servlet) CommandContextForAPI20 CommandContextForAPI21 CommandContextForAPI22 CommandContext抽象クラス <<abstract>> CommandContext uses +<<static>> getInstance(ServletContext, HttpServletRequest, HttpServletResponse) :CommandContext + getSession():HttpSession + invalidateSession() + setAttributeToSession(String, Obejct, boolean):boolean + getAttributeFromSession(String):Object + setAttributeToRequest(String, Object) + getAttributeFromRequest(String):Object + getParameterValue(String):String + getParameterValues(String):String[] + forward(String) + include(String) uses uses
CommandContextの使用例 • Public class LoginServlet { • public void service(HttpServletRequest request, HttpServletResponse response) { • CommandContext cmdCtx = CommandContext.getInstance( • getServletConfig().getServletContext(), request, response • ); • String userID = cmdCtx.getParameterValue( “USER_ID” ); • String password = cmdCtx.getParameterValue( “PASSWORD” ); • : • cmdCtx.setAttributeToSession( “USER_ID”, userID, true ); • cmdCtx.forward( “welcome.jsp” ); • } • }
Entityオブジェクト • 独自の永続化オブジェクト • O-Rマッピングを実現 • データソースの存在をCommandオブジェクトに意識させない • データソース間の相違(SQLの方言)を吸収 • EJB(EntityBean)ではない ;) • ACS開発開始時(昨年半ば)に評価 • 時機尚早と判断 機能的・性能的制限から
EntityインタフェースとPersister抽象クラス <<interface>> Entity <<abstract>> Persister + validate() + update() + remove() + update(Entity) + insert(Entity) + remove(Entity) + query(String):Entity + queries(String):Vector # getSQLForInsert(Entity):Vector # getSQLForUpdate(Entity):Vector # getSQLForDelete(Entity):Vector # getSQLForSingleQuery(String):Vector # getSQLForMultipleQuery(String):Vector ConcreteEntity ConcretePersister uses +<<static>> getInstance(String):ConcreateEntity +<<static>> getInstances(String):Vector +<<static>> getInstance():ConcreatePersister * 1
Entityの使用例 ・・・ CustomerEntity customer = new CustomerEntity(); customer.setName( “中村” ); customer.setAddress( “横浜市” ); customer.setPhoneNumber( “045-123-4567” ); customer.validate(); customer.update(); <%@ import=“jp.co...CustomerEntity” %> <HTML><BODY> <% CustomerEntity customer = CustomerEntity.getInstance( “cust000001” ); %> 名前: <%= customer.getName() %> 住所: <%= customer.getAddress() %> 電話: <%= customer.getPhoneNumber() %> </BODY></HTML>
APサーバ固有APIの差異の吸収 • Webアプリケーション・サーバの代表的な機能 • コンテナの実装エンジン(Servlet、JSP、EJB) • 各種リソースのPooling機能 • クラスタリング(フェールオーバ、ロードバランス) • 既存システムへのコネクター など • データベース・コネクションのPooling機能 • JDBC2.0で「データソース」として標準化 • 現状のAPサーバは未準拠のものも多い 抽象クラス(PersisterConnector)用意し、固有APIの差異を吸収
WLSPoolConnector GenericJDBCConnector WASPoolConnector PersistConnector抽象クラス <<abstract>> PersisterConnector +<<static>> getInstance():PersisterConnector + begin():boolean + commit() + rollback() + query(String):RecordSet + insert(String):int + update(String):int + delete(String):int
PersistConnectorの使用例 • public abstract class ItemPersister extends Persister { • ・・・ • public Entity query(String id) { • PersisterConnector connector = PersisterConnector.getInstance(); • try { • connector.begin(); • Vector aVector = getSQLForSingleQuery(id); • String sql = (String)aVector.elementAt(0); • RecordSet aRecordSet = connector.query(sql); • target = (Item)createInstance(aRecordSet); • } catch(Exception e) { • connector.rollback(); • } • connector.commit(); • return target; • } • }
BtoBの定義 • 企業間の電子商取引 • 従来からEDI(電子データ交換)システムやCALS(生産・運用・調達支援統合システム)として存在 • 情報や取引関係はclosedであった • ACSがねらうBtoBとは • インターネット上でopenな情報の共有と取引関係の確立を実現するもの eg. インターネット調達、マーケットプレイス
何故XMLなのか? • 従来のBtoB(EDI)との比較 EDI XML シンタックス・ルールが 難解 シンプル(すぎる?) スキーマ テキストフォーマット 固定長バイナリやCSV フォーマットで表現 データ形式 不足している 標準規格APIに従ったものが 無償で提供 ツール/ライブラリ ツール/ライブラリに 制限される Unicodeに対応するため 使用言語を制限しない 使用言語 利点はいろいろあるが・・・
何故XMLなのか?(cnt’d) • 標準技術として認知されたことが一番の理由(だと思う) • TCP/IPとかHTTPとかと同じ(デファクトの強み) • EDIFACTやANSI X.12は対照的な例 • Javaとの相性がよいこと • XMLドキュメントを解析・生成するためのライブラリ(パーサ)が既に数多く提供されている • eg. Sun Project X(JAXP)、IBM XML Parser for Java Apache Xeres Java Parser
Ariba Buyerとの連携 • Ariba Buyer (v7.0) • インターネット調達アプリケーション • Ariba Commerce Service Network(ACSN) • BuyerとSupplierの間のネットワーク・ハブ Ariba Commerce Service Network Supplier (ACS) Ariba Buyer Ariba社 売り手側企業 買い手側企業
cXML • commerce eXtensible Markup Language(cXML) • Ariba社を含む複数のベンダーにより策定 • XML.ORG(http://www.xml.org)のスキーマ・リポジトリに登録 • 資材調達に係るデータの静的および動的な側面を定める • 静的な面: 商品カタログ、見積もり、発注データ など • 動的な面: ローカル・カタログ機能、 インターネット・カタログ(パンチアウト)機能
ローカル・カタログ機能 Buyer管理者 Supplier管理者 Ariba Buyer ACSN Supplier カタログを 作成する Index cXML/HTTP ACSNに ログインする Index cXML/HTTP カタログを Uploadする ACSNに ログインする カタログを Downloadする Index cXML/HTTP カタログを インポートする Index cXML/HTTP
Indexドキュメント <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE Index SYSTEM "http://xml.cxml.org/schemas/cXML/1.1.008/cXML.dtd" > <Index> <SupplierID domain="DUNS">0000002-T</SupplierID> <IndexItem> <IndexItemAdd> <ItemID> <SupplierPartID>ABC001</SupplierPartID> </ItemID> <ItemDetail> <UnitPrice> <Money currency="JPY">4660</Money> </UnitPrice> <Description xml:lang="ja"> <ShortName>Sample商品001</ShortName> Sample商品001の詳細説明 </Description> <UnitOfMeasure>EA</UnitOfMeasure> <Classification domain="SPSC">55555555</Classification> </ItemDetail> <IndexItemDetail> <LeadTime>7</LeadTime> </IndexItemDetail> </IndexItemAdd> </IndexItem> <IndexItem> <IndexItemDelete> <ItemID> <SupplierPartID>ABC002</SupplierPartID> </ItemID> </IndexItemDelete> </IndexItem> </Index>
インターネット・カタログ(パンチアウト)機能インターネット・カタログ(パンチアウト)機能 Buyer利用者 Ariba Buyer ACSN Supplier HTML/HTTP Supplierの選択 PunchOutSetupRequest cXML/HTTP PunchOutSetupRequest cXML/HTTP PunchOutSetupRespone cXML/HTTP PunchOutSetupRespone cXML/HTTP HTML/HTTP SupplierのURI に遷移 HTML/HTTP 商品の選択・追加 PunchOutOrderMessage HTML/HTTP : : PunchOutOrderMessage HTML/HTTP 「注文」ボタンの押下
パンチアウト機能の利点 • アイテム数が多く増加する商品(本、CD、ソフトウェア)を電子カタログ化するコストを削減できる。 • コンフィギュレーションが必要となる商品(コンピュータ・ハードウェア)の見積もりに対応できる。 • 価格やメニューが変化しやすい商品(サービス)の見積もりに対応できる。 • 顧客に応じてパーソナライズしたコンテンツを提供できる。例えば、商品の仕切りや購入金額の上限など。
パンチアウトで使用されるXMLドキュメント cXMLドキュメント 説明 Buyer利用者の認証情報やカート情報が含まれる。 「create」「edit」「inspect」のオペレーション・タイプがある。 PunchOutSetupRequest PunchOutSetupRequestに対する応答ドキュメント。Buyer によって表示されるACS側の画面のURIが含まれる PunchOutSetupResponse 本ドキュメントには、見積もりデータとして、商品コードや 数量、集計金額などが含まれる。 PunchOutOrderMessage 作成 「create」 編集 「edit」 提出 検査 「inspect」 承認完了
PunchOutSetupRequestドキュメント <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE cXML SYSTEM " http://xml.cxml.org/schemas/cXML/1.1.008/cXML.dtd "> <cXML version="1.0" payloadID="970197090991.2144681359@sirius" timestamp="2000-09-29T12:11:30-15:00"> <Header> <From> <Credential domain="NetworkId"> <Identity>AN00000001-T</Identity> </Credential> </From> <To> <Credential domain="DUNS"> <Identity>0000002-T</Identity> </Credential> </To> <Sender> <Credential domain="AribaNetworkUserId"> <Identity>sysadmin@ariba.com</Identity> <SharedSecret>XXXXXXXX</SharedSecret> </Credential> <UserAgent>B2B Buyer 7.0 </UserAgent> </Sender> </Header> <Request deploymentMode="test"> <PunchOutSetupRequest operation="create"> <BuyerCookie>123456789</BuyerCookie> <BrowserFormPost> <URL>https://an.ariba.com/punchout?ansessionid=123456789</URL> </BrowserFormPost> </PunchOutSetupRequest> </Request> </cXML>
PunchOutSetupResponseドキュメント <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE cXML SYSTEM "http://xml.cxml.org/schemas/cXML/1.1.008/cXML.dtd"> <cXML payloadID="20000929121955383.1962378.297240000@202.32.87.104" timestamp="2000-09-29T12:19:55+09:00" xml:lang="ja" version="1.1.008"> <Response> <Status code="200" text="OK"></Status> <PunchOutSetupResponse> <StartPage> <URL>http://www.abuy24.com/servlet/Default</URL> </StartPage> </PunchOutSetupResponse> </Response> </cXML> • StartPageとして以下のURIを応答する。 • 「create」の場合: ACSのトップページのURI • 「edit」「inspect」の場合: ACSのカート画面のURI
PunchOutOrderMessageドキュメント <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE cXML SYSTEM "http://xml.cxml.org/schemas/cXML/1.1.008/cXML.dtd"> <cXML payloadID="20000904170039238.1962458.1176968516@202.32.87.104" timestamp="2000-09-04T17:00:39+09:00" xml:lang="ja" version="1.1.009"> <Header> ・・・ </Header> <Message> <PunchOutOrderMessage> <BuyerCookie>123456789</BuyerCookie> <PunchOutOrderMessageHeader operationAllowed="edit"> <Total><Money currency="JPY">5393</Money></Total> </PunchOutOrderMessageHeader> <ItemIn quantity="1"> <ItemID><SupplierPartID>ASI0360</SupplierPartID></ItemID> <ItemDetail> <UnitPrice><Money currency="JPY">4660</Money></UnitPrice> <Description xml:lang="ja"> <ShortName>Sample商品001</ShortName> Sample商品001の詳細説明 </Description> <UnitOfMeasure>EA</UnitOfMeasure> <Classification domain="SPSC">55555555</Classification> </ItemDetail> </ItemIn> </PunchOutOrderMessage> </Message> </cXML>
パンチアウト機能の実装 • LaunchListenerServlet ①SAX APIを用いたPunchOutSetupRequestの解析 ②ユーザの認証(ACSへのログイン処理) ③「edit」「inspect」の場合、カート・オブジェクトを再構築 ④遷移先URIを決定 ⑤DOM APIによりPunchOutSetupResponseを生成 • CreateOrderMessageCommand ①DOM APIにより、HTTPセッション・オブジェクト中のカート・オブジェクトからXMLドキュメントを生成 ②生成したXMLドキュメントをHttpRequestオブジェクトに格納 • 既存JSPページの修正 • カート画面のJSPページ など
今後の予定 • EJBコンポーネント化を再検討 • 独自Entityオブジェクト ⇒ EntityBean化 • Commandオブジェクト ⇒ SessionBean化? • ACSのBtoBインタフェースの汎用化とAriba以外のプロトコルへの対応 • Commerce One, Inc. • Oracle Internet Procurement、Oracle Exchange
ご参考資料 • インターネットビジネス推進部のホームページ • http://e-biz.hitachi-sk.co.jp • ACS製品情報 • http://e-biz.hitachi-sk.co.jp/sub/frm_sol.html • 関連記事 • IDGジャパン JavaWORLD 2000年3月号:「ECサイト構築事例に見るWebアプリケーション開発手法」 2000年11月号:「加速するEC、進化するJ2EE」Part2~4 2000年4月号より連載: 「部下には聞けない“Java入門”」