JSTL fmt:formatNumber

Как отформатировать переменную с помощью ‹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. Пока я не впечатлен.


person Chloe    schedule 11.01.2013    source источник


Ответы (3)


Вы смешиваете старые школьные скриптлеты с EL и ожидая, что они имеют одну и ту же область видимости переменных. Это неправда. EL (эти ${} вещи) выполняет поиск соответственно на странице, запрос, сеанс и application выполняет поиск первого атрибута, отличного от null, соответствующего заданному имени, и возвращает его. Он никоим образом не обращается к локальной области видимости scriptlet.

В принципе, чтобы сделать

<%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>.

Обратите внимание, что смешивание scriptlets с EL не является обычной практикой. Вы используете и то, и другое. В данном конкретном случае этот Java-код относится к классу сервлета предварительной обработки.

Также обратите внимание, что ваша конкретная проблема не связана конкретно с JSTL. Вы просто указали несуществующую переменную.

person BalusC    schedule 11.01.2013

Если вы хотите опубликовать переменную Java в ${ExpressionLanguage}, вы должны добавить ее в контекст. Существуют контексты приложения, сеанса, запроса и страницы. Это то, что происходит на моей тестовой странице.

  • Использование тегов <% ... %> всегда указывает на «тяжелый» код Java, переменные не видны напрямую в коде JSTL.
  • введите переменную java в контекст JSTL, такой как pagecontext. Теперь вы можете использовать ${xx} переменных EL в коде jsp.
  • Я не помещал Distance2 в контекст, а использовал его через <%= .. %> встроенный java-скриптлет. Иногда проще всего сделать так.
  • Вы даже можете ввести переменную ${EL}- only обратно в тяжеловесную сторону 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) %>
person Whome    schedule 11.01.2013

Я нашел это!

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

Что странно, потому что я пытался

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

который взорвался. Это НАСТОЛЬКО запутанно! Нигде не объясняется, что имеет более высокий приоритет, ‹%%> или ${}

person Chloe    schedule 11.01.2013
comment
Я пытался выучить новый нормаль, но это не сработало: <fmt:formatNumber pattern="0.0" value="${geo.getDistance(geo.getLatitude(), geo.getLongitude(), ${row.latitude}, ${row.longitude})}"/>, как и многие-многие вариации. - person Chloe; 13.01.2013