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

San*_*dey 11 jsf ajax4jsf

<a4j:ajax event="click" render="tempval" listener="#{question.setParameters}" />
Run Code Online (Sandbox Code Playgroud)

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

#{...} is not allowed in template text
Run Code Online (Sandbox Code Playgroud)

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

Bal*_*usC 11

当您使用JSP作为视图技术并且您正在使用#{...}模板文本(例如,<p>只是示例性的,它可以是任何纯HTML元素)时,您将收到此错误:

<p>#{bean.property}</p>
Run Code Online (Sandbox Code Playgroud)

它在JSP中不受支持,但它的后继Facelets支持它.在JSP中,您需要明确使用<h:outputText>:

<p><h:outputText value="#{bean.property}"></p>
Run Code Online (Sandbox Code Playgroud)

但是,在您已经#{...}在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不存在JSP 文件a4j.

为了使用JSF 2.0兼容的组件库,您需要从JSP迁移到Facelets.另一种方法是使用较旧的RichFaces 3.x版本.版本3.3.3支持JSP上的JSF 2.0.它提供了<a4j:support>实现相同的标签.但请记住,你正以这种方式倒退技术.你应该继续前进.删除JSP并继续使用它的后继Facelets.

也可以看看: