読者です 読者をやめる 読者になる 読者になる

yukungのブログ

yukungの技術ブログ兼駄文置き場 

今さらながらStruts+Tomcatの環境周りまとめ

java memo

研修の講師をやることになり、サンプルアプリを作ることになったので、Struts+Tomcatでアプリを作ろうとしたら、開発環境構築で大分躓いてしまいました。久しぶりでほとんど覚えてなかったのでメモっておきます。

使用したStrutsのバージョンは1.2.9、Tomcatのバージョンは5.5です。*1

Tomcatと各JavaEE仕様のバージョンの対応

JavaEE Servlet JSP EJB JSF 備考
Tomcat4.x 1.3 2.3 1.2 2.0
Tomcat5.x 1.4 2.4 2.0 2.1
Tomcat6.x 5.0 2.5 2.1 3.0 1.2 JAX-WS2.0、JAXB2.0、JPA1.0、JSFJSTLの共存が可能
Tomcat7.x 6.0 3.0 2.2/EL2.2 3.1 2.0 JAX-RSCDIなどが追加、JAX-WS2.2、JAXB2.2、JPA2.0

JSTL/EL式とTomcatとの関係

JSTL EL式 備考
Tomcat4.x 1.0 ※EL式使うときはJSTL1.0が必須
Tomcat5.X 1.1 JSTLなくてもEL式は使用可能(JSP2.0の標準仕様、Tomcatがcommons-el.jarを含んでいる)
Tomcat6.x 1.1 1.2も使おうと思えば使える
Tomcat7.x 1.2 JSTL 1.2 には JSP 2.1 コンテナーが必要なこと、またJSTL 1.2 以降では JSTLJava EE の一部を構成することに注意*2

その他Tomcat4.xとTomcat5.x以降で気をつけるべきこと

Tomcat4.x
  • web.xmlの宣言がDTD(Servlet2.3)
  • EL式をStrutsカスタムタグ内部で使いたいときは、Struts-ELタグライブラリを別途用意する
  • tablibディレクティブのuri属性の値はhttp://java.sun.com/jstl/core
  • <%@page isELIgnored="false" %>が必要
  • web.xml要素は、単独でそのまま記述
Tomcat5.x以降
  • web.xmlの宣言がXMLスキーマ(Servlet2.4)
    • これを忘れるとEL式が評価されず${hoge}とかそのまま出力される
  • Strutsカスタムタグ内部にEL式がそのまま使える
  • pageディレクティブのisELIgnoredは不要(デフォルトでELが使える)
  • taglibディレクティブのuri属性の値はhttp://java.sun.com/jsp/jstl/core
  • web.xml要素は、の子要素として記述

JSTLのtaglib宣言について

実はweb.xml内のでの宣言は不要です。

standard.jarの中のMETA-INFフォルダの中にTLDファイルが同梱されており、そのTLDファイルに要素と属性uriが記述されています。サーブレットコンテナはWEB-INF/libの中にjarが入っていれば、jarの中までTLDファイルを探しに行くため、以下は不要となります。

  • WEB-INF/lib内にTLDファイルの配置
  • web.xml内ので、JSTLのTLDファイルのパス記述

JSPでのpageディレクティブ宣言の共通化

JSPのヘッダーに記述するJSTLのprefix設定は、下記の方法で共通化しておくとよい。

  • 以下のようなJSPを作成しておく
// taglib.jsp
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
  • web.xml要素の子要素である要素内で、要素に上記のJSPのパスを指定
    • コンテキストルートからの相対パスがよろしいかと
<jsp-property-group>
	<url-pattern>*.jsp</url-pattern>
	<el-ignored>false</el-ignored>
	<page-encoding>UTF-8</page-encoding>
	<scripting-invalid>false</scripting-invalid>
	<include-prelude>/pages/taglibs.jsp</include-prelude>
</jsp-property-group>

2012/1/19 追記

  • Tomcatバージョン対応にTomcat7.x と備考欄 を追加
  • JSTLとTomcat7.x の記述を追加
  • バージョン対応リンク集とその他参考サイトを追加

*1:大分レガシーですが、これがSIerクオリティ

*2:http://www.ibm.com/developerworks/jp/java/library/j-jstlsql/