Ретрансляционный сервлет (сервлет вызывает другой сервлет)

#java #servlets

#java #сервлеты

Вопрос:

Здравствуйте, у меня вопрос о сервлете, вызывающем другой сервлет

У меня есть основной сервлет с именем Relay, который будет отвечать за управление другими сервлетами

пользователь нажмет на и будет перенаправлен на ретрансляционный сервлет

 <li><a href="/oosd/Relay?selectAnimal=SelectAnimalServlet">Check the available animals</a> </li>
  

внутри ретрансляционного сервлета будет получено значение параметра, чтобы определить, какой сервлет будет запущен

 String selectAnimal = request.getParameter("selectAnimal");

if (selectAnimal.equals("SelectAnimalServlet")){
            getServletContext().getNamedDispatcher("/SelectAnimalServlet") 
            .forward(request, response); 
            //for testing
            System.out.println("Request forwarded to "   selectAnimal   " servlet");
        }
  

Выберите код Animalservlet:

 try
{     
    HttpSession session = request.getSession(true);
    session.getAttribute("currentSessionUser");
    List<AnimalSelectBean> beans = DAO.getAnimalList(); 
    request.setAttribute("beans", beans); 
    request.getRequestDispatcher("CheckAnimal.jsp").forward(request, response); 


}
  

Теперь, когда я запускаю, что он по какой-то причине не работает, если я меняю ссылку на SelectAnimalServlet напрямую, код работает, есть идеи, как это решить?

Редактировать:

Вот мой web.xml

 <?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:javaee="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

  <servlet>
    <servlet-name>LoginServlet</servlet-name>
    <servlet-class>content.LoginServlet</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>UpdateAnimalServlet</servlet-name>
    <servlet-class>content.UpdateAnimalServlet</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>SelectAnimalServlet</servlet-name>
    <servlet-class>content.SelectAnimalServlet</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>Relay</servlet-name>
    <servlet-class>content.Relay</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>SelectAnimalServlet</servlet-name>
    <url-pattern>/SelectAnimalServlet</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>UpdateAnimalServlet</servlet-name>
    <url-pattern>/UpdateAnimalServlet</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>LoginServlet</servlet-name>
    <url-pattern>/LoginServlet</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>Relay</servlet-name>
    <url-pattern>/Relay</url-pattern>
  </servlet-mapping>
</web-app>
  

также я изменил:

 getServletContext().getNamedDispatcher("/SelectAnimalServlet") 
                .forward(request, response); 
  

Для:

 response.sendRedirect(response.encodeRedirectURL(selectAnimal));
  

и все та же пустая веб-страница сhttp://localhost:8080/oosd/Relay ?selectAnimal=ссылка SelectAnimalServlet

Комментарии:

1. Что вы имеете в виду под «не работает»? (И почему вы это делаете?)

2. неработоспособность означает пустую белую страницу, и я должен сделать это в соответствии с моей курсовой работой, я должен создать ретрансляционный сервлет, который управляет другим сервлером

3. я могу сделать это, создав множество форм и кнопок, вставив скрытый ввод для передачи значения вместо ссылок href, но я думаю, что должен быть способ обойти это

4. Есть ли что-нибудь в журнале сервера?

5. Я получаю этот java.lang. Исключение NullPointerException не знаю, относится ли это к чему-либо полезному или нет, однако ссылка на странице — localhost: 8080 / oosd / Relay? selectAnimal=SelectAnimalServlet это должно быть localhost:8080/oosd/SelectAnimalServlet Я думаю, что проблема в направлении от первого ретранслятора сервлета ко второму SelectAnimalServlet

Ответ №1:

getNamedDispatcher ожидает имя сервлета; вы предоставляете ему URL-адрес сервлета.

Либо используйте имя, либо используйте getRequestDispatcher с URL.

Поскольку вы пересылаете, URL-адрес не изменится — ответ перенаправления, отправленный обратно в браузер при пересылке, отсутствует. Содержимое пересылки записывается непосредственно в исходный ответ.

Теперь, когда вы пересылаете, вам нужно перенаправить на URL, а не только на имя сервлета.

Что делает сервлет, который вы перенаправляете, для вывода?

Я не верю, что ваше соглашение об именовании параметров имеет какой-либо смысл. Параметр не должен называться так же, как имя сервлета; параметр должен быть чем-то вроде «command» или «select». Затем вы должны использовать значение параметра команды для поиска URL сервлета. Или, в вашем случае, просто добавьте / , и все готово. Нет необходимости делать какие-либо if/else сравнения.

Комментарии:

1. Вы имеете в виду следующее: RequestDispatcher rd = request.getRequestDispatcher(«localhost: 8080 /oosd /SelectAnimalServlet»); rd.forward(запрос, ответ); или это: getServletContext().getNamedDispatcher(«SelectAnimalServlet») .forward(запрос, ответ); потому что оба не работают

2. @user1031152 Затем вам нужно начать добавлять некоторые записи в журнал, чтобы выяснить, почему.

3. @user1031152 Просто используйте System.out.println сейчас; это будет отображаться в журналах сервера. Вы используете Tomcat или …?

4. @user1031152 Создает ли перенаправляемый сервлет какой-либо вывод? У меня все работает без каких-либо проблем.

5. да, SelectAnimalServlet будет отображать записи из таблицы базы данных, и я не знаю, как найти журналы, я новичок в этом