The HIRO Says

If you smell what The HIRO is cooking!!!

【slim3】JSPの開発手順および注意事項

前回まで、slim3 の画面遷移制御用コンポーネントである
”Controller”について触れてきました。
今回は、この Controller から呼び出される/を呼び出す JSP の開発手順、およびその際の注意事項について見ていきます。


1.あらかじめ用意されているもの

slim3-blank をインストールする際、あらかじめ以下のものが用意されています。

  1. ベースとなる JSP 部品
  2. CSS

これらをベースに、自動生成した JSP(後述)に修正を加えていく形で、JSP を開発していくことになります。


なお、slim3-blank のインストール時に用意されているファイルについては、slim3のプロジェクト構成をご覧下さい。

(1)ベースとなるJSP部品

war ディレクトリ下に、以下の4つの JSP 部品が用意されています。

JSP ファイル名 内容
header.jsp ヘッダー:タイトルの表示機能を持つ。
menu.jsp メニュー用のリンクを持つ。
footer.jsp フッター。
index.jsp アプリの初期表示画面。上記3ファイルを include している。

header・menu・footer を使用する JSP を構築したい場合は、index.jsp をベースとすれば良いでしょう。
また、これらの JSP文字コードは、いずれも UTF-8 となっています。

(2)CSS

war/css ディレクトリ下に、global.css が用意されています。
上述の index.jsp、および自動生成した JSP(後述)は、同ファイルを参照するようになっています。
そのため、画面のデザインを定義・変更したい場合は、通常このファイルを編集していくことになります。
(ちなみに、独自の CSS ファイルを定義・使用しても問題ありません。)


2.自動生成されるJSPの概要

個別の JSP は、gen-controller で、Controller クラスらと一緒に Ant で自動生成されます。
自動生成される JSP のポイントは、以下の5点です。

  1. 文字コードUTF-8
  2. war/css/global.css を参照するようになっている。
  3. header・menu・footer は include していない。
  4. JSTL の各タグを使用できる。
  5. slim3 専用の function タグを使用できる。
    • 機能は、SAStruts のものとほぼ同等。


なお、gen-controller での JSP ファイル名およびパスのルールについては、こちらの「2.URL の指定方法」をご覧下さい。

【参考】自動生成されたJSP

★で注記した箇所以外は、全て同じ内容で生成されます。

<%@page pageEncoding="UTF-8" isELIgnored="false"%>
<%@taglib prefix="c"
    uri="http://java.sun.com/jsp/jstl/core"%>
<%@taglib prefix="fmt"
    uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@taglib prefix="fn"
    uri="http://java.sun.com/jsp/jstl/functions"%>
<%@taglib prefix="f"
    uri="http://www.slim3.org/functions"%>




order Order←★URL をタイトルにしている



Hello order Order !!!

↑★Hello [URL で指定したもの]になっている

3.JSPからControllerを呼び出す手順

(1)リンクで呼び出す場合

<a> タグで、gen-controller で指定したものと同じパスを指定すればOKです。

    <a href="${f:h('/order/')}">注文</a>

ちなみに f:h() は、引数の文字列を HTML エスケープ(サニタイズ)してくれます。
クロスサイトスクリプティングを防止してくれる、という意味です。

(2)formで呼び出す場合

<form> タグで、action 属性に gen-controller で指定したものと同じパスを指定すればOKです。


(a)入力値の設定方法
(例)テキストフィールドの場合。

    <input type="text" ${f:text("name")} />

f:text() で、テキストフィールドと HttpServletRequest 設定時のパラメータ名とを関連付けます。


(b)ボタンの設定方法

    <input type="submit" value="登録"
        name="registerButton" />

複数のボタンを用意し、どれが押下されたかを判定したい場合は、ボタンに name を設定し、Controller 内で HttpServletRequest#getAttribute() を呼び出し、その name の値が取得できるか否かで判定できます。


4.注意事項

JSP の開発・使用に際しては、以下の点に注意が必要です。

(1)JSPのURL直接指定は不可

ブラウザで、JSP の URL を直接指定することはできません。
HTTP ERROR:403(アクセス禁止)になります。

  1. メッセージから推察するに、slim3 というよりは GAE/J の仕様のようです。
  2. ちなみに HTML は、WEB-INF 下でなければ直接参照が可能です。


よく JavaEE での開発では、直接参照されるのを避けるために、JSP を WEB-INF 下に配置したりします。
ですが、GAE/J・slim3 ではそもそも JSP を直接参照できないので、特に WEB-INF 下に配置・移動する必要性はないようです。

(2)web.xmljsp-configを使用できない

taglib や JavaScript の参照など、JSP 共通の定義を行えるようにするため、JavaEE では web.xmljsp-config を設定できるようになっています。
ですが GAE/J では jsp-config の設定が認識されません。
ですので、taglib や JavaScript の参照などは、JSP に1つ1つ設定していく必要があります。


詳しくは、以下のリンクをご覧下さい。

  1. jsp-configは使えない?
  2. http://groups.google.co.jp/group/google-appengine-java/browse_thread/thread/2bfc201cd7ad8b48?pli=1

5.JSPのhot deploy

slim3 では、JSP も hot deploy してくれます。
(1)Eclipse の同期化をさせなくても、Windowsexplorer レベルでの変更を反映してくれます。
(2)JSP文字コードの変更も反映してくれます。


ちなみに、web.xml などの Servlet の起点となるものについては、hot deploy できない模様です。


6.【参考】JSPの実装例

header・menu・footer を使用する JSP の実装例を、以下に示します。

<%@ page pageEncoding="UTF-8" isELIgnored="false" %>
<%@ taglib uri="http://www.slim3.org/functions" prefix="f" %>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>注文登録</title>
    <link rel="stylesheet" type="text/css" href="/css/global.css" />
</head>
<body>
    <%-- ◆header --%>
    <jsp:include page="header.jsp">
        <jsp:param name="title" value="注文登録" />
    </jsp:include>
    <%-- ◆menu --%>
    <jsp:include page="menu.jsp" />
    <%-- ◆メインのコンテンツ --%>
    <div id="body">
        <form action="/order/orderConfirm" method="POST">
            <table border="1" align="center">
                <tr>
                    <th>商品名</th>
                    <td><input type="text" ${f:text("name")} /></td>
                </tr>
                <tr>
                    <th>数量</th>
                    <td><input type="text" ${f:text("amount")} /></td>
                </tr>
            </table>
            <br />
            <table border="0" align="center">
                <tr>
                    <td><input type="submit" value="登録"   /></td>
                    <td>   </td>
                    <td><input type="reset"  value="クリア" /></td>
                </tr>
            </table>
        </form>
    </div>
    <%-- ◆footer --%>
    <jsp:include page="footer.jsp" />
</body>
</html>