JSPのエンコーディング

著者
Damian
Terlecki
2分間の読書
JEE

JSPテクノロジーで構築されたアプリケーションがある場合、通常、ターゲットサーバーはサーブレットコンテナを実装する単純なサーバー、 例えばTomcatになります。アプリケーションで非標準のダイアクリティカルマーク、ウムラウトなどを表示する場合、 それらが正しく表示されるか検証する価値があります。エンコーディングを正確に指定しないと、サーバーはJSPテンプレートのディレクティブを異なる方法で扱う可能性があります。

JSPでの文字エンコーディングの問題を示す画像

エンコーディング

JSPの場合、エンコーディングはpageディレクティブの属性を介して制御されます。

<%@ page language="java" pageEncoding="UTF-8" contentType="text/html; UTF-8"%>
  • pageEncoding – 翻訳時にページのエンコーディングを設定し、contentTypeがない場合はサーバーの応答時にも設定します。
  • contentType – サーバーの応答時にエンコーディングを設定します。

拡張子によって、これらのパラメータのデフォルト値は異なる場合があります。

  • *.jsppageEncoding="ISO-8859-1" contentType="text/html; ISO-8859-1"
  • *.jspxpageEncoding="UTF-8" contentType="text/xml; UTF-8" または pageEncoding="UTF-16" contentType="text/xml; UTF-16"

さらに、ページをインポートするには3つの方法があります。

  • 翻訳時に考慮されるincludeディレクティブを介して:<%@ include file="page.jsp" %>
  • 応答生成時にincludeアクション要素を介して:<jsp:include page="page.jsp" />
  • または、応答生成時にJSTLタグでページをインポートする:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<c:import url="page.jsp" charEncoding="UTF-8"/>

タイミング(翻訳/応答)と選択された(またはされていない)文字エンコーディングに基づいて、さまざまな状況でさまざまな問題が発生する可能性があります。 各ページ(インクルードされるページも含む)にpageEncodingcontentTypeパラメータを追加し、 インポート時のcharEncodingも忘れないようにすることをお勧めします。

テスト

テスト用のプレイグラウンドを作成するには、spring JSP demoをお勧めします。 hello.jspを置き換えて、エンコーディングパラメータをいじるためにサンプルのJSPテンプレートを使用できます。

<%@ page pageEncoding="UTF-8" contentType="text/html; UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>UTF-8 Test</title>
</head>
<body>
    <h1>Main page:</h1>
    <h3>dynamic: ${name}</h3>
    <h3>static: Heizölrückstoßabdämpfung</h3>
    
    <h1>Directive include:</h1>
    <%@ include file="page.jsp" %>
    
    <h1>JSP include:</h1>
    <jsp:include page="page.jsp"/>
    
    <h1>Import:</h1>
    <c:import url="page.jsp" charEncoding="UTF-8"/>
</body>
</html>

page.jsp:

<%@ page pageEncoding="UTF-8" contentType="text/html; UTF-8" %>
<h3>dynamic: ${name}</h3>
<h3>static: Heizölrückstoßabdämpfung</h3>

JSTLの依存関係を追加し、非組み込みサーバーにデプロイする場合は、パッケージングをWARに変更します。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <packaging>war</packaging>
    <!--...-->

    <dependencies>
        <!--...-->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
    </dependencies>
</project>

次に、サーバーにデプロイするか、Mavenラッパーで実行します:./mvnw clean spring-boot:runそしてhttp://localhost:8080/?name=Heizölrückstoßabdämpfungを開きます。

興味深いことに、Tomcat(9)とWebLogic(12/14)は、特定のエンコーディングがない場合、わずかに異なる動作をします。 EL構文を使用してBean属性を参照する場合、例えば${utf8Variable}、TomcatはURLインポート中に変数値のエンコーディングに問題がないようですが、 WebLogicはそうではありません。