模板文本中不允许使用#{…}
<a4j:ajax event="click" render="tempval" listener="#{question.setParameters}" />
当我们使用这个代码时,服务器会抛出一个带有消息的exception
#{...} 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标记库时, ,或者如果在类path中找不到a4j
标记库。 这样, <a4j:ajax>
标签就不会被parsing,因此被视为纯文本,包括ELexpression式的所有属性。 因此#{question.setParameters}
在模板文本中被视为EL,这在JSP中不受支持。
但是,您的问题更大: <a4j:ajax>
所属的RichFaces 4.x组件库不支持JSP 。 从JSF 2.0开始,JSP就被弃用了,Facelets成功了。 所有JSF组件库(如RichFaces)都决定放弃对JSP的支持,因为开发和支持两种不同视图技术JSP和Facelets的标记库和组件是非常麻烦的。 所以,即使你已经在类path中已经有了RichFaces 4.x,并且已经通过<%@ taglib %>
正确地注册了它,它也不会在JSP中工作,只是因为a4j
命名空间不存在JSP .tld
文件。
为了使用JSF 2.0兼容组件库,您必须从JSP迁移到Facelets。 另一种方法是使用较旧的RichFaces 3.x版本。 版本3.3.3支持JSP上的JSF 2.0。 它提供了<a4j:support>
标签来达到同样的效果。 但请记住,你正在用这种方式倒退。 你应该继续前进。 拖放JSP并继续其后续的Facelets。
也可以看看:
- 从JSF 1.2迁移到JSF 2.0
- 我们的Facelets wiki页面 – 底部包含几个教程链接
我面临同样的问题,对我来说,错误的原因是JavaScript中的一个注释行,使用#{…}为我的页面中的字段赋值。 一旦我删除它工作正常,听起来很奇怪,但这是发生了什么事。