JSP - Servlet没有正确转发到JSP

时间:2014-12-18 11:00:24

标签: 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);
}

浏览器中的网址会显示:

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>

Screenshot of the Servlet tab

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

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

3 个答案:

答案 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模式的地址与模式完全匹配。 **这些模式区分大小写。花了我几个小时找出类似的问题。 **