2009-06-10 11 views
10

私はjsp、jstl、jsfを使ってアプリケーションを開発しています。私の大学のプロジェクトでは、jsfにとって非常に新しいです。jsfからリダイレクトしますか?

これまでのところすべてがうまくいっています。しかし、私はdinamycパラメータを使ってマネージドBeanからページにリダイレクトする方法を考え出すのに問題があるようです。 例:article.jsp?article_id=2

誰かが私にそれがどのように行われたか教えていただけますか?

私は

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

ようsomethinngを使用しますが、エラーを取得しようとして:

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; 
     } 

ありがとうございます。

答えて

1

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

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

2

なぜ1か所でディスパッチを使用して、もう1つのリダイレクトでリダイレクトしていますか?これは問題の原因ではなく、回答を送った後に戻ってこない。あなたは、あなたがそれをしたいとコメント日付を返すためにDateFormatを使用することができます

  • (それはずっときれいになります):あなたが気にしない場合には、そのほかには、私はいくつかの優しい提案を持っています。
  • エラーArrayListに文字列のみが含まれる場合は、ジェネリック(ArrayList<String>)を使用します。
  • エラーをどうしていますか?
  • commentNameの衛生管理は、非常にです。あなたはブラックリストの代わりにホワイトリストを使うべきです - あなたがコメントに受け入れたいものを定義し、他のすべてをブロックします。今すぐ誰かが<img>タグを挿入して、セッションハイジャックにつながるCookieを盗むページを指すsrcを挿入することができます。
  • ディスパッチをリダイレクトに変更した後で、その下にリターンを追加します(常にこれを行う必要があります)。これを行わないと、あなたが今見ているものが得られる可能性があります。これはあなたが既に別の場所に返信しているということですが、あなたが戻って来なかったので別の場所を送ろうとしています。
+0

あなたは、いくつかの非常に素晴らしい提案を記載されている:私の問題を解決したものだ

。 ありがとう、確かにそれを調べます。 – Dmitris

+0

あなたは大歓迎です:P – laginimaineb

23

同じ問題が発生する場合もあります。

FacesContext.getCurrentInstance().getExternalContext().redirect("article.jsp?article_id=" + articleId); 
+13

説明:HttpServletResponse#sendRedirect()の後に暗黙的に 'FacesContext#responseComplete()'を呼び出して、JSFに応答をレンダリングする必要がないことを指示します。言い換えれば、別の(もっと不器用な)解決策は、 'response.sendRedirect()'行の後に 'FacesContext.getCurrentInstance()。responseComplete()'を自分で呼び出すことでした。 – BalusC

1
FacesContext.getCurrentInstance().getExternalContext().redirect("http://www.myUrl.com"); 

ルネ

+4

こんにちは、それはすでにOP自身によって答えられています:) – BalusC

関連する問題