java - JSP - Servlet 未正确转发到 JSP

标签 java jsp servlets

我有一个 Controller Servlet,它必须将请求转发到特定的 JSP。然而,每当我转发请求时,它都会加载 JSP,但浏览器中的 URL 会执行一些非常奇怪的操作。

例如:

通过index.jsp我点击:<a href="/login" />

在 Controller 中我有一个方法

if(request.getPathInfo().equals("/login"){
  dispatcher = this.getServletContext().getRequestDispatcher("/login.jsp");
  dispatcher.forward(request, response);
}

浏览器中的 URL 会显示:

http://mywebsite.com/my_work/do/login

而不是:

http://mywebsite.com/my_work/login.jsp

login.jsp页面将会显示,只是 URL 错误。这会导致问题,因为我必须在每个 JSP 中包含 2 个对 Javascript 和 CSS 文件的引用,因为相对 URL 会发生变化,具体取决于我是否通过键入 http://mywebsite.com/my_work/login.jsp 手动访问页面。进入浏览器,或者是否通过 Controller servlet 的转发来访问它。

我的 web.xml:

    <?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
    <servlet>
        <servlet-name>Controller</servlet-name>
        <servlet-class>controller.Controller</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Controller</servlet-name>
        <url-pattern>/do/*</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <resource-ref>
        <res-ref-name>jdbc/LessonDatabase</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
        <res-sharing-scope>Shareable</res-sharing-scope>
    </resource-ref>
</web-app>

Screenshot of the Servlet tab

任何帮助都会很棒。我已经完成了所有工作,但我猜这是不正确的!

应该注意的是,任何转发都会发生这种情况。

最佳答案

这是因为您正在将请求转发到您的 JSP

if(request.getPathInfo().equals("/login"){
  dispatcher = this.getServletContext().getRequestDispatcher("/login.jsp");
  dispatcher.forward(request, response);
}

当您转发请求到下一个JSP或Servlet时,它会继续显示ServletURL模式 code> 在您要转发的浏览器地址栏中。

如果您希望更改URL,则应重定向它。

response.sendRedirect("YOUR_JSP");

因此,您的代码应该是,

if(request.getPathInfo().equals("/login"){
  response.sendRedirect("/login.jsp");
}

注意

转发请求(即使用RequestDispatcher)和重定向请求(即使用sendRedirect)之间的区别在于,如果您将请求转发到下一个资源,那么您的相同request 对象被传递到下一个资源,因此它的所有属性和参数都被发送到下一个JSP 或 Servlet

相反,如果您重定向请求,则会要求客户端(浏览器)向下一个资源发送新请求。因此,请求中之前的所有参数和属性都无法在下一个资源的新请求中访问。

但是,存储在 session 上下文中的信息(参数和属性)不受重定向请求的影响。

关于java - JSP - Servlet 未正确转发到 JSP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27544973/

相关文章:

java - 计算两个 double 的平均值?

java - 国际化 : Umlaut not being displayed correctly in JSP

java - 如何阻塞和解除阻塞 servlet 线程?

java - 使用 runtime.getruntime.exec 从 Java 调用 python 脚本

java - 在切换选项卡之前验证 CTabFolder

java - OAuth2 'mac' token 类型是否有任何已知的 Java 实现?

java - RxJava 与 Java 8 并行流

java - 现有应用程序的 MVC 框架

java - HTML 页面作为 AJAX 响应?

Java:如何将值从类/bean 传递到 servlet