在JSF的托管bean中获取GET参数

4

有人能告诉我如何在JSF的托管bean中捕获从URI传递的参数吗? 我有一个导航菜单,所有节点都链接到某个导航案例。我有两个类似的项目:获取产品和发行产品。它们有相同的页面,但有一个不同的参数:productType。我尝试通过将其添加到“to-view-id”元素中的URL来设置它,就像这样:

<navigation-case>
    <from-outcome>acquiring|products</from-outcome>
    <to-view-id>/pages/products/list_products.jspx?productType=acquiring</to-view-id>
</navigation-case>

<navigation-case>
    <from-outcome>issuing|products</from-outcome>
    <to-view-id>/pages/products/list_products.jspx?productType=issuing</to-view-id>
</navigation-case>

但我无法从我的托管bean中获取“productType”。我尝试通过FacesContext这样获取它:

FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("productType")

就像这样:

HttpServletRequest request = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest();
    request.getParameter("productType");

我尝试将其包含为faces-config.xml中托管bean的参数,然后通过普通setter获取它:

 <managed-bean>
        <managed-bean-name>MbProducts</managed-bean-name>
        <managed-bean-class>my.package.product.MbProducts</managed-bean-class>
        <managed-bean-scope>request</managed-bean-scope>
     <managed-property>
         <property-name>productType</property-name>
         <value>#{param.productType}</value>
     </managed-property>
    </managed-bean>
...
public class MbProducts {
...
 public void setProductType(String productType) {
  this.productType = productType;
 }
...
}

但是这些方法都没有帮助我。它们都返回了空值。我该如何获取这个productType?或者我该怎么以其他方式传递它?

1个回答

3
默认情况下,导航规则会执行“前向”操作。也就是说,它会重用最初的请求。无论你如何访问转发资源中的请求参数,它都会尝试从最初已处理的请求中获取它们。
要解决这个问题,你需要触发一个“重定向”,而不是转发。这将创建一个全新的请求(在浏览器地址栏中也会反映出来)。
在JSF中,添加
<redirect/>

导航案例应该做什么。

谢谢,BalusC!在我的情况下,我还必须将 .jspx 更改为 .jsf,因为使用 <redirect/> 会显示 CompilationException :) - mykola

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接