Як обробити статичний вміст у Spring MVC?


200

Я розробляю веб-сервер за допомогою Spring MVC 3 і маю DispatcherServletвсі запити на "/" так (web.xml):

  <servlet>
    <servlet-name>app</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>app</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

Тепер це працює як рекламується, проте як я можу обробляти статичний вміст? Раніше, перш ніж використовувати URL-адреси RESTful, я б схопив, наприклад, всі * .html і надіслав це до DispatcherServlet, але тепер це вже інша гра з м'ячем.

У мене є / static / папка, що включає / styles /, / js /, / images / тощо, і я хотів би виключити / static / * з DispatcherServlet.

Тепер я міг запустити статичні ресурси, коли це зробив:

  <servlet-mapping>
    <servlet-name>app</servlet-name>
    <url-pattern>/app/</url-pattern>
  </servlet-mapping>

Але я хочу, щоб він мав приємні URL-адреси (точка мене використовує Spring MVC 3), а не цільова сторінка www.domain.com/app/

Я також не хочу рішення, пов'язане з tomcat або будь-яким іншим контейнером сервлетів, і тому що це (відносно) низький трафік, мені не потрібен веб-сервер (наприклад, апаш httpd).

Чи є для цього чисте рішення?



@hamo Пов'язана нитка: stackoverflow.com/questions/34279705 / ...
smwikipedia

Відповіді:


266

Оскільки я витратив багато часу на це питання, я подумав, що поділюсь своїм рішенням. Починаючи з весни 3.0.4, існує параметр конфігурації, який викликається <mvc:resources/>(детальніше про те на веб-сайті довідкової документації ), який може використовуватися для обслуговування статичних ресурсів при використанні DispatchServlet у корені вашого сайту.

Для цього використовуйте структуру каталогу, яка виглядає наступним чином:

src/
 springmvc/
  web/
   MyController.java
WebContent/
  resources/
   img/
    image.jpg
  WEB-INF/
    jsp/
      index.jsp
    web.xml
    springmvc-servlet.xml

Вміст файлів повинен виглядати так:

src / springmvc / web / HelloWorldController.java:

package springmvc.web;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class HelloWorldController {

 @RequestMapping(value="/")
 public String index() {
  return "index";
 }
}

WebContent / WEB-INF / web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
         http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

 <servlet>
  <servlet-name>springmvc</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <load-on-startup>1</load-on-startup>
 </servlet>

 <servlet-mapping>
  <servlet-name>springmvc</servlet-name>
  <url-pattern>/</url-pattern>
 </servlet-mapping>
</web-app>

WebContent / WEB-INF / springmvc-servlet.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:context="http://www.springframework.org/schema/context"
 xmlns:mvc="http://www.springframework.org/schema/mvc"
 xsi:schemaLocation="http://www.springframework.org/schema/beans
 http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
 http://www.springframework.org/schema/mvc
 http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
 http://www.springframework.org/schema/context
 http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <!-- not strictly necessary for this example, but still useful, see http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-ann-controller for more information -->
 <context:component-scan base-package="springmvc.web" />

    <!-- the mvc resources tag does the magic -->
 <mvc:resources mapping="/resources/**" location="/resources/" />

    <!-- also add the following beans to get rid of some exceptions -->
 <bean      class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
 <bean
class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
 </bean>

    <!-- JSTL resolver -->
 <bean id="viewResolver"
  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>

</beans>

WebContent / jsp / index.jsp:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<h1>Page with image</h1>
<!-- use c:url to get the correct absolute path -->
<img src="<c:url value="/resources/img/image.jpg" />" />

Сподіваюсь, це допомагає :-)


12
Цей приклад має бути у посібнику користувача Spring - це найкраще, що я бачив у цій темі. Дякую Йоріс!
Пол

Це, безумовно, зробило для мене хитрість - просто поради Rozky - це те, що я почав робити, але чомусь будь-яка сторінка, окрім моєї домашньої сторінки, відображала URL-адресу ресурсу щодо сторінки - після виконання цієї поради робить їх відносними до контексту мого додатка, замість цього - і працює чудово! Дякую!
Бейн

Дякую! Я витягнув волосся, поки не змінив лінію: <mvc: mapping = = / / ресурси / ** "location =" /, classpath: / META-INF / web-ресурси / "/> to <mvc: map map = "/ ресурси / **" location = "/ ресурси /" />
Позначте D

