使用功能后如何维护网址?

时间:2012-09-06 10:02:42

标签: url jsf navigation managed-bean faces-config

我的网址有问题。 首先,我必须显示图像和图像的信息 但我需要点击一个按钮来显示我的信息。

这是显示图像和未显示信息的链接。 门户/面/ chicken.jsp?image_id = 1

所以,点击按钮后。它变成了portal / faces / chicken.jsp

我正在使用的检索图像的代码需要url image_id = 1 request.getParameter(“image_id”)显示图像。

这是我的按钮代码来自jsf:

<h:commandButton action="#{bean1.checkwork}" value="Get Info" type="submit">
    <f:param name="id" value="#{param['image_id']}"></f:param>
</h:commandButton>

这是我的faces-config.xml的代码:

<navigation-rule>
    <from-view-id>/MainPage.jsp</from-view-id>
    <navigation-case>
        <from-action>#{bean1.checkwork}</from-action>
        <from-outcome>successful</from-outcome>
        <to-view-id>chicken.jsp?image_id=#{param['image_id']}</to-view-id>
    </navigation-case>
</navigation-rule>

这是我的功能代码。

      public String checkwork()
      { 
           HttpServletRequest request = (HttpServletRequest)
           FacesContext.getCurrentInstance().getExternalContext().getRequest();
           String image_ID = null;
              if(request!=null)
              {
                   image_ID = request.getParameter("image_id");

                   images(image_ID);
                  student(matric);

               }
          else
          {
               System.out.println("fail");
                }

    return "successful";

}

那么,它与jsf,托管bean还是faces-config.xml有什么关系? 有人知道我的代码有问题吗?

1 个答案:

答案 0 :(得分:1)

当您按下按钮时,它确实不会出现在URL中,因为命令按钮会在请求正文而不是请求URL中发送带有参数的POST请求。所以请求参数绝对可用。使用HTTP流量检查器(按Chrome / IE9 / Firebug中的F12),您可以看到它。

由于您为<f:param>分配了错误的名称,导致您的具体问题。

<f:param name="id" value="#{param['image_id']}"></f:param>

这种方式只能由request.getParameter("id")提供,而不是getParameter("image_id")提供。相应地修改名称:

<f:param name="image_id" value="#{param['image_id']}" />

关于在“函数”(“函数”是错误的术语,你可能意味着“方法”,“动作方法”)之后维护URL的具体问题,只需使用GET而不是POST。使用<h:button>代替<h:commandButton>。您只需要更改代码以调用(post)构造函数中的实际操作或与目标视图关联的bean的<f:event preRenderView>


对具体问题

无关,有更好的方法可以在你的支持bean中获取它。

String imageId = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("image_id");

在您的JSF代码中导入javax.servlet.*表示您正在做的事情可能是笨拙的方式。请注意,request 从不为null(JSF代码还会如何执行?),因此request上的nullcheck也完全没必要。

另一种方法是使用@ManagedProperty

@ManagedProperty("#{param.image_id}")
private String imageId; // +setter

这仅适用于请求范围的bean。