我只有与@RequestScoped
支持bean关联的页面。我从其他页面到达此页面,我在其中传递参数“project”。因此,当我进入右页时,我的网址就像contextRoot/faces/jsf.xhtml?project=123
。
查看:
<f:metadata>
<f:viewParam name="project" value="#{entityBean.projectId}" />
</f:metadata>
...
<p:commandButton value="#{msg['button.add']}"
actionListener="#{entityBean.addNewEntity((entityName),(entityDescritpion))}"
ajax="true" update=":projectDetailForm"/>
支持bean:
@Named("entityBean")
@RequestScoped
public class EntityBean implements Serializable{
private String projectId;
@PostConstruct
public void init() {
params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
for (Map.Entry<String, String> entry : params.entrySet()) {
System.out.println(entry.getKey() + " / " + entry.getValue());
}
if (params.get("project") != null) {
projectId = params.get("project");
} else {
HttpServletRequest request =
(HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest();
String projectId = request.getParameter("project");
}
}
//projectId getter and setter
//public void addNewEntity(String name, String desc) {}
}
第一次打开页面时,一切正常。 GET参数已成功处理。但是,由于bean是请求作用域,它会在请求结束时被销毁,并在随后的回发中重新创建。在这些回发期间,GET参数不再可用,即使它在浏览器地址栏中可见。我尝试了三种获取参数的方法
f:viewParam
和ExternalContext
,甚至来自ServletContext
,但我无法获取这些参数。
我不想将@RequestScoped
更改为@SessionsScoped
而我无法使用@ViewScoped
,因为我正在使用CDI bean而我不想将它们混合使用。
答案 0 :(得分:9)
您需要<f:param>
组件中的UICommand
来保留后续请求的请求参数。 E.g。
<p:commandButton ...>
<f:param name="project" value="#{param.project}" />
</p:commandButton>
或者,您可以使用JSF实用程序库<o:form>
的OmniFaces,它基本上使用附加属性<h:form>
扩展includeViewParams
,这使您可以保留请求参数通过<f:viewParam>
注册后续请求。
<o:form includeViewParams="true">
...
</o:form>
如果您有多个命令按钮/链接和ajax操作,这可能会更容易。
您的情况下浏览器地址栏中的URL未更改,因为您正在触发ajax请求。但是实际 URL,您可以在生成的HTML输出的<form action>
中通过右键单击 - 查看源在浏览器中看到,默认情况下不包含当前的GET参数。
无关,在postconstruct中手动收集参数,你基本上忽略了<f:viewParam>
的实用性和强大功能。我建议您仔细阅读以下答案,以了解如何正确使用它们: