Почему файлы 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 ответов


Я думаю, что здесь есть несколько проблем:

  1. вы путаете пути с spring MVC
  2. вы неправильно настраиваете свой веб-xml

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

для путей, это может помочь думать о вещах шаг за шагом шаг.

  1. вы запрашиваете url из своего браузера, браузер смотрит на протокол, хост и порт и использует DNS, чтобы найти соответствующий IP-адрес для подключения.
  2. установлена связь между вашим браузером и хозяина. Хост ищет процесс, запущенный на указанном вами Порту, и если TCP-соединение разрешено любыми системами безопасности, запрос передается процессу, запущенному на этом порту, в сеть сервер.
  3. веб-сервер принимает решения на основе того, что после порта, в частности, он определяет, что контекст веб-приложения, глядя на путь, который он был дан. Как только он определяет корневой контекст приложения, он знает, какое веб-приложение должно обрабатывать этот запрос. Решение основано на том, как вы настраиваете веб-сервер, у вас может быть веб-приложение, обрабатывающее запросы без корневого контекста или определенного корневого контекста. Например, если вы запросили localhost:8080/CtxtRoot/jsp/, у вас может быть одно веб-приложение на сервере, корневым контекстом которого является "CtxtRoot", и оно будет обрабатывать этот запрос. Кроме того, у вас может быть приложение, которое имеет "" для контекста, и оно может обрабатывать этот запрос. Это зависит от того, как вы настраиваете сервер, по умолчанию Tomcat будет использовать имя war в качестве корневого контекста.
  4. веб-приложение получает запрос. Хотя он знает полный запрошенный URL-адрес, он принимает решения только на основе всего после корневого контекста. Так например, с запросом на localhost:8080/CtxtRoot/jsp/, веб-приложение будет маршрутизировать вещи на основе " jsp " в качестве пути.
  5. веб-приложение имеет цепочку фильтров, в которую оно сначала отправляет запрос. Если шаблон фильтра соответствует запросу, этот фильтр может оценить запрос. Он может блокировать запрос, обрабатывать запрос или передавать его дальше. Я не буду говорить больше, потому что ваш вопрос не включает фильтры.
  6. веб-приложение ищет ресурс, шаблон которого соответствует запрос, он сначала рассматривает сервлеты, а затем статические ресурсы. Часть url, которая приходит после контекста, - это то, что она пытается сопоставить, поэтому, если запрос был для localhost:8080/CtxtRoot/jsp/, а корневой контекст был "CtxtRoot", тогда веб-приложение сравнивает "/jsp/ " со всеми сопоставлениями сервлетов. Запросы на статические ресурсы в WEB-INF всегда будут отклонены, но сервлеты и фильтры могут и возвращают данные из WEB-INF.
  7. Я собираюсь продолжить предполагая, что запрос был направлен весной DispatcherServlet, он получает запрос и рассматривает все После пути сервлета. Spring DispatcherServlet ищет контроллер, путь которого соответствует пути После пути сервлета. Путь сервлета-это в основном то, что вы помещаете в сопоставление сервлетов в своем веб-xml. Позвольте мне привести пример, скажем, у вас есть веб-приложение, контекст которого "app", и у него есть сервлет spring MVC, сопоставление сервлетов которого "/mvc" , и контроллер, который обрабатывает путь "sales", тогда вы можете достичь этого контроллер с http://localhost:8080/app/mvc/sales.
  8. если DispatcherServlet не может найти контроллер, я считаю, что он обрабатывает входящий запрос, как если бы он был возвращен контроллером, поэтому, если под-путь "продажи", то он передаст это в качестве аргумента распознавателю представлений. Если он не может найти его, то сервер возвращает не найдена ошибка.
  9. обычно контроллер возвращает строку, когда это сделано, которая является путем к ресурсу. Он может вернуть 'popular' в виде строки. Весна пересылает это в ViewResolver, и я предполагаю, что вы используете InternalResourceViewResolver. Он будет смотреть на префикс и суффикс и в основном обертывать их вокруг того, что было дано. Поэтому, если префикс ' / WEB-INF/views/', суффикс '.jsp', и аргумент "популярный", тогда он будет искать ресурс в " /WEB-INF/views/popular.jsp'. Это буквально просто объединение этих строк, чтобы сделать путь. Путь всегда относительно корня веб-приложения. Если путь создается файл jsp, он будет интерпретироваться перед возвращением.
  10. затем он, наконец, возвращается к пользователю.

из вашего примера вы запрашивали 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, и это распространено.

Я думаю, если вы сделаете эти вещи, это сработает:

  1. переместите jsp в /WEB-INF/jsp/fileName.jsp
  2. обновите контекст приложения, чтобы'/WEB-INF/ jsp / 'был префиксом и'.ССП-это суффикс.
  3. добавьте прослушиватель загрузчика контекста в веб-xml и установите contextConfigLocation путь относительно корневого контекста приложения. Например, это может быть /WEB-INF/appContext.в XML
  4. отправить запрос

    localhost: 8080 / CtxtRoot / fileName

кроме того, вы продолжали говорить о файле приветствия, но вы давали полные пути к ресурсам. Файл приветствия вступает в игру, только если пользователь делает запрос в корневой каталог, например:

localhost:8080/CtxtRoot/

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

удачи вам.


все за пределами WEB-INF является общедоступным никакая аутентификация не применяется к этому(мы можем применить, определив ограничение scurity в web.xml), но все ресурсы внутри WEB-INF защищены. Вы можете хранить статические страницы вне WEB-INF и динамические страницы, такие как профили, учетные записи внутри WEB-INF. Пожалуйста, проверьте, что я могу ошибаться.