サーブレットとJSP ミニTips

サーブレットから他のページへのジャンプ(フォワード)

RequestDispatcher d =
    getServletContext().getRequestDispatcher("/newpage.html");
d.forward(request, response);

JSPから他のページへのフォワード

<jsp:forward page="/moreinfo.jsp">
<jsp:param name="user" value="guest"/>
</jsp:forward>

 JSP文書から別のページにフォワードするには、 jsp:forwardタグを使います。 page=の値がジャンプ先ですが、これは必ずスラッシュ(/)で開始します。 URLは そのWebアプリケーションのコンテキスト・ルートからの相対パスになります。
jsp:forwardタグの中にはjsp:paramタグを入れ子にすることができ、 POST変数と同じように扱われるフォーム変数をフォワード先の文書に渡すことができます。
 なお、フォワードしてもWebブラウザに表示されるURLは元のままです。

JSPでインクルードするファイルが文字化け
インクルードされるファイルの中に日本語の文字を書いていて、 日本語が??に変換されてしまう場合、インクルードされるファイルにも冒頭に

<%@ page language="java" contentType="text/html;charset=Shift_JIS" %>

が書いてあるか確認します。 そして、インクルードするファイルに

<%@ page language="java" contentType="text/html;charset=Shift_JIS" %>
<%@ page pageEncoding="Shift_JIS" %>

を書けば、問題ないと思います。(Tomcat 5.0.16で確認)

フォーム変数の日本語化
Tomcatには、CGIフォーム変数をサーブレットやJSPで受け取ったとき、 文字列をISO8859-1で解釈しようとするので、 日本語の文字列が正しくUTF-8として取り込まれないことがあります。 これを防ぐには、次のような変換をかけます。

public static final String getEUC(String src)
throws java.io.UnsupportedEncodingException {
    return new String(src.getBytes("8859_1"), "EucJP");
}
String param = getEUC(request.getParameter("kanji_name"));

ちなみにシフトJISを所望の場合はEucJPをSJISに変えればOKです。

サーブレットのリクエストパスからローカルファイルのパスを得る
サーブレットコンテナの設定により、 特定の拡張子やパターンを持つ複数のリクエストパスに対し、 同じサーブレットを起動することができます。 そのような場合、呼び出されたサーブレットから、元のリクエストパスを知るには、 次のようなコードを使います。

String svPath   = request.getServletPath();
String realPath = getServletContext().getRealPath(svPath);

Windowsの機種依存文字が文字化け
UNIXやインターネットでは行儀悪いとか言われますが、 業務システムではどうしても丸囲み数字やローマ数字などの機種依存文字をユーザが使ってしまうもの。 それらに対応するには、 Content-typeとpageEncodingを "Shift_JIS" ではなく、"Windows-31J" とします。

Webアプリケーション(ServletContext)にパラメータを渡したい
サーブレットやJSPにweb.xmlのinit-paramタグで初期化パラメータが渡せるように、 Webアプリケーション全体で共有できる、つまりServletContextに記憶させることができる初期化パラメータもあります。 これはweb.xmlに書くcontext-paramというタグを次のように使います。

<context-param>
  <param-name>setup.file.path</param-name>
  <param-value>/WEB-INF/setup.xml</param-value>
</context-param>

これで、サーブレットやリスナー(ServletContextListener)の中から、 getServletContext().getInitParameter("setup.file.path")メソッドを使えば、 "/WEB-INF/setup.xml" が得られます。

セッションのタイムアウト時間を設定する
web.xmlのsession-timeoutタグで、デフォルトの30分を変更できます。単位は分です。

<session-config>
  <session-timeout>60</session-timeout>
</session-config>

welcomeページを表示する
welcomeページとは、ディレクトリを指すURLにアクセスされた際に、 代わりに表示するページのことです。これも、web.xmlで指定できます。

<welcome-file-list>
  <welcome-file>login.jsp</welcome-file>
  <welcome-file>../login.jsp</welcome-file>
</welcome-file-list>

このように、複数指定する理由は?
1つ下の階層のディレクトリに直接アクセスされた場合も効くようにするためです。

HttpServletRequest.setAttribute()で設定した情報は、フレームのページでは見れない?
フレームは、下地となるページをHTTPサーバが送り出した後、 各フレームのページを個別にHTTPサーバが送信することで実現されています。 つまり、request.setAttribute()の情報は下地となるページを送り出した時に終わりとなるので、 各フレームの個別のページでは参照できません。
各フレームの個別のページで情報を見れるようにする最も簡単な方法は? requestの代わりにHttpSession.setAttribute()でセッションに格納することですね。

web.xmlのタグの順序早見表
DTDにはこのように書かれていますね。

<!ELEMENT web-app (icon?, display-name?, description?, distributable?,
context-param*, filter*, filter-mapping*, listener*, servlet*,
servlet-mapping*, session-config?, mime-mapping*, welcome-file-list?,
error-page*, taglib*, resource-env-ref*, resource-ref*, security-constraint*,
login-config?, security-role*, env-entry*, ejb-ref*,  ejb-local-ref*)>

Server Side Java Index Top

(first uploaded 2002/01/19 last updated 2009/01/04, URANO398)

楽天モバイル[UNLIMITが今なら1円] ECナビでポインと Yahoo 楽天 LINEがデータ消費ゼロで月額500円〜!


無料ホームページ 無料のクレジットカード 海外格安航空券 解約手数料0円【あしたでんき】 海外旅行保険が無料! 海外ホテル