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

标签 jsf jsf-2

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





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/

    相关文章:

    java - 如何在 h :selectOneMenu? 中更改值时在 ajax 请求中传递附加参数

    java - 类文件 javax/faces/webapp/FacesServlet 中非 native 或抽象方法中缺少代码属性

    jsf - c :set for bean properties

    jsf - 从 Servlet 访问 ViewScoped ManagedBean

    javascript - 使用 JSF 2.0 Ajax 响应访问 bean 函数的返回值?

    java - 让 Struts 与 JSF 一起工作

    java - JSF Facelet 验证条件是否为真

    java - 为什么通知栏不起作用?

    javascript - 如何自动隐藏/显示adf组件

    java - 由错误页面处理的 ViewExpiredException,仍在日志中