Java 从jsf重定向?
我正在为我的大学项目使用jsp、jstl和jsf开发应用程序,也就是说,我对jsf也很陌生 到目前为止,一切进展顺利。然而,我似乎在弄清楚如何使用dinamyc参数从托管bean重定向到页面时遇到了问题。 例如Java 从jsf重定向?,java,jsp,jsf,jstl,javabeans,Java,Jsp,Jsf,Jstl,Javabeans,我正在为我的大学项目使用jsp、jstl和jsf开发应用程序,也就是说,我对jsf也很陌生 到目前为止,一切进展顺利。然而,我似乎在弄清楚如何使用dinamyc参数从托管bean重定向到页面时遇到了问题。 例如article.jsp?article\u id=2 谁能告诉我是怎么做的吗 我一直在试着用像这样的东西 FacesContext.getCurrentInstance().getExternalContext().dispatch("faces/article.jsp2?article_
article.jsp?article\u 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时如何从托管JavaBean重定向吗
下面是我的代码(可能有问题,这就是重定向不起作用的原因)
HttpServletRequest=(HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest();
HttpServletResponse=(HttpServletResponse)FacesContext.getCurrentInstance().getExternalContext().getResponse();
String articleId=request.getSession().getAttribute(“article_id”).toString();
//String articleId=request.getParameter(“article_id”);
字符串authorName=request.getSession().getAttribute(“用户名”).toString();
java.util.Calendar Calendar=java.util.Calendar.getInstance();
String commentDate=String.valueOf(calendar.get(java.util.calendar.DAY\u OF_MONTH))+“;
commentDate+=String.valueOf(calendar.get(java.util.calendar.MONTH))+“;
commentDate+=String.valueOf(calendar.get(java.util.calendar.YEAR));
ArrayList错误=新建ArrayList();
如果(commentName.contains(“),则基本上,在您调用response.sendRedirect()之前,某些内容已经向客户端发送了输出。一旦某些内容发送到浏览器,您就无法将其重定向或转发到其他位置
一般来说,任何可能导致重定向或转发的场景都应该在请求上下文中尽早处理,以确保在向客户端发送任何数据之前发生重定向。您是否正在执行类似于通过视图中的标记调用此代码的操作?为什么要在一个位置使用dispatch,在oth中使用redirect呃?这不是问题的根源——但是,在发送回复后不返回才是。除此之外,如果你不介意的话,我有一些友好的建议:
- 您可以使用DateFormat返回您想要的注释日期(这样会更简洁)
- 如果错误ArrayList仅包含字符串,请使用泛型(
ArrayList
)
- 你怎么处理这些错误
- 您对commentName的使用非常危险。您应该使用白名单而不是黑名单-定义您希望在评论中接受的内容并阻止其他内容。现在有人可以插入
- 在将发送更改为重定向后,在其下方添加一个返回(您应该始终这样做。不这样做可能会导致您现在看到的结果,即您已经在其他地方发送了响应,但由于您尚未返回,因此您已经到达了尝试发送另一个响应的位置)
以防有人遇到同样的问题
这就解决了我的问题:
FacesContext.getCurrentInstance().getExternalContext().redirect("article.jsp?article_id=" + articleId);
Rene您列出了一些非常好的建议。非常感谢,我们一定会仔细研究。说明:它在HttpServletResponse\sendRedirect()
之后隐式调用FacesContext\responseComplete()
来指示JSF不需要呈现响应。换句话说,另一个(更笨拙)解决方案是在response.sendRedirect()
行之后自己调用FacesContext.getCurrentInstance().responseComplete()
。
FacesContext.getCurrentInstance().getExternalContext().redirect("article.jsp?article_id=" + articleId);
FacesContext.getCurrentInstance().getExternalContext().redirect("http://www.myUrl.com");