在回发中保留原始GET请求参数

Adr*_*anX 5 jsf jsf-2

我只是页面与关联的@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"/>
Run Code Online (Sandbox Code Playgroud)

支持豆:

@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) {}
}
Run Code Online (Sandbox Code Playgroud)

第一次打开页面时,一切正常.GET参数已成功处理.但是,由于bean是请求作用域,它会在请求结束时被销毁,并在随后的回发中重新创建.在这些回发期间,GET参数不再可用,即使它在浏览器地址栏中可见.我试图通过获取参数的三种方法f:viewParam,并ExternalContext甚至产生ServletContext,但我不能让这些参数.

我并不想改变@RequestScoped@SessionsScoped,我不能用@ViewScoped,怎么一回事,因为我使用CDI豆,我不想将它们混合.

Bal*_*usC 9

您需要<f:param>UICommand组件中保留后续请求的请求参数.例如

<p:commandButton ...>
    <f:param name="project" value="#{param.project}" />
</p:commandButton>
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用<o:form>JSF实用程序库OmniFaces,它基本上扩展了<h:form>一个附加属性includeViewParams,使您可以保留通过<f:viewParam>后续请求注册的请求参数.

<o:form includeViewParams="true">
    ...
</o:form>
Run Code Online (Sandbox Code Playgroud)

如果您有多个命令按钮/链接和ajax操作,这可能会更容易.

在您的情况下,浏览器地址栏中的URL未更改,因为您正在触发ajax请求.但实际的 URL,您可以<form action>通过右键单击生成的HTML输出 - 浏览器中的查看源,默认情况下不包含当前的GET参数.


具体问题无关,通过在postconstruct中手动收集参数,你基本上忽略了它的有用性和功能<f:viewParam>.我建议您仔细阅读以下答案,以了解如何正确使用它们: