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

问题描述 投票:11回答:3
<a4j:ajax event="click" render="tempval" listener="#{question.setParameters}" />

当我们使用此代码时,服务器会抛出该消息的异常

#{...} is not allowed in template text

这是怎么造成的,我该如何解决?

jsf ajax4jsf
3个回答
11
投票

当您使用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。

See also:


1
投票

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


-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>
© www.soinside.com 2019 - 2024. All rights reserved.