Org.apache.jasper.JasperException: функциональный тест должен использоваться с префиксом, если пространство имен по умолчанию не указано
Я использую следующие вещи для своего проекта:
Spring 3.0.1 + Apache Tiles 2.2.1 + Glassfish 2.1. То, что я пытаюсь сделать, это вызвать какой-то метод на jsp-странице и передать ему некоторые параметры. Например, у меня есть bean:
@Component
@Scope(value = "singleton")
public class TestBean {
public void test(String param){
System.out.println("param = " + param);
}
}
и у меня есть jsp-страница:
<%@page contentType="text/html; charset=utf-8"%>
${testBean.test("hello")}
Этот код дает мне исключение, например:
org.apache.jasper.JasperException: функциональный тест должен использоваться с префикс, когда пространство имен по умолчанию не указано
Если я вызываю какой-то метод, не передавая ему параметры - все в порядке.
Я попытался поместить jboss-el.jar в свой WEB-INF/lib и поместить необходимые параметры в web.xml(как описано здесь), но с никакого эффекта.
Я ограничен набором технологий, перечисленных выше, поэтому я ничего не могу добавить или, например, не могу изменить версию своего приложения-сервера.
При всех этих условиях существует ли решение моей проблемы?
Ответы
Ответ 1
org.apache.jasper.JasperException: тест функции должен использоваться с префиксом, если пространство имен по умолчанию не указано
Это означает, что среда не поддерживает новую функцию EL 2.2 при вызове методов bean с аргументами. Устаревшая среда пытается интерпретировать выражение как функцию EL, которая имеет обозначение namespace:functionName()
(например, как функции JSTL). Исключение составляет лишь жалобы на то, что часть namespace:
не может быть найдена для идентификации функции EL. Но в любом случае это не так.
Вам нужно убедиться, что для вызова методов bean с аргументами в элементе EL выполняются следующие условия:
-
Целевой контейнер должен поддерживать EL 2.2. Все контейнеры, совместимые с Servlet 3.0, как EL 2.2 являются частью Java EE 6, которая, в свою очередь, также охватывает Servlet 3.0. Примерами контейнеров Servlet 3.0 являются Tomcat 7.x, Glassfish 3.x и JBoss AS 6.x/7.x.
-
Файл /WEB-INF/web.xml
объявлен как соответствующая спецификация Servlet 3.0 (и, следовательно, не старше, например 2.5).
<?xml version="1.0" encoding="UTF-8"?>
<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">
<!-- Config here. -->
</web-app>
В противном случае ваш контейнер будет работать в резервном модуле, соответствующем соответствию версии в объявлении root web.xml
, тем самым теряя все новые возможности Servlet 3.0 и EL 2.2.
-
В Webapp /WEB-INF/lib
не содержатся библиотеки реализации конкретных контейнеров, созданные из контейнера более старой версии make/version, например el-api.jar
и/или el-impl.jar
от Tomcat 6.x или около того.
Ваша конкретная проблема вызвана использованием контейнера, совместимого с несерветом 3.0: старый Glassfish 2.x.
Перейдите на Glassfish 3.x или найдите альтернативные способы. Подход JBoss EL работает только для JSF, а не для Spring или "простой JSP".
Ответ 2
Пожалуйста, используйте tomcat 7, если вы используете el 2.2 и сервлет 3.0
Мы столкнулись с тем же и получили исправленную версию выше
Ответ 3
Поскольку я должен работать на Servlet 2.5, я сделал этот взлом:
JSP:
${testBean.test["hello"]}
Bean:
private Map test;
public Map getTest() {
if (test == null) {
test = new Map() {
@Override
public Object get(Object key) {
System.out.println("param = " + key);
return null;
}
@Override
public int size() {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public boolean isEmpty() {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public boolean containsKey(Object key) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public boolean containsValue(Object value) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public Object put(Object key, Object value) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public Object remove(Object key) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void putAll(Map m) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void clear() {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public Set keySet() {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public Collection values() {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public Set entrySet() {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
};
}
return test;
}