gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 17:01:22 26 4
gpt4 key购买 nike

我有一个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com