作为在Bean中直接从请求中获取参数的替代方法,您可以使用“视图参数”。
这些参数需要在使用托管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>
</h:body>
</html>
如果您现在请求此页面,则会使用为id参数提供的请求值调用后备bean的setter。这适用于
GET
和(非面向对象)
POST
请求。
优点是您可以在此处使用标准JSF转换器和验证程序。当然,如果您的托管bean未绑定到特定视图,则此解决方案不太理想。
需要注意的一个小问题是,在提供视图参数的初始请求之后进行正常的面向对象回发时,即使bean位于视图范围内并且没有明确提供新值,也将再次调用bean中的setter。
为了测试这个功能,我使用了以下托管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参数证明也可行。
// +getter+setter
,而不是添加一堆显而易见的内容。只需让您的IDE自动生成getter/setter并将它们隐藏在类的底部即可。 - BalusC