有人可以解释一下,为什么第一个代码有效而另一个没有?
工作:
<h:commandButton value="#{settingsBean.tmp}" action="editverteilerliste">
<f:setPropertyActionListener target="#{settingsEditVerteilerlisteBean.aktuelleVerteilerliste}" value="#{settingsBean.tmp}" />
</h:commandButton>
不工作:
<p:commandLink action="editverteilerliste">
<f:param name="aktuelleVerteilerliste" value="#{settingsBean.tmp}" />
<h:outputText value="asdf"/>
</p:commandLink>
settingsBean.tmp是Verteilerliste的一个实例
Action editverteilerliste指向另一个使用settingsEditVerteilerlisteBean的页面:
@ManagedBean
@RequestScoped
public class settingsEditVerteilerlisteBean implements Serializable {
private Logger logger = Logger.getLogger(settingsEditVerteilerlisteBean.class);
public settingsEditVerteilerlisteBean() {
}
@PostConstruct
public void init() {
logger.info("Postconstructor invoked!");
}
@ManagedProperty(value = "#{aktuelleVerteilerliste}")
private Verteilerliste aktuelleVerteilerliste;
[Getter and Setter...]
}
第二页:
<h:body>
<ui:composition template="../template/mainlayout.xhtml">
<ui:define name="content">
<h3>Verteilerliste <h:outputText value="#{settingsEditVerteilerlisteBean.aktuelleVerteilerliste.name}"/></h3>
</ui:define>
</ui:composition>
</h:body>
我知道我可以使用工作但我想知道为什么第二个不起作用!
答案 0 :(得分:1)
第二个不起作用,因为您的托管属性绑定被解析为null
,因为在任何JSF范围的映射中,aktuelleVerteilerliste
键很可能没有元素。
要使第二个工作正常,您需要告诉JSF查看给定请求的参数,即更改为@ManagedProperty(value = "#{param['aktuelleVerteilerliste']}")
。
为了使区别更加清晰,<f:setPropertyActionListener>
只是在调用JSF生命周期的应用程序阶段时将target
对象等同于value
,而后一种方法只是将特定参数添加到JSF组件,在您的情况下是命令组件,并且可以通过EL对象param
访问命令组件参数,EL对象是当前请求参数的映射。
也就是说,您对命令链接的使用被认为是一种不好的做法。它们用于在提交表单以执行某些业务作业时调用某些服务器端逻辑。在您的情况下,您正在使用它们来执行简单导航。为此,您最好使用<h:link>
组件来创建简单的a
元素。这样,如果您附加参数,最终会得到editverteilerliste?aktuelleVerteilerliste=something
之类的查询参数,您可以通过<f:viewParam>
进入视图。这样,您最终会在应用程序中使用可收藏的URL和清晰的导航。