- PR -

JSP XMLシンタックスでの式(expression)の取り扱いについて

1
投稿者投稿内容
bump
会議室デビュー日: 2004/07/02
投稿数: 10
投稿日時: 2007-03-04 12:05
お世話になります。

JSPのXML形式についての質問です。
通常JSPにてJAVAの式を評価するためには、<%= 〜%>タグを利用します。
これが、XML形式になると<jsp:expression>〜</jsp:expression>になります。
このXML形式の場合、任意のカスタムタグの属性値内で式の評価を行うことは可能でしょうか。


JSPタグ形式の場合
<% String abc = "XXX" + "xxx"; %>
<mytag:customtag value="<%=abc%>" />

XML形式の場合
<jsp:scriptlet>String abc = "XXX" + "xxx";</jsp:scriptlet>
<mytag:customtag value="???" />

???に<jsp:expression>abc/jsp:expression>と記述すると、JSPコンパイル時にXMLシンタックスエラーとなってしまいます。

何か良い方法はないでしょうか。
ご教授願います。よろしくお願いします。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2007-03-04 13:11
どんなエラーがでますか?
そのエラーをキーワードにして検索するとどんなページがひっかかりますか?
ひっかかったページに原因と対策は書かれていますか?
書かれている場合、その対策をほどこして解決できますか?
bump
会議室デビュー日: 2004/07/02
投稿数: 10
投稿日時: 2007-03-04 19:32
ご返答ありがとうございます。

発生しているエラーは次のようなJasperExceptionです。

org.apache.jasper.JasperException: /Sample/sample.jsp(17,20) The value of attribute "value" associated with an element type "mytag:customtag" must not contain the '<' character.

org.apache.jasper.JasperException: /Sample/sample.jsp(17,20) The at org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:512)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:377)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:672)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:463)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:398)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:301)
at sample.SampleServlet.writeResponse(SampleServlet.java:438)
at sample.SampleServlet.doPost(SampleServlet.java:377)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
at java.lang.Thread.run(Thread.java:595)

実行環境は
JDK 1.5
TOMCAT 5.5

私の推測ですが、JSPコンパイル時にTOMCATがJSPをXML解析しており、その際に<jsp:expression>タグの部分の解析でシンタックスエラーを起こしているのだと思っています。
そこで、<jsp:expression>タグをCDATAセクションで囲って見ました。
そうすと、JSPのコンパイルは通るのですが、こんどは、<jsp:expression>をタグとして認識してくれず、"<jsp:expression>"という文字列として扱われてしまいます。

もし、回避策があるならば、ご教授願います。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2007-03-04 20:52
変数に格納したものをページスコープに格納して、
EL式で読み出すのはいかがでしょうか。
JSP2.0から対応していますが、bumpさんの環境なら問題ないでしょう。
コード:
<%
    //変数設定
    String href = "http://www.yahoo.co.jp";
    String label = "Yahoo! Japan";

    //ページスコープへ格納
    pageContext.setAttribute("label", label);
    pageContext.setAttribute("href", href);
%>
<!--EL式で参照する-->
<!--単純なタグ-->
<a href="${href}">${label}</a>

<!--タグライブラリ-->
<html:link href="${href}"/>${label}</html:link>


上記コードのように、無理に変数に格納してから、
ページスコープへ移す必要はないのですが・・・

タグライブラリに値を渡す場合は関係ない話ですが、(タグライブラリ次第)
EL式を使って直接タグを書き出す場合、
エスケープされませんから、XSSに気をつけてください。
bump
会議室デビュー日: 2004/07/02
投稿数: 10
投稿日時: 2007-03-14 14:51
返答が遅くなってしまい申し訳ございません。

かつのりさんの案を採用させていただき、ELを使って実現しようと思います。

とはいえ、通常のJSPでできていたことが、XMLシンタックスではできなくなることは、私的にはちょっと厳しいなと感じてしまいました。
一般的に良い方法とは思いませんが、カスタムタグの属性に式を埋め込むことは、比較的頻繁にやっていたので。。。
もしかしたら、ELには、XMLシンタックスにてカスタムタグの属性に式を埋め込む機能を、比較的容易に実現するための代替案としての意味も含んでいるのかもしれませんね。

どうもありがとうございました。

[ メッセージ編集済み 編集者: bump 編集日時 2007-03-14 14:52 ]

[ メッセージ編集済み 編集者: bump 編集日時 2007-03-14 14:52 ]
Paul
ベテラン
会議室デビュー日: 2002/04/30
投稿数: 75
お住まい・勤務地: 東京
投稿日時: 2007-08-03 19:48
> 通常のJSPでできていたことが、XMLシンタックスではできなくなる
基本的にできます。代替となる記述形式が用意されています。
そのまま書くと、not welformedになるからいけないのです。

コード:
<jsp:scriptlet>String abc = "XXX" + "xxx";</jsp:scriptlet>
<mytag:customtag> 
 <jsp:attribute name="value">
 <jsp:expression>abc</jsp:expression> 
 </jsp:attribute>
</mytag:customtag>



_________________
Paul K.Nakagome
1

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