0

我正在尝试获取一些参数(现在是两个,但在另一个 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 我有第二部分的线程列表(但这部分 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 方法的 try(try-catch)中,我试图获取参数。

我也已经添加到 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>
4

2 回答 2

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 时,您可能会发现与 includeViewParameters=true 技巧一起用于在页面之间导航很有用f:metadataf:viewParam请查看以下问题:

于 2013-01-06T14:08:25.017 回答
2

正如 elias 所说,当您单击命令按钮时,会出现一个新请求(一个帖子),这不会包括上一个请求中的 get 参数。

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

<o:form includeViewParams="true">

这具有额外的优势,即用户可以在 URL 中看到这些参数,因此如果他们复制它或通过在浏览器的地址栏中按 Enter 键来刷新页面,事情会继续按预期工作。

于 2013-01-06T14:49:54.357 回答