Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从jsf重定向?_Java_Jsp_Jsf_Jstl_Javabeans - Fatal编程技术网

Java 从jsf重定向?

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_

我正在为我的大学项目使用jsp、jstl和jsf开发应用程序,也就是说,我对jsf也很陌生

到目前为止,一切进展顺利。然而,我似乎在弄清楚如何使用dinamyc参数从托管bean重定向到页面时遇到了问题。 例如
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");