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

您将 oldschool scriptletEL混合,并期望它们共享相同的变量范围。这不是真的。EL(那些${}东西)分别在pagerequestsessionapplication范围内搜索null与给定名称匹配的第一个非属性并返回它。它不会以任何方式访问scriptlet本地范围。

基本上,使

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

可用 as ${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>

请注意,a 说,将scriptlet与 EL 混合不是正常做法。您使用其中一个或另一个。在这种特殊情况下,该 Java 代码属于预处理servlet 类

另请注意,您的具体问题与JSTL无关。您只是指出它是一个不存在的变量。

于 2013-01-11T19:49:20.223 回答
1

如果要向其发布 java 变量,${ExpressionLanguage}则必须将其添加到上下文中。有应用程序、会话、请求和页面上下文。这就是我的测试页面中发生的情况。

  • 使用<% ... %>标签总是表示“重量级”的 java 代码,变量在 JSTL 代码中不直接可见。
  • 将 java 变量引入 JSTL 上下文,例如 pagecontext。现在您可以${xx}在 jsp 代码中使用 EL 变量。
  • 我没有将 distance2 放到上下文中,而是通过<%= .. %>嵌入式 java scriptlet 使用它。有时这样做最容易。
  • 你甚至可以将${EL}-only 变量引入重量级java 端,使用jsp:useBean标签创建java 变量。然后可以在<%..%>scriptlet中看到它。
  • 我在 value 里面做了一个简单的数学表达式${distanceEL3}作为例子。
  • 供您参考,如果使用 Tomcat,请查看该tomcat/work/Catalina/localhost/mywebapp/org/apache/jsp/test_jsp.java文件。您可以看到变量是如何创建的,就像手动编写的 java 文件一样。

测试.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 回答