作为直接从 bean 中的请求中获取参数的替代方法,您可以使用 view parameters。
这些需要在使用托管 bean 的 Facelet 上声明如下:
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
>
<h:body>
<f:metadata>
<f:viewParam id="id" name="id" value="#{myBean.id}" />
</f:metadata>
<!-- Rest of Facelet here -->
</h:body>
</html>
如果您现在请求此页面,将使用为 id 参数提供的请求值调用 backing bean 的 setter。这适用于GET 和(非人脸)POST 请求。
优点是您可以在此处使用标准的 JSF 转换器和验证器。当然,如果您的托管 bean 没有绑定到特定视图,那么这个解决方案就不太理想了。
需要注意的一个小特殊的事情是,在提供视图参数的初始请求之后执行普通人脸回发时,将再次调用 bean 中的设置器,即使 bean 在视图范围内并且没有新的值是明确提供的。
为了测试它是否有效,我使用了以下托管 bean:
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.event.ActionEvent;
@ManagedBean
@ViewScoped
public class MyBean {
Long id;
@PostConstruct
public void test() {
System.out.println("post construct called");
}
public void actionMethod(ActionEvent event) {
System.out.println("action called");
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
}
还有以下 Facelet:
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
>
<h:body>
<f:metadata>
<f:viewParam id="id" name="id" value="#{myBean.id}" />
</f:metadata>
<h:outputText value="#{myBean.id}"/>
<h:form>
<h:commandButton value="test" actionListener="#{myBean.actionMethod}"/>
</h:form>
<form method="post">
<input name="id" value="4" />
<input type="submit" value="submit" />
</form>
</h:body>
</html>
在输入字段中输入一个数字,然后单击提交按钮。如果该数字被打印回屏幕上,则测试成功。请注意,第二个表单是常规表单,并且不会同时发布任何 JSF 状态。我在 JBoss AS 6 上对此进行了测试,它可以工作。将 id 参数证明为 GET 参数也可以。