Spring MVC'de statik içerik nasıl kullanılır?


200

Bahar MVC 3 kullanarak bir webapp geliştiriyorum ve DispatcherServlet'/' gibi tüm istekleri yakalamak var (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>

Şimdi bu reklamı yapıldığı gibi çalışır, ancak statik içeriği nasıl işleyebilirim? Daha önce, RESTful URL'leri kullanmadan önce, tüm * .html'yi yakalayıp örneğin adresine gönderirdim DispatcherServlet, ama şimdi farklı bir top oyunu.

/ Styles /, / js /, / images / etc içeren bir / static / klasörünüz var ve / static / * 'dan hariç tutmak istiyorum DispatcherServlet.

Şimdi bunu yaptığımda statik kaynakları çalıştırabilir:

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

Ancak, açılış sayfasının www.domain.com/app/ olduğunu değil, güzel URL'lere sahip olmamı istiyorum (Spring MVC 3'ü kullandığım nokta).

Ayrıca tomcat veya başka bir sunucu uygulamasına bağlı bir çözüm istemiyorum ve bu (nispeten) düşük trafik olduğundan bir web sunucusuna (apache httpd gibi) infront ihtiyacım yok.

Bunun temiz bir çözümü var mı?



Yanıtlar:


266

Bu konuda çok zaman harcadığım için çözümümü paylaşacağımı düşündüm. İlkbahar 3.0.4'ten bu yana , sitenizin kökünde DispatchServlet'i kullanırken statik kaynakları sunmak için kullanılabilen ( başvuru belgeleri web sitesinde<mvc:resources/> daha fazla) adlı bir yapılandırma parametresi vardır .

Bunu kullanmak için aşağıdakine benzeyen bir dizin yapısı kullanın:

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

Dosyaların içeriği aşağıdaki gibi olmalıdır:

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" />" />

Bu yardımcı olur umarım :-)


12
Bu örnek Bahar kullanıcı kılavuzunda olmalıdır - bu konuda gördüğüm en iyisi. Teşekkürler Joris!
Paul

Bu benim için kesinlikle hile yaptı - sadece rozky'nin tavsiyesi yapmaya başladığım şeydi, ancak bir nedenle ana sayfam dışındaki herhangi bir sayfa, kaynak URL'sini sayfaya göre oluşturuyordu - bu tavsiyeyi izleyerek onları göreceli hale getiriyor benim app bağlam-köküne - ve mükemmel çalışıyor! Teşekkürler!
Bane

Teşekkürler! <Mvc: resources mapping = "/ resources / **" location = "/, classpath: / META-INF / web-resources /" /> satırını <mvc: resources mapping olarak değiştirene kadar saçlarımı çekiyordum = "/ kaynaklar / **" konum = "/ kaynaklar /" />
Mark D

2
@ Banan'ın belirttiği gibi, <c: url değeri = ... /> bu çözümün önemli bir parçasıdır. Bana (ya da birisine) neden olduğunu söyler misiniz? Teşekkürler!
Mark

4
Ayrıca <mvc: resources mapping = "/ **" location = "/ resources /" /> kullanabilirsiniz ve kök ile eşlenir. (ie: Kök her iki kaynağı VE jsps'yi içerecektir). Bu, her yerde c: url kullanarak sizi kurtarabilir
efaj

46

Bu sorun, 3.0.4 baharında çözülmüştür. <mvc:resources mapping="..." location="..."/> ilkbahar dağıtıcısı yapılandırma dosyanızda yapılandırma öğesini .

Bahar Belgelerini Kontrol Edin


5
Aslında "yanlış" olmamasına rağmen, Spring'in kendi belgelerinde (cevabınız olarak atıfta bulunduğunuz) bir şey eksik olduğu için bu cevap çok kısa. Joris'in cevabını daha eksiksiz bir cevap için kontrol edin ... uzun olmadığı gerçeği değil, ne cevabınızın ne de Spring'in dox'unun bahsetmediği ve kanıtladığı <c: url ...> kullanımından bahsettiği gerçeği çözümün kritik bir parçası olmak.
Bane

38

Spring 3.0.x sürümünde servlet-config.xml dosyasına (web.xml dosyasında contextConfigLocation olarak yapılandırılmış dosya) aşağıdakileri ekleyin. Mvc ad alanını da eklemeniz gerekir, ancak bunun için google !;)

Bu benim için çalışıyor

<mvc:default-servlet-handler/>

Saygılarımızla

Ayub Malik


