Конфигурация отображения контроллера Spring и статические ресурсы
У меня проблема с перехватом запроса к статическим ресурсам контроллером.
Вот web.xml (часть, связанная с проблемой):
<servlet>
<servlet-name>testing</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>testing</servlet-name>
<url-pattern>/testing/*</url-pattern>
</servlet-mapping>
Вот тестирование-servlet.xml:
<mvc:annotation-driven />
<mvc:resources mapping="/resources/**" location="/WEB-INF/resources/" />
<bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
Вот исходный код класса контроллера:
@Controller
@RequestMapping(value = "/testing")
public class TestingController {
@RequestMapping(method = RequestMethod.GET)
public String doSomething() {
return "doView";
}
@RequestMapping(value = "/getSomething", method = RequestMethod.GET)
public String getSomething(@RequestParam String id) {
return "getView";
}
}
И последний фрагмент файлов doView.jsp и getView.jsp с объявлением статического файла с помощью JavaScript:
<script src="testing/resources/js/jquery.js"></script>
Есть одна вещь, которую я не понимаю - почему я получаю doView.jsp, вводя только http://localhost:8080/app/testing
но чтобы получить getView.jsp мне нужно войти http://localhost:8080/app/testing/testing/getSomething
("Тестирование" набирается дважды).
А теперь главная причина этой темы - когда я удаляю аннотацию отображения запроса из определения класса (@RequestMapping(value = "/testing")
и оставить эти методы, тогда я не могу получить файл jquery.js вообще. Когда я печатаю http://localhost:8080/app/testing/resources/js/jquery.js
Я получаю doView.jsp. Нет никаких проблем, о которых сообщает инструмент разработчика в браузере (отсутствует файл jquery.js или что-то в этом роде) - этот запрос только что перехвачен диспетчером Spring. Единственное преимущество в этой конфигурации состоит в том, что мне не нужно дважды вводить "тестирование", чтобы открыть getView.jsp.;)
Кто-нибудь знает решение, как сделать mvc:resources
тег работает в такой ситуации? И нет, я не могу установить URL-адрес всего тестового сервлета в "/".;)
2 ответа
Первая первая часть вопроса, это нормальное поведение. ты объявил /testing/*
как шаблон url для вашего сервлета Dispatcher, что означает, что все "вещи", появляющиеся после / testing /, рассматриваются весной и поэтому перехватываются. Затем вы должны были добавить @RequestMapping
аннотации, и вы заполняете значение параметра этого testing
что может привести к путанице. Вы можете использовать /ANOTHER_NAME как url-pattern
вместо того, чтобы тестировать и поддерживать отображение запроса на определение вашего контроллера как тестирование.
для второй части, мне кажется, вы помещаете свой js-файл в / src / main / resources, который является защищенной папкой, вы можете подумать о том, чтобы поместить его в / src / webapp / public-resources, а затем настроить следующим образом:
<mvc:resources mapping="/resources/**"
location="/, classpath:/WEB-INF/public-resources/"
cache-period="10000" />
Пожалуйста, добавьте эту банку
<mvc:resources mapping="/resources/**" location="/resources/"/>
<mvc:annotation-driven/>
этот jar-файл будет автоматически загружен в структуру maven/pom.xml, но в случае с вашей собственной lib вы должны будете поставить этот jar-файл hamcrest-core-1.3.jar