2
Як зазначав @Bane, значення <c: url = = / / є ключовою частиною цього рішення. Чи хотіли б ви (чи хтось) проти сказати мені чому? Дякую!
Марк

4
Ви також можете використовувати <mvc: resources mapping = "/ **" location = "/ resources /" />, і він буде відображений у корінь. (тобто: Корінь буде містити обидва ресурси ТА jsps). Це може врятувати вас, використовуючи c: url всюди
efaj

46

Цю проблему вирішено навесні 3.0.4. РЕЛІЗ, де ви можете використовувати <mvc:resources mapping="..." location="..."/> елемент конфігурації у файлі конфігурації вашого диспетчера.

Перевірте весняну документацію


5
Хоча насправді це не "неправильно", ця відповідь є занадто коротким, оскільки у власній документації Spring (яку ви посилаєтесь як свою відповідь) щось не вистачає. Перевірте відповідь Йоріса на більш повну відповідь ... не факт, що вона тривала, а те, що він згадує про використання <c: url ...>, про що не згадують ні ваша відповідь, ні докс Спрінгс, - і що довелося бути критичною частиною рішення.
Бейн

38

Навесні 3.0.x додайте наступне до свого servlet-config.xml (файл, який налаштовано в web.xml як contextConfigLocation. Вам також потрібно додати mvc простір імен, але просто google для цього, якщо ви не знаєте, як !;)

Це працює для мене

<mvc:default-servlet-handler/>

З повагою

Аюб Малик


коли я додаю цей рядок, я отримую: org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: рядок 31 у документі XML з ресурсу шляху класу [META-INF / spring / application-context.xml] недійсний; вкладений виняток - org.xml.sax.SAXParseException; рядокNumber: 31; колонка Кількість: 35; cvc-complex-type.2.4.c: відповідний підстановочний код є суворим, але декларації для елемента 'mvc: default-servlet-handler' неможливо знайти.
Алекс Worden

Не забудьте впоратися з порядком обробника, коли у вас також є інші роздільники перегляду.
фенікс

20

Якщо я правильно розумію вашу проблему, я думаю, що я знайшов рішення вашої проблеми:

У мене був той самий випуск, де показано необроблений вихід без стилів css, файлів javascripts або jquery.

Я щойно додав відображення до сервлету "за замовчуванням". У файл web.xml було додано наступне:

 <servlet-mapping>
  <servlet-name>default</servlet-name>
  <url-pattern>*.css</url-pattern>
 </servlet-mapping>

 <servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.js</url-pattern>
 </servlet-mapping>

Це має відфільтрувати запити файлів javascript та css від об’єкта DispatcherRequest.

Знову ж таки, не впевнений, чи це ти за тим, що ти шукаєш, але це працювало для мене. Я думаю, що "default" - це ім'я сервлета за замовчуванням в JBoss. Не надто впевнений, що це для інших серверів.


1
Насправді я не хочу використовувати сервлет за замовчуванням, який приєднує мене до jboss / tomcat
hamo

@hamo чому це проблема? (це справжнє запитання, а не аргументативний реторт). Вам потрібно буде запустити сервер (jboss / tomcat / jetty) у будь-якому випадку для запуску весни, правда?
Манав

3
І ви можете додати всі <url-pattern>теги всередині одного і того ж<servlet-mapping>
Milanka

16

Є ще один пост переповнення стека, який має відмінне рішення .

Це, здається, не є специфічним для Tomcat, просте і чудово працює. Я спробував пару рішень у цій публікації з весняним mvc 3.1, але потім виникли проблеми з моїм динамічним вмістом.

Якщо коротко, там сказано додати відображення сервлетів таким чином:

