<a4j:ajax event="click" render="tempval" listener="#{question.setParameters}" />
当我们使用此代码时,服务器会抛出该消息的异常
#{...} is not allowed in template text
这是怎么造成的,我该如何解决?
当您使用JSP作为视图技术并且在模板文本中使用#{...}
时会出现此错误(<p>
只是示例,它可以是任何纯HTML元素):
<p>#{bean.property}</p>
它在JSP中不受支持,但它的后继Facelets支持它。在JSP中,您需要显式使用<h:outputText>
:
<p><h:outputText value="#{bean.property}"></p>
但是,在您已经在JSF组件中使用#{...}
的特定代码段中,只有当a4j
没有正确地将<%@ taglib %>
标记库注册为JSP标记库,或者无法找到a4j
标记库时,才会发生这种情况。在类路径中。这样,<a4j:ajax>
标记不会被解析,因此被视为纯文本,包括具有EL表达式的所有属性。所以#{question.setParameters}
在模板文本中被视为EL,JSP不支持。
但是你的问题更大:<a4j:ajax>
所属的RichFaces 4.x组件库不支持JSP。自JSF 2.0以来,JSP已被弃用,并由Facelets继承。所有JSF组件库(如RichFaces)都决定放弃对JSP的支持,因为为两种不同的视图技术JSP和Facelets开发和支持标记库和组件是一项艰巨的工作。因此,即使你已经在类路径中使用RichFaces 4.x并且你已经通过<%@ taglib %>
正确地注册它,它也永远不会在JSP中工作,因为.tld
命名空间不存在JSP a4j
文件。
为了使用JSF 2.0兼容的组件库,您需要从JSP迁移到Facelets。另一种方法是使用较旧的RichFaces 3.x版本。版本3.3.3支持JSP上的JSF 2.0。它提供<a4j:support>
标签来实现相同的目标。但请记住,你正以这种方式倒退技术。你应该继续前进。删除JSP并继续使用它的后继Facelets。
我遇到了同样的问题,对我来说错误的原因是javascript中的注释行使用#{...}为我的页面中的字段赋值。一旦我删除它工作正常,听起来很奇怪,但这就是发生的事情。
如果您使用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>