Почему файлы jsp внутри папки WEB-INF работают, но помещены в папку под WEB-INF нет?
когда мои файлы jsp находятся внутри папки WEB-INF (as/WEB-INF / file.jsp), я могу получить к ним доступ из localhost: 8080/ProjectCtxtRoot/, но я не могу получить к ним доступ, если они помещены в /WEB-INF/jsp/file.jsp?
Я изменил путь в теге welcome-list в интернете.XML следующим образом
<welcome-file-list>
<welcome-file>/JSP/fileName.jsp</welcome-file>
</welcome-file-list>
Я также изменил диспетчер-сервлета.XML следующим образом
<bean id="jspViewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/jsp/"
p:suffix=".jsp" />
все равно это не работает. Url, используемый для вышеуказанного случая, -
localhost:8080/ContextRoot/jsp/
localhost:8080/ContextRoot/jsp/fileName.jsp
localhost:8080/ContextRoot/jsp/fileName
и это не работает для любой из указанных выше адресов.
но он работал, когда
<welcome-file-list>
<welcome-file>/fileName.jsp</welcome-file>
</welcome-file-list>
диспетчер-сервлета.XML следующим образом
<bean id="jspViewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/"
p:suffix=".jsp" />
Url, используемый для вышеуказанного случая, является localhost: 8080/ContextRoot/, и он работает.
Я использую сервер tomcat v 7.0. Я обновляю свой проект в Eclipse IDE, затем очищаю его, строю его, строю war с помощью mvn clean install, затем выбираю war с домашней страницы tomcat manager и развертываю его. Я делаю это каждый раз.
вот как diapatcher-сервлет.xml просматривает весь процесс. Я просто меняю конкретный раздел, как сказано выше
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">
<mvc:annotation-driven/>
<context:component-scan base-package="com.projectName.www" />
<!-- Factory bean that creates the Mongo instance -->
<bean id="mongo" class="org.springframework.data.mongodb.core.MongoFactoryBean">
<property name="host" value="localhost" />
</bean>
<!-- MongoTemplate for connecting and quering the documents in the database -->
<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
<constructor-arg name="mongo" ref="mongo" />
<constructor-arg name="databaseName" value="tableName" />
</bean>
<!-- Use this post processor to translate any MongoExceptions thrown in @Repository annotated classes -->
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />
<bean id="jspViewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/jsp/"
p:suffix=".jsp" />
<!-- <bean class="org.springframework.web.servlet.view.tiles2.TilesViewResolver"/>
<bean class=
"org.springframework.web.servlet.view.tiles2.TilesConfigurer"> -->
<!-- <property name="definitions">
<list>
<value>/WEB-INF/views/views.xml</value>
</list>
</property>
</bean> -->
</beans>
вот как моя сеть.xml выглядит как
<web-app>
<!-- <display-name>Archetype Created Web Application</display-name> -->
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- <init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/src/main/webapp/WEB-INF/dispatcher-servlet.xml</param-value>
</init-param>-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/dispatcher-servlet.xml</param-value>
</context-param>
<!-- <listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener> -->
<welcome-file-list>
<welcome-file>/fileName.jsp</welcome-file>
</welcome-file-list>
</web-app>
Ok. Он работает, когда я переместил всю папку jsp из /webapp/WEB-INF/jsp/fileName.jsp в /webapp / jsp / fileName.JSP-страница. Я хотел бы знать 1. почему это работает сейчас? 2. Правильно ли это? 3. Он работает, когда url-адрес localhost:8080/CtxtRoot/jsp/или localhost: 8080/CtxtRoot/jsp/search.JSP, но это не работает для localhost: 8080/AnnaUnivResults/jsp / search. Почему это так?
2 ответов
Я думаю, что здесь есть несколько проблем:
- вы путаете пути с spring MVC
- вы неправильно настраиваете свой веб-xml
к сожалению, я не могу охватить каждую деталь для вас, много весны настраивается, поэтому мое объяснение просто будет охватывать самый базовый сценарий. Если кто-то найдет ошибку, пожалуйста, скажите, и я исправлю ее.
для путей, это может помочь думать о вещах шаг за шагом шаг.
- вы запрашиваете url из своего браузера, браузер смотрит на протокол, хост и порт и использует DNS, чтобы найти соответствующий IP-адрес для подключения.
- установлена связь между вашим браузером и хозяина. Хост ищет процесс, запущенный на указанном вами Порту, и если TCP-соединение разрешено любыми системами безопасности, запрос передается процессу, запущенному на этом порту, в сеть сервер.
- веб-сервер принимает решения на основе того, что после порта, в частности, он определяет, что контекст веб-приложения, глядя на путь, который он был дан. Как только он определяет корневой контекст приложения, он знает, какое веб-приложение должно обрабатывать этот запрос. Решение основано на том, как вы настраиваете веб-сервер, у вас может быть веб-приложение, обрабатывающее запросы без корневого контекста или определенного корневого контекста. Например, если вы запросили
localhost:8080/CtxtRoot/jsp/
, у вас может быть одно веб-приложение на сервере, корневым контекстом которого является "CtxtRoot", и оно будет обрабатывать этот запрос. Кроме того, у вас может быть приложение, которое имеет "" для контекста, и оно может обрабатывать этот запрос. Это зависит от того, как вы настраиваете сервер, по умолчанию Tomcat будет использовать имя war в качестве корневого контекста. - веб-приложение получает запрос. Хотя он знает полный запрошенный URL-адрес, он принимает решения только на основе всего после корневого контекста. Так например, с запросом на
localhost:8080/CtxtRoot/jsp/
, веб-приложение будет маршрутизировать вещи на основе " jsp " в качестве пути. - веб-приложение имеет цепочку фильтров, в которую оно сначала отправляет запрос. Если шаблон фильтра соответствует запросу, этот фильтр может оценить запрос. Он может блокировать запрос, обрабатывать запрос или передавать его дальше. Я не буду говорить больше, потому что ваш вопрос не включает фильтры.
- веб-приложение ищет ресурс, шаблон которого соответствует запрос, он сначала рассматривает сервлеты, а затем статические ресурсы. Часть url, которая приходит после контекста, - это то, что она пытается сопоставить, поэтому, если запрос был для
localhost:8080/CtxtRoot/jsp/
, а корневой контекст был "CtxtRoot", тогда веб-приложение сравнивает "/jsp/ " со всеми сопоставлениями сервлетов. Запросы на статические ресурсы в WEB-INF всегда будут отклонены, но сервлеты и фильтры могут и возвращают данные из WEB-INF. - Я собираюсь продолжить предполагая, что запрос был направлен весной DispatcherServlet, он получает запрос и рассматривает все После пути сервлета. Spring DispatcherServlet ищет контроллер, путь которого соответствует пути После пути сервлета. Путь сервлета-это в основном то, что вы помещаете в сопоставление сервлетов в своем веб-xml. Позвольте мне привести пример, скажем, у вас есть веб-приложение, контекст которого "app", и у него есть сервлет spring MVC, сопоставление сервлетов которого "/mvc" , и контроллер, который обрабатывает путь "sales", тогда вы можете достичь этого контроллер с
http://localhost:8080/app/mvc/sales
. - если DispatcherServlet не может найти контроллер, я считаю, что он обрабатывает входящий запрос, как если бы он был возвращен контроллером, поэтому, если под-путь "продажи", то он передаст это в качестве аргумента распознавателю представлений. Если он не может найти его, то сервер возвращает не найдена ошибка.
- обычно контроллер возвращает строку, когда это сделано, которая является путем к ресурсу. Он может вернуть 'popular' в виде строки. Весна пересылает это в ViewResolver, и я предполагаю, что вы используете InternalResourceViewResolver. Он будет смотреть на префикс и суффикс и в основном обертывать их вокруг того, что было дано. Поэтому, если префикс ' / WEB-INF/views/', суффикс '.jsp', и аргумент "популярный", тогда он будет искать ресурс в " /WEB-INF/views/popular.jsp'. Это буквально просто объединение этих строк, чтобы сделать путь. Путь всегда относительно корня веб-приложения. Если путь создается файл jsp, он будет интерпретироваться перед возвращением.
- затем он, наконец, возвращается к пользователю.
из вашего примера вы запрашивали localhost: 8080 / ContextRoot / jsp / fileName, поэтому похоже, что "CtxRoot" является корневым контекстом, путь вашего сервлета -"/", поэтому он должен передать все, что после этого, контроллеру. К тому времени, когда DispatcherServlet получает запрос, он ищет контроллер, который обрабатывает " jsp " как путь. Так как вы не было ни одного, он решил рассматривать это как путь ресурса. Он использовал распознаватель представлений и сформировал путь /WEB-INF/jsp/jsp/fileName.jsp, которого, очевидно, не существует.
предположим, что вы вместо этого запросили localhost: 8080 / ContextRoot / fileName, запрос достигнет DispatcherServlet, он не найдет контроллера, который обрабатывает "fileName" как путь, и, следовательно, будет рассматривать его как ресурс. Он сформирует путь / WEB-INF/jsp/fileName.jsp, и это вернет результат.
однако ваш веб-xml не был настроен для инициализации spring. Таким образом, ваше веб-приложение фактически обрабатывало каждый из ваших запросов, как если бы они были для ресурса относительно корня веб-приложения. Я считаю, что если бы вы сделали этот запрос с правильной инициализацией Spring, это могло бы сработать.
вот хороший пример, как это сделать это:
http://www.mkyong.com/spring3/spring-3-mvc-hello-world-example/
обратите внимание, что его веб-xml имеет ContextLoaderListener, который прокомментирован в вашем, и это важно для инициализации spring в веб-приложении. Я также вижу комментарий в вашем диспетчере с path/src/main / resources, но все пути в веб-xml должны быть относительно корня веб-приложения. Во время выполнения веб-сервер не знает о вашем проекте, а " src " - это не в корневом каталоге веб-приложения. Также обратите внимание, что у вас может быть другой контекст приложения для вашего материала MVC, чем ваш основной контекст spring, и это распространено.
Я думаю, если вы сделаете эти вещи, это сработает:
- переместите jsp в /WEB-INF/jsp/fileName.jsp
- обновите контекст приложения, чтобы'/WEB-INF/ jsp / 'был префиксом и'.ССП-это суффикс.
- добавьте прослушиватель загрузчика контекста в веб-xml и установите contextConfigLocation путь относительно корневого контекста приложения. Например, это может быть /WEB-INF/appContext.в XML
-
отправить запрос
localhost: 8080 / CtxtRoot / fileName
кроме того, вы продолжали говорить о файле приветствия, но вы давали полные пути к ресурсам. Файл приветствия вступает в игру, только если пользователь делает запрос в корневой каталог, например:
localhost:8080/CtxtRoot/
этот запрос будет перенаправлен в файл приветствия. Я думаю, что единственный раз, когда вы попробовали это, jsp оказался в корне вашего приложения и был настроен как файл приветствия, поэтому он работал. Хотя он "работал", он фактически не использовал весну, чтобы вернуть это.
удачи вам.
все за пределами WEB-INF является общедоступным никакая аутентификация не применяется к этому(мы можем применить, определив ограничение scurity в web.xml), но все ресурсы внутри WEB-INF защищены. Вы можете хранить статические страницы вне WEB-INF и динамические страницы, такие как профили, учетные записи внутри WEB-INF. Пожалуйста, проверьте, что я могу ошибаться.