2009-06-10 39 views
10

Tôi đang làm việc trên ứng dụng với jsp, jstl và jsf cho dự án đại học của tôi, điều đó đang được nói, tôi cũng rất mới với jsf.chuyển hướng từ jsf?

Mọi thứ đang diễn ra tuyệt vời cho đến nay. Tuy nhiên, tôi dường như có một vấn đề tìm ra cách chuyển hướng từ bean được quản lý sang trang với các tham số dinamyc. Ví dụ: article.jsp?article_id=2

Ai đó có thể cho tôi biết cách thực hiện?

Tôi đã cố gắng để sử dụng somethinng như

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

Nhưng nhận được lỗi:

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) 

Tôi đã cố gắng để sử dụng

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

Nhưng một lần nữa nhận được một lỗi.

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

Ai đó có thể cho tôi biết cách chuyển hướng từ bean java được quản lý khi làm việc với jsf?

Dưới đây là mã của tôi (có thể đã xảy ra sự cố với điều đó và đó là lý do tại sao chuyển hướng không hoạt động).

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

Cảm ơn bạn trước.

Trả lời

1

Về cơ bản, một cái gì đó đã gửi đầu ra cho khách hàng trước khi bạn thực hiện cuộc gọi đến response.sendRedirect(). Khi một thứ gì đó đã được gửi tới trình duyệt, bạn không thể chuyển hướng hoặc chuyển tiếp chúng đến một địa điểm khác.

Nói chung, mọi trường hợp có thể dẫn đến chuyển hướng hoặc chuyển tiếp phải được xử lý càng sớm càng tốt trong ngữ cảnh yêu cầu để đảm bảo chuyển hướng xảy ra trước khi bạn gửi bất kỳ dữ liệu nào cho khách hàng. Bạn đang làm điều gì đó như gọi mã này thông qua thẻ trong chế độ xem?

2

Tại sao bạn sử dụng công văn ở một nơi và chuyển hướng ở một nơi khác? Đây không phải là nguồn gốc của vấn đề - tuy nhiên, không trả lại sau khi gửi câu trả lời. Khác sau đó rằng, nếu bạn không nhớ, tôi có một vài gợi ý thân thiện:

  • Bạn có thể sử dụng DateFormat để trả lại ngày bình luận như bạn muốn nó (nó sẽ được nhiều sạch).
  • Nếu lỗi ArrayList chỉ chứa các chuỗi, hãy sử dụng Generics (ArrayList<String>).
  • Bạn đang làm gì với lỗi?
  • Vệ sinh của bạn về bình luậnName là rất nguy hiểm. Bạn nên sử dụng danh sách trắng thay vì danh sách cấm - xác định nội dung bạn muốn chấp nhận trong nhận xét và chặn mọi thứ khác. Ngay bây giờ ai đó có thể chèn một thẻ <img> với một src trỏ đến một trang ăn cắp cookie mà sẽ dẫn đến một cuộc tấn công phiên.
  • Sau khi thay đổi công văn sang chuyển hướng thêm trả lại dưới nó (bạn nên luôn luôn làm điều này.Không làm điều này có thể dẫn đến những gì bạn đang thấy ngay bây giờ, đó là bạn đã gửi phản hồi ở một nơi khác, nhưng vì bạn chưa quay trở lại bạn đã đạt đến một nơi mà bạn đang cố gửi một người khác).
+0

Bạn liệt kê một số gợi ý rất tốt đẹp. Cảm ơn rất nhiều, chắc chắn sẽ xem xét nó. – Dmitris

+0

bạn được chào đón: P – laginimaineb

23

Trong trường hợp một số người sẽ gặp phải sự cố tương tự.

Đó là những gì giải quyết vấn đề của tôi:

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

Giải thích: nó ngầm gọi 'FacesContext # responseComplete()' sau 'HttpServletResponse # sendRedirect()' để hướng dẫn JSF rằng nó không cần trả lời. Nói cách khác, một giải pháp khác (nhiều vụng về) sẽ được gọi là 'FacesContext.getCurrentInstance(). ResponseComplete()' sau dòng 'response.sendRedirect()'. – BalusC

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

René

+4

Xin chào, điều đó đã được trả lời bởi bản thân OP :) – BalusC

Các vấn đề liên quan