如何从JSF 2调用外部URL传递在辅助bean内生成的GET参数

时间:2013-12-26 19:48:55

标签: jsp jsf jsf-2

我在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的形式到达。

3 个答案:

答案 0 :(得分:1)

由于JSF 2.0你有h:link控件来发出get请求,所以你可以这样使用:

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

如果您真的想要发送get请求,可以向jsp发送重定向,则需要将action方法更改为动作侦听器,以便:

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">

答案 1 :(得分:1)

而不是

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

你想要

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

从操作方法返回字符串只能导航到当前webapp中的页面。如果要导航到外部Web应用程序,则必须使用外部上下文的redirect()方法并返回null。

答案 2 :(得分:0)

也许您必须编写一个简单的servlet并使用RequestDispatcher。而不是h:commandLink,您可以使用h:outputLink。然后:

创建一个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>