- PR -

Tomcat5.0.28のエンコード設定についての質問

投稿者投稿内容
孤立状態
会議室デビュー日: 2005/03/31
投稿数: 19
投稿日時: 2005-04-01 14:41
度々、お世話になります。
当方、社内情報システムの人間で運用重視の環境でして、至らない事は重々承知して
おりますが、その辺のご理解をお願いいたします。

導入検討の事前調査で環境を整備しているのですが、どうしても上手くいかないので、
皆さんのお知恵を拝借させてください。

以前、質問した際、迅速かつ的確な指摘を受けたことに味をしめて、こんなドシロウトな
質問をして、大変申し訳ありません。
どうか孤立無援の『なんちゃって技術者』を助けてください。

*****************************************************************************
【状況】
Tomcat5にてDBからの検索結果を表示するテストプログラムを作成しましたが、
日本語部分の表示が出来ない。


環境と設定内容は以下の通りです。
【導入ソフト】
javaSDK 1.4.2.07
Tomcat 5.0.28
Eclipse 3.0.1
(Oracle 9i(9.2)) ojdbc14.jar

【設定内容】
---server.xml---------------------------------------------------------------
<GlobalNamingResources>
<Resource name="jdbc/[xxx Oracle Connect String xxx]" auth="Container"
type="javax.sql.DataSource"/>
<ResourceParams name="jdbc/[xxx Oracle Connect String xxx]">
<parameter>
<name>factory</name>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter>
<parameter>
<name>driverClassName</name>
<value>oracle.jdbc.driver.OracleDriver</value>
</parameter>
<parameter>
<name>url</name>
<value>jdbc:oracle:thin:@[Oracle IP Address]:1521:[Oracle sid]</value>
</parameter>
<parameter>
<name>username</name>
<value>[Oracle UserName]</value>
</parameter>
<parameter>
<name>password</name>
<value>[Oracle Password]</value>
</parameter>
<parameter>
<name>maxActive</name>
<value>20</value>
</parameter>
<parameter>
<name>maxIdle</name>
<value>2</value>
</parameter>
<parameter>
<name>maxWait</name>
<value>-1</value>
</parameter>
</ResourceParams>
</GlobalNamingResources>

---web.xml------------------------------------------------------------------
<?xml version="1.0"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
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"
version="2.4">
<servlet>
<servlet-name>test2</servlet-name>
<servlet-class>test2.jdbctest1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>test2</servlet-name>
<url-pattern>/test2</url-pattern>
</servlet-mapping>
<resource-ref>
<description>Oracle Datasource example</description>
<res-ref-name>jdbc/[xxx Oracle Connect String xxx]</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
</web-app>


---testsites1.xml(←コンテキストXML)----------------------------------------
<Context path="/testsites1" reloadable="false" docBase="C:\\\\Program Files\\\\eclipse\\\\workspace\\\\testsites1" workDir="C:\\\\Program Files\\\\eclipse\\\\workspace\\\\testsites1\\\\work" >
<Logger className="org.apache.catalina.logger.FileLogger" prefix="testsites1." suffix=".txt" timestamp="true"/>
<ResourceLink name="jdbc/[xxx Oracle Connect String xxx]" global="[xxx Oracle Connect String xxx]" type="javax.sql.DataSource"/>
</Context>

---JDBCの配置----------------------------------------------------------------
『[%CATALINA_HOME%]\\\\common\\\\lib』に『ojdbc14.jar』を配置

---ソースファイル-------------------------------------------------------------
package test2;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.naming.*;
import javax.sql.*;
import java.sql.*;

public class jdbctest1 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
Context initContext = new InitialContext();
Context envContext = (Context)initContext.lookup("java:comp/env");
DataSource ds = (DataSource)envContext.lookup("jdbc/wgs_nt0103_dbs1");
Connection con = ds.getConnection();
Statement smt = (Statement)con.createStatement();
ResultSet rs = (ResultSet)smt.executeQuery("select KNJNM from MTBL where ID_CODE = 'XXXXXX'");

response.getWriter().println("<html>");
response.getWriter().println("<head>");
response.getWriter().println("<meta name=Generator content='Microsoft Office HTML Filter 2.1'>");
response.getWriter().println("<meta http-equiv='Content-Type' pageEncoding='Shift_JIS' content='text/html; charset=Shift-JIS'>");
response.getWriter().println("</head>");
response.getWriter().println("<body>");
response.getWriter().println("検索結果を表示");
response.getWriter().println("<br>");

while(rs.next()){
String strValue = rs.getString("KNJNM");
response.getWriter().println(strValue.toString());
response.getWriter().println("<br>");
}

rs.close();
con.close();

