我正在为我的大学项目开发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)
有人可以告诉我在使用jsf时如何从托管java bean重定向?
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;
}
提前谢谢。
答案 0 :(得分:23)
如果有人会遇到同样的问题。
这就解决了我的问题:
FacesContext.getCurrentInstance().getExternalContext().redirect("article.jsp?article_id=" + articleId);
答案 1 :(得分:2)
为什么你在一个地方使用派遣并在另一个地方重定向?这不是问题的根源 - 不是在发送响应后返回,但是,。除此之外,如果你不介意,我有一些友好的建议:
ArrayList<String>
)。<img>
标签,其中src指向cookie窃取页面,这会导致会话被劫持。答案 2 :(得分:1)
基本上,在调用response.sendRedirect()之前,某些内容已经将输出发送到客户端。将某些内容发送到浏览器后,您无法将其重定向或转发到其他位置。
通常,应在请求上下文中尽早处理可能导致重定向或转发的任何方案,以确保在将任何数据发送到客户端之前重定向。您是否正在通过视图中的标记调用此代码?
答案 3 :(得分:1)
FacesContext.getCurrentInstance().getExternalContext().redirect("http://www.myUrl.com");
勒