Как служить.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 для индексирования.ОСП моем сервере сейчас служит страница правильно.



спасибо.

562   8  

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), три вещи действительно имеет место:

  1. получить все параметры модели из модели (возвращается методом обработчика контроллера т. е. "public ModelAndView doSomething() { return new ModelAndView("home") }")
  2. выставьте эти параметры модели в качестве атрибутов запроса (чтобы он мог быть прочитан JspServlet)
  3. переадресация запроса на JspServlet. RequestDispatcher знает, что каждый *.запрос jsp должен быть перенаправлен в JspServlet (потому что это конфигурация tomcat по умолчанию)

когда вы просто измените имя представления на home.html tomcat будет не знать, как обрабатывать запрос. Это происходит потому, что нет обработки сервлетов *.HTML-код просит.

решение

как решить эту. Есть три наиболее очевидных решения:

  1. выставить html в виде файла ресурсов
  2. поручите JspServlet также обрабатывать *.формат html запросы
  3. написать свой собственный сервлет (или передать другому существующему сервлету запросы на *.формат 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: суффикс=".ССП" значение подобающим образом, в противном случае мы можем разработать пользовательский вид сельсин

http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/web/servlet/view/UrlBasedViewResolver.html

похоже, вы пытаетесь сделать что-то вроде этого:

  • статические HTML-представления
  • весенние контроллеры, обслуживающие AJAX

Если это так, как упоминалось ранее, наиболее эффективный способ-позволить веб-серверу (а не Spring) обрабатывать запросы HTML как статические ресурсы. Таким образом, вы хотите следующее:

  1. вперед всех .формат HTML. ,стиль CSS. ,js,.png, запросы etc к обработчик ресурсов веб-сервера
  2. карта всех другие запросы к контроллерам 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

    Ничего не найдено.