response.getWriter().println("Are You Success ?");
response.getWriter().println("</body>");
response.getWriter().println("</html>");

} catch (NamingException e) {
// TODO 自動生成された catch ブロック
response.getWriter().println(e.toString());
} catch (SQLException e) {
// TODO 自動生成された catch ブロック
response.getWriter().println(e.toString());
}
}
}

【動作結果】
???????
???????
??????????????????????????????
??????????????????????????????
??????????????????????????????
??????????????????????????????
Are You Success ?

という具合に日本語部分が文字化けします。
Encodeの設定もWebサイトにあるものを参考にしてみたのですが、
うまくいきません。


当方の知識不足は重々認識しておりますが、何卒、ご教授していただきたいと共に
具体的な指摘をお願いいたします。


[ メッセージ編集済み 編集者: 孤立状態 編集日時 2005-04-01 14:42 ]
(株)ぽち
ぬし
会議室デビュー日: 2002/09/10
投稿数: 376
投稿日時: 2005-04-01 15:03
私はここ数年servletでhtmlを返すことをしていないので
かなり忘れぎみですが、HttpServletResponse#getWriter
のAPIドキュメントには以下が書いてあります。

引用:

文字データをクライアントに送り返すのに使用する PrintWriterオブジェクトを返します。 ここで適用される文字エンコーディングは setContentType(java.lang.String) メソッドで charset= の形式で指定したものです。 指定の文字エンコーディングに対応したPrintWriter 型のオブジェクトを取得するにはこのメソッドよりも 前 に setContentType(java.lang.String) メソッドが実行されていなければなりません。



何かヒントになれば。
孤立状態
会議室デビュー日: 2005/03/31
投稿数: 19
投稿日時: 2005-04-01 15:47
早速のご返事有難うございます。

『(株)ぽち』様、またもや迅速かつ的確なアドバイス有難うございます。

ソースの冒頭に以下の内容を追記したところうまくいきました。
【追加内容】
response.setContentType("text/html;charset=SJIS");

他のWEBサイトでは、server.xmlを編集する方法やら、
コンテキスト.xmlを編集し、[%CATERINA_HOME%]\\webapps\\servlets-examples\\WEB-INF\\classes\\filters
の内容を自身のアプリ配下にコピーしたり
私の解釈が間違っていなければ、Tomcatの設定で対応するような事が
書いてありました。確かに理屈から考えて、そういう機能があっても
おかしくないわけですが、またしても自分の知識の無さを露呈した
だけに終わりました。

その方面で調査してMake-Try-Destoroyを繰り返して、昨日から
パニックになっておりました。

『(株)ぽち』様、誠に有難うございます。
(株)ぽち
ぬし
会議室デビュー日: 2002/09/10
投稿数: 376
投稿日時: 2005-04-01 15:56
Tomcatはいままで幾度となくバージョンアップしています。

その都度、設定方法が変わったり、または便利になったり
など色々変化しますので、調べる際にはどのバージョンの
設定方法なのかをまずは確認することをオススメします。

ちなみにお調べになった設定方法の数々は間違った情報
ではないと思います。(あるかもしれないが・・)
ただ、ケースの違いと言うんですかね。
こういう時にはこういう設定、もしくは昔はこう設定
してた(今はもっと簡単)とか色々。

補足ですが、JSPを使用する場合は
%CATALINA_HOME%/conf/web.xmlにエンコード設定する所
があります。
孤立状態
会議室デビュー日: 2005/03/31
投稿数: 19
投稿日時: 2005-04-05 16:14
お世話になっております。
新規スレを立てるべきなのかもしれませんが、
前回からの続きなので、継続にします。お許しください。

前回の『(株)ぽち』様の指摘で、ServletのEncodeの問題は解決したのですが、
JSPで以下のエラーが発生しています。

