【问题标题】:Redirect to jsp. Why url is not ending /response.jsp?重定向到jsp。为什么 url 没有结束 /response.jsp?
【发布时间】:2014-06-11 09:35:36
【问题描述】:

我有通过以下方式重定向到 jsp 的 servlet:

request.setAttribute("responseVar",responseVar); request.getRequestDispatcher("response.jsp").include(request, response);

为什么在浏览器 url 中看起来像 localhost:8080/servletname/servletname 而不像 localhost:8080/servletname/response.jsp

我该如何解决?

【问题讨论】:

  • include() 方法只是在当前响应中合并 JSP 的内容。在此处阅读更多信息General JSP Overview

标签: jsp servlets


【解决方案1】:

您需要的是response.sendRedirect("response.jsp");,它也会更改 URL,但它不会记住请求中设置的任何属性。这是一个单独的请求。


HttpServletResponse#sendRedirect() 声明的内容:

使用指定的重定向位置 URL 向客户端发送临时重定向响应。此方法可以接受相对 URL; servlet 容器必须在将响应发送到客户端之前将相对 URL 转换为绝对 URL。如果该位置是相对的,没有前导“/”,则容器将其解释为相对于当前请求 URI。如果位置与前导“/”相对,则容器将其解释为相对于 servlet 容器根目录。

如果响应已经提交,这个方法会抛出一个IllegalStateException。使用此方法后,应将响应视为已提交,不应写入。


编辑

如果您还需要访问属性,请尝试任一选项:

  1. 将值作为查询参数发送,但查询字符串长度有限制

    小服务程序

    response.sendRedirect("response.jsp?responseVar="+responseVar);
    

    JSP

    ${param.responseVar}
    
  2. 设置为会话属性

    小服务程序

    request.getSession().setAttribute("responseVar",responseVar);
    

    JSP

    ${sessionScope.responseVar}
    
  3. web.xml中修改Servlet本身的url-pattern,如下图,includeforward也可以使用。

    web.xml

    <servlet>
       <servlet-name>MyServlet</servlet-name>
       <servlet-class>com.x.y.z.MyServlet</servlet-class>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>MyServlet</servlet-name>
        <url-pattern>/response.jsp</url-pattern>
    </servlet-mapping>
    

【讨论】:

  • 我已编辑帖子。使用sendRedirect 我不能在jsp 中使用responseVar。如何在请求范围内使用保存属性更改 url?
  • 正如我在帖子中提到的。这是一个单独的请求,因此所有请求属性都将丢失。
  • 谢谢。你能推荐你认为最有用的书吗
  • 肯定从Oracle official doc on JSP开始,这里是PDF
【解决方案2】:

建议使用include 方法使用forward 方法

request.getRequestDispatcher("response.jsp").forward(request, response);

RequestDispatcher 的include 方法包含RequestDispatcher 的resource 和forward 方法,将您的请求和响应转发到您想要的资源。

如需更多帮助,请转至HERE

是的,但它不会在 url 中显示您的 response.jsp

为此你必须使用

response.sendRedirect("response.jsp");

【讨论】:

  • 跟转发url是一样的。
  • 这与我的帖子有点不同吗?
  • 测试我发现的内容后检查答案
  • 你的答案是正确的,但我的答案仍然不是这样的:(
猜你喜欢
  • 2017-01-01
  • 2019-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 2016-03-07
相关资源
最近更新 更多