2009-06-10 13 views
10

Sto lavorando all'applicazione con jsp, jstl e jsf per il mio progetto universitario, questo è stato detto, anch'io sono molto nuovo per jsf.reindirizza da jsf?

Tutto sta andando benissimo finora. Tuttavia, sembra che abbia un problema a capire come eseguire il reindirizzamento dal bean gestito alla pagina con i parametri dinamyc. Ad esempio article.jsp?article_id=2

Qualcuno può dirmi come è fatto?

ho cercato di usare come somethinng

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

Ma ottenere errore:

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) 

ho cercato di utilizzare

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

Ma ancora una volta ottenere un errore.

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

Qualcuno può dirmi come faccio a reindirizzare dal bean Java gestita quando si lavora con JSF?

Bellow è il mio codice (forse qualcosa di sbagliato in questo e perché reindirizzare non funziona).

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

Grazie in anticipo.

risposta

1

Fondamentalmente, qualcosa sta già inviando l'output al client prima di effettuare la chiamata a response.sendRedirect(). Una volta che qualcosa è stato inviato al browser non è possibile reindirizzare o inoltrarlo a un altro posto.

In generale, qualsiasi scenario che potrebbe comportare un reindirizzamento o un inoltro deve essere gestito il più presto possibile nel contesto della richiesta per assicurare che il reindirizzamento si verifichi prima di inviare qualsiasi dato al client. Stai facendo qualcosa come chiamare questo codice tramite un tag nella vista?

2

Perché stai utilizzando la spedizione in un posto e il reindirizzamento nell'altro? Questa non è la fonte del problema, ma non tornare dopo aver inviato le risposte. Altri poi che, se non ti dispiace, ho un paio di suggerimenti amichevoli:

  • È possibile utilizzare DateFormat per restituire la data commento come lo vuoi (che sarà molto più più pulito).
  • Se gli errori ArrayList contengono solo stringhe, utilizzare i generici (ArrayList<String>).
  • Cosa stai facendo con gli errori?
  • Il risanamento del commentoNome è molto pericoloso. Dovresti utilizzare la whitelist invece della blacklist - definire ciò che desideri accettare in un commento e bloccare tutto il resto. In questo momento qualcuno potrebbe inserire un tag <img> con un src che punta a una pagina di furto di cookie che comporterebbe un hijack di sessione.
  • Dopo aver cambiato la spedizione in un reindirizzamento, aggiungi un ritorno sotto di esso (devi sempre farlo.Non farlo potrebbe comportare ciò che stai vedendo in questo momento, ovvero che hai già inviato una risposta da qualche altra parte, ma dal momento che non sei tornato hai raggiunto un punto in cui stai cercando di inviarne un altro).
+0

È elencato alcune molto belle suggerimenti. Grazie mille, ci penserò sicuramente. – Dmitris

+0

prego: P – laginimaineb

23

Nel caso in cui qualcuno si imbattesse nello stesso problema.

Questo è ciò che ha risolto il mio problema:

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

Spiegazione: richiama implicitamente 'FacesContext # responseComplete()' dopo 'HttpServletResponse # sendRedirect()' per indicare a JSF che non è necessario eseguire il rendering della risposta. In altre parole, un'altra soluzione (più maldestra) sarebbe stata chiamare 'FacesContext.getCurrentInstance(). ResponseComplete()' dopo la riga 'response.sendRedirect()'. – BalusC

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

René

+4

Ciao, questo è già stato risolto dall'OP stesso :) – BalusC