2009-04-27 2 views
30

У меня есть страница JSP, работающая на Tomcat 5.5. У меня есть следующий код:JSP: выражение EL не оценивается

<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 работает, но выход не работает. Любая помощь, которую может дать любой, будет отличной.

ответ

62

Я знаю, что он должен быть включен по умолчанию, но я просматриваю страницы время от времени (или даже ту же страницу, которая меняет поведение), где обработка EL не выполняется. Добавление следующих строк в верхней части любых таких страниц должны решить эту проблему:

<%@ page isELIgnored="false" %> 

добавить его к каждой странице, потому что это не больно, и я до сих пор не знаю причину, которая иногда вызывает страницу чтобы прекратить интерпретацию EL-выражений.

+2

На сервере Tomcat 5.5, есть две возможные причины (только?): Неверная схема в web.xml, или el- игнорируется опция конфигурации. –

+1

У меня (и других) была хорошая работа на одной странице, и после изменения чего-либо на странице (т. Е. Добавления некоторого html), она просто перестает оценивать выражения EL. Единственное объяснение, которое я могу придумать, - это ошибка в Tomcat где-то, но не стоит углубляться слишком глубоко, поскольку включение ее вручную (через код выше) решает проблему. – RHSeeger

+4

Если вы создали свой webapp с архетипом maven, правильный ответ таков: http://stackoverflow.com/a/25372735/20654 – OscarRyz

0

См. Мой ответ на Javascript String.replace(/\$/,str) works weirdly in jsp file по возможным причинам.

Более длинный ответ: $ {i} является выражением в так называемом «языке выражений». Иногда язык выражений может быть отключен. См. Выше ответ по потенциальным причинам и способы его включения.

0

Использование tomcat6. Это не требует какой-либо конфигурации для EL в web.xml.

+2

Tomcat 5.5 также не требует какой-либо конфигурации для EL в web.xml. Tomcat 5.0 также нет. Если у вас возникла проблема с этим, он находится где-то в другом месте. – BalusC

38

У меня была такая же проблема и проводилась навсегда, пытаясь понять, что случилось.

Я разработал множество веб-приложений с нуля. Почему вдруг этот человек не сотрудничал?

Одна разница была на этот раз я использовал архетип 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, перестроил и перераспределил. Никакой сигары. Не мог поверить, что это не проблема. Очистил проект, перезапустил tomcat. Неа.

Ответ RHSeeger заставил меня попробовать положить в <% @ page isELIgnored = "false"%>. Это решило проблему. Но я все еще хотел знать, почему для начала начал игнорировать начало.

Я понял, что эль игнорировался из-за чего-то не так с моим web.xml, поэтому я внимательно осмотрел его по сравнению с другим webapp'ом webappapp, который, как я знал, работал нормально. Нет заметных различий.

После этого я удалил <% @ page isELIgnored = "false"%> из моего JSP и перераспределился, считая, что el не будет оцениваться снова, но, к моему удивлению, el был оценен отлично!

Затем, полагая, что это должна быть какая-то проблема с кешированием, я отключил свои изменения в web.xml, чтобы воссоздать проблему. Я перераспределился, но все же эль оценивалась правильно, даже с плохим web.xml. Затем я очистил весь проект (я использую разнесенное развертывание), сдувая взорванный каталог и воссоздавая его. Затем я перезапустил tomcat. Тем не менее, эль, похоже, правильно оценивался, несмотря на плохой web.xml.

Наконец-то меня осенило.Я просто добавил пространство в какое-то место в JSP, переупаковал его и обновил страницу. Бинго! Теперь эль не оценивался.

Таким образом, проблема была с web.xml. Это еще больше осложнило бы тот факт, что JSP не перекомпилировались, если они не изменились. Не уверен, что tomcat использует сумму MD5, чтобы решить, нужно ли перекомпилировать JSP или что. Другая возможность заключается в том, что я использую плитки, которые, как я знаю, имеют механизм кэширования, но я бы не ожидал, что вы продолжите перезапуск tomcat.

В любом случае, если вы не измените свои JSP ПОСЛЕ исправления файла web.xml, все ставки будут отключены, будет ли EL снова работать. Надеюсь, это избавит кого-то еще от головной боли. Мне также интересно, может ли кто-нибудь сказать мне, было ли это не рекомпиляция JSP или кеширование кеширования вывода JSP. Я уверен, что это перекомпиляция, потому что во время компиляции JSP должен выяснить, что делать с выражениями $ {} el, правильно? Плитки не могут кэшировать то, что подставляется в выражения el, иначе возникнут всевозможные проблемы.

+0

Большое спасибо, это именно то, через что я прошел - создан из архетипа, а EL и JSTL все не работают, хотя JSP-файл использовал тот же код, что и предыдущее приложение, которое раньше работало. Исправлено пространство имен web.xml, перезапущено, все еще не работает; наконец, модифицировал JSP и отсортировал! –

+0

Это был Tomcat, не перекомпилировавший JSP. Он отслеживает последнее изменение файла JSP - более новые версии также отслеживают последние измененные времена зависимостей. Они проверяются на настраиваемой частоте (обычно 5 секунд, если память обслуживается), и перекомпиляция срабатывает, если обнаружено изменение. Файл .java может быть расположен в рабочем каталоге Tomcat и будет сохраняться через перезагрузки. –

+0

@kevinmrohr Большое спасибо за подробный эксперимент и ответ. – smwikipedia

1

имеет аналогичную проблему с Кевином, я использовал maven, чтобы начать работу с webapp, но без радости с оценкой выражений в jsp - мне пришлось удалить заголовок DOCTYPE - все хорошо сейчас, не играя с isELIgnored bit - maven генерирует web.xml, который ссылки на 2.3, которые, как утверждал Питер, по умолчанию отключены по умолчанию.

9

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

+0

Работы и спас мой день! : D – Philipp

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 
15

Это заголовок в web.xml, который вызывает проблему

Ниже мавена сгенерированные заголовки 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's 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"> 
+0

это спасает мой день! благодаря! – Maigret

+0

gr8 ...... спасибо –

+0

Это решение работает. –

2

Для тех, кто заинтересован, эквивалентный синтаксис XML для JSP 2.0:

<jsp:directive.page isELIgnored="false"/> 
Смежные вопросы