我正在尝试从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
答案 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并重定向到该页面。