Java:从Servlet重定向导致一个空白页面

时间:2015-12-22 09:34:22

标签: java html servlets web.xml servlet-filters

我正在尝试从servlet重定向到HTML页面。对于调试,我的servlet,HTML页面和web.xml中的代码量很少

我可以在没有servlet的情况下在浏览器中加载HTML页面。但是当我尝试从servlet重定向到同一页面时,只呈现一个空白页面。没有显示错误。 以下是相关代码。

  

的web.xml

    <?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    id="WebApp_ID" version="2.5">
    <display-name>name</display-name>

    <listener>
        <listener-class>net.semandex.salsa.webapp.SalsaWebApp</listener-class>
    </listener>

    <servlet>
        <description>
        </description>
        <display-name>SalsaValidationServlet</display-name>
        <servlet-name>SalsaValidationServlet</servlet-name>
        <servlet-class>net.semandex.salsa.validationServlets.SalsaValidationServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>SalsaValidationServlet</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>

    <session-config>
        <session-timeout>20</session-timeout>
    </session-config>

</web-app>
  

的Servlet

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class SalsaValidationServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String path = request.getPathInfo();
        if(path == null) return;
        String []p = path.split("/");
        if( !path.endsWith("licenseValidation.html") )
            //request.getRequestDispatcher("/auth/licenseValidation.html").forward(request, response);
            response.sendRedirect( request.getContextPath() + "/auth/licenseValidation.html" );
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        doGet(req, resp);
    }
}
  

HTML页面 - licenseValidation.html

<html>
<head>
<title>License upload page</title>
</head>
<body>

<form>
        <input type="text" name="name"/><br>        
        <input type="text" name="group"/>
        <input type="text" name="pass"/>
        <input type="submit" value="submit">            
</form>

</body>
</html> 

为什么此代码加载空白页而不是HTML页? 重定向确实发生但发生在空白页面上。浏览器中新URL的状态代码为200,但调试器中的响应为空。

  

修改

问题是&#34; / *&#34; BalusC所述的URL模式。在另一个答案中找到了更有用的信息。 Difference between / and /* in servlet mapping url pattern

3 个答案:

答案 0 :(得分:1)

您使用的请求网址没有任何关联的额外路径信息。因此request.getPathInfo()返回null并且重定向未被触发。

如果要重定向到任何页面,即使没有额外的路径信息,也需要删除空检查。只需重定向它:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //String path = request.getPathInfo();
    //if(path == null) return;
    //String []p = path.split("/");
    //if( !path.endsWith("licenseValidation.html") )
    //request.getRequestDispatcher("/auth/licenseValidation.html").forward(request, response);
    response.sendRedirect( request.getContextPath() + "/auth/licenseValidation.html" );
}
如果没有额外的路径信息,

request.getPathInfo将返回null:getPathInfo

假设您已将servlet-mapping定义为:

<servlet-mapping>
    <servlet-name>SalsaValidationServlet</servlet-name>
    <url-pattern>/salsadb/*</url-pattern>
</servlet-mapping>

您要将此请求发送到此网址:

http://localhost:8080/<appName>/salsadb/some_text

这次pathInfo不会为空;它的值为/some_text,这是与URL关联的额外路径信息。

修改

映射SalsaValidationServlet以提供对应用程序的所有请求。即将到来的第一个请求是:

http://localhost:8080/salsadb/

调用doGet的{​​{1}}方法,SalsaValidationServlet的值为pathInfo。它将请求重定向到/

现在,浏览器会向重定向网址发送新请求,在这种情况下为:/auth/licenseValidation.html。同样,/auth/licenseValidation.html doGet方法被调用,因为它与此SalsaValidationServlet映射:对应用程序的任何请求执行。这次pathInfo的值为/*不满足/licenseValidation.html条件:

if

因此,重定向不会被触发。

我认为这将澄清问题。如果可能,请更改if( !path.endsWith("licenseValidation.html") ) 以仅向应用程序提供所需的请求。

答案 1 :(得分:1)

我认为您的url-pattern标签是问题,请将其更改为/*.

以外的其他内容

答案 2 :(得分:0)

我不明白你为什么要重定向到图片? 但是,如果您仍想查看图像,请在HTML / jsp页面中添加salsa-icon.png并重定向到该页面。