Как служить.html файлы с пружиной
Я разрабатываю сайт с Spring, и пытаюсь обслуживать ресурсы, которые не являются .JSP-файл.( html например)
прямо сейчас я прокомментировал эту часть моей конфигурации сервлета
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/jsp/" p:suffix=".jsp" />
и попытался вернуть из контроллера полный путь к ресурсу.
@Controller
public class LandingPageController {
protected static Logger logger = Logger.getLogger(LandingPageController.class);
@RequestMapping({"/","/home"})
public String showHomePage(Map<String, Object> model) {
return "/WEB-INF/jsp/index.html";
}
}
индекс.html-файл существует в этой папке.
Примечание: когда я изменяю индекс.html для индексирования.ОСП моем сервере сейчас служит страница правильно.
спасибо.
8 ответов:
начальная проблема заключается в том, что конфигурация указывает свойство
suffix=".jsp"таким образом, класс реализации ViewResolver добавит.jspдо конца имени представления, возвращаемого из вашего метода.однако, так как вы прокомментировали
InternalResourceViewResolverзатем, в зависимости от остальной конфигурации вашего приложения, может не быть никакого другого зарегистрированного ViewResolver. Вы можете обнаружить, что сейчас ничего не работает.С
.htmlфайлы статический и не требуют обработки сервлетом, то это более эффективно и проще, чтобы использовать<mvc:resources/>картография. Для этого требуется пружина 3.0.4+.например:
<mvc:resources mapping="/static/**" location="/static/" />что будет проходит через все запросы, которые начинаются с
/static/до .Итак, поставив
index.htmlнаwebapp/static/и с помощьюreturn "static/index.html";от вашего метода, весна должна найти вид.
Я бы просто добавил, что вам не нужно реализовывать метод контроллера для этого, поскольку вы можете использовать view-controller тег (Весна 3) в файле конфигурации сервлета:
<mvc:view-controller path="/" view-name="/WEB-INF/jsp/index.html"/>
постановка проблемы
Первое, что нужно понять, это следующее: Это не весна, которая отображает файлы jsp. Это JspServlet (org.апаш.Джаспер.сервлет.JspServlet), который это делает. Этот сервлет поставляется с Tomcat (компилятор jasper), а не с spring. Этот JspServlet знает, как скомпилировать страницу jsp и как вернуть ее в виде html-текста клиенту. JspServlet в tomcat по умолчанию обрабатывает только запросы, соответствующие двум шаблонам:*.jsp и *.jspx.
теперь, когда весна делает вид
InternalResourceView(илиJstlView), три вещи действительно имеет место:
- получить все параметры модели из модели (возвращается методом обработчика контроллера т. е.
"public ModelAndView doSomething() { return new ModelAndView("home") }")- выставьте эти параметры модели в качестве атрибутов запроса (чтобы он мог быть прочитан JspServlet)
- переадресация запроса на JspServlet.
RequestDispatcherзнает, что каждый *.запрос jsp должен быть перенаправлен в JspServlet (потому что это конфигурация tomcat по умолчанию)когда вы просто измените имя представления на home.html tomcat будет не знать, как обрабатывать запрос. Это происходит потому, что нет обработки сервлетов *.HTML-код просит.
решение
как решить эту. Есть три наиболее очевидных решения:
- выставить html в виде файла ресурсов
- поручите JspServlet также обрабатывать *.формат html запросы
- написать свой собственный сервлет (или передать другому существующему сервлету запросы на *.формат HTML.)
для полных примеров кода, как этого достичь, пожалуйста, ответьте на мой ответ в другом посте:как сопоставить запросы в HTML-файл в Spring MVC?
вы все еще можете продолжать использовать тот же арбитр смотреть, но установить суффикс пустой.
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/jsp/" p:suffix="" />теперь ваш код может вернуть либо индекса.html или индекс.JSP как показано в приведенном ниже примере -
@RequestMapping(value="jsp", method = RequestMethod.GET ) public String startJsp(){ return "/test.jsp"; } @RequestMapping(value="html", method = RequestMethod.GET ) public String startHtml(){ return "/test.html"; }
я столкнулся с той же проблемой и попробовал различные решения для загрузки html страница из Spring MVC, следующее решение работало для меня
Шаг-1 в веб-сервера.xml-комментарий эти две строки
<!-- <mime-mapping> <extension>htm</extension> <mime-type>text/html</mime-type> </mime-mapping>--> <!-- <mime-mapping> <extension>html</extension> <mime-type>text/html</mime-type> </mime-mapping> -->Шаг 2 введите следующий код в веб-xml приложения
<servlet-mapping> <servlet-name>jsp</servlet-name> <url-pattern>*.htm</url-pattern> </servlet-mapping>Шаг-3 Создайте статический регулятор класс
@Controller public class FrontController { @RequestMapping("/landingPage") public String getIndexPage() { return "CompanyInfo"; } }Шаг-4 в файле конфигурации Spring измените суффикс на .htm .htm
Шаг 5 переименовать страницу как .htm файл и сохранить его в WEB-INF и построить / запустить сервер
localhost:8080/.../landingPage
изменить p: суффикс=".ССП" значение подобающим образом, в противном случае мы можем разработать пользовательский вид сельсин
похоже, вы пытаетесь сделать что-то вроде этого:
- статические HTML-представления
- весенние контроллеры, обслуживающие AJAX
Если это так, как упоминалось ранее, наиболее эффективный способ-позволить веб-серверу (а не Spring) обрабатывать запросы HTML как статические ресурсы. Таким образом, вы хотите следующее:
- вперед всех .формат HTML. ,стиль CSS. ,js,.png, запросы etc к обработчик ресурсов веб-сервера
- карта всех другие запросы к контроллерам spring
вот один из способов сделать это...
web.xml - сопоставить сервлет с root (/)
<servlet> <servlet-name>sprung</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> ... <servlet> <servlet-mapping> <servlet-name>sprung</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>Spring JavaConfig
public class SpringSprungConfig extends DelegatingWebMvcConfiguration { // Delegate resource requests to default servlet @Bean protected DefaultServletHttpRequestHandler defaultServletHttpRequestHandler() { DefaultServletHttpRequestHandler dsrh = new DefaultServletHttpRequestHandler(); return dsrh; } //map static resources by extension @Bean public SimpleUrlHandlerMapping resourceServletMapping() { SimpleUrlHandlerMapping mapping = new SimpleUrlHandlerMapping(); //make sure static resources are mapped first since we are using //a slightly different approach mapping.setOrder(0); Properties urlProperties = new Properties(); urlProperties.put("/**/*.css", "defaultServletHttpRequestHandler"); urlProperties.put("/**/*.js", "defaultServletHttpRequestHandler"); urlProperties.put("/**/*.png", "defaultServletHttpRequestHandler"); urlProperties.put("/**/*.html", "defaultServletHttpRequestHandler"); urlProperties.put("/**/*.woff", "defaultServletHttpRequestHandler"); urlProperties.put("/**/*.ico", "defaultServletHttpRequestHandler"); mapping.setMappings(urlProperties); return mapping; } @Override @Bean public RequestMappingHandlerMapping requestMappingHandlerMapping() { RequestMappingHandlerMapping handlerMapping = super.requestMappingHandlerMapping(); //controller mappings must be evaluated after the static resource requests handlerMapping.setOrder(1); handlerMapping.setInterceptors(this.getInterceptors()); handlerMapping.setPathMatcher(this.getPathMatchConfigurer().getPathMatcher()); handlerMapping.setRemoveSemicolonContent(false); handlerMapping.setUseSuffixPatternMatch(false); //set other options here return handlerMapping; } }Дополнительные Соображения
- скрыть .расширение html-это выходит за рамки Spring, если вы делегируете статические запросы ресурсов. Посмотрите на переписывание URL фильтр.
- Templating-вы не хотите дублировать разметку на каждой странице HTML для общих элементов. Это, вероятно, не может быть сделано на сервере, если он служит HTML в качестве статического ресурса. Посмотрите на клиентскую часть * VC framework. Я поклонник Юи, который имеет множество механизмов шаблонов, включая руль.
конфигурация Java для html файлов (в данном случае index.html):
@Configuration @EnableWebMvc public class DispatcherConfig extends WebMvcConfigurerAdapter { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/index.html").addResourceLocations("/index.html"); } }
Comments