[Seasar-user:10272] Re: [Teeda]JSPのcharsetが無視される

[E-MAIL ADDRESS DELETED] [E-MAIL ADDRESS DELETED]
2007年 9月 3日 (月) 16:18:25 JST


お世話になります。田口です。

表題の件、原因が判明しましたのでご報告と、
再度質問があります。ご回答をよろしくお願いいたします。

1.レスポンスがUTF-8となった原因
JSPでは@pageでWindows-31Jを明示的に指定しているが
viewタグの処理の中でresponse.setContentTypeしているため
JSPの指定が無視されている。

2.viewタグの処理でUTF-8がsetContentTypeされた原因
viewTagでは、リクエストからgetCharacterEncodingを
取得し、setContentTypeで設定している。

3.リクエストのCharacterEncodingがUTF-8となった原因
フィルターの処理でCharacterEncodingを"Windows-31J"と
設定しているが、ServletExternalContextUtil.setCharacterEncoding(ServletRequest)
でUTF-8に上書きされている

4.ServletExternalContextUtilでUTF-8が設定された原因
ServletExternalContextUtil.setCharacterEncodingでは下記のように動作している

getEncodingFromContentType ==> null
getEncodingFromSession ==> UTF-8

5.getEncodingFromSession がUTF-8となった原因
直前のajaxのリクエストが
FacesServlet -> AjaxServlet(フォワード)
で処理されていてFacesServletの
ViewHandlerImpl.storeResponseCharacterEncoding(ExternalContext)
のなかでUTF-8が設定されている

6.ajaxのリクエストがFacesServletで処理される原因
teedaのJSPの中でajax(teeda-ajax)を利用しており、ajaxのリクエストURL中に
facesが含まれるため、web.xmlの
	<servlet-mapping>
		<servlet-name>Faces Servlet</servlet-name>
		<url-pattern>/faces/*</url-pattern>
	</servlet-mapping>
にマッチしたため。

■質問内容
上記の現象をなんと回避したいのですがよい方法はないでしょうか。
6のurl-patternでajaxを除外できればと考えましたが、記述の仕方が
判りませんでした。
ちなみにurl-patternを*.jspとすると、HttpServletRequest.getPathInfoの結果にfaces
が含まれてしまい、無限ループしてしまいました。

以上、よろしくお願いいたします。


>お世話になります。田口です。
>
>JSPでTeeda-ajax-1.0.7、Teeda-core-1.0.7を使い開発しています。
>
>JSPのPageディレクティブに
><@ page language="java" contentType="text/html; charset=Windows-31J" %>
>と指定していますが、
>Ajax通信後に表示されるページの
>レスポンスデータを見ると、
>UTF-8となっています。
>(以降もUTF-8のまま)
>
>Ajax通信後には、contentTypeのcharsetに従い、
>Windows-31Jとなってほしいのですが。
>
>原因と対策方法をご教示ください。
>以上、よろしくお願いいたします。
>



Seasar-user メーリングリストの案内