从jsf重定向?

我正在为我的大学项目使用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重定向?

贝娄是我的代码(可能是错误的,这就是为什么重定向不工作)。

 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(" 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); 

你为什么在一个地方使用派遣并在另一个地方重定向? 这不是问题的根源 – 但是,在发送响应之后不会返回。 除此之外,如果你不介意,我有一些友好的建议:

  • 您可以使用DateFormat根据需要返回注释日期(它会清晰)。
  • 如果错误ArrayList仅包含字符串,请使用generics( ArrayList )。
  • 你在做什么错误?
  • 您对commentName的卫生非常危险。 您应该使用白名单而不是黑名单 – 在评论中定义您希望接受的内容并阻止其他所有内容。 现在有人可以插入一个标签,其中src指向一个cookie窃取页面,这将导致会话劫持。
  • 将调度更改为重定向后,在其下方添加一个返回(您应该始终执行此操作。不执行此操作可能会导致您现在看到的内容,即您已经在其他地方发送了响应,但是因为您没有你回来了,你已经到了一个你试图发送另一个的地方)。

基本上,在调用response.sendRedirect()之前,某些内容已经将输出发送到客户端。 将某些内容发送到浏览器后,您无法将其重定向或转发到其他位置。

通常,应在请求上下文中尽早处理可能导致重定向或转发的任何方案,以确保在将任何数据发送到客户端之前进行重定向。 您是否正在通过视图中的标记调用此代码?

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

勒内