这个问题在这里已经有了答案:
Retaining GET request query string parameters on JSF form submit
(2 个回答)
5年前关闭。
我只有与 @RequestScoped
相关联的页面支持 bean 。我从我传递参数“项目”的其他页面进入此页面。所以当我进入正确的页面时,我的网址是 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,我不想混合它们。
最佳答案
您需要 <f:param>
在 UICommand
组件为后续请求保留请求参数。例如。
<p:commandButton ...>
<f:param name="project" value="#{param.project}" />
</p:commandButton>
或者,您可以使用
<o:form>
JSF 实用程序库 OmniFaces ,它基本上扩展了 <h:form>
带有附加属性 includeViewParams
这使您可以保留通过 <f:viewParam>
注册的请求参数用于后续请求。<o:form includeViewParams="true">
...
</o:form>
如果您有多个命令按钮/链接和 ajax 操作,这最终可能会更容易。
在您的情况下,浏览器地址栏中的 URL 未更改,因为您正在触发 ajax 请求。但实际的 URL,您可以在
<form action>
中看到通过右键单击生成的 HTML 输出 - 在浏览器中查看源代码,默认情况下不包含当前的 GET 参数。无关 对于具体问题,通过在 postconstruct 中手动收集参数,您基本上忽略了
<f:viewParam>
的用处和功能。 .我建议仔细阅读以下答案以了解如何正确使用它们:关于jsf - 跨回发保留原始 GET 请求参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16187049/