Ответ 1
Если кто-то столкнется с одной и той же проблемой.
Что решило мою проблему:
FacesContext.getCurrentInstance().getExternalContext().redirect("article.jsp?article_id=" + articleId);
Я работаю над приложением с jsp, jstl и jsf для моего проекта в колледже, который, как говорится, я также очень новичок в jsf.
Все идет хорошо. Тем не менее, мне кажется, что проблема заключается в том, как сделать перенаправление с управляемого bean на страницу с параметрами dinamyc.
Например article.jsp?article_id=2
Может кто-нибудь сказать мне, как это делается?
Я пытался использовать что-то вроде
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;
}
Спасибо заранее.
Если кто-то столкнется с одной и той же проблемой.
Что решило мою проблему:
FacesContext.getCurrentInstance().getExternalContext().redirect("article.jsp?article_id=" + articleId);
Почему вы используете отправку в одном месте и перенаправляете в другую? Это не является источником проблемы, но не возвращается после отправки ответов. Другое, тогда, если вы не возражаете, у меня есть несколько дружеских предложений:
ArrayList<String>
).<img>
с помощью src, указывающего на страницу хищения файлов cookie, которая приведет к захвату сеанса.В принципе, что-то уже отправляет вывод клиенту, прежде чем вы выполните вызов response.sendRedirect(). Как только что-то было отправлено в браузер, вы не можете перенаправить или переслать их в другое место.
В общем, любые сценарии, которые могут привести к перенаправлению или переходу, должны быть обработаны как можно раньше в контексте запроса, чтобы обеспечить перенаправление, прежде чем отправлять какие-либо данные клиенту. Вы делаете что-то вроде вызова этого кода через тег в представлении?
FacesContext.getCurrentInstance().getExternalContext().redirect("http://www.myUrl.com");
Рене