3

<fmt:formatNumber> で変数をフォーマットするにはどうすればよいですか? JSTL を学習し、古い Struts タグから変換しています。これはうまくいきません。距離変数を読み取れません!

    <%double distance=geo.getDistance(geo.getLatitude(), geo.getLongitude(), lat, lng);%>
    <c:set var="distanceEL" value="${distance}"/>
    ${distance}, 
    <fmt:formatNumber pattern="0.0" value="${distance}"/>, 
    <fmt:formatNumber pattern="0.0" value="${distanceEL}"/>, 
    <fmt:formatNumber pattern="0.0" value="1234.567"/>,
    <%= new java.text.DecimalFormat("0.0").format(distance) %>

次のように表示されます

, , , 1234.6, 19.3

私はJSTL 1.2を使用しています。これまでのところ、私は感銘を受けていません。

4

3 に答える 3

4

オールドスクールのスクリプトレットELと混合していて、それらが同じ変数スコープを共有することを期待しています。本当じゃない。EL(これらのもの)は、ページリクエストセッション、およびアプリケーションのスコープでそれぞれ、指定された名前に一致する最初の非属性${}を検索し、それを返します。スクリプトレットのローカルスコープには一切アクセスしません。null

基本的に、作るために

<%double distance=geo.getDistance(geo.getLatitude(), geo.getLongitude(), lat, lng);%>

として利用可能${distance}である場合は、要求スコープなど、目的のELスコープのいずれかに設定する必要があります。

<%
  double distance=geo.getDistance(geo.getLatitude(), geo.getLongitude(), lat, lng);
  request.setAttribute("distance", distance);
%>

それが済んだら、あなたはただ使うことができます

<fmt:formatNumber pattern="0.0" value="${distance}"/>

ちなみに、でマッサージする必要はありません<c:set>

とはいえ、スクリプトレットとELを混在させることは通常の方法ではないことに注意してください。どちらか一方を使用します。この特定のケースでは、そのJavaコードは前処理サーブレットクラスに属しています。

また、具体的な問題はJSTLとは特に関係がないことに注意してください。存在しない変数を指定しただけです。

于 2013-01-11T19:49:20.223 に答える
1

Java 変数を公開する${ExpressionLanguage}場合は、それをコンテキストに追加する必要があります。アプリケーション、セッション、リクエスト、およびページのコンテキストがあります。これが私のテストページで起こることです。

  • タグを使用<% ... %>すると、常に「重い」Java コードが示されます。変数は JSTL コードでは直接表示されません。
  • pagecontext などの JSTL コンテキストに java 変数を導入します。${xx}これで、jsp コードで EL 変数を使用できるようになりました。
  • distance2 をコンテキストに入れませんでしたが、<%= .. %>埋め込まれた Java スクリプトレットを介して使用しました。この方法が最も簡単な場合もあります。
  • 導入することもできます${EL}-変数のみを重いJava側に戻し、jsp:useBeanタグを使用してJava変数を作成します。その後、スクリプトレットで確認できます<%..%>
  • ${distanceEL3}例として、値内に簡単な数式を作成しました。
  • 参考までに、Tomcat を使用している場合は、tomcat/work/Catalina/localhost/mywebapp/org/apache/jsp/test_jsp.javaファイルを参照してください。Javaファイルを手で書いたように、変数がどのように作成されるかを見ることができます。

test.jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><%@ 
    taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %><%@page 
    contentType="text/plain; charset=UTF-8" pageEncoding="ISO-8859-1"
    import="java.text.*"
%><%

double distance=1234.567;
double distance2=3456.789;
pageContext.setAttribute("distance", distance);

%>Test Results

<fmt:setLocale value="en_US" scope="page"/>

<c:set var="distanceEL" value="${distance}" />
distance=${distance}
fmt1=<fmt:formatNumber pattern="0.0" value="${distance}" />
fmt2=<fmt:formatNumber pattern="0.00" value="${distanceEL}" />
fmt3=<fmt:formatNumber pattern="0.0" value="1234.567" />
fmt4=<%= new DecimalFormat("0.0").format(distance) %>

<c:set var="distanceEL2" value="<%= distance2 %>" />
distance2=${distanceEL2}
fmt1=<fmt:formatNumber pattern="0.0" value="<%= distance2 %>" />
fmt2=<fmt:formatNumber pattern="0.00" value="${distanceEL2}" />
fmt4=<%= new DecimalFormat("0.0").format(distance2) %>

<c:set var="distanceEL3" value="${765.432-2.2}" />
<jsp:useBean id="distanceEL3" type="java.lang.Double" />
distance3=${distanceEL3}
fmt1=<fmt:formatNumber pattern="0.0" value="<%= distanceEL3 %>" />
fmt2=<fmt:formatNumber pattern="0.00" value="${distanceEL3}" />
fmt4=<%= new DecimalFormat("0.0").format(distanceEL3) %>
于 2013-01-11T19:59:39.753 に答える
0

見つけた!

<fmt:formatNumber pattern="0.0" value="<%=distance%>"/>

私が試したので、これは奇妙です

<%= geo.getDistance(geo.getLatitude(), geo.getLongitude(), ${lat}, ${lng}) %>

爆破した。それはとても混乱しています!<%%>と${}のどちらが優先順位が高いかはどこに説明されていますか

于 2013-01-11T19:37:54.417 に答える