Bu satırı eklediğimde şunu alıyorum: org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Sınıf belgesi kaynağından XML belgesinde Satır 31 [META-INF / spring / application-context.xml] geçersiz; iç içe kural dışı durum org.xml.sax.SAXParseException; lineNumber: 31; columnNumber: 35; cvc-complex-type.2.4.c: Eşleşen joker karakter katı, ancak 'mvc: default-servlet-handler' öğesi için hiçbir bildirim bulunamadı.
Alex Worden

Başka bir görünüm çözümleyiciniz varsa, işleyicinin sırası ile uğraştığınızdan emin olun.
phoenix

20

Sorununuzu doğru anlarsam, sorununuza bir çözüm bulduğumu düşünüyorum:

Ben ham çıktı hiçbir css stilleri, javascripts veya jquery dosyaları bulundu ile gösterilen aynı sorunu vardı.

Az önce "varsayılan" sunucu uygulamasına eşlemeler ekledim. Web.xml dosyasına aşağıdakiler eklendi:

 <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>

Bu, javascript ve css dosya isteklerini DispatcherRequest nesnesinden filtreleyecektir.

Yine, peşinde olduğunuz şeyin bu olduğundan emin değilim, ama benim için çalıştı. Bence "varsayılan" JBoss içindeki varsayılan sunucu uygulamasının adıdır. Diğer sunucular için ne olduğundan emin değilim.


1
Aslında beni jboss / tomcat ile eşleştiren varsayılan sunucu uygulamasını kullanmak istemiyorum
hamo

@hamo bu neden bir problem? (bu gerçek bir soru, tartışmalı bir imbik değil). İlkbaharın çalışması için sunucuyu (jboss / tomcat / jetty) zaten çalıştırmanız gerekecek, değil mi?
Manav

3
Ve tüm <url-pattern>etiketleri aynı içeride ekleyebilirsiniz<servlet-mapping>
Milanka

16

Mükemmel bir çözüme sahip başka bir yığın taşma direği var .

Tomcat'e özgü görünmüyor, basit ve harika çalışıyor. Ben bahar mvc 3.1 ile bu yazı bir kaç çözüm denedim ama sonra dinamik içerik sunulan alma sorunları vardı.

Kısacası, böyle bir sunucu uygulaması eşlemesi ekleyin diyor:

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

11

Tucker'ın urlrewritefilter kullanarak bir yol buldum. Eğer varsa daha iyi bir cevap vermek için çekinmeyin!

Web.xml dosyasında:

<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 dosyasında:

<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>    

Bu, '.' İle herhangi bir uri anlamına gelir. içinde (örneğin style.css gibi) yeniden yazılmaz.


5
<mvc:resources/>@Joris'in gösterdiği gibi daha iyi cevap İlkbahar 3'tür.
Paul

11

Ben sadece Bahar MVC 3.0 bu sorun ile grappling ve başlangıçta UrlRewriteFilter seçeneği ile gitti. Ancak "doğru hissetmedim" olarak bu çözümden memnun değildim (sadece ben değilim - "hack" kelimesinin birkaç kez göründüğü Bahar Forumlarına yukarıdaki bağlantıya bakın).

Bu yüzden yukarıdaki "Bilinmeyen (Google)" için benzer bir çözüm buldum ancak / static / (Pet Store uygulamasının Spring Roo sürümünden alınmış) tarafından sunulan tüm statik içeriğe sahip olma fikrini ödünç aldım. "Varsayılan" sunucu uygulaması benim için çalışmadı, ancak Spring Webflow ResourceServlet (ayrıca Spring Roo tarafından oluşturulan uygulamadan da alındı) işe yaradı.

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'lerde yaptığım tek değişiklik, CSS, JS ve resimler için URL'lere / static / yol eklemekti. Örneğin "$ {pageContext.request.contextPath} /static/css/screen.css".

Maven kullanıcıları için "org.springframework.js.resource.ResourceServlet" bağımlılığı:

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

Kötü bir çözüm değil nickdos- teşekkür ederim! Ben hala neden çekirdek bahar mvc (web akışı ile başka bir bağımlılık eklemek yerine) veya kutudan başka bir çözüm eklemek zorunda değilken kaynak sunucu uygulaması olmadığı için "anlamıyorum". Urlrewrite benim için iyi çalışıyor, bu yüzden şimdilik buna sadık kalacağım! Şerefe, Hamo
hamo

2
Spring Pet Clinic uygulamasının standart (Roo olmayan) sürümüne baktığımda, "varsayılan" için sunucu uygulaması tanımının ek yorum ile yorumlandığını fark ettim: "Bunu bildirmeyen kaplarda (GlassFish) bu öğeyi kaldır msgstr "kutunun dışında dolaylı tanım". Varsayılan için açık paket bildirimi org.apache.catalina.servlets.DefaultServlet şeklindedir. Yani bu "kutudan çıkmış" kaynak sunucu uygulamanız (?) Olabilir. Geliştirme için Jetty kullanıyorum ve Jetty, örtük bir varsayılan sunucu uygulaması (Glassfish gibi) sağlamıyor gibi görünüyor.
nickdos

