6

我有一个简单的页面,它与@RequestScoped支持 bean 相关联。我从传递参数“项目”的其他页面进入此页面。所以当我进入正确的页面时,我有 url 之类的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"/>

支持豆:

@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:viewParamExternalContextServletContext无法获取这些参数。

我不想更改@RequestScoped@SessionsScoped,也不能使用@ViewScoped,因为我正在使用 CDI bean,我不想混合它们。

4

1 回答 1

10

您需要<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 请求。但是,您可以通过右键单击生成的 HTML 输出中看到的实际URL - 在浏览器中查看源,默认情况下不包含当前的 GET 参数。<form action>


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

于 2013-04-24T11:34:15.943 回答