10

私は大学のプロジェクトでjsp、jstl、およびjsfを使用したアプリケーションに取り組んでいますが、jsfも初めてです。

これまでのところ、すべてがうまくいっています。ただし、マネージド Bean から dinamyc パラメータを使用してページにリダイレクトする方法を理解するのに問題があるようです。例えば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

ある場所でディスパッチを使用し、別の場所でリダイレクトするのはなぜですか? これは問題の原因ではありません - ただし、応答を送信した後に返されないのは問題です。それ以外で、もしよろしければ、いくつかの友好的な提案があります。

  • DateFormat を使用して、必要に応じてコメントの日付を返すことができます (はるかにクリーンになります)。
  • エラー ArrayList に文字列のみが含まれる場合は、ジェネリック ( ArrayList<String>) を使用します。
  • エラーで何をしていますか?
  • commentName の衛生状態は非常に危険です。ブラックリストの代わりにホワイトリストを使用する必要があります。コメントで受け入れたいものを定義し、それ以外はすべてブロックしてください。現在、誰かが<img>src を持つタグを挿入して、Cookie を盗むページを指し、セッション ハイジャックを引き起こす可能性があります。
  • ディスパッチをリダイレクトに変更した後、その下にリターンを追加します (常にこれを行う必要があります。これを行わないと、現在表示されているような結果になる可能性があります。つまり、既に別の場所に応答を送信していますが、別のものを送信しようとしている場所に到達しました)。
于 2009-06-10T05:42:32.470 に答える
1
FacesContext.getCurrentInstance().getExternalContext().redirect("http://www.myUrl.com");

レネ

于 2010-11-08T01:26:09.787 に答える
1

基本的に、response.sendRedirect() を呼び出す前に、何かがすでに出力をクライアントに送信しています。何かがブラウザに送信されると、それらを別の場所にリダイレクトまたは転送することはできません。

一般に、リダイレクトまたは転送が発生する可能性のあるシナリオは、要求コンテキストのできるだけ早い段階で処理して、クライアントにデータを送信する前にリダイレクトが発生するようにする必要があります。ビューのタグを介してこのコードを呼び出すようなことをしていますか?

于 2009-06-10T05:41:24.843 に答える