web-dev-qa-db-ja.com

JSP:EL式は評価されません

Tomcat 5.5で実行されているJSPページがあります。私は次のコードを持っています:

 <c:forEach var="i" begin="1" end="10" step="1">
  <c:out value="${i}" />
  <br />
</c:forEach>

私が得ている出力は:

${i} 
${i} 
${i} 
${i} 
${i} 
${i} 
${i} 
${i} 
${i} 
${i} 

ForEachループが機能している理由がわかりませんが、出力が機能していません。だれでもできるどんな助けも素晴らしいでしょう。

30
James

デフォルトではオンになっているはずですが、EL処理が行われないページ(および動作を変更する同じページ)をたまに実行します。そのようなページの上部に以下を追加すると、問題が解決するはずです。

<%@ page isELIgnored="false" %> 

害を及ぼさないのですべてのページに追加しますが、ページがEL式の解釈を停止する原因となる根本的な原因はまだわかりません。

65
RHSeeger

私はこれと同じ問題を抱えていて、何が悪いのかを理解しようと永遠に費やしました。

私はたくさんのウェブアプリを一から開発しました。なぜこれが突然協力しなくなったのですか?

1つの違いは、今回はmaven webappアーキタイプを使用してプロジェクト構造を生成したことです。次のようなweb.xmlファイルが作成されました。

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://Java.Sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>
</web-app>

自分の問題であることに気付いたとき、私は答えがあると確信していました。そこで、2.5のweb.xmlヘッダーの1つをコピーして再構築し、再デプロイしました。シガーなし。それが問題ではなかったと信じることができませんでした。プロジェクトをクリーンアップし、Tomcatを再起動しました。いいえ。

RHSeegerの答えにより、<%@ page isELIgnored = "false"%>を入力するようになりました。これで問題は解決しました。しかし、私はなぜelがそもそも無視され始めたのか知りたいと思っていました。

Elはweb.xmlに問題があるため無視されていると考えたので、正常に機能していることがわかっている別のwebappのweb.xmlと比較して、elを詳しく調べました。目立った違いはありません。

次に、<%@ page isELIgnored = "false"%>をJSPから削除し、再デプロイしました。elが再度評価されない場合を想定していますが、驚いたことに、elは正常に評価されました。

次に、それが何らかのキャッシュの問題であるに違いないと考え、問題を再現するためにweb.xmlへの変更を元に戻しました。再デプロイしましたが、web.xmlが悪い場合でも、elは正しく評価されていました。次に、プロジェクト全体をクリーンアップし(展開されたデプロイメントを使用しています)、展開されたディレクトリを吹き飛ばして再作成しました。その後、Tomcatを再起動しました。それでも、web.xmlが悪いにもかかわらず、elは正しく評価されているようです。

ついにそれは私に夜明けした。私は単に、JSPのある場所にスペースを追加し、それを再パッケージして、ページを更新しました。ビンゴ!今エルは評価されていませんでした。

したがって、web.xmlの問題だった。 JSPが変更されない限り、JSPが再コンパイルされないという事実により、さらに複雑になります。 TomcatがMD5サムを使用して、JSPを再コンパイルする必要があるかどうか、または何をする必要があるかを判断できません。もう1つの可能性は、キャッシュメカニズムを備えたタイルを使用していることですが、Tomcatの再起動に耐えることはできません。

とにかく、web.xmlを修正した後でJSPを変更しない限り、ELが再び動作するかどうかについては、すべての賭けが無効になります。これが他の誰かの頭痛を救うことを願っています。 TomcatがJSPを再コンパイルしていないのか、JSPの出力をキャッシュするタイルであるのかを誰かに教えてもらえたら、私も興味があります。コンパイル時に、JSPが$ {} el式の処理方法を理解する必要があるため、それが再コンパイルであると確信しています。タイルは実際にel式に代入されるものをキャッシュできません。そうしないと、あらゆる種類の問題が発生します。

39
kevinmrohr

問題の原因はweb.xmlのヘッダーです

Mavenで生成されたヘッダーの下では、ELが評価されなくなります。

<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://Java.Sun.com/dtd/web-app_2_3.dtd" >
<web-app>

ヘッダーevalのELを使用します。

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
xmlns="http://Java.Sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://Java.Sun.com/xml/ns/javaee http://Java.Sun.com/xml/ns/javaee/web-app_2_5.xsd">
16
user3954300

必ず関連する名前空間をweb.xmlに含めてください。交換してみてください

<web-app>

のようなもので

<web-app xmlns="http://Java.Sun.com/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://Java.Sun.com/xml/ns/javaee
                      http://Java.Sun.com/xml/ns/javaee/web-app_3_0.xsd"
  version="3.0"
  metadata-complete="true">

それは私のためにそれを修正しました。 Tomcatのインストールに付属するサンプルアプリで、Tomcatインスタンスの正しい名前空間を見つけることができます。

9
Bouke Woudstra

興味のある方のために、JSP 2.0と同等のXML構文は次のとおりです。

<jsp:directive.page isELIgnored="false"/>
2
Fabien R

kevinと同様の問題があり、私はmavenを使用してwebappを使い始めましたが、jspで式を評価する喜びはありませんでした-DOCTYPEヘッダーを削除する必要がありました-isELIgnoredビットを使用せずにすべて正常になりました-mavenは2.3にリンクするweb.xmlを生成しますPeterが述べたように、ELはデフォルトで無効になっています

1
greg one

Tomcat6を使用します。 web.xmlでELの設定を行う必要はありません。

0
Maheshkumar.P

考えられる理由については、 Javascript String.replace(/\$ /、str)がjspファイルで奇妙に機能する で私の回答を参照してください。

より長い答え:$ {i}は、いわゆる「式言語」の式です。場合によっては、式言語を無効にすることができます。考えられる理由とそれを有効にする方法については、上記の回答をご覧ください。

0

コントローラから:

@RequestMapping(value = "createcustomer",method = RequestMethod.GET)
    public String customer(Model model)
    {
        Customer cus=new Customer();
        cus.setCustomerNumber("Test");
        model.addAttribute("customer",cus);
        return "createcustomer";
    }

ビューで:

<%@taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<%@ taglib prefix="c" uri="http://Java.Sun.com/jstl/core" %> 

<div class="cl">    
   <form:form commandName="customer" method="POST">

      <p>Name: <c:out value="${customer.CustomerNumber}"></c:out></p>

   </form:form>
<div>

出力:

Name: Test
0
Md. Rahman