我有一个 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>
任何帮助都会很棒。我已经完成了所有工作,但我猜这是不正确的!
应该注意的是,任何转发都会发生这种情况。
最佳答案
这是因为您正在将请求转发到您的 JSP
。
if(request.getPathInfo().equals("/login"){
dispatcher = this.getServletContext().getRequestDispatcher("/login.jsp");
dispatcher.forward(request, response);
}
当您转发请求
到下一个JSP或Servlet
时,它会继续显示Servlet
的URL模式
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/