gpt4 book ai didi

jsf - 跨回发保留原始 GET 请求参数

转载 作者:行者123 更新时间:2023-12-03 20:49:58 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





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:viewParamExternalContext甚至来自 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> 的用处和功能。 .我建议仔细阅读以下答案以了解如何正确使用它们:
  • What can <f:metadata>, <f:viewParam> and <f:viewAction> be used for?
  • ViewParam vs @ManagedProperty(value = "#{param.id}")
  • 关于jsf - 跨回发保留原始 GET 请求参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16187049/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com