模板文本中不允许使用#{...}

时间:2012-09-18 14:04:48

标签: jsf ajax4jsf

<a4j:ajax event="click" render="tempval" listener="#{question.setParameters}" />

当我们使用此代码时,服务器会抛出一条带有消息

的异常
#{...} is not allowed in template text

这是如何引起的?如何解决?

4 个答案:

答案 0 :(得分:11)

当您使用JSP作为视图技术并且在模板文本中使用#{...}时,您将收到此错误(<p>只是示例,它可以是任何纯HTML元素):

<p>#{bean.property}</p>

它在JSP中不受支持,但它的后继Facelets支持它。在JSP中,您需要明确使用<h:outputText>

<p><h:outputText value="#{bean.property}"></p>

但是,在您已经在JSF组件中使用#{...}的特定代码段中,只有在a4j标记库未正确注册为JSP标记库时才会发生这种情况。 <%@ taglib %>,或者如果在类路径中找不到a4j标记库。这样,<a4j:ajax>标记不会被解析,因此被视为纯文本,包括具有EL表达式的所有属性。因此#{question.setParameters}在模板文本中被视为EL,而JSP中不支持。

但是你的问题更大:RichFaces 4.x组件库,<a4j:ajax>是其中的一部分,不支持JSP 。自JSF 2.0以来,JSP已被弃用,并由Facelets继承。所有JSF组件库(如RichFaces)都决定放弃对JSP的支持,因为为两种不同的视图技术JSP和Facelets开发和支持标记库和组件是一项很大的工作。因此,即使你已经在类路径中有RichFaces 4.x并且你已经通过<%@ taglib %>正确地注册它,它也永远不会在JSP中工作,因为.tld文件不存在于{ {1}}命名空间。

为了使用JSF 2.0兼容的组件库,您需要从JSP迁移到Facelets。另一种方法是使用较旧的RichFaces 3.x版本。版本3.3.3支持JSP上的JSF 2.0。它提供a4j标记来实现相同的目标。但请记住,你正以这种方式倒退技术。你应该继续前进。删除JSP并继续使用它的后继Facelets。

另见:

答案 1 :(得分:1)

我遇到了同样的问题,对我来说,错误的原因是javascript中的注释行使用#{...}为我的页面中的字段赋值。 一旦我删除它工作正常,听起来很奇怪,但这就是发生的事情。

答案 2 :(得分:0)

只需从jsp页面中删除Xmlns

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:a4j="http://richfaces.org/a4j"
xmlns:rich="http://richfaces.org/rich">

现在为jsp页面添加标签库..

<%@taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@taglib uri="http://java.sun.com/jsf/html" prefix="h"%>

它一定能解决您的问题。

答案 3 :(得分:-1)

如果您将jsp用作视图技术,则需要导入以下两个库。

<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>

如果您使用xhtml,请在html标签中添加以下内容,例如

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:c="http://java.sun.com/jsp/jstl/core">
...
</html>