Доступ к JSP в подпапке в папке WEB-INF?

Я только начал работать с JSP и столкнулся с одной проблемой.

Насколько я понимаю, к страницам JSP в WEB-INF можно получить доступ через браузер с URL-адресом в localhost:

localhost:8080/MyProject/MyJSP.jsp

Однако, если я создам еще одну подпапку в папке WEB-INF (например, «Моя папка») и попытаюсь получить доступ к той же странице JSP через URL-адрес:

localhost:8080/MyProject/MyFolder/MyJSP.jsp

вместо этого выдает ошибку 404. Обрабатываются ли системы навигации по файлам JSP иначе, чем, скажем, система навигации по файлам HTML?

РЕДАКТИРОВАТЬ: я использую сервлеты для отображения моей страницы JSP как таковой:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

response.sendRedirect("MyJSP.jsp");
}

EDIT2: я изменил перенаправление на requestDispatcher, как мне посоветовали:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/WEB-INF/MyFolder/MyJSP.jsp");
dispatcher.forward(request, response);
}

Если мой @WebServlet имеет значение ("/myjsp"), может ли кто-нибудь получить доступ к моей странице MyJSP.jsp, если он введет localhost:8080/MyProject/myjsp?


person Jae Bin    schedule 01.10.2018    source источник
comment
К сведению: веб-запрос не может получить прямой доступ к JSP (или любому другому ресурсу) внутри WEB-INF. Доступ к ресурсам внутри WEB-INF возможен только с помощью кода.   -  person Andreas    schedule 02.10.2018
comment
И если у вас есть возможность, вам следует использовать современную систему, такую ​​как Spring MVC/Boot, вместо того, чтобы писать сервлеты вручную и использовать JSP.   -  person chrylis -cautiouslyoptimistic-    schedule 02.10.2018
comment
@chrylis JSP устарел?   -  person Jae Bin    schedule 02.10.2018
comment
Да; он привязан к конкретным моделям сервлетов и не подходит для многих сценариев тестирования или использования для электронной почты и т. д. Обычно Thymeleaf лучше подходит для новых проектов.   -  person chrylis -cautiouslyoptimistic-    schedule 02.10.2018


Ответы (2)


Насколько я понимаю, к страницам JSP в WEB-INF можно получить доступ через браузер с URL-адресом в localhost.

Нет. Все ровно наоборот. Все в WEB-INF не доступно для браузера.

Хорошей практикой является размещение их там именно потому, что вы никогда не хотите, чтобы кто-либо обращался к JSP напрямую из браузера. JSP — это представления, и запросы должны сначала проходить через контроллер, который затем выполняет диспетчеризацию (т. е. вперед, а не перенаправляет, см. RequestDispatcher.forward() vs HttpServletResponse.sendRedirect()) в правильное представление.

person JB Nizet    schedule 01.10.2018
comment
Ах хорошо. Если мой @WebServlet — /myjsp и кто-то вводит /MyProject/myjsp в качестве URL-адреса, сможет ли он по-прежнему получить доступ к странице MyJSP.jsp? - person Jae Bin; 02.10.2018

'/WEB-INF/' считается защищенной/защищенной папкой, и не рекомендуется делать ее доступной, если это действительно не требуется. Если вы все еще хотите сделать эти файлы доступными, попробуйте добавить приведенное ниже сопоставление сервлетов в свой файл web.xml. Надеюсь, поможет

<servlet>
<servlet-name>MyJSP</servlet-name>
<jsp-file>/WEB-INF/MyFolder/*</jsp-file>
</servlet>
<servlet-mapping>
<servlet-name>MyJSP</servlet-name>
<url-pattern>/ViewMyJsp.jsp</url-pattern>
</servlet-mapping>

Вы можете указать сопоставление явно, объявив его с помощью элемента в дескрипторе развертывания. Вместо элемента <servlet-class> вы указываете элемент <jsp-file> с путем к файлу JSP из корня WAR.

person Sumesh TG    schedule 03.10.2018