オブジェクト指向概論 第 13 講 実装とサーバサイド Java 立命館大学 情報理工学部 黄宏軒 1
13.1 Java による実装 n フォワードエンジニアリング UML による表現をプログラミング言語による記述に変換 n リバースエンジニアリング UML User -name:string +getname():string プログラミング言語の情報を UML モデルに変換 UML User -name:string +getname():string Java プログラム public class User{ private String name; public String getname() { return name; Java プログラム public class User{ private String name; public String getname() { return name; 2
クラス定義の実装 UML クラスパッケージ汎化抽象クラスインタフェース実現 Java class package extends abstract class interface implements package sample.domain; public class Cart { public interface OrderService { public class OrderServiceSupport implements OrderService { public class OrderServiceImpl extends OrderServiceSupport { 3
属性と関連の実装 1. 属性 インスタンス変数またはクラス変数へ 2. 多重度 1 の関連 public class OrderDetail { private static int COUNT_MAX = 10; protected int ty; private int totalprice; public class CartItem { protected item Item; 4
3. 集約, コンポジション ( 関連と同じように ) インスタンス変数へ 4. 多重度が * の関連 配列またはコレクションで public class Class { private Teacher teacher; private Student[ ] student; 5
5. 多重度が * 対 * の双方向関連 関連クラスにするのが良い public class Author { private Write[] write; public class Write { private Author author; private Book book; 6
n オブジェクト図を描いているととわかりやすい 著者 1 1 0..* 1..* 書籍 A さん : 著者 ああ : 書籍いい : 書籍 執筆 B さん : 著者 うう : 書籍 ええ : 書籍 C さん : 著者 おお : 書籍 = 執筆オブジェクト 7
操作の実装 n UML の操作 Java のメソッド public class Customer { public static int ORDER_MAX = 10; private String customerid; public void addorder(order order) { public Collection<Order> getorders() { return this.orders; 8
n シーケンス図のメッセージ送信 送信先のメソッド public class OrderService { public void order(string custid) { Cart cart = cartdao.findbycustid(custid); Order order = cart.createorder(); 9
13.2 Web アプリケーション n 静的 Web 例 : ホームページ ページの要求 ページの返却 HTML ファイル n 動的 Web 例 : 乗換え案内 処理の要求 乗車駅 下車駅取得 最短経路探索 結果の返却 結果表示ページ作成 10
CGI(Common Gateway Interface) n 利用者の PC Webブラウザからの要求に応じて, 対応するプログラムを起動し, 実行結果をWebブラウザに返すしくみ キーワード 検索 http://foo.com/ 検索入力ページ http://foo.com/cgi.bin/search.pl サーバー 別プロセスとして起動される search.pl プログラムを起動 検索結果リスト 検索結果ページ ページの枠に検索結果を埋め込む 11
13.3 Java サーブレット スレッドとして起動される HTTP リクエスト サーブレット サーブレット サーブレット HTTP レスポンス サーブレットコンテナ ページの枠に検索結果を埋め込む 12
Web サーバソフト n Apache Web サーバ (HTTP リクエストを処理する ) ソフト CGI 機能を持つ n Apache Tomcat n IIS Java サーブレットや JSP を実行するためのサーブレットコンテナ ( エンジン ) Apache と連携させて動かすこともできる Microsoft が提供する Windows 用 Web サーバソフト ASP や ASP.NET を実行することができる 13
Java サーブレットの例 package jp.hattori.objectdev; import java.io.ioexception; import java.io.printwriter; import javax.servlet.servletexception; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletreuest; import javax.servlet.http.httpservletresponse; public class SampleServlet extends HttpServlet { private static final long serialversionuid = 1L; 出力先の取得 出力するページの作成 protected void dopost (HttpServletReuest reuest, HttpServletResponse response) throws ServletException, IOException { response.setcontenttype("text/html; charset=shift_jis"); HttpServlet クラスを継承してサーブレットを作成 reuest.setcharacterencoding("shift_jis"); String str = reuest.getparameter("text1"); PrintWriter out = response.getwriter(); out.println("<html><body>"); out.println(str); HTTP リクエスト (POST) により起動されるメソッド HTTP リクエストからパラメータを取り出す out.println("<h3> あなたは,<blink> " + str + " </blink> と書きました.</h3>"); out.println("</body></html>"); 14
doget( ) と dopost( ) n HTTP リクエストに対応して実行されるメソッド HTTP リクエスト 半径 = 4 Public void doget (reuest, response) { 半径 = 4 送信 面積 =50.24 // リクエストからデータを取り出す reuest.getparameter( radius ); //HTML 出力の生成 response.getwriter( ); HTTP レスポンス 15
デプロイメント記述子 web.xml <servlet> <description></description> <display-name>sampleservlet</display-name> <servlet-name>sampleservlet</servlet-name> <servlet-class>jp.hattori.objectdev.sampleservlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>sampleservlet</servlet-name> <url-pattern>/sample</url-pattern> </servlet-mapping> サーブレット名 サーブレット名サーブレットクラス 対応する URL 16
13.4 JSP n Java サーブレット Java プログラムの中で HTML を生成 n JSP(Java Server Pages) HTMLの中にJavaプログラムを埋め込む実行時にはJavaサーブレットに書き換えられて実行される 17
JSP の例 <%@ page language="java" contenttype="text/html; charset=windows-31j" pageencoding="windows-31j"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/tr/html4/loose.dtd"> <html> <head><meta http-euiv="content-type" content="text/html; charset=windows-31j"> <title>jsp 時計 </title></head> <body> <h2> ようこそ,JSP の世界へ </h2> ただいまの時刻は,<% out.println(new java.util.date()); %> です. </body> </html> 18
Java サーブレットと JSP の連携 n Java サーブレットで処理をして, 結果を JSP で表示 サーブレット // formview.jsp に引き継ぐため Attribute にセット reuest.setattribute( name, janame ); // hello.jsp に引き継ぐ ReuestDispatcher dispathcer =reuest.getreuestdispatcher( "hello.jsp" ); // フォワード dispathcer.forward( reuest, response ); JSP // パラメータの取得 String name = (String) reuest.getattribute( name ); // データの表示 <dt>name</dt> <dd><%= name %></dd> 19
13.5 JavaBeans n JavaBeans とは ある一定の命名規則と設計規則にしたがって作成された Java クラス 単体としては動作しないソフトウェア部品で, 常に他のプログラムから呼び出されて利用される n MVC (model, view, controller) モデルの実現 Java サーブレット,JSP からビジネスロジックを JavaBeans として独立させる 20
MVC モデル n 本講義で前提とするソフトウェアアーキテクチャのモデル 1 クライアントからの入力 (http reuest) を Controller が受ける 2Controller が入力を解釈して,Model に処理を依頼する クライアント ブラウザ Java Controller サーフ レット View JSP JavaBeans Model サーバ DB 4View は Model の処理結果を参照する 5View はクライアントに出力 (http response) を返す 3Controller が View を呼び出し,Web ページの生成を依頼する 21
Java サーブレット,JSP, JavaBeans サーブレット Public void doget(httpservletreuest reuest, HttpServletResponse response) throws ServletException, IOException { // JavaBeans を生成 HellowWorldBean samplbean = new HellowWorldBean(); ServletContext application = this.getservletconfig().getservletcontext(); // サーブレットコンテクストに格納 application.setattribute( HellowBean, samplebean); JSP <jsp:uawbean id= HellowBean class= mybeans.hellowworldbean scope= application /> // JavaBeansの使用宣言 <html><head><title>helloworldbean</tiutle></head> <body> <jsp:getproperty name= HellowBean property= greeting /> // データの取得 </body></html> 22
13.7 Java とデータベース n Java とデータベースはモデルが違う 23
DAO パターンによるデータアクセス n DAO(Data Access Object) システムのドメインロジックとデータ ( ベース ) のアクセスを分離させる データベースからオブジェクトを取得したり, データベースへオブジェクトを格納する DAO への依頼には SQL を使わない DAO は一つのテーブルに対応させる ロジック データアクセスレイヤ 予約テーブル DAO SQL データベース 予約テーブル 24
JDBC n JDBC (Java DB Connectivity) Java から DB をアクセスするための API MySQL などでは,DB は別プロセスとして動かすので, プロセス間通信となる Web サーバ select * from customer_tbl ; データベースサーバ 検索結果 DB doget( ) {. String sl = select * from customer_tbl ; rs = st.executequery(sl);. 25