Известно ли, что Eclipse портит сопоставления Servlet/JSP?

Я создаю небольшой веб-сайт, используя JPA/Hibernate 5.4.2, Java Servlet API 4.0.1 и Tomcat 9 для своего сервера. Я использую Eclipse JEE 4.11 в качестве своей IDE.

По сути, у меня было много проблем с сопоставлениями сервлетов и JSP, и я не могу понять, почему. В одном случае у меня был один конкретный файл JSP, который отказывался подтверждать другие файлы JSP, хотя все они находились в одной папке. Например, он не мог видеть мои файлы заголовков (которые были включены с помощью ), пока я не добавил имя папки (например, "/jsp/Header.jsp"). Однако это приведет к тому, что мои URL-адреса для всех остальных страниц будут испорчены, что не позволит им по очереди загружать верхний и нижний колонтитулы.

Насколько я могу судить, это похоже на то, как будто приложение переключает каталог для доступа к данному файлу, но оно почему-то никогда не возвращается назад, и поэтому другие пути URL становятся недействительными, поскольку теперь они указывают на неправильное местоположение. Стоит отметить, что это не работает для моих тегов, где мне приходилось использовать относительные URL-адреса.

До сих пор мне удавалось исправить многие из этих проблем, добавляя к моим URL-адресам префикс ${pageContext.request.contextPath}, но я столкнулся с ситуацией, когда мои URL-адреса все еще перепутались после посещения определенной страницы.

Я решил использовать файл web.xml (расположенный в "webapp/WEB-INF") для сопоставления моих JSP и сервлетов, с примерами каждого ниже. Обратите внимание, что записи сервлета были сгенерированы Eclipse, но я вручную сопоставил файлы JSP, используя тот же формат. Я дважды проверил XML-файл, чтобы убедиться, что не сделал никаких очевидных ошибок, но пока не нашел ни одной. Единственное, что я обнаружил в своем исследовании, это то, что порядок отображений может быть важен, но никто никогда не дает конкретной информации об этом.

Я также пытался очистить свой проект в Eclipse, обновить проект (поскольку у меня были проблемы с видеофайлами, которые не распознавались моим приложением до этого), и очистить рабочий каталог моего Tomcat. Ничто из этого, кажется, не имело никакого эффекта.

    <servlet>
        <display-name>ExerciseListServlet</display-name>
        <servlet-name>ExerciseListServlet</servlet-name>
        <servlet-class>web.ExerciseListServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>ExerciseListServlet</servlet-name>
        <url-pattern>/ExerciseListServlet</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>UserProfile</servlet-name>
        <jsp-file>/jsp/UserProfile.jsp</jsp-file>
    </servlet>
    <servlet-mapping>
        <servlet-name>UserProfile</servlet-name>
        <url-pattern>/UserProfile</url-pattern>
    </servlet-mapping>

есть идеи? Я хорошо знаю, что я не публиковал много кода, но эта проблема возникала практически с каждой страницей в какой-то момент, и тот факт, что у меня не было этой проблемы в прошлый раз, когда я работал с эти системы говорят мне, что может быть ошибка или неправильная конфигурация с Tomcat, Hibernate или, возможно, Eclipse. На данный момент моя система выдает исключения по совершенно не связанным причинам, хотя я, кажется, знаю почему, поэтому пока не буду это включать.


person Varthorne    schedule 27.06.2019    source источник
comment
Почему вы имеете дело с низкоуровневыми сервлетами вместо использования фреймворка вроде Spring MVC, который делает большую часть этого за вас?   -  person chrylis -cautiouslyoptimistic-    schedule 28.06.2019
comment
удалите все сопоставления из web.xml и используйте аннотации в сервлетах, таких как @WebServlet(/ExerciseListServlet)   -  person Pavan Kumar T S    schedule 28.06.2019


Ответы (1)


Вам просто нужно удалить все содержимое файла web.xml. удалите все сервлеты и соответствующие им сопоставления.

Затем вы можете заставить свой сервлет прослушивать определенный URL-адрес, добавив аннотацию WebServlet. Используйте приведенную ниже аннотацию в своем коде.

@WebServlet(urlPatterns = "/ExerciseListServlet", loadOnStartup = 1, displayName = "ExerciseListServlet")
@MultipartConfig

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

person Onkar Musale    schedule 28.06.2019