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

<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中的一个注释行,使用#{…}为我的页面中的字段赋值。 一旦我删除它工作正常,听起来很奇怪,但这是发生了什么事。

Interesting Posts