連載
» 2008年12月03日 00時00分 公開

もはやWeb利用者の常識、“URL”の意味を理解しようWebアプリの常識をJSPとStrutsで身につける(5)(3/3 ページ)

[中村圭一朗,株式会社メセナ・ネットコム]
前のページへ 1|2|3       

GETではリクエスト情報がURLに丸見え

 GETパラメータの場合は、URLの末尾に「?」を付け「名前=値」の形式でリクエストパラメータを連結します。

GETパラメータの記述例
http://localhost:8080/hello/Get?id=999&name=mesena&……

 複数のリクエストパラメータを待つ場合は、上記の例のように「&」で連結します。GETパラメータはデータの受け渡しに制限があり(上限は環境に依存します)、情報の一部をキーワードとして指定する検索エンジンなどで一般的によく利用されます。URLとして表示されているので、再利用が可能なためです。

 一方でGETパラメータを使うと、送信するリクエスト情報がURLに丸見えなので、機密情報や個人情報をGETでは送信しないことはWebアプリケーションの“常識”といえます。

GETパラメータをJSPとStrutsで理解する

 では、実際にGETの仕組みをJSP/Strutsで実装してみます。まず、連載第2回の「Strutsの常識を知り、EclipseとTomcatの環境構築」で作成したディレクトリ「PKG/Hello/pages」に「Parameter.jsp」を作成します。

Parameter.jsp
<%@ page contentType="text/html; charset=Shift-JIS" %>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>
<html:html>
  <head><title>GET/POSTサンプル</title></head>
  <html:form action="/Request">
    <bean:header id="htp" name="user-agent" value="no-header" />
    <bean:parameter id="para" name="etc" value="no-name" />
    <table border="0">
      <tr><td>
        HTTPヘッダ :<bean:write name="htp" />
      </td></tr>
      <tr><td>
        GETパラメータ :<bean:write name="para" />
      </td></tr>
      <tr><td>
        リクエスト情報入力:<html:text property="name" size="20"
                                  maxlength="30" />
      </td></tr>
      <tr><td>
        <html:submit value="OK" />
      </td></tr>
    </table>
  </html:form>
</html:html>

 次に、「PKG/Hello/WEB-INF/src」配下に「request」フォルダを作成して、そのフォルダ配下に「RequestAction.java」を作成します。

RequestAction.java
package request;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import hello.form.HelloForm;

/**
* RequestAction.java
*/
public class RequestAction extends Action {

    Log log = LogFactory.getLog(RequestAction.class);

    public ActionForward execute(ActionMapping mapping,
                                 ActionForm form,
                                 HttpServletRequest request,
                                 HttpServletResponse response)
    throws Exception {

        request.setCharacterEncoding("Windows-31J");
        HelloForm helloForm = (HelloForm) form;
        log.info(" name = "+helloForm.getName());
        return mapping.findForward("success");
    }
}

 最後に、「PKG/Hello/WEB-INF」配下の「struts-config.xml」を編集して完了です。

struts-config.xmlに追加
<struts-config>
<!-- ================================ Global Forward Definitions -->
  <global-forwards>
  </global-forwards>
<!-- ================================ Action Mapping Definitions -->
  <action-mappings>
    <action attribute="HelloForm"
      input="/pages/Who.jsp"
      name="HelloForm"
      path="/hello"
      type="hello.HelloAction"
      scope="session"
      validate="true">
      <forward name="success" path="/pages/Hello.jsp" />
    </action>
<!-- ここから追加 -->
    <action attribute="HelloForm"
      input="/pages/Parameter.jsp"
      name="HelloForm"
      path="/Request"
      type="request.RequestAction"
      scope="session"
      validate="true">
      <forward name="success" path="/pages/Request.jsp" />
    </action>
<!-- ここまで追加 -->

  </action-mappings>
<!-- ============================= Message Resources Definitions -->
<!-- ==================================== Plug Ins Configuration -->
<!-- ============================================== Tiles plugin -->
<!-- ========================================== Validator plugin -->
</struts-config>

注意! 「絶対パスと相対パス」

ここで、「input="/pages/Parameter.jsp"」の「/pages/Parameter.jsp」という表記について確認しておきます。

Webブラウザでよく見るURLは「http://localhost:8080/hello/pages/Parameter.jsp」というふうに、スキーム名やドメイン名などを含めたものです。これを「絶対パス」といい、そのURLだけでファイルのある場所を一意で示す絶対的なものです。

これに対して、「/pages/Parameter.jsp」のような表記の仕方を「相対パス」といいます。例えば、「http://localhost:8080/hello」までを基準の場所として、ファイルやディレクトリがどこにあるかを相対的に示す表記です。基準の場所と「相対パス」を足すと、「絶対パス」になります。

JSPやStrutsの設定ファイルに記述する場合、相対パスを用いることがほとんどです。また、項目に対して記入すべき相対パスが、「どこを基準としているのか」「/で始まるのか」「それとも、/を付けないのか」でWebアプリケーションが動かなくなることがよくあるので、気を付けましょう。