<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/images/*</url-pattern>
</servlet-mapping>

11

Я знайшов шлях для цього, використовуючи urlrewritefilter тукея. Будь ласка, не соромтесь дати кращу відповідь, якщо у вас є!

В web.xml:

<filter>
    <filter-name>UrlRewriteFilter</filter-name>
    <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>UrlRewriteFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

  <servlet>
    <servlet-name>app</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>app</servlet-name>
    <url-pattern>/app/*</url-pattern>
  </servlet-mapping>

У urlrewrite.xml:

<urlrewrite default-match-type="wildcard">
<rule>
    <from>/</from>
    <to>/app/</to>
</rule>
<rule match-type="regex">
    <from>^([^\.]+)$</from>
    <to>/app/$1</to>
</rule>
<outbound-rule>
    <from>/app/**</from>
    <to>/$1</to>
</outbound-rule>    

Це означає, що будь-які урі із знаком "." в ньому (як, наприклад, style.css) не буде переписано.


5
Краща відповідь - весна 3 <mvc:resources/>, як показав @Joris.
Пол

11

Я щойно стикався з цією проблемою у Spring MVC 3.0, і спочатку я пішов з опцією UrlRewriteFilter. Однак я не був задоволений цим рішенням, оскільки він "не почувався правильним" (я не єдиний - дивіться посилання вище на Весняні форуми, де слово "хак" з'являється кілька разів).

Тож я придумав подібне рішення до "Невідомого (Google)" вище, але запозичив ідею, що весь статичний вміст подається з / static / (взято з версії Spring Roo програми Pet Store). Сервлет "за замовчуванням" не працював для мене, але Spring Webflow ResourceServlet (також взятий із програми, створеної Spring Roo).

Web.xml:

<servlet>
    <servlet-name>mainDispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>2</load-on-startup>
</servlet>

<servlet>
    <servlet-name>Resource Servlet</servlet-name>
    <servlet-class>org.springframework.js.resource.ResourceServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>mainDispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

<servlet-mapping>
    <servlet-name>Resource Servlet</servlet-name>
    <url-pattern>/static/*</url-pattern>
</servlet-mapping>

Єдиною зміною, яку я вніс у JSP, було додати / static / шлях до URL-адрес для CSS, JS та зображень. Наприклад, "$ {pageContext.request.contextPath} /static/css/screen.css".

Для користувачів Maven залежність для "org.springframework.js.resource.ResourceServlet" становить:

<dependency>
    <groupId>org.springframework.webflow</groupId>
    <artifactId>org.springframework.js</artifactId>
    <version>2.0.8.RELEASE</version>
</dependency>

Непогане рішення нікдос- дякую! Я все ще просто "не розумію", чому в сервісному джерелі mvc не існує сервлету ресурсів (замість того, щоб додавати іншу залежність від веб-потоку) або якесь інше рішення з коробки. Urlrewrite добре працює для мене, тому я до цього часу дотримуюся цього! Ура, Хамо
хамо

2
Переглядаючи стандартну (не-Roo) версію програми Spring Pet Clinic, я помітив, що визначення сервлетів для "за замовчуванням" коментується додатковим коментарем: "Відміняйте це в контейнерах (GlassFish), які не декларують це неявне визначення поза полем ". Явна декларація пакета за замовчуванням - org.apache.catalina.servlets.DefaultServlet. Таким чином, це може бути ваш серветт ресурсів "out of the box" (?). Я використовую Jetty для роботи розробників, і, здається, Jetty не дає неявного сервлета за замовчуванням (як Glassfish).
нікдос

8

Мій власний досвід з цією проблемою такий. Більшість веб-сторінок і книг, пов’язаних з весною, начебто підказують, що найбільш підходящим синтаксисом є наступний.

    <mvc:resources mapping="/resources/**" location="/resources/" />

Вищенаведений синтаксис говорить про те, що ви можете розмістити статичні ресурси (CSS, JavaScript, зображення) у папці під назвою "ресурси" у корені програми, тобто / webapp / ресурси /.

Однак, на моєму досвіді (я використовую Eclipse та плагін Tomcat), єдиний підхід працює, якщо ви розміщуєте папку своїх ресурсів у WEB_INF (або META-INF). Отже, синтаксис, який я рекомендую, такий.

    <mvc:resources mapping="/resources/**" location="/WEB-INF/resources/" />

У своєму JSP (або подібному) посилайтеся на ресурс наступним чином.

<script type="text/javascript"
        src="resources/my-javascript.js">
</script>

Потрібно згадувати, що це питання виникло лише тому, що я хотів, щоб мій весняний диспетчерський сервлет (передній контролер) перехопив усе, все динамічне, тобто. Отже, у мене в web.xml є наступне.

<servlet>
    <servlet-name>front-controller</servlet-name>
    <servlet-class>
                org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    <load-on-startup>1</load-on-startup>
    <!-- spring automatically discovers /WEB-INF/<servlet-name>-servlet.xml -->
</servlet>

<servlet-mapping>
    <servlet-name>front-controller</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

Нарешті, оскільки я використовую сучасні кращі практики, у моєму сервлеті переднього контролера xml є наступне (див. Вище).

<mvc:annotation-driven/>

У моєму реальному виконанні контролера є наступне, щоб переконатися, що у мене є метод за замовчуванням для обробки всіх вхідних запитів.

@RequestMapping("/")

Я сподіваюся, що це допомагає.


Це було єдине рішення, яке працювало на мене. Одне цікаве, що я помітив, - це те, що нові ресурси, додані після запуску веб-сторінки, не були знайдені до перезавантаження. З точки зору користувача це не має сенсу, але більшу частину часу не повинно бути головною проблемою.
Рафаель Штейл

Ви сказали з точки зору Tomcat, дивовижно :)
omkar sirra

Я спробував кожну відповідь на цій сторінці. На щастя, коли я дістався цього, мені більше не доведеться пробувати.
TimeTrax

6

Я отримав ту саму проблему і вважав відповідь Йоріса дуже корисною. Але додатково мені потрібно додати

<mvc:annotation-driven /> 

до конфігураційного файлу сервлета. Без цього картографування ресурсів не вийде, і всі обробники перестануть працювати. Сподіваюся, що це комусь допоможе.


2

URLRewrite - це свого роду "хак", якщо ви хочете його так назвати. Що зводиться до того, що ти знову вигадуєш колесо; оскільки вже є рішення. Ще слід пам’ятати Http Server = Статичний контент & сервер додатків = динамічний контент (саме так вони були розроблені). Делегуючи відповідні обов'язки кожному серверу, ви максимально підвищуєте ефективність ... але зараз це, мабуть, лише занепокоєння в критичних для продуктивного середовища умовах, і щось на кшталт Tomcat, швидше за все, добре працюватиме в обох ролях; але все-таки щось слід пам’ятати.


2

Я вирішив це таким чином:

<servlet-mapping>
    <servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.jpg</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.png</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.gif</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.js</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.css</url-pattern>
</servlet-mapping>

Це працює на Tomcat і звичайно Jboss. Однак врешті-решт я вирішив використати рішення Spring, яке надає (як згадував rozky), яке набагато переносніше.


2

Я використав обидва способи: urlrewrite та анотації, що базується на весняному mvc 3.0.x, і виявив, що підхід на основі анотації найбільш підходить

<annotation-driven />

<resources mapping="/resources/**" location="/resources/" />

У разі urlrewrite, потрібно визначити багато правил і деякий час також отримати клас не знайдений виняток для UrlRewriteFilter, як це вже забезпечено залежність від нього. Я виявив, що це відбувається через наявність перехідної залежності, тому знову один крок збільшиться і доведеться виключати цю залежність з pom.xml за допомогою

<exclusion></exclusion> tags.

Тож підхід, заснований на анотації, буде хорошою справою


2

Починаючи з 3-ї весни, всі ресурси потрібно відображати по-різному. Вам потрібно скористатися тегом, щоб вказати розташування ресурсів.

Приклад:

<mvc:resources mapping="/resources/**" location="/resources/" />

Цим способом ви спрямовуєте сервлет диспетчера шукати ресурси каталогів для пошуку статичного вмісту.


1

Мій спосіб вирішення цієї проблеми полягає в розміщенні всіх ваших дій з конкретним префіксом, наприклад "web" або "service", і налаштувати, що всі URL-адреси з цим префіксом буде перехоплене DispatcherServlet.


1

Я просто додаю три правила до весняного правила за замовчуванням (/ **) до urlrewritefilter tuckey (urlrewrite.xml) для вирішення проблеми

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 3.0//EN" "http://tuckey.org/res/dtds/urlrewrite3.0.dtd">
    <urlrewrite default-match-type="wildcard">
     <rule>
      <from>/</from>
      <to>/app/welcome</to>
     </rule>
     <rule>
      <from>/scripts/**</from>
      <to>/scripts/$1</to>
     </rule>
     <rule>
      <from>/styles/**</from>
      <to>/styles/$1</to>
     </rule>
     <rule>
      <from>/images/**</from>
      <to>/images/$1</to>
     </rule>
     <rule>
      <from>/**</from>
      <to>/app/$1</to>
     </rule>
     <outbound-rule>
      <from>/app/**</from>
      <to>/$1</to>
     </outbound-rule> 
    </urlrewrite>

1

Я знаю, що існує кілька конфігурацій для використання статичного вмісту, але моє рішення полягає в тому, що я просто створюю об'ємну папку веб-додатків у вашому tomcat. Цей "масовий веб-сервер" обслуговує лише весь статичний вміст без подачі додатків. Це безболісне та просте рішення для подачі статичного вмісту до вашого фактичного весняного веб-сайту.

Наприклад, я використовую дві папки webapp на своєму tomcat.

  1. springapp : працює лише весняний веб-додаток без статичного вмісту, наприклад imgs, js або css. (призначений для весняних додатків.)
  2. ресурси : він обслуговує лише статичний вміст без JSP, сервлету або будь-якого веб-додатку Java. (призначений для статичного вмісту)

Якщо я хочу використовувати javascript, я просто додаю URI для свого файлу javascript.

EX> /resources/path/to/js/myjavascript.js

Для статичних зображень я використовую той самий метод.

EX> /resources/path/to/img/myimg.jpg

Нарешті, я поставив " обмеження безпеки " на своєму tomcat, щоб заблокувати доступ до фактичного каталогу. Я ставив користувачеві "ніхто" до обмеження, щоб сторінка створювала "403 заборонену помилку", коли люди намагалися отримати доступ до статичного контенту.

Поки що це працює дуже добре для мене. Я також зауважив, що на багатьох популярних веб-сайтах, таких як Amazon, Twitter та Facebook, вони використовують різні URI для подання статичного вмісту. Щоб дізнатися це, просто клацніть правою кнопкою миші будь-який статичний вміст і перевірте їх URI.


1

Це зробило справжню роботу в моєму випадку

в web.xml:

...
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/images/*</url-pattern>
    <url-pattern>/css/*</url-pattern>
    <url-pattern>/javascripts/*</url-pattern>
</servlet-mapping>


<servlet-mapping>
    <servlet-name>spring-mvc-dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

...


1

Для конфігурації пружини на базі java ви можете використовувати наступне

Використання ResourceHandlerRegistry, який зберігає реєстрації обробників ресурсів для обслуговування статичних ресурсів.

Детальніше @ WebMvcConfigurerAdapter, який визначає методи зворотного виклику для налаштування на основі Java конфігурації Spring MVC, включеної за допомогою @EnableWebMvc.

@EnableWebMvc
@Configurable
@ComponentScan("package.to.scan")
public class WebConfigurer extends WebMvcConfigurerAdapter {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/static_resource_path/*.jpg").addResourceLocations("server_destination_path");

    }

0

Зустрівшись та пройшовши той самий процес прийняття рішень, який описаний тут, я вирішив перейти з пропозицією ResourceServlet, яка працює досить непогано.

Зауважте, що ви отримуєте більше інформації про те, як використовувати веб-потік у процесі збирання Maven тут: http://static.springsource.org/spring-webflow/docs/2.0.x/reference/html/ch01s05.html

Якщо ви використовуєте стандартне центральне сховище Maven, артефактом є (на противагу вищезгаданому пакету джерел джерела):

<dependency>
    <groupId>org.springframework.webflow</groupId>
    <artifactId>spring-js</artifactId>
    <version>2.0.9.RELEASE</version>
</dependency> 

0

Цього можна досягти щонайменше трьома способами.

Рішення :

  • розкрийте html як файл ресурсу
  • доручити JspServlet також обробляти * .html запити
  • написати власний сервлет (або передати інший існуючий запит сервлету до * .html).

Для отримання повних прикладів коду, як цього досягти, будь ласка, перейдіть до моєї відповіді в іншому дописі: Як зіставити запити до HTML-файлу у Spring MVC?


0

Проблема полягає в URLPattern

Змініть свій шаблон URL-адреси на відображенні сервлетів із "/" на "/ *"


0
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<mvc:default-servlet-handler/>
</beans>

і якщо ви хочете використовувати конфігурацію на основі анотацій, використовуйте наведений нижче код

@Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }

0

Помістіть статичний вміст, наприклад css, js, у наступний шлях

resources 
        ->static
               ->css
               ->js
(or) 
resources 
        ->public
               ->css
               ->js
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.