<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
标记库未正确注册为 JSP 标记库时<%@ taglib %>
,或者a4j
在类路径中找不到标记库时,才会发生这种情况。这样<a4j:ajax>
标签就不会被解析,因此被视为纯文本,包括所有带有 EL 表达式的属性。因此#{question.setParameters}
在模板文本中被视为 EL,这在 JSP 中不受支持。
<a4j:ajax>
但是您的问题更大:作为其中一部分的 RichFaces 4.x 组件库不支持 JSP。JSP 自 JSF 2.0 起被弃用,并由 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>
只需从 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"%>
它肯定会解决你的问题。