【问题标题】:How to forward a request to non-JSF page in action method?如何在操作方法中将请求转发到非 JSF 页面?
【发布时间】:2009-12-17 14:27:17
【问题描述】:

我想将请求从 JSF 操作方法转发到非 JSF 页面。 我在我的 JSF 操作中使用以下代码:

public String submitUserResponse() {
    // ...

    parseResponse("foo.jsp", request, response);

    // ...

    return "nextpage";
}  

private String parseResponse(String uri, HttpServletRequest request, HttpServletResponse response) {
    if (uri != null) { 
        RequestDispatcher dispatcher = request.getRequestDispatcher(uri);
        dispatcher.forward(request, response);
        return null;
    }

    // ...

    return "xxxx";
}

submitUserResponse() 操作方法在用户单击 JSF 页面中的提交按钮时被调用,并且此方法返回 nextpage 字符串。这里请求以正常流程转发到下一个 JSF 页面。但在我的要求中,我需要将请求转发到下一个非 JSF 页面。它正在运行,但它在服务器中显示在异常下方。

java.lang.IllegalStateException: 响应提交后无法转发

我观察到在使用dispatched.forward(uri) 转发我的请求后,parseResponse(...)return "nextpage"; 之间的代码行仍在执行。 response.sendRedirect(url) 也发生了同样的事情。这是如何引起的,我该如何解决?

【问题讨论】:

    标签: jsf navigation forward


    【解决方案1】:

    我的疑惑是:1.为什么在使用 dispatched.forward(uri) 转发我的请求后执行下一行代码。 response.sendRedirect("") 中发生了同样的事情。

    因为你没有调用return跳出方法块。 include()forward()sendRedirect() 确实没有他们自动执行此操作的一些魔法。这些仍然只是 Java 方法,就像其他任何方法一样(当然,System#exit() 除外)。它们将按顺序调用,代码将继续执行,直到方法块或 return 语句结束。这只是关于编写和控制自己的代码流。

    也就是说,正常的 JSF 做法是您应该为此使用 ExternalContext#dispatch()ExternalContext#redirect()(第一个适用于您的情况)。它不仅使您的代码免受 JSF 代码(例如 Servlet API)中不必要的“幕后”混乱的影响,而且还消除了调用 FacesContext#responseComplete() 的需要,您也可以这样做来修复您的初始 IllegalStateException问题。

    简而言之:将您的代码替换为

    public void submitUserResponse(){
        String uri = "foo.jsp";
        FacesContext.getCurrentInstance().getExternalContext().dispatch(uri);
    }  
    

    就是这样。无需从 JSF 引擎盖下不必要地挖掘 Servlet 请求/响应。请注意,该方法声明为void。这是完全可以接受的,尽管一些像 IDE 这样的知识渊博的人会抱怨它,如果是这样,那么只需忽略它或替换为 String 并添加 return null;

    另见:

    【讨论】:

    • 我做了同样的事情。但我收到相同的异常消息。在这里,我想将请求重定向到另一个应用程序。所以我使用了 public String editVerismo_initAction(){ .......... FacesContext.getCurrentInstance().getExternalContext().redirect(redirectUrl);返回空值; }
    【解决方案2】:

    这对我有用:

    FacesContext.getCurrentInstance().getExternalContext().dispatch("/ServletUrl");

    (特别注意正斜杠'/')

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多