4. Q&A

Tomcatからの移行時によく起きる問題やTomcatからの移行以外にもよくある質問に対するQ&Aをまとめました。

4.1. Webアプリケーションの実行エラーに関するQ&A

Q1 Webアプリケーションを実行するとClassCastExceptionが発生するのですが、どのような原因が考えられますか?

A1 対象となるクラスのロードが正しく行われていない可能性があります。nec-web.xmlの設定を変更して、クラスのロード処理を変えて、アプリケーションの動作を確認してください。以下の例を参考に"delegate=false"を設定したnec-web.xmlを追加してください。
【nec-web.xml】

<?xml version="1.0" encoding="UTF-8"?>
<nec-web-app xmlns="http://java.sun.com/xml/ns/j2ee">
  <context-root>context_name</context-root>
  <class-loader delegate="false"/>
</nec-web-app>

nec-web.xmlの詳細は[ 移行作業 > クラスロード優先順位の設定 ]を参照してください。

Q2 Webアプリケーションを実行するとセキュリティ例外が発生するのですが、どのような原因が考えられますか?

A2 セキュリティポリシーの追加が必要です。本資料の[ 移行作業 > セキュリティポリシーの設定 ]をご覧ください。

Q3 Webアプリケーションからのログが出力されないのですが、どのような原因が考えられますか?

A3 log4jの設定を変更してください。本資料の[ 移行作業 > log4jの設定 ]をご覧ください。

Q4 フィルタがうまく動作しないのですが、どのような原因が考えられますか?

A4 フィルタはServlet2.3仕様から追加された仕組みです。WebOTX V9およびV10.1, V10.2 ではServlet3.0に準拠しているため、web.xml 先頭の version を 2.3〜3.0のいずれかに変更してください。変更後のイメージは次のようになります。

<?xml version="1.0" encoding="Shift_JIS"?>
 <web-app xmlns="http://java.sun.com/xml/ns/j2ee" version="2.4" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

Q5 getParameterで取得したデータが文字化けするのですが、どのような原因が考えられますか?

A5 Tomcat 7.xでは、URIのエンコードの指定のために、server.xmlでURIEncoding と useBodyEncodingForURI が指定できますが、WebOTX では、server.network-config.protocols.protocol.http-listener.http.uri-encoding と server.network-config.protocols.protocol.http-listener.http.use-body-encoding-for-uri で指定します。
それぞれ、運用管理コマンド(otxadminコマンド)を利用して、次のように指定します。

otxadmin> set server.network-config.protocols.protocol.http-listener.http.uri-encoding=Windows-31J

otxadmin> set server.network-config.protocols.protocol.http-listener.http.use-body-encoding-for-uri=true

Q6 WebブラウザでJSPの出力を参照したとき、機種依存文字(鰍ネど)が文字化けするのですが、どのような原因が考えられますか?

A6 Web アプリケーションの表示で文字化けが発生する場合、次のステップで原因の調査と対処をしてくださ い。

  1. Servlet で、Content-Type による charset を正しく指定(出力)しているか確認します。
    Web ブラウザが表示する文字コードを判断するのに Content-Type を使用します。 Servlet が出力する文字のコードを Content-Type による charset で正しく指定する必要があります。 機種依存文字などを出力する際には、charset に”Windows-31J”を指定します。
  2. JSP で、page ディレクティブで、contentType を正しく指定しているか確認します。
    Servlet と同様に、出力する文字コードを contentType で指定します。 Servlet と同様、機種依存文字などを出力する際には、charset に“Windows-31J”を指定します。
  3. JSP で、page ディレクティブで pageEncoding を正しく指定しているかを確認します。
    pageEncoding は、JSP 自体がどのコードで記述されているかを示します。 個々のJSP では pageEncoding を指定せずに、まとめて指定することもできます。 web.xml で次のように<page-encoding> を指定します。
    【web.xml】
    <web-app  ....
      <jsp-config>
        <jsp-property-group>
          ....
          <page-encoding>Windows-31J</page-encoding>
        </jsp-property-group>
      </jsp-config>
      ....
      <servlet>
      ....
      </servlet>
    </web-app>
    

