2015-12-22 2 views
0

Я пытаюсь перенаправить на HTML-страницу из сервлета. Для отладки у меня минимальный код на моем сервлете, HTML-странице и в web.xmlJava: перенаправление с сервлета приводит к пустой странице

Я могу загрузить HTML-страницу в браузере без сервлета. Но когда я пытаюсь перенаправить на одну страницу из сервлета, отображается только пустая страница. Ошибка не отображается. Ниже приведен соответствующий код.

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, но ответ в отладчике пуст.

Edit:

Проблема была в "/ *" URL шаблон, как указано на BalusC. Нашел еще полезную информацию в своем другом ответе. Difference between/and /* in servlet mapping url pattern

+0

Какой URL-адрес запроса используется для вызова вашего сервлета? –

+0

http: // localhost: 8080/salsadb // –

+1

Ваш шаблон URL неправильный. Он захватывает ВСЕ запросы, включая те, к которым вы перенаправляете. В принципе, сервлет снова вызывает себя, но ни одно условие не соответствует, и он ничего не делает с ответом, поэтому все, что вы получаете, - пустой ответ. Для правильного шаблона URL см. Ответ в двух экземплярах. Для объяснения того, как работают эти шаблоны URL, см. Ссылку «См. Также» в нижней части ответа в двух экземплярах. – BalusC

ответ

1

Используемый URL-адрес запроса не содержит дополнительной информации о пути. Таким образом, 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 возвращает нулевое значение, если нет дополнительной информация Путь: 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 не будет null; он будет иметь значение /some_text, что является дополнительной информацией о пути, связанной с URL-адресом.

EDIT:

SalsaValidationServlet сопоставляется обслуживать все запросы к приложению. Первый запрос, который приходит это:

http://localhost:8080/salsadb/ 

метод SalsaValidationServletdoGet вызывается, и значение pathInfo является /. Он перенаправляет запрос на /auth/licenseValidation.html.

Теперь браузер отправит новый запрос на URL-адрес переадресации, который в данном случае равен: /auth/licenseValidation.html. Опять вызывается метод doGetSalsaValidationServlet, поскольку он сопоставляется с этим /*: выполнить для любого запроса в приложение. На этот раз значение Pathinfo является /licenseValidation.html, который не удовлетворяющие этого if условия:

if(!path.endsWith("licenseValidation.html")) 

и из-за этого Перенаправление не получает срабатывает на этот раз.

Я думаю, что это прояснит проблему. Если возможно, измените значение servlet-mapping, чтобы обслуживать только требуемые запросы к приложению.

+0

Спасибо за ответ. salsadb на самом деле appName в моем случае. Таким образом, pathInfo для localhost: 8080/salsadb/является «/», и я могу проверить с точкой останова, что перенаправление действительно происходит. –

+0

@PratikPatel Отредактировал мой ответ. –

+0

Условие if удовлетворено, потому что я проверяю путь, а не pathInfo. Причиной проблемы был шаблон URL// URL, указанный в комментарии @BaluC. –

0

Я не понял, почему вы пытаетесь перенаправить изображение? Однако, если вы все еще хотите увидеть изображение, добавьте salsa-icon.png на страницу HTML/jsp и перенаправьте его.

+0

Как я уже говорил, я перенаправляю только изображение, чтобы упростить код для отладки. Я хочу перенаправить на HTML-страницу, но поведение будет одинаковым для HTML-страницы. Сначала я попробовал с простой минимальной HTML-страницей, но вместо этого отображалась пустая страница, как я описал. Поскольку такое перенаправление на изображение или HTML-страницу не должно быть иным? поэтому я заменил страницу по изображению, чтобы исключить любую ошибку в HTML-коде. –

+0

Можете ли вы разместить свой HTML-код здесь? Также путь к файлу изображения правильный? просто попробуйте добавить этот путь перед вашим контентом в браузере, и вы это узнаете. http: // : порт/images/salsa-icon.png. Посмотрите, сможете ли вы увидеть файл изображения. –

+0

Да, путь правильный. Я вижу изображение/страницу, если сервлет не применяется. Проблема возникает только после применения сервлета. –

1

Я думаю, что ваш тег url-pattern является проблемой, пожалуйста, измените его на что-то другое, кроме/*.

Смежные вопросы