我有一个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);
}
浏览器中的网址会显示:
http://mywebsite.com/my_work/do/login
而不是:
http://mywebsite.com/my_work/login.jsp
将显示login.jsp
页面,只是网址错误。这会导致问题,因为我必须在每个JSP中包含2 x引用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>
任何帮助都会很棒。我已经完成了所有工作,但我猜这不正确!
应该注意,任何转发都会发生这种情况。
答案 0 :(得分:4)
这是因为您要将请求转发给JSP
。
if(request.getPathInfo().equals("/login"){
dispatcher = this.getServletContext().getRequestDispatcher("/login.jsp");
dispatcher.forward(request, response);
}
当您forward a request
到下一个JSP or Servlet
时,它会继续显示您转发的浏览器地址栏中URL pattern
的{{1}}。
如果您希望更改Servlet
,则应URL
。
redirect
因此,您的代码应为
response.sendRedirect("YOUR_JSP");
注意强>
if(request.getPathInfo().equals("/login"){
response.sendRedirect("/login.jsp");
}
请求(即使用RequestDispatcher)和Forwarding
请求(即使用sendRedirect)之间的区别在于,如果您将请求转发到下一个资源,那么您的同一redirecting
个对象传递到下一个资源,因此其request
的所有内容都会发送到下一个attributes & parameters
。
相反,如果您重定向请求,则会要求客户端(浏览器)向JSP or Servlet
发送new request
。因此,请求中的所有先前next resource
都无法在下一个资源的新请求中访问。
但是,parameters and attributes
或(parameters & attributes)
中存储的信息session
不会受到重定向请求的影响。
答案 1 :(得分:1)
执行重定向而不是转发(并处理其含义)是以引用静态资源的方式修复问题的完全错误的方法。
除非您了解执行重定向的含义,否则最好(也是最简单)的解决方案是修复引用静态资源的方式。
您可以通过计算和设置基本路径,以与框架无关的方式执行此操作(尽管您的框架可能提供其他方法)。
http://www.w3schools.com/tags/tag_base.asp
在下文中,无论当前资源的路径如何,始终会相对于webapp的根引用JS和CSS文件。
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!--
To avoid scriptlets and use JSTL see:
http://stackoverflow.com/questions/6271075/how-to-get-the-base-url-from-jsp-request-object
-->
<%
String path = request.getContextPath();
String basePath = request.getScheme()
+ "://"
+ request.getServerName()
+ ":"
+ (request.getServerPort() != 80
? request.getServerPort()
: "") + path + "/";
%>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>ABC</title>
<base href="<%=basePath%>" />
<link href="css/styles.css" rel="stylesheet"
media="screen" />
<script src="js/jquery-1.8.3.js"></script>
</head>
答案 2 :(得分:0)
只需确保URL模式的地址与模式完全匹配。 **这些模式区分大小写。花了我几个小时找出类似的问题。 **