また、WebOTX V8からは文字コードを強制的に指定することができるようになりました。以下に、Servlet/JSPへの入出力、エンコーディングを強制設定する機能について説明します。

  1. HTTPリクエスト

    エンコーディングを指定してリクエストのデータをどの文字コードとしてJavaで扱うUnicodeにデコードするか、 の設定があります。
    詳細は HTTPリクエスト を参照してください。

  2. HTTPレスポンス

    レスポンス出力時、Javaで扱うUnicodeをどのエンコーディングを指定して、意図する文字コードにエンコード(レスポンス出力)するか の設定があります。
    詳細は HTTPレスポンス を参照してください。

  3. jspファイルのコンパイル

    jspファイルがどの文字コードで記述されているか(どのエンコーディングを指定してJavaで扱うUnicodeにデコードするか) の設定があります。
    詳細は jspファイルのコンパイル を参照してください。

  4. jspファイルのレスポンス

    JSPを実行した際、Javaで扱うUnicodeをどのエンコーディングを指定して、意図する文字コードにエンコード(レスポンス出力)するか の設定があります。
    詳細は jspファイルのレスポンス を参照してください。

  5. ファイル入力/出力

    ファイルにアクセスするInputStream、OutputStreamを作成する際ユーザが文字コードを指定します。WebOTX独自の設定機能は存在しませんがJava VMオプション(-Dfile.encoding=<MS932等>)指定によりデフォルトキャラセットを変更可能

  6. データベースアクセス

    JDBCドライバに依存します。


※各設定で指定した文字コードはJavaのコンバータにより処理されます。

HTTPリクエスト

リクエストのデータをどの文字コードとして扱うかは通常、以下の処理順で決定されます。(ここで決定された文字コードはリクエストからデータを取得する際のInputStreamに適用されます。)

  1. Filter等でリクエストデータを参照する前に、ServletRequest.setCharcterEncoding()によりエンコーディングを設定した場合、そのエンコーディングでリクエストデータをデコードします。

  2. HTTPリクエストのヘッダ情報にcharset指定がある場合、そのエンコーディングでリクエストデータをデコードします。
    "Content-Type: application/x-www-form-urlencoded; charset=windows-31j" 等

  3. HTTPリクエストのヘッダ情報にcharset指定が無い場合、nec-web.xmlファイルに<locale-charset-info>要素を設定し、warファイルに予めアーカイブすることでリクエストデータのデコードに用いるデフォルトのエンコーディングを指定することができます。
    ※nec-web.xmlの例
    <locale-charset-info default-locale="ja">
     <locale-charset-map locale="ja" charset="windows-31j" />
     <parameter-encoding form-hint-field="penc" />
    </locale-charset-info>
    

    3-1) リクエストのパラメータ中に該当データ(この場合パラメータ名が(pencのデータpenc=x-IBM943C 等)があればそれをエンコーディングとして使用します。

    3-2) 3-1)が無い場合、リクエスト中のAccept-Language: ja、無ければnec-web.xmlの<locale-charset-info default-locale="ja">を取得します。<locale-charset-map>よりlocaleが一致するmapを検索し、そのcharsetでリクエストパラメータをUnicodeに変換します。

  4. 上記のいずれも無い場合、リクエストデータはデフォルトのエンコーディング"ISO-8859-1"でデコードされます。
HTTPレスポンス

レスポンスにデータをどの文字コードとして出力するかは通常、以下の処理順で決定されます。(ここで決定された文字コードはHTTPレスポンスのヘッダ情報(Content-Typeのcharset)とデータを出力する際のOutputStreamに適用されます)

  1. Servlet2.4の仕様でロケールおよび文字エンコードのマッピングをweb.xmlに指定できます。javax.servlet.ServletResponseのsetLocale()メソッドが呼ばれた時に参照され、指定したロケールに対応する文字コードが設定されます。
    ※web.xmlへの設定例
    <locale-encoding-mapping-list>
     <locale-encoding-mapping>
      <locale>ja</locale>
      <encoding>windows-31j</encoding>
     </locale-encoding-mapping>
     <locale-encoding-mapping>
      <locale>ko_KR</locale>
      <encoding>EUC-KR</encoding>
     </locale-encoding-mapping>
    </locale-encoding-mapping-list>
    

  2. ServletResponse.setContentType()にてcharsetが指定された場合、そのエンコーディングでエンコード(レスポンス出力)します。

  3. 上記の指定が無い場合、デフォルトのエンコーディング"ISO-8859-1"でエンコード(レスポンス出力)します。
jspファイルのコンパイル

