【问题标题】:How to call an external url from JSF 2 passing GET parameter generated inside the backing bean如何从 JSF 2 调用外部 url,传递在支持 bean 中生成的 GET 参数
【发布时间】:2014-01-14 10:32:50
【问题描述】:

我在 p:dataTable 中有类似的东西

<h:commandLink action="#{myMB.connect}" icon="ui-icon-person" title="Connect" target="_blank">  
<f:setPropertyActionListener value="#{site.name}" target="#{myMB.siteId}"  />
Connect 
</h:commandLink>

connect() 计算我想添加到请求中的唯一 ID,如下所示

UUID id = UUID.randomUUID();
//do some things here with the id
return("./terminal.jsp?id="+id.toString());

这失败了,因为 id 在 terminal.jsp 中作为 null 到达。

【问题讨论】:

  • 但是如果你打印到日志,你会得到 id.toString() 的值吗?
  • 这个 url 会在对话框的 iframe 内?

标签: jsp jsf jsf-2


【解决方案1】:

代替

return("./terminal.jsp?id="+id.toString());

你想要的

FacesContext.getCurrentInstance().getExternalContext().redirect("./terminal.jsp?id="+id.toString())

从 action 方法返回 String 只能导航到当前 webapp 中的页面。如果你想导航到一个外部 webapp,你必须使用外部上下文的 redirect() 方法并且只返回 null。

【讨论】:

    【解决方案2】:

    从 JSF 2.0 开始,您可以使用 h:link 控件来发出获取请求,因此您可以这样使用:

    <h:link outcome="terminal.jsp">
        <f:param name="id" value="#{myMB.siteId}" />
    </h:link>
    

    如果你真的想发出一个get请求,你可以发送一个重定向到jsp,你需要将action方法更改为一个action listener,这样:

    public void makeRequest(ActionEvent event) throws IOException {
            HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
            response.sendRedirect("terminal.jsp?id="+id.toString());
    }
    
    <h:commandLink actionListener="#{myMB.makeRequest}" icon="ui-icon-person" title="Connect" target="_blank">
    

    【讨论】:

      【解决方案3】:

      也许您必须编写一个简单的 servlet 并使用 RequestDispatcher。您可以使用 h:outputLink 代替 h:commandLink。那么:

      创建一个 servlet。

      import javax.servlet.annotation.WebServlet;
      import javax.servlet.http.HttpServlet;
      @WebServlet("/myservlet")
      public class MyServlet extends HttpServlet {
          protected void doPost(HttpServletRequest request, HttpServletResponse response)
                                       throws ServletException, IOException {
              UUID id = UUID.randomUUID();
              RequestDispatcher rd=request.getRequestDispatcher("terminal.jsp");
              request.setParameter("id", id.toString());
              rd.forward(request, response);
          }
      }
      

      将commandLink更改为

      <h:outputLink value="#{request.contextPath}/myservlet" title="Connect" target="_blank">  
          <f:param name="siteName" value="#{myMB.siteId}" />
      </h:commandLink>
      

      【讨论】:

        猜你喜欢
        • 2012-01-26
        • 2014-06-14
        • 1970-01-01
        • 2013-12-04
        • 1970-01-01
        • 1970-01-01
        • 2011-11-21
        • 1970-01-01
        • 2011-10-21
        相关资源
        最近更新 更多