14:00サーブレットは、JSPと連携してはじめて真価を発揮するものと言えます。今回はJSPとの連携や、Webアプリケーションに保管されたBeanオブジェクトとの連携などを中心に説明をしていきましょう。目次Page1はじめに対象読者JSP~サーブレット~JSPの流れを考えるサーブレットの作成Page2サーブレットにページを読み込むJSPにサーブレットを埋め込むリクエスト・セッション・アプリケーションの値Page3WEB-INF内のファイルをBeanからアクセスするサーブレットからのBeanの利用JSPからのBeanの利用まとめはじめに今回はJSPで使った主な機能をサーブレットで実装する方法について説明します。JSPとサーブレットの連携についても考えてみます。JSPとサーブレット間でのデータのやり取り、さらにはWebアプリケーションにBeanを保管し、jSP~サーブレット~Bean間での値の受け渡しについても触れておきましょう。対象読者Javaの基本(文法全般および基本的なクラスライブラリの使い方程度)をマスターしている人。サーバサイド(JSP、サーブレット)について基礎から勉強したい人。WTPを使った開発に興味がある人。JSP~サーブレット~JSPの流れを考えるJSPとサーブレットの特徴を考えたとき、誰もが思うのは「クライアントへの表示関係をJSPで行い、サーバ側で必要な処理をサーブレットで実装しよう」ということでしょう。「データを送信するJSP→処理用サーブレット→結果表示JSP」というように、JSPとサーブレットの間でやり取りしながら処理を行っていくというやり方です。このようにすることで、GUIと内部処理を分離できるはずです。そのためには、「JSPからサーブレットへの送信」「サーブレットからJSPに情報を渡す」「サーブレットから必要に応じてJSPページにリダイレクトする」といった処理が必要となります。実際に簡単なサンプルを作成して、これらの機能の使い方について整理していくことにしましょう。ここでは「index.jsp」→「MyServlet」→「page.jsp」という流れで処理を受け渡すことにしましょう。「index.jsp」からです。一応、jspにしてありますが、基本的にはただのHTMLです。</body></html>index.jspに用意したフォーム。テキストの入力フィールドが1つあるだけのもの。ここでは、myservに向けてフォームをPOST送信しています。このmyservがMyServletになります。これ自体は特に説明の要はないでしょう。続いて、結果を表示する「page.jsp」のソースコードです。</body></html>ここでは、request.getAttributeを使って"msg"という名前の値を取り出しています。%>としてページに表示をしています。サーブレットの作成サーブレットは、「index.jsp」から送信されたフォームの内容を受け取り、それを必要な形に処理し、「page.jsp」にその値を渡してリダイレクトする、という処理を行います。ソースコードを挙げておきましょう。}}フォームにテキストを記入して送信する。送信先のサーブレットでテキストを加工し、リダイレクトした「page.jsp」でその結果を表示している。ここでは、doGetで特に処理をしていません。直接アクセスしたとしても、空白のページが表示されるだけです。doPostで必要な処理を行っています。setCharacterEncodingとsetContentTypeで下準備をした後、「index.jsp」から送られてきた値を取り出します。request.getParameter("text1");この点は、JSPとまったく同じことが分かりますね。jspの暗黙オブジェクトも実質的にはdoPostの引数で渡されるHttpServletRequestと同じわけですから。続いて、この値をリクエストのアトリビュートとして設定します。str);これも、JSPとまったく同じです。これで、「page.jsp」側はrequest.getAttributeで値を取り出せるようになるわけです。JSP/サーブレット間の値のやり取りは、JSPどうしの場合とほとんど変わらずに行えることが分かるでしょう。作業完了後に「page.jsp」に移動するリダイレクト処理はどうすればよいのでしょうか。これは、少々面倒なことを行う必要があります。JSPでは、pageContextという暗黙オブジェクトのforwardを使えばよかったのですが、このpageContextに相当するものはサーブレットに用意されていません。pageContext暗黙オブジェクトの正体は、javax.servlet.jspパッケージに用意されている「PageContext」というクラスのインスタンスです。これはJSP用に用意されているものであるため、JSP以外(サーブレット含む)では利用できないのです。そこで、サーブレットでのやり方を別途覚えておく必要があります。this.getServletContext();まず、etServletContextというメソッドを使い、ServletContextというクラスのインスタンスを取得します。これはサーブレットが利用されているWebアプリケーションに関する情報を管理するもので、各Webアプリケーションごとに1つのインスタンスが割り当てられています。JSPにも、これに相当する暗黙オブジェクトはあります(「application」というものです)。ここから、リダイレクトのためのオブジェクトを取得して作業を行います。context.getRequestDispatcher("/page.jsp");RequestDispatcherは、文字通りリクエストの処理を転送するために必要な処理を持つクラスのインスタンスです。getRequestDispatcherにより、必要なRequestDispatcherを取得します。このとき、引数には転送先のファイルのURLを指定します。これで、指定したURLに転送するためのRequestDispatcherが得られるわけです。response);取得したRequestDispatcherのforwardを呼び出して転送を行います。引数には、HttpServletRequestとHttpServletResponseを渡します。通常は、doGet/doPostの引数として渡されたものをそのまま渡せばよいでしょう。このforwardが実行された時点でサーバはリダイレクトを行い、「page.jsp」にページ遷移します。従って、forwardの後に処理は書かないよう注意が必要です。リダイレクトを行うとき、もう1つ覚えておきたいことがあります。それは、「サーブレットに送られたリクエスト・レスポンスがそのままリダイレクト先へも渡される」という点です。サーブレットが受け取ったのと同じものが転送先に渡されるのです。いうことは、サーブレットに送信した情報は、そのまま転送先でも利用できるということになります。ここではサーブレットで「index.jsp」から送信されたフォームの内容を受け取り、アトリビュートに設定して送りましたが、「index.jsp」から送られた情報を直接「page.jsp」で利用することもできるわけです。(String)request.getParameter("text1");%>request.getParameterすれば、リダイレクト先で送信フォームの内容を直接取り出すことができる。%>タグをこのようにすれば、「index.jsp」から送られたフォームのtext1の値をそのまま「page.jsp」で取り出すことができます。forwardする際にdoGet/doPostの引数として渡されたHttpServletRequestとHttpServletResponseをそのまま渡すからこれが可能になる、という点は忘れないでおきましょう。Webアプリケーション外へのリダイレクトについてリダイレクトを行うforwardは、基本的にこのWebアプリケーション内のファイルを利用するものです。リクエスト情報を受け渡して処理を引き継ぐことができるようにする関係上、外部のファイルへのリダイレクトには利用できないので注意が必要です。「リクエスト情報は不要だ。単純に他のページにジャンプしたい」というような場合にはどうすればいいのでしょうか。これは、responseにある「sendRedirect」というメソッドを用います。response.sendRedirect("http://google.com/");例えば、このようにすることでGoogleのサイトへジャンプさせることができます。ツヤノ)三文ライター&三流プログラマ。ビギナーに向けたプログラミング関連の執筆を中心に活動している。※現在、入門ドキュメントサイト「libro」、カード型学習サイト「CARD.tuyano.com」を公開中。Google+プロフィールはこちら。圧縮・解凍UNIX基本講座@CodeZine『CodeZine(コードジン)』の公式アカウントです。【NEW】デブスト2019デブサミ2019福岡・関西デブサミ2019夏デブスト関西デブサミ2019×ログインEメールパスワード※旧SEメンバーシップ会員の方は、同じ登録情報(Eメール&パスワード)でログインいただけます。イラストの無断転載を禁じます。記載されているロゴ、システム名、製品名は各社及び商標権者の登録商標あるいは商標です。