2009-06-10 58 views
10

Estoy trabajando en la aplicación con jsp, jstl y jsf para mi proyecto universitario, eso está dicho, yo también soy muy nuevo en jsf.redirigir desde jsf?

Todo va muy bien hasta ahora. Sin embargo, parece tener un problema para averiguar cómo redirigir desde beans administrados a páginas con parámetros dinamyc. Por ejemplo article.jsp?article_id=2

¿Alguien puede decirme cómo se hace?

I estado tratando de utilizar como somethinng

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

Pero conseguir el error:

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) 

he estado tratando de utilizar

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

Pero una vez más conseguir un error.

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

Puede alguien por favor dígame cómo vuelvo a dirigir a partir de Java Bean administrado cuando se trabaja con JSF?

Abajo está mi código (tal vez algo malo con eso y es por eso que el redireccionamiento no funciona).

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

Gracias de antemano.

Respuesta

1

Básicamente, algo ya está enviando resultados al cliente antes de realizar la llamada a response.sendRedirect(). Una vez que se ha enviado algo al navegador, no puede redireccionarlo o reenviarlo a otro lugar.

En general, los escenarios que puedan dar como resultado un redireccionamiento o un reenvío se deben manejar lo antes posible en el contexto de la solicitud para garantizar que la redirección ocurra antes de enviar datos al cliente. ¿Estás haciendo algo como llamar a este código a través de una etiqueta en la vista?

2

¿Por qué usa el envío en un lugar y lo redirecciona en el otro? Esta no es la fuente del problema; sin embargo, no volver después de enviar las respuestas sí lo es. Aparte de eso, si no te importa, tengo algunas sugerencias amistosas:

  • Puede utilizar DateFormat para devolver la fecha comentario como quiera que (será mucho más limpia).
  • Si los errores ArrayList solo contienen cadenas, use genéricos (ArrayList<String>).
  • ¿Qué estás haciendo con los errores?
  • Su limpieza del commentNombre es muy peligroso. Debe usar la lista blanca en lugar de la lista negra: defina lo que desea aceptar en un comentario y bloquee todo lo demás. En este momento, alguien podría insertar una etiqueta <img> con un src apuntando a una página de robo de cookies que daría lugar a un secuestro de sesión.
  • Después de cambiar el envío a un redireccionamiento, agregue un retorno debajo de él (siempre debe hacer esto.No hacer esto podría dar como resultado lo que estás viendo en este momento, que es que ya has enviado una respuesta a otro lugar, pero como no has regresado has llegado a un lugar donde intentas enviar a otro).
+0

Se enumeran algunas sugerencias muy agradables. Muchas gracias, definitivamente lo investigaré. – Dmitris

+0

De nada: P – laginimaineb

23

En caso de que alguien tenga el mismo problema.

Eso es lo que resolvió mi problema:

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

Explicación: llama implícitamente a 'FacesContext # responseComplete()' después de 'HttpServletResponse # sendRedirect()' para indicar a JSF que no necesita procesar la respuesta. En otras palabras, otra solución (más torpe) hubiera sido llamar 'FacesContext.getCurrentInstance(). ResponseComplete()' después de la línea 'response.sendRedirect()'. – BalusC

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

René

+4

Hola, eso ya ha sido respondido por el propio OP :) – BalusC

Cuestiones relacionadas