<a4j:ajax event="click" render="tempval" listener="#{question.setParameters}" />
当我们使用此代码时,服务器会抛出一条带有消息
的异常#{...} is not allowed in template text
这是如何引起的?如何解决?
答案 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>