JSF - 参数中的空值 - FacesContext

时间:2013-01-06 13:25:58

标签: jsf null facescontext

我正在努力获得一些参数(现在它是两个,但在另一个xhtml上我可能需要更多)。

在页面index.html上我有一个链接,用于调用Threads.xhtml,参数为user_id和section_id:

<h:dataTable value="#{Sections.sections}" var="Section">
    <h:column>
        <h:form>
            <h:link value="#{Section.section_label}" outcome="Threads">
                <f:param name="user_id" value="#{LoginIn.user_id}"/>
                <f:param name="section_id" value="#{Section.section_id}"/>
            </h:link>
        </h:form>
    </h:column>
</h:dataTable>

当我点击链接时,它会转到前面:

Project/faces/Threads.xhtml?user_id=5&section_id=2

所以这很好:)。

现在,在Threads.xhtml页面上,我有一个链接(一个链接,不是dataTable,如index.xhtml - 创建新的部分),页面NewThread.xhtml,参数user_id和section_id:

<h:form>
    <h:link value="#{msg.create_new_thread}" outcome="NewThread">
        <f:param name="user_id" value="#{param.user_id}"/>
        <f:param name="section_id" value="#{param.section_id}"/>
    </h:link>
</h:form>

当我点击链接时,它会转到,例如:..

Project/faces/NewThread.xhtml?user_id=5&section_id=2

所以它也很好:)。

现在,我通过以下方式检查user_id和section_id的NewThread.xhtml页面值:

<h:outputText value="User_id: #{param.user_id}"/><br/>
<h:outputText value="Section_id: #{param.section_id}"/><br/>

我在页面上看到了值:

User_id: 5
Section_id: 2

好吧:)。但现在,当我试图在Java代码NewThread.java中获取这些值时,它们只返回null:

FacesContext facesContext = FacesContext.getCurrentInstance();
String user_id = (String) facesContext.getExternalContext().getRequestParameterMap().get("user_id");
String section_id= (String) facesContext.getExternalContext().getRequestParameterMap().get("section_id");
//For test:
System.out.println("User_id: " + user_id);
System.out.println("Section_id: " + section_id);

在控制台中我得到了:

User_id: null
Section_id: null

我也尝试使用toString()方法,但它没有帮助。

回到index.xhtml,当我点击其中一个部分的链接时,例如。第二部分(由任何用户,例如user_id = 5),它转到Threads.xhtml:

Project/faces/Threads.xhtml?user_id=5&section_id=2

在Threads.xhtml上我有第二部分的Threads列表(但这部分xhtml代码无关紧要):

<h:dataTable value="#{Threads.threads}" var="Thread">
    <h:column>
        <h:link value="#{Thread.thread_label}" outcome="Threads">
            <f:param name="thread_id" value="#{Thread.thread_id}"/>
        </h:link>
    </h:column>
</h:dataTable>

在Threads.java的Java代码上,我得到了:

FacesContext facesContext = FacesContext.getCurrentInstance();
String section_id = (String) facesContext.getExternalContext().getRequestParameterMap().get("section_id");
System.out.println("Section_id: " + section_id);

在控制台中我得到了:

Section_id: 2

所以WTF?一旦它起作用,但另一次它不会。

编辑:

对不起,我忘了。我通过NewThread.xhtml中的commandButton访问NewThread.java:

<h:commandButton value="#{msg.add_thread}" action="#{NewThread.AddThread}"/>

并在NewThread.java中调用AddThread方法;在尝试(尝试捕获)AddThread方法时,我正在尝试获取参数。

我已经添加到faces-config.xml:

<managed-bean>
    <managed-bean-name>Threads</managed-bean-name>
    <managed-bean-class>forum.Threads</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<managed-bean>
    <managed-bean-name>NewThread</managed-bean-name>
    <managed-bean-class>forum.NewThread</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
</managed-bean>

2 个答案:

答案 0 :(得分:4)

点击h:commandButton后,会发出新请求。问题是参数没有传递给这个请求。

因此,如果您希望请求范围的bean NewThread 从请求参数中获取数据,则必须在h:commandButton的请求中包含参数。试试这个:

<h:commandButton value="#{msg.add_thread}" action="#{NewThread.AddThread}">
    <f:param name="user_id" value="#{param.user_id}"/>
    <f:param name="section_id" value="#{param.section_id}"/>
</h:commandButton>

当您使用JSF 2时,您可能会发现将f:metadataf:viewParam一起使用以及在页面之间导航的includeViewParameters = true技巧非常有用,请查看以下问题:

答案 1 :(得分:2)

正如伊莱亚斯所说,当你点击命令按钮时会有一个新请求(一个帖子),这将不包括上一个请求的获取参数。

另一种解决方案是将上述视图参数与o:form中的OmniFaces组件结合使用,该组件具有自动将所有视图参数保留为GET参数的属性:

<o:form includeViewParams="true">

这还有一个额外的好处,即用户可以在URL中查看这些参数,因此如果他们通过点击浏览器的地址栏来复制或刷新页面,事情就会按预期继续工作。