我正在努力获得一些参数(现在它是两个,但在另一个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§ion_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§ion_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§ion_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>
答案 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:metadata
与f:viewParam
一起使用以及在页面之间导航的includeViewParameters = true技巧非常有用,请查看以下问题:
答案 1 :(得分:2)