10

我正在为我的大学项目申请 jsp、jstl 和 jsf,也就是说,我对 jsf 也很陌生。

到目前为止一切都很好。但是,我似乎在弄清楚如何使用 dinamyc 参数从托管 bean 重定向到页面时遇到问题。例如article.jsp?article_id=2

有人可以告诉我它是怎么做的吗?

我一直在尝试使用类似的东西

FacesContext.getCurrentInstance().getExternalContext().dispatch("faces/article.jsp2?article_id=" + articleId);

但得到错误:

javax.servlet.ServletException: #{postComment.postClick}: javax.faces.FacesException: javax.servlet.ServletException: javax.faces.component.UIViewRoot cannot be cast to com.sun.faces.application.StateManagerImpl$TreeNode
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:256)

我一直在尝试使用

response.sendRedirect("faces/article.jsp2?article_id=" + articleId);
            return;

但是又报错了。

javax.servlet.ServletException: Cannot forward after response has been committed
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:256)

有人可以告诉我在使用 jsf 时如何从托管 Java bean 重定向?

贝娄是我的代码(可能有问题,这就是重定向不起作用的原因)。

HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
        HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();

        String articleId = request.getSession().getAttribute("article_id").toString();
        //String articleId  = request.getParameter("article_id");
        String authorName = request.getSession().getAttribute("user_name").toString();

        java.util.Calendar calendar = java.util.Calendar.getInstance();
        String commentDate = String.valueOf(calendar.get(java.util.Calendar.DAY_OF_MONTH)) + ".";
        commentDate += String.valueOf(calendar.get(java.util.Calendar.MONTH)) + ".";
        commentDate += String.valueOf(calendar.get(java.util.Calendar.YEAR));

         ArrayList error = new ArrayList();

        if(commentName.contains("<"))
        {
            error.add("Comment name contains illegal characters");
        }

        if(commentBody.isEmpty() && commentBody.contains("<script"))
        {
            error.add("Your message body contains illegal characters");
        }

        if(error.size() > 0)
        {
            request.getSession().setAttribute("error", error);
            error.clear();
            FacesContext.getCurrentInstance().getExternalContext().dispatch("article.jsp2?article_id=" + articleId);
        }
        else
        {
            Comment comment = new Comment();
            comment.setCommentAuthor(authorName);
            comment.setCommentBody(commentBody);
            comment.setCommentDate(commentDate);
            comment.setCommentName(commentName);
            comment.setArticleId(articleId);

            DisplayArticleIO addComment = new DisplayArticleIO();
            addComment.postComment(comment);
//            FacesContext.getCurrentInstance().getExternalContext().dispatch("faces/article.jsp2?article_id=" + articleId);
            response.sendRedirect("faces/article.jsp2?article_id=" + articleId);
            return;
        }

先感谢您。

4

4 回答 4

23

万一有人遇到同样的问题。

这就是解决我的问题的方法:

FacesContext.getCurrentInstance().getExternalContext().redirect("article.jsp?article_id=" + articleId);
于 2009-06-10T06:01:28.407 回答
2

为什么你在一个地方使用 dispatch 而在另一个地方重定向?这不是问题的根源 - 但是,在发送响应后不返回。除此之外,如果您不介意,我有一些友好的建议:

  • 您可以使用 DateFormat 根据需要返回评论日期(它会清晰)。
  • 如果错误 ArrayList 仅包含字符串,请使用泛型 ( ArrayList<String>)。
  • 你对这些错误做了什么?
  • 您对 commentName 的卫生非常危险。您应该使用白名单而不是黑名单 - 在评论中定义您希望接受的内容并阻止其他所有内容。现在有人可以插入一个<img>带有 src 的标签,该标签指向一个 cookie 窃取页面,这将导致会话劫持。
  • 将调度更改为重定向后,在其下方添加一个返回(您应该始终这样做。不这样做可能会导致您现在看到的结果,即您已经在其他地方发送了响应,但是因为您没有'没有返回你已经到达你试图发送另一个的地方)。
于 2009-06-10T05:42:32.470 回答
1

基本上,在您调用 response.sendRedirect() 之前,某些东西已经在向客户端发送输出。将某些内容发送到浏览器后,您就无法将它们重定向或转发到其他地方。

通常,任何可能导致重定向或转发的场景都应在请求上下文中尽早处理,以确保在您向客户端发送任何数据之前发生重定向。您是否正在执行类似通过视图中的标记调用此代码的操作?

于 2009-06-10T05:41:24.843 回答
1
FacesContext.getCurrentInstance().getExternalContext().redirect("http://www.myUrl.com");

勒内

于 2010-11-08T01:26:09.787 回答