【エラー内容】
HTTPステータス 500 -
--------------------------------------------------------------------------------
type 例外レポート
メッセージ
説明 The server encountered an internal error () that prevented it from fulfilling this request.
例外
org.apache.jasper.JasperException: ファイル/WEB-INF/web.xmlのXML解析エラー: (行 1, 列 43)
org.apache.jasper.xmlparser.ParserUtils.parseXMLDocument(ParserUtils.java:103)
org.apache.jasper.compiler.JspConfig.processWebDotXml(JspConfig.java:70)
org.apache.jasper.compiler.JspConfig.init(JspConfig.java:188)
org.apache.jasper.compiler.JspConfig.findJspProperty(JspConfig.java:240)
org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:160)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:470)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:451)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:439)
org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:511)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:295)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
原因
org.xml.sax.SAXParseException: Invalid encoding name "Shift-JIS".
org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
org.apache.xerces.util.ErrorHandlerWrapper.fatalError(Unknown Source)
org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
org.apache.xerces.impl.XMLEntityManager.createReader(Unknown Source)
org.apache.xerces.impl.XMLEntityManager$ScannedEntity.setReader(Unknown Source)
org.apache.xerces.impl.XMLEntityScanner.setEncoding(Unknown Source)
org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanXMLDeclOrTextDecl(Unknown Source)
org.apache.xerces.impl.XMLDocumentScannerImpl$XMLDeclDispatcher.dispatch(Unknown Source)
org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
org.apache.xerces.parsers.DOMParser.parse(Unknown Source)
org.apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown Source)
javax.xml.parsers.DocumentBuilder.parse(Unknown Source)
org.apache.jasper.xmlparser.ParserUtils.parseXMLDocument(ParserUtils.java:98)
org.apache.jasper.compiler.JspConfig.processWebDotXml(JspConfig.java:70)
org.apache.jasper.compiler.JspConfig.init(JspConfig.java:188)
org.apache.jasper.compiler.JspConfig.findJspProperty(JspConfig.java:240)
org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:160)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:470)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:451)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:439)
org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:511)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:295)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
--------------------------------------------------------------------------------
【ソース】
<html>
<body>
<%=new java.util.Date() %>
<%=new java.util.Date() %>
</body>
</html>
--------------------------------------------------------------------------------
ソースは至って簡単な日付・時刻を2行表示するだけのもので、
以前はコンパイルは通っていましたし、ブラウザ上で表示されて
いました。

エラーから判断するにEncode設定のエラーとも取れるのですが、
前回からEclipseの設定変更した部分はどうも関連しないような
気がします。

また、『(株)ぽち』様が前回指摘した
『補足ですが、JSPを使用する場合は
 %CATALINA_HOME%/conf/web.xmlにエンコード設定する所
 があります。』
とは、この事を見越して指摘していた頂いたものなのでしょうか?

あまりにも不甲斐ない自分に挫折しそうになっている私を助けてください。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2005-04-05 16:43
とにかく落ち着いてください。スタックトレースに出ている通りです。

・web.xmlの記述が間違っている
・Shift-JISというエンコーディングの設定が不正である

正しくは、Shift_JISです。
(株)ぽち
ぬし
会議室デビュー日: 2002/09/10
投稿数: 376
投稿日時: 2005-04-05 18:43
引用:

また、『(株)ぽち』様が前回指摘した
『補足ですが、JSPを使用する場合は
 %CATALINA_HOME%/conf/web.xmlにエンコード設定する所
 があります。』
とは、この事を見越して指摘していた頂いたものなのでしょうか?

あまりにも不甲斐ない自分に挫折しそうになっている私を助けてください。



違います。

今回の問題はukさま指摘の通り、ただ単にxmlのエンコード指定が間違っているだけでしょう。
私が補足したのは

servletでなくjspで画面を構成した場合の文字コード指定方法です。
孤立状態
会議室デビュー日: 2005/03/31
投稿数: 19
投稿日時: 2005-04-06 09:42
『uk』様有難うございます。
うまくいきました。
全くお恥ずかしい限りです。

『(株)ぽち』様、ご指摘有難うございます。

早速、『%CATALINA_HOME%conf\\web.xml』を以下のようにしましたが、
またも問題が出ています。
------------------------------------------------------------------------------
【現象】
JSPの画面表示の日本語が文字化けする。

【web.xml】
  (一部抜粋)
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
<init-param>
<param-name>fork</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>xpoweredBy</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>javaEncoding</param-name>
<param-value>Shift_JIS</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>

【各アプリケーションのweb.xml】
<?xml version="1.0" encoding='Shift_JIS'?>

<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
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"
version="2.4">
<servlet>
<servlet-name>test1</servlet-name>
<servlet-class>test1.servlettest1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>test1</servlet-name>
<url-pattern>/test1</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>test2</servlet-name>
<servlet-class>test2.jdbctest1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>test2</servlet-name>
<url-pattern>/test2</url-pattern>
</servlet-mapping>
<!-- Oracle DB 接続 1 -->
<resource-ref>
<description>Oracle Datasource example</description>
<res-ref-name>jdbc/connect2</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
<!-- Oracle DB 接続 1 -->
<resource-ref>
<description>Oracle Datasource example</description>
<res-ref-name>jdbc/connect2</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
</web-app>

【JSP】
<html>
<head>
<meta http-equiv=Content-Type content="text/html; charset=Shift_JIS">

   〜(中略)〜
<td colspan=5 class=box_green_05_txt9_bc1>担当営業</td>

   〜(以下省略)〜
------------------------------------------------------------------------------
上記、JSPの日本語部分が見事に文字化けします。

当方の知識不足は『痛いほど』認識しておりますが、
何卒、ご指導くださいますようお願いいたします。

スキルアップ/キャリアアップ(JOB@IT)