jspファイルがどの文字コードで記述されているか(読み込み時どのエンコーディングでデコードするか)は通常、以下の処理で決定されます。(ここで決定されたエンコーディングはjspファイルを読み込む際のInputStremに適用されます)

  1. jspにpageEncoding指定が記述されている場合、そのエンコーディングでjspファイルをデコード(読み込み)します。

  2. jspにpageEncoding指定が無くcontentType指定(charset指定)が記述されている場合、そのエンコーディングでjspファイルをデコード(読み込み)します。

  3. JSP2.0の仕様でjspのエンコーディングをweb.xmlに指定できます。contentType指定(charset指定)が無い場合、web.xmlで指定したエンコーディングが適用されます。
    ※web.xmlへの設定例
    <jsp-config>
     <jsp-property-group>
      <uri-pattern>/jsp/*</uri-pattern>
      <page-encoding>Shift_JIS</page-encoding>
     </jsp-property-group>
    </jsp-config>
    

  4. pageEncoding指定、contentType指定が共に無い、web.xmlの指定も無い場合、otxadminコマンドにてデフォルトのエンコーディングを指定することができます。(要ドメイン再起動)
    otxadmin> set server.web-container.property.default-encoding=Shift_JIS
    
  5. 上記のいずれの指定も無い場合、jspファイルはデフォルトのエンコーディング"ISO-8859-1"でデコード(読み込み)されます。
    ※default-web.xmlのjavaEncodingはjsp->servletで変換したservletのjavaファイルをエンコード(出力)する際のエンコーディング指定します。

※実際のファイルの文字コードが、複数あり、個別のページでエンコーディングを指定している場合、priorityJspInEncodingを指定して特定の文字コードでエンコードするように設定すると、一部のページで文字化けが発生します。この場合は、該当のページのファイルの文字コード修正してください。

jspファイルのレスポンス

出力するレスポンスデータはどのエンコーディングエンコード(出力)するかは通常、以下の処理で決定されます。(ここで決定されたエンコーディングはレスポンスのヘッダ情報(Content-Typeのcharset)と出力する際OutputStreamに適用されます)

  1. jspにcontentType指定(charset指定)が記述されている場合、そのエンコーディングでレスポンスデータをエンコード(出力)します。

  2. JSP2.0の仕様でjspのエンコーディングをweb.xmlに指定できます。contentType指定(charset指定)が無い場合、web.xmlで指定したエンコーディングが適用されます。

    ※web.xmlへの設定例
    <jsp-config>
     <jsp-property-group>
      <uri-pattern>/jsp/*</uri-pattern>
      <page-encoding>Shift_JIS</page-encoding>
     </jsp-property-group>
    </jsp-config>
    

  3. contentType指定、web.xmlの指定共に無い場合、otxadminコマンドにてデフォルトのエンコーディングを指定することができます。(要ドメイン再起動)

    otxadmin> set server.web-container.property.default-encoding=Shift_JIS
    
  4. 上記のいずれの指定も無い場合、jspのレスポンスはデフォルトのエンコーディング"ISO-8859-1"でエンコード出力されます。

    ※1 この機能の指定方法は2パターンあります、全Webアプリケーション共通の指定と、Webアプリケーション毎に指定するものです。それぞれdomain.xmlのweb-container要素のpropertyとwarファイルにアーカイブするnec-web.xmlに定義されます。

    全アプリケーション共通の設定、Webアプリケーション毎の設定の両方が指定された場合、Webアプリケーション毎の設定が優先されます。nec-web.xmlに指定する場合は、エンコーディングを1つ設定する指定か、localeとエンコーディングをマッピングさせてエンコーディングを決定する指定の2パターンを可能とします。両方が指定された場合、localeとエンコーディングのマッピング指定が優先されます。以下、各設定例を記述します。

    =====設定例=====
    1. レスポンスエンコーディングの優先設定
      • Webアプリケーション毎に有効なLocaleに対応したエンコーディング指定のnec-web.xmlへの記述(a1)
        例)<nec-web-app>
           <property name="priorityResponseEncoding-map:ja" value="EUC_JP" />
          </nec-web-app>

        ※ "priorityResponseEncoding"に"-map"を付加し、":"で区切ってLocaleを記述します LocaleはHttpResponseのgetLocale()で取得できる文字列と同じである必要があります。

      • Webアプリケーション毎に有効なnec-web.xmlへの記述 (a2)
        例)<nec-web-app>
           <property name="priorityResponseEncoding" value="EUC_JP" />
          </nec-web-app>

      • 全Webアプリケーションに有効なdomain.xmlへの指定 (b)
        例) otxadmin> set server.web-container.property.priority-response-encoding=EUC_JP
        ※要ドメイン再起動

    2. JSPファイル読み込みエンコーディングの優先指定
      • Webアプリケーション毎に有効なnec-web.xmlへの記述(c)
        例)<nec-web-app>
           <jsp-config />
            <property name="priorityJspInEncoding" value="EUC_JP" />
           </jsp-config>
          </nec-web-app>

      • 全Webアプリケーションに有効なdomain.xmlへの指定(d)
        例) otxadmin> set server.web-container.property.priority-jsp-in-encoding=EUC_JP
        ※要ドメイン再起動
    3. JSPファイル出力時エンコーディングの優先指定
      JSP出力時とはコンパイルしたjavaソースでHttpServletResponseにsetContentType()する際に指定する"charset=XXX"部分に相当します。
      • Webアプリケーション毎に有効なLocaleに対応したエンコーディング指定のnec-web.xmlへの記述(e1)
        例)<nec-web-app>
           <jsp-config />
            <property name="priorityJspOutEncoding-map:ja" value="EUC_JP" />
           </jsp-config>
          </nec-web-app>

        ※ "priorityJspOutEncoding"に"-map"を付加し、":"で区切ってLocaleを記述します。
        LocaleはHttpResponseのgetLocale()で取得できる文字列と同じである必要があります。

      • Webアプリケーション毎に有効なnec-web.xmlへの記述 (e2)
        例)<nec-web-app>
           <jsp-config />
            <property name="priorityJspOutEncoding" value="EUC_JP" />
           </jsp-config>
          </nec-web-app>

      • 全Webアプリケーションに有効なdomain.xmlへの指定 (f)
        例) otxadmin> set server.web-container.property.priority-jsp-out-encoding=EUC_JP
        ※要ドメイン再起動

Q7 Tomcatからの移行時にJSPのコンパイルエラーになるのですが、原因は何が考えられるでしょうか?

A7 Java 1.4 で記述されたJSPをコンパイルした際にエラーが発生します。WebOTX V10はデフォルトでは、Java 8 (Java1.8)としてコンパイルするため、この問題が発生します。次の例のように、コンパイルする際に使用するJavaの バージョンを指定してください。<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>の定義に compilerTargetVM と compilerSourceVM のパラメータで 1.4 を指定する定義を追加し、ドメインを再起動してください。

対象ファイル:<WebOTXインストールディレクトリ>/domains/domain1/config/default-web.xml
<servlet>
 <servlet-name>jsp</servlet-name>
 <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
 <init-param>
  <param-name>compilerTargetVM</param-name>
  <param-value>1.4</param-value>
 </init-param>
 <init-param>
  <param-name>compilerSourceVM</param-name>
  <param-value>1.4<param-value>
 </init-param>
</servlet>


エラー原因が上記ではない場合は、APでデータ型を明示的に指定することによりエラーを回避できる可能性があります。
AP修正例)
xxxxxxxx a = (xxxxxxxx)form.getViewList().get(idx);
              ↓
xxxxxxxx a = (xxxxxxxx)form.getViewList().get(idx.intValue());

Q8 Servletを実行する際にURLを"/<コンテキスト名>/servlet/サーブレットのクラス名"というように実行するとHTTP404エラーとなるのですが、設定により直接Servletを実行する方法はありますか?

A8 Tomcat4.1.12以降をベースとする WebOTX V6以降では、servlet-mapping の定義が無いサーブレットへのアクセスはセキュリティの観点からデフォルトでは無効になっています。また、WebOTX V8からは、この機能がデフォルトで定義されていません。

WebOTX V6以降で上記のアクセスを許可するにはアプリケーションのweb.xmlに以下の定義を追加してください。 対象ファイル:web.xml もしくは <WebOTXインストールディレクトリ>/domains/domain1/config/default-web.xml

<servlet>
 <servlet-name>invoker</servlet-name>
 <servlet-class>org.apache.catalina.servlets.InvokerServlet</servlet-class>
 <init-param>
  <param-name>debug</param-name>
  <param-value>0</param-value>
 </init-param>
 <load-on-startup>2</load-on-startup>
</servlet>


<servlet-mapping>
 <servlet-name>invoker</servlet-name>
 <url-pattern>/servlet/*</url-pattern>
</servlet-mapping>

[ 移行作業 > Tomcat 5.5と Tomcat 6.0の差異 ] も参考にしてください。


Q9 ServletのJavaプログラムから、ネットワークドライブにあるファイルを開きたいのですが、どのようにしたらよろしいでしょうか?

A9 ネットワークドライブは以下の条件で利用可能となります。
WebOTXがサービス起動の場合は、サービスのログオンユーザの設定と、共有フォルダへのログオンユーザのアクセス権が必要です。また、APでの共有フォルダの指定は、UNC表記(\\hostname\共有フォルダ名)で指定してください。
※ D:\xxxxx\xxxx の表記では、アクセスできません。

Q10 シンボリックリンクを使用したいのですが、どのようにしたらよろしいでしょうか?

A10 例) WebAPP1というWebアプリケーション内からリンクする例です

Q11 Webサーバプラグインのログローテート機能を利用したいのですが、どのようにしたらよろしいでしょうか?

A11 以下の例を参考にファイルを編集し、Webサーバを再起動してください。

対象ファイル:<WebOTXインストールディレクトリ>/domains/domain1/config/WebCont/*.conf

JkLogFile "D:/WebOTX/domains/domain1/logs/web/mod_jk-24.log"
                  ↓
JkLogFile "|D:/WebOTX/WebServer24/bin/rotatelogs.exe D:/WebOTX/domains/domain1/logs/web/mod_jk-24.log 86400"

一日(86400秒)毎にログローテートされます。
※ *.confファイルはデフォルト名のままである場合、ドメイン再起動で上書きされます。必要に応じてファイル名をリネームしてください。

詳細および、その他のWebサーバについては以下を参照してください。

4.2. Webアプリケーションの開発に関するQ&A

Q1 servletをコンパイルするときに、WebOTXではどのjarを利用するのでしょうか?

A1 ${AS_INSTALL}/lib/javaee.jar を利用してください。

Q2 Webアプリケーションを自動的に配備するには、どうすれば良いのでしょうか?

A2 Tomcatでは、webappsディレクトリにWARファイルを置くと自動的に配備されますが、WebOTXでは ${ INSTANCE_ROOT}/autodeploy ディレクトリにWARファイルを格納することで、自動的に配備できます。

Q3 context.xml にWebアプリケーションが利用するパラメータを記述しているのですが、WebOTX ではどこに記述すればよいのでしょうか?

A3 WebOTX には context.xml は存在しません。web.xml に記述してください。

4.3. 環境設定、チューニングに関するQ&A

Q1 WebOTXでJavaVMのメモリ量を指定するには、どうすれば良いのでしょうか?

A1 Tomcatでは、起動用のファイルでJavaVMのメモリ量を指定しますが、WebOTXでは運用管理コマンド(otxadmin) で指定します。

【割り当てメモリの最大値を 1024 MB にする例】

otxadmin> create-jvm-options --user <ユーザ名> --password <パスワード> --host <ホスト名> --port <管理ポート> -Xmx1024m:

詳細については、WebOTXマニュアル [ 構築・運用 > チューニング > APサーバ > リソースチューニング ] をご覧ください。

Q2 Apacheと連携するときの同時接続(スレッド)数の設定は、どうすれば良いのでしょうか?

A2 Tomcatでは server.xml を編集して設定しますが、WebOTXでは運用管理コマンド(otxadmin) で指定します。

【同時に処理できるリクエストの数を拡大する例】

otxadmin> set --user <ユーザ名> --password <パスワード> --host <ホスト名> --port <管理ポート> server.network-config.network-listeners.network-listener.<リスナID>.max-processors=<最大数>

詳細については、WebOTXマニュアル [ 構築・運用 > チューニング > Webコンテナ > プロセッサ数 > 最大プロセッサ数 ] をご覧ください。

Q3 JDBCデータソースの設定は、どうすれば良いのでしょうか?

A3 Tomcatでは server.xml を編集して設定しますが、WebOTXでの設定方法は本資料の JDBCデータソースの設定をご覧ください。

Q4 1台のサーバで複数のWebコンテナを起動するには、どうすれば良いのでしょうか?

A4 Tomcatでは、Tomcatのディレクトリをコピーして、同じマシンで複数のTomcatを起動しますが、WebOTXでは複数のドメインを作成することで複数のWebコンテナを起動することができます。

Q5 Tomcatからの移行時に対応する環境設定を教えてください。

A5 環境設定の対応は以下となっています。

※環境変数の詳細については、WebOTXマニュアル [ 構築・運用 > 環境変数・JDK・ホスト名の設定変更 > システム環境変数 ] をご覧ください。

4.4. Webアプリケーションのリソースへのアクセス制御に関するQ&A

Q1 <security-constraint>要素でWebアプリケーションのリソースへのアクセス制御を実施していますが、特定のHTTPメソッドでは認証なしでアクセスできてしまいます。ガードする方法はありませんか?

A1 「セキュアシステム構築ガイド > WebOTXを利用する場合のセキュリティ対策の設定 > アプリケーション > 認証・アクセス制御・権限管理 > Webアプリケーションのリソースへのアクセス制御」をご覧ください。