10 Stimmen

von jsf umleiten?

Ich arbeite an der Anwendung mit jsp, jstl und jsf für mein College-Projekt, das ist gesagt, ich bin auch sehr neu zu jsf.

Bis jetzt läuft alles bestens. Allerdings scheint ich ein Problem haben, herauszufinden, wie man Redirect von verwalteten Bean auf Seite mit Dinamyc-Parameter zu tun. Zum Beispiel article.jsp?article_id=2

Kann mir jemand sagen, wie man das macht?

Ich habe versucht, etwas zu verwenden wie

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

Aber ich bekomme einen Fehler:

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)

Ich habe versucht, die

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

Aber ich bekomme wieder einen Fehler.

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

Kann jemand bitte sagen Sie mir, wie ich von verwalteten Java Bean umleiten, wenn mit jsf arbeiten?

Bellow ist mein Code (vielleicht etwas falsch mit, dass und das ist, warum redirect nicht funktioniert).

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

Ich danke Ihnen im Voraus.

23voto

Dmitris Punkte 3348

Für den Fall, dass jemand auf das gleiche Problem stößt.

Das war die Lösung für mein Problem:

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

2voto

laginimaineb Punkte 8115

Warum verwenden Sie an einer Stelle dispatch und an der anderen redirect? Das ist nicht die Ursache des Problems - nicht zurückkehren nach dem Senden von Antworten, ist jedoch. Ansonsten habe ich, wenn Sie nichts dagegen haben, ein paar freundliche Vorschläge:

  • Sie können DateFormat verwenden, um das Datum des Kommentars so zurückzugeben, wie Sie es wünschen (es wird viel Reiniger).
  • Wenn die Fehler-ArrayList nur Strings enthält, verwenden Sie Generika ( ArrayList<String> ).
  • Wie gehen Sie mit den Fehlern um?
  • Ihre Bereinigung des Kommentarnamens ist sehr gefährlich. Sie sollten Whitelisting statt Blacklisting verwenden - definieren Sie, was Sie in einem Kommentar akzeptieren wollen und blockieren Sie alles andere. Momentan könnte jemand einen <img> Tag mit einem src, der auf eine Seite verweist, die Cookies stiehlt, was zu einem Session-Hijack führen würde.
  • Nachdem Sie die Weiterleitung in eine Umleitung umgewandelt haben, fügen Sie ein Return darunter ein (dies sollten Sie immer tun). Wenn Sie das nicht tun, könnte das zu dem führen, was Sie gerade sehen, nämlich dass Sie bereits eine Antwort an eine andere Stelle gesendet haben, aber da Sie nicht zurückgekehrt sind, haben Sie eine Stelle erreicht, an der Sie versuchen, eine weitere zu senden).

1voto

SystemOut Punkte 36

Im Grunde wird bereits etwas an den Client gesendet, bevor Sie response.sendRedirect() aufrufen. Sobald etwas an den Browser gesendet wurde, können Sie es nicht mehr umleiten oder an eine andere Stelle weiterleiten.

Im Allgemeinen sollten alle Szenarien, die zu einer Um- oder Weiterleitung führen könnten, so früh wie möglich im Anfragekontext behandelt werden, um sicherzustellen, dass die Umleitung erfolgt, bevor Sie Daten an den Client senden. Machen Sie etwas wie den Aufruf dieses Codes über ein Tag in der Ansicht?

1voto

Rene Punkte 19
FacesContext.getCurrentInstance().getExternalContext().redirect("http://www.myUrl.com");

René

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X