2009-06-10 2 views
10

Я работаю над приложением с jsp, jstl и jsf для моего проекта в колледже, который, как говорится, я также очень новичок в jsf.перенаправление с jsf?

Все идет хорошо. Тем не менее, мне кажется, что проблема заключается в том, как сделать перенаправление с управляемого компонента на страницу с параметрами dinamyc. Например article.jsp?article_id=2

Может кто-нибудь сказать мне, как это делается?

Я пытался использовать somethinng как

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) 

Может кто-нибудь пожалуйста, скажите мне, как я перенаправлять из управляемого Java Bean при работе с JSF?

Bellow - это мой код (возможно, что-то не так с этим, и именно поэтому перенаправление не работает).

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

Почему вы используете отправку в одном месте и перенаправляете в другую? Это не является источником проблемы, но не возвращается после отправки ответов. Другое то, что, если вы не возражаете, у меня есть несколько дружеских советов:

  • Вы можете использовать DateFormat вернуть комментарий дату, как вы хотите его (это будет гораздо чище).
  • Если ошибки ArrayList содержат только строки, используйте generics (ArrayList<String>).
  • Что вы делаете с ошибками?
  • Ваша санация комментарияName очень опасно. Вы должны использовать белый список вместо черного списка - определить, что вы хотите принять в комментарии, и заблокировать все остальное. Прямо сейчас кто-то может вставить тег <img> с помощью src, указывающий на страницу хищения файлов cookie, которая приведет к захвату сеанса.
  • После смены отправки на переадресацию добавьте возврат под ним (вы всегда должны это делать.Не делать этого может привести к тому, что вы видите прямо сейчас, а это то, что вы уже отправили ответ где-то в другом месте, но поскольку вы не вернулись, вы достигли места, где вы пытаетесь отправить другое).
+0

Вы перечислили некоторые очень хорошие предложения. Большое спасибо, обязательно заглянем в него. – Dmitris

+0

приветствуется: P – laginimaineb

23

В случае, если кто-то столкнется с проблемой.

Вот что решить мою проблему:

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

Объяснение: он неявно вызывает 'FacesContext # responseComplete()' после 'HttpServletResponse # sendRedirect()', чтобы проинструктировать JSF о том, что ему не нужно отображать ответ. Другими словами, другое (более неуклюжее) решение заключалось бы в вызове 'FacesContext.getCurrentInstance(). ResponseComplete()' после строки 'response.sendRedirect()' самостоятельно. – BalusC

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

Рене

+4

Привет, на это уже ответил сам ОП :) – BalusC

Смежные вопросы