また、HTML上でも「./pages/Parameter.jsp」「../pages/Parameter.jsp」「../../Parameter.jsp」という表記の仕方でリンク先や参照先を指定する場合があります。これも混乱しやすいので、よくディレクトリの仕様を確認しておく必要があります。一般的に「./」で同じディレクトリを、「../」で1つ上の階層のディレクトリを、「../../」で2つ上の階層のディレクトリを表しています。「Parameter.jsp」と記述しても、同じディレクトリに存在することを表します。


Eclipseからサンプルを実行してみよう

 それでは、サンプルを実行してみましょう。連載第2回と同様に、Eclipseを起動します。次に、[プロジェクト・エクスプローラー]の「Hello」を選択して右クリックをして、[リフレッシュ]を選択します。Eclipseで[プロジェクト]の[クリーン]を選択して、Helloプロジェクトのコンパイルが完了したら、Eclipse上から「Tomcat起動」アイコン(猫マーク)を押して、Tomcatを起動してください。正常に起動したことを確認したら、下記のURLにアクセスしてください。

http://localhost:8080/hello/pages/Parameter.jsp

 すると、図3のようなページが表示されたと思います。

図3 Parameter.jspの表示結果 図3 Parameter.jspの表示結果

 次に下記のURLのように、URLの後ろに「?etc=mesena」という文字列を追加して更新してください。

http://localhost:8080/hello/pages/Parameter.jsp?etc=mesena

 「?」の後に付いた「etc」の値を取得して「GETパラメータ」の値が「mesena」に変わったと思います。この特徴こそ、GETパラメータの仕組みです。

図4 GETパラメータを指定したParameter.jspの表示結果 図4 GETパラメータを指定したParameter.jspの表示結果

Strutsの<bean>タグ

 ここで、前回のタグリファレンスで紹介した<bean:header><bean:write><bean:parameter>タグについて説明します。

 <bean:header>タグ

 項目「HTTPヘッダ」で出力している情報「<bean:header>タグ」は、HTTPリクエストヘッダの値を取得する際に使用します。指定できる属性はid、multiple、name、valueです。使用するWebブラウザにより、HTTPリクエストヘッダの情報は異なります。

 <bean:write>タグ

 その「<bean:header>タグ」で取得した情報を画面に表示させるために使用しているのが「<bean:write>」タグです。<bean:write>タグは、取得されたJavaBeansパラメータを属性「name」で指定して表示します。このタグは表示させたい項目を簡単に表示できるため一般的によく利用されます。

 <bean:parameter>タグ

 画面に「GETパラメータ :no-name」として表示しているのが、<bean:parameter>タグです。<bean:parameter>タグの特徴はリクエストで取得したパラメータを取得して表示できます。属性は、<bean:header>と同じです。

 今回のRequest.jspでは、属性「value」で"no-header"としているため、初期値としてvalueが表示されています。

POSTパラメータをJSPとStrutsで理解する

 次に、POSTパラメータの仕組みについて説明します。POSTパラメータの場合は、「リクエスト情報入力」のように事前に入力フォームを用意します。先ほどのディレクトリ「PKG/Hello/pages」に以下のような「Request.jsp」を作成してください。入力フォームに関しては前回の記事が参考になると思います。

Request.jsp
<%@ page contentType="text/html; charset=MS932" %>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>
<html:html>
  <head><title>GET/POSTサンプル</title></head>
  <html:form action="/Request">
    <table border="0">
      <tr><td>
        リクエスト情報出力:<bean:write name="HelloForm"
                                  property="name" />
      </td></tr>
    </table>
  </html:form>
</html:html>

 入力フォームに値を入力して、「OK」ボタンを押すと、RequestAction.javaでパラメータ「name」として入力したリクエスト情報を取得できます。これが、POSTパラメータの仕組みです。その取得した情報を<bean:write>タグを使って表示すると、図5のような画面が表示されます。

図5 POSTパラメータのデータが表示 図5 POSTパラメータのデータが表示

次回は、Webアプリ上で保持する“状態”の常識

 今回の内容で、URL、プロトコル・メッセージング・パラメータに関する常識が身に付いたことと思いますが、いかがでしたでしょうか。

 次回は今回の内容に関連して、セッションやCookie、ステートレス/フル、同期/非同期通信、などWebアプリケーション上で保持する“ステート”(状態)について説明します。今回の内容とセットで読むと、さらに理解が深まるかと思いますので、どうぞお楽しみに。

 今回のサンプルは、こちらからダウンロードできます。

プロフィール

中村 圭一朗(なかむら けいいちろう)
株式会社メセナ・ネットコム所属

現在、Strutsを利用した旅行業務システムの開発に携わっている。日々情報収集と知識の蓄積に努め、さまざまな場面で迅速かつ正確な判断と行動を取れるSE(真の技術者)を目指しまい進。



前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。