8

Bu sorunla ilgili kendi deneyimim aşağıdaki gibidir. Baharla ilgili çoğu web sayfası ve kitap, en uygun sözdiziminin aşağıdaki gibi olduğunu göstermektedir.

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

Yukarıdaki sözdizimi, statik kaynaklarınızı (CSS, JavaScript, resimler) uygulamanızın kök dizinindeki "kaynaklar" adlı bir klasöre (webapp / resources /) yerleştirmenizi önerir.

Ancak, tecrübelerime göre (Eclipse ve Tomcat eklentisini kullanıyorum), kaynak klasörünüzü WEB_INF (veya META-INF) içine yerleştirdiğinizde çalışan tek yaklaşım çalışır . Bu yüzden, tavsiye ettiğim sözdizimi aşağıdaki gibidir.

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

JSP'nizde (veya benzeri), kaynağa aşağıdaki gibi başvurun.

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

Söylemeye gerek yok, tüm soru sadece ortaya çıktı çünkü Bahar dağıtıcı servletimin (ön kontrolör) her şeyi, dinamik her şeyi, yani her şeyi kesmesini istedim. Bu yüzden web.xml dosyamda aşağıdakiler var.

<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>

Son olarak, mevcut en iyi uygulamaları kullandığım için, ön denetleyici sunucu uygulamam xml'de aşağıdakilere sahibim (yukarıya bakın).

<mvc:annotation-driven/>

Ve gerçek denetleyici uygulamamda, gelen tüm istekleri işlemek için varsayılan bir yöntemim olduğundan emin olmak için aşağıdakilere sahibim.

@RequestMapping("/")

Umarım bu yardımcı olur.


Benim için işe yarayan tek çözüm buydu. Fark ettiğim ilginç bir şey, web uygulamasını başlattıktan sonra eklenen yeni kaynakların yeniden başlatılıncaya kadar bulunamaması. Kullanıcı açısından mantıklı değil, ancak çoğu zaman büyük bir sorun olmamalıdır.
Rafael Steil

Tomcat perspektifiyle söyledin, harika :)
omkar sirra

Bu sayfadaki her yanıtı denedim. Neyse ki bu bir var, ben daha fazla denemek zorunda değilsiniz.
TimeTrax

6

Aynı problemi aldım ve Joris'in cevabını çok yardımcı buldum. Ama ek olarak eklemeliyim

<mvc:annotation-driven /> 

sunucu uygulaması yapılandırma dosyasına. Bu olmadan kaynak eşleme çalışmaz ve tüm işleyiciler çalışmayı durdurur. Umarım bu birine yardımcı olur.


2

URLRewrite buna bir tür "hack" denir. Aşağı inen şey, tekerleği yeniden icat ediyorsun; çünkü zaten mevcut çözümler var. Hatırlanması gereken başka bir şey de Http Server = Statik içerik & App server = dinamik içerik (bu şekilde tasarlandıkları). Her sunucuya uygun sorumlulukları devrederek verimliliği en üst düzeye çıkarırsınız ... ancak günümüzde bu muhtemelen sadece performans açısından kritik ortamlarda bir endişe kaynağıdır ve Tomcat gibi bir şey büyük olasılıkla her iki rolde de iyi çalışır; ama yine de akılda tutulması gereken bir şey değil.


2

Bu şekilde çözdüm:

<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>

Bu Tomcat ve tabii Jboss üzerinde çalışıyor. Ancak sonunda Spring'in (rozky tarafından belirtildiği gibi) daha taşınabilir bir çözüm kullanmaya karar verdim .


2

Bahar mvc 3.0.x tabanlı urlrewrite ve ek açıklama her iki yolu kullandım ve ek açıklama tabanlı yaklaşım en uygun olduğunu buldum

<annotation-driven />

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

Urlrewrite durumunda, çok fazla kural tanımlamak zorundasınız ve bir süre de, bağımlılık sağladığı için UrlRewriteFilter için bir sınıf bulunamadı. Geçişli bağımlılığın varlığı nedeniyle olduğunu buldum, bu yüzden yine bir adım artacak ve bu bağımlılığı pom.xml kullanarak hariç tutmak zorunda kalacak

<exclusion></exclusion> tags.

Dolayısıyla ek açıklama tabanlı yaklaşım iyi bir anlaşma olacaktır.


2

İlkbahar 3'ten itibaren, tüm kaynakların farklı bir şekilde eşlenmesi gerekir. Kaynakların konumunu belirtmek için etiketi kullanmanız gerekir.

Misal :

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

Bu şekilde, dağıtım programı sunucu uygulamasını, statik içeriği aramak üzere dizin kaynaklarına bakmaya yönlendirirsiniz.


1

Bu sorunu çözme yolum, tüm eylemlerinizi "web" veya "service" gibi belirli bir önekle yerleştirmek ve bu önekle tüm URL'lerin DispatcherServlet tarafından engelleneceğini yapılandırmaktır.


1

Sorunu çözmek için tuckey'nin urlrewritefilter (urlrewrite.xml) 'e ilkbahar varsayılan kuralından (/ **) önce üç kural ekliyorum

<?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

Statik içeriği kullanmak için birkaç yapılandırma olduğunu biliyorum, ancak benim çözümüm sadece Tomcat'inizde bir toplu web uygulaması klasörü oluşturmam. Bu "toplu web uygulaması" yalnızca uygulama sunmadan tüm statik içeriğe hizmet vermektedir. Bu, gerçek yay web uygulamanıza statik içerik sunmak için ağrısız ve kolay bir çözümdür.

Örneğin, tomcat'imde iki webapp klasörü kullanıyorum.

  1. springapp : imgs, js veya css gibi statik içeriği olmayan sadece bahar web uygulamasını çalıştırıyor. (bahar uygulamaları için ayrılmıştır.)
  2. kaynakları : yalnızca JSP, servlet veya herhangi bir tür java web uygulaması olmayan statik içeriği sunar. (statik içerikler için ayrılmıştır)

Javascript kullanmak istiyorsanız, sadece benim javascript dosya için URI ekleyin.

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

Statik görüntüler için aynı yöntemi kullanıyorum.

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

Son olarak, gerçek dizine erişimi engellemek için tomcat'ime " güvenlik-kısıtlaması " koydum . Kullanıcıların statik içerik yoluna erişmeye çalıştıklarında sayfanın "403 yasak hatası" oluşturmasını sağlamak için "kimse" kullanıcı sınırlamasını kısıtlamaya koydum.

Şimdiye kadar benim için çok iyi çalışıyor. Amazon, Twitter ve Facebook gibi birçok popüler web sitesinin statik içerik sunmak için farklı URI kullandıklarını da fark ettim. Bunu bulmak için, herhangi bir statik içeriğe sağ tıklayın ve URI'larını kontrol edin.


1

Bu benim durumumdaki gerçek işi yaptı

web.xml dosyasında:

...
<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 tabanlı yay yapılandırması için aşağıdakileri kullanabilirsiniz

Statik kaynaklara hizmet vermek için kaynak işleyicilerinin kayıtlarını depolayan ResourceHandlerRegistry'i kullanma .

Daha fazla bilgi @ WebMvcConfigurerAdapter @EnableWebMvc ile etkinleştirilen Bahar MVC için Java tabanlı yapılandırmayı özelleştirmek için geri arama yöntemleri tanımlar.

@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

Burada açıklanan aynı karar verme süreciyle karşılaştıktan ve geçtikten sonra, oldukça iyi çalışan ResourceServlet önerisine gitmeye karar verdim.

Buradaki maven oluşturma işleminizde webflow'u nasıl kullanacağınız hakkında daha fazla bilgi aldığınızı unutmayın: http://static.springsource.org/spring-webflow/docs/2.0.x/reference/html/ch01s05.html

Standart Maven merkezi deposunu kullanırsanız artefakt (yukarıda belirtilen kaynak kaynağı paketinin tersidir):

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

0

Bu, en az üç şekilde elde edilebilir.

Çözümler :

  • html'yi kaynak dosyası olarak gösterme
  • JspServlet'e ayrıca * .html isteklerini işlemesi talimatını verin
  • kendi sunucu uygulamanızı yazın (veya mevcut başka bir sunucu uygulaması isteklerine * .html'ye iletin).

Tam kod örnekleri için bunu nasıl başarabilirim lütfen başka bir yazıda cevabım için başvurmak: Bahar MVC istekleri HTML dosyasına nasıl eşlenir?


0

Sorun URLPattern ile ilgili

Sunucu uygulaması eşlemenizdeki URL modelinizi "/" yerine "/ *" olarak değiştirin


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>

ek açıklama tabanlı yapılandırma kullanmak istiyorsanız aşağıdaki kodu kullanın

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

0

Css, js gibi statik içerikleri aşağıdaki yola yerleştirin

resources 
        ->static
               ->css
               ->js
(or) 
resources 
        ->public
               ->css
               ->js
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.