将 <f:param> 标签替换为 JSTL <c:set> 标签和 javax.faces.view.facelets.TagException

Replacing the <f:param> tag with the JSTL <c:set> tag & the javax.faces.view.facelets.TagException

我正在尝试构建书中给出的问题。

作者提到:

有时,JSTL <c:set> 标签可以解决 JSF <f:param> 标签不能解决的问题。大概,你知道我们可以使用<f:param>标签给<ui:include>标签传递参数,如下代码所示:

<ui:include src="rafa.xhtml">
  <f:param name="rafa" value="Rafael Nadal Page"/>,
</ui:include>

好吧,这个方法触发了一个问题!现在,Rafael Nadal Page 值将通过 EL 在包含页面中可用,#{rafa},但在包含页面的托管 bean 的构造函数中将不可用!

<c:set>标签是时候挽救局面了;因此,代码将更改为以下内容:

<ui:include src="rafa.xhtml">
  <c:set var="rafa" value="Rafael Nadal Page" scope="request"/>,
</ui:include>

当我使用 <c:set> 时,它与 #{rafa}

的可用性完美配合

而在 <f:param> 的情况下,它给了我这样一个例外: 而作者提到该值将通过 EL 在包含的页面中可用,#{rafa}。我不是在谈论 bean 的 constructor 中的值,而是针对包含的页面。他到底是什么意思?

这只是书中的一个不幸的错字。它真的应该是 <ui:param> 而不是 <f:param>

<ui:include src="rafa.xhtml">
  <ui:param name="rafa" value="Rafael Nadal Page"/>,
</ui:include>

<f:param>的目的是在<h:xxxLink><h:xxxButton>组件的outcome中添加HTTP请求参数,并在<h:outputFormat>中参数化消息格式。 <ui:param> 旨在将 Facelet 上下文参数传递给 <ui:include><ui:decorate><ui:define>

我已经通知作者了。

另请参阅:

  • JSTL in JSF2 Facelets... makes sense? 提及 <c:set><ui:param>