Bagaimana menangani konten statis di Spring MVC?

200

Saya mengembangkan aplikasi web menggunakan Spring MVC 3 dan mendapatkan DispatcherServletsemua permintaan ke '/' seperti itu (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>

Sekarang ini berfungsi seperti yang diiklankan, namun bagaimana saya bisa menangani konten statis? Sebelumnya, sebelum menggunakan URL RESTful, saya akan menangkap semua * .html misalnya dan mengirimkannya ke DispatcherServlet, tapi sekarang ini permainan bola yang berbeda.

Saya memiliki / static / folder yang mencakup / styles /, / js /, / images / etc dan saya ingin mengecualikan / static / * dari DispatcherServlet.

Sekarang saya bisa membuat sumber daya statis berfungsi ketika saya melakukan ini:

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

Tapi saya ingin memiliki URL yang bagus (maksud saya menggunakan Spring MVC 3) bukan halaman arahan menjadi www.domain.com/app/

Saya juga tidak ingin solusi digabungkan ke kucing jantan atau wadah servlet lainnya, dan karena ini (relatif) lalu lintas rendah saya tidak perlu webserver (seperti apache httpd) infront.

Apakah ada solusi bersih untuk ini?

hamo
sumber
@hamo Sebuah utas terkait: stackoverflow.com/questions/34279705/…
smwikipedia

Jawaban:

266

Karena saya menghabiskan banyak waktu untuk masalah ini, saya pikir saya akan membagikan solusi saya. Sejak musim semi 3.0.4, ada parameter konfigurasi yang disebut <mvc:resources/>(lebih lanjut tentang itu di situs web dokumentasi referensi ) yang dapat digunakan untuk menyajikan sumber daya statis saat masih menggunakan DispatchServlet di root situs Anda.

Untuk menggunakan ini, gunakan struktur direktori yang terlihat seperti berikut:

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

Isi file akan terlihat seperti:

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";
 }
}

Konten Web / 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>

Konten Web / 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>

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

Semoga ini membantu :-)

Joris
sumber
12
Contoh ini harus ada dalam panduan pengguna Spring - ini adalah yang terbaik yang pernah saya lihat tentang topik ini. Terima kasih Joris!
Paul
Ini benar-benar melakukan trik untuk saya - hanya saran rozky adalah apa yang saya mulai lakukan tetapi untuk beberapa alasan halaman apa pun, selain halaman rumah saya, membuat URL sumber daya relatif terhadap halaman - mengikuti saran ini membuat mereka relatif ke root konteks aplikasi saya - dan berfungsi dengan baik! Terima kasih!
Bane
Terima kasih! Saya mencabut rambut saya sampai saya mengubah baris: <mvc: pemetaan sumber daya = "/ sumber daya / **" location = "/, classpath: / META-INF / sumber daya web /" /> ke <mvc: pemetaan sumber daya = "/ resources / **" location = "/ resources /" />
Mark D
2
Seperti @Bane tunjukkan, <c: nilai url = ... /> adalah bagian penting dari solusi ini. Apakah Anda (atau siapa saja) keberatan memberi tahu saya mengapa? Terima kasih!
Tandai
4
Anda juga dapat menggunakan <mvc: pemetaan sumber daya = "/ **" location = "/ resources /" /> dan itu akan dipetakan ke root. (yaitu: Root akan berisi sumber daya DAN jsps). Ini dapat menghemat penggunaan c: url di mana saja
efaj
46

Masalah ini diselesaikan pada musim semi 3.0.4.RELEASE di mana Anda dapat menggunakan <mvc:resources mapping="..." location="..."/> elemen konfigurasi di file konfigurasi spring dispatcher Anda.

Periksa Dokumentasi Musim Semi

gila
sumber
5
Meskipun sebenarnya tidak "salah", jawaban ini terlalu singkat karena dokumentasi Spring sendiri (yang Anda rujuk sebagai jawaban Anda) tampaknya melewatkan sesuatu. Periksa jawaban Joris untuk jawaban yang lebih lengkap ... bukan fakta bahwa itu panjang tetapi fakta bahwa ia menyebutkan penggunaan <c: url ...> yang tidak disebutkan oleh jawaban Anda maupun dox Spring - dan yang terbukti menjadi bagian penting dari solusi.
Bane
38

Di Spring 3.0.x tambahkan berikut ini ke servlet-config.xml Anda (file yang dikonfigurasi di web.xml sebagai contextConfigLocation. Anda perlu menambahkan namespace mvc juga tetapi hanya google untuk itu jika Anda tidak tahu caranya !;)

Itu bekerja untuk saya

<mvc:default-servlet-handler/>

Salam

Ayub Malik

Ayub Malik
sumber
ketika saya menambahkan baris ini saya mendapatkan: org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Baris 31 dalam dokumen XML dari sumber jalur kelas [META-INF / spring / application-context.xml] tidak valid; pengecualian bersarang adalah org.xml.sax.SAXParseException; lineNumber: 31; columnNumber: 35; cvc-complex-type.2.4.c: Wildcard yang cocok ketat, tetapi tidak ada deklarasi yang dapat ditemukan untuk elemen 'mvc: default-servlet-handler'.
Alex Worden
Pastikan untuk menangani urutan pawang ketika Anda memiliki beberapa resolusi tampilan lainnya.
phoenix
20

Jika saya memahami masalah Anda dengan benar, saya pikir saya telah menemukan solusi untuk masalah Anda:

Saya memiliki masalah yang sama di mana output mentah ditampilkan tanpa gaya css, javascripts atau file jquery ditemukan.

Saya baru saja menambahkan pemetaan ke servlet "default". Yang berikut ini ditambahkan ke file 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>

Ini harus memfilter permintaan file javascript dan css dari objek DispatcherRequest.

Sekali lagi, tidak yakin apakah ini yang Anda cari, tetapi itu berhasil untuk saya. Saya pikir "default" adalah nama dari servlet default di dalam JBoss. Tidak terlalu yakin apa itu untuk server lain.

pengguna243397
sumber
1
Saya sebenarnya tidak ingin menggunakan servlet default - yang memasangkan saya ke jboss / tomcat
hamo
@ ya, mengapa itu menjadi masalah? (ini adalah pertanyaan asli, bukan jawaban argumentatif). Anda perlu menjalankan server (jboss / tomcat / jetty) untuk menjalankan musim semi, bukan?
Manav
3
Dan Anda dapat menambahkan semua <url-pattern>tag di dalam yang sama<servlet-mapping>
Milanka
16

Ada posting stack overflow lainnya yang memiliki solusi yang sangat baik .

Tampaknya tidak spesifik Tomcat, sederhana, dan bekerja dengan baik. Saya sudah mencoba beberapa solusi dalam posting ini dengan spring mvc 3.1 tetapi kemudian mengalami masalah dalam mendapatkan konten dinamis saya.

Secara singkat, dikatakan menambahkan pemetaan servlet seperti ini:

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

Saya menemukan cara mengatasinya menggunakan urlrewritefilter tuckey. Silakan berikan jawaban yang lebih baik jika Anda punya!

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

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

Ini berarti bahwa setiap uri dengan '.' di dalamnya (seperti style.css misalnya) tidak akan ditulis ulang.

hamo
sumber
5
Jawaban yang lebih baik adalah Spring 3 <mvc:resources/>, seperti yang ditunjukkan oleh @Joris.
Paul
11

Saya baru saja bergulat dengan masalah ini di Spring MVC 3.0 dan saya awalnya pergi dengan opsi UrlRewriteFilter. Namun saya tidak senang dengan solusi ini karena "rasanya tidak beres" (saya bukan satu-satunya - lihat tautan di atas ke Forum Musim Semi di mana kata "retas" muncul beberapa kali).

Jadi saya datang dengan solusi yang mirip dengan "Tidak Dikenal (Google)" di atas tetapi meminjam ide untuk memiliki semua konten statis dilayani dari / static / (diambil dari versi Spring Roo dari aplikasi Pet Store). Servlet "default" tidak berfungsi untuk saya tetapi Spring Webflow ResourceServlet tidak (juga diambil dari aplikasi yang dihasilkan 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>

Satu-satunya perubahan yang saya buat ke JSP adalah menambahkan / static / path ke URL untuk CSS, JS dan gambar. Misalnya "$ {pageContext.request.contextPath} /static/css/screen.css".

untuk pengguna Maven ketergantungan untuk "org.springframework.js.resource.ResourceServlet" adalah:

<dependency>
    <groupId>org.springframework.webflow</groupId>
    <artifactId>org.springframework.js</artifactId>
    <version>2.0.8.RELEASE</version>
</dependency>
nickdos
sumber
Bukan solusi buruk nickdos- terima kasih! Saya masih tidak "mengerti" mengapa tidak ada servlet sumber daya di inti pegas MVC (daripada harus menambahkan ketergantungan lain dengan aliran web) atau solusi lain di luar kotak. Urlrewrite berfungsi dengan baik untuk saya jadi saya akan tetap menggunakannya untuk saat ini! Cheers, Hamo
hamo
2
Melihat kembali versi standar (non-Roo) dari aplikasi Spring Pet Clinic, saya perhatikan bahwa definisi servlet untuk "default" dikomentari dengan komentar tambahan: "Batalkan komentar ini dalam wadah (GlassFish) yang tidak menyatakan ini definisi implisit di luar kotak ". Deklarasi paket eksplisit untuk default adalah org.apache.catalina.servlets.DefaultServlet. Jadi ini mungkin servlet sumber daya "out of the box" (?) Anda. Saya menggunakan Jetty untuk pekerjaan dev dan sepertinya Jetty tidak menyediakan servlet default implisit (seperti Glassfish).
nickdos
8

Pengalaman saya sendiri dengan masalah ini adalah sebagai berikut. Sebagian besar halaman web dan buku yang terkait dengan Spring tampaknya menyarankan bahwa sintaksis yang paling tepat adalah sebagai berikut.

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

Sintaks di atas menunjukkan bahwa Anda dapat menempatkan sumber daya statis Anda (CSS, JavaScript, gambar) dalam folder bernama "sumber daya" di root aplikasi Anda, yaitu / webapp / sumber daya /.

Namun, dalam pengalaman saya (saya menggunakan Eclipse dan plugin Tomcat), satu-satunya pendekatan yang berfungsi adalah jika Anda menempatkan folder sumber daya Anda di dalam WEB_INF (atau META-INF). Jadi, sintaks yang saya rekomendasikan adalah sebagai berikut.

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

Di JSP Anda (atau serupa), referensi sumber daya sebagai berikut.

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

Tidak perlu disebutkan lagi, seluruh pertanyaan hanya muncul karena saya ingin servlet Spring controller (front controller) saya untuk mencegat semuanya, semuanya dinamis, yaitu. Jadi saya punya yang berikut di web.xml saya.

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

Akhirnya, karena saya menggunakan praktik terbaik saat ini, saya memiliki yang berikut di servlet xml pengontrol depan saya (lihat di atas).

<mvc:annotation-driven/>

Dan saya memiliki yang berikut ini dalam implementasi controller saya yang sebenarnya, untuk memastikan bahwa saya memiliki metode default untuk menangani semua permintaan yang masuk.

@RequestMapping("/")

Saya harap ini membantu.

Puneet Lamba
sumber
Itulah satu-satunya solusi yang berhasil untuk saya. Satu hal menarik yang saya perhatikan adalah sumber daya baru ditambahkan setelah saya memulai webapp tidak ditemukan sampai restart. Tidak masuk akal dari perspektif pengguna, tetapi seharusnya tidak menjadi masalah utama sebagian besar waktu.
Rafael Steil
Anda diceritakan dengan perspektif Tomcat, luar biasa :)
omkar sirra
Saya mencoba setiap jawaban di halaman ini. Untungnya ketika saya sampai di sini saya tidak perlu mencoba lagi.
TimeTrax
6

Saya mendapat masalah yang sama dan menemukan jawaban Joris sangat membantu. Tapi selain itu saya perlu menambahkan

<mvc:annotation-driven /> 

ke file konfigurasi servlet. Tanpa itu pemetaan sumber daya tidak akan berfungsi dan semua penangan akan berhenti bekerja. Semoga ini bisa membantu seseorang.

Susitha Ravinda Senarath
sumber
2

URLRewrite adalah semacam "retas" jika Anda ingin menyebutnya demikian. Apa yang terjadi adalah, Anda menciptakan kembali roda; karena sudah ada solusi. Satu hal yang perlu diingat adalah Http Server = Konten statis & Server aplikasi = konten dinamis (ini adalah bagaimana mereka dirancang). Dengan mendelegasikan tanggung jawab yang sesuai untuk setiap server Anda memaksimalkan efisiensi ... tapi sekarang ini mungkin hanya masalah dalam lingkungan kinerja kritis dan sesuatu seperti Tomcat kemungkinan besar akan bekerja dengan baik di kedua peran sebagian besar waktu; tapi itu masih sesuatu yang perlu diingat.

Stoney
sumber
2

Saya memecahkannya dengan cara ini:

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

Ini bekerja pada Tomcat dan ofcourse Jboss. Namun pada akhirnya saya memutuskan untuk menggunakan solusi yang disediakan Spring (seperti yang disebutkan oleh rozky) yang jauh lebih portabel.

Chepech
sumber
2

Saya menggunakan kedua cara yaitu urlrewrite dan anotasi berbasis di spring mvc 3.0.x dan menemukan bahwa pendekatan berbasis anotasi paling cocok yaitu

<annotation-driven />

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

Dalam kasus urlrewrite, harus mendefinisikan banyak aturan dan beberapa waktu juga mendapatkan kelas tidak ditemukan pengecualian untuk UrlRewriteFilter karena telah menyediakan ketergantungan untuk itu. Saya menemukan bahwa itu terjadi karena adanya ketergantungan transitif, jadi sekali lagi satu langkah akan meningkat dan harus mengecualikan ketergantungan itu dari pom.xml menggunakan

<exclusion></exclusion> tags.

Jadi pendekatan berbasis anotasi akan bagus.

Ruju
sumber
2

Dari Spring 3, semua sumber daya perlu dipetakan dengan cara yang berbeda. Anda perlu menggunakan tag untuk menentukan lokasi sumber daya.

Contoh:

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

Dengan melakukan cara ini, Anda mengarahkan servlet operator untuk melihat ke sumber direktori untuk mencari konten statis.

Balasubramanian Jayaraman
sumber
1

Cara saya memecahkan masalah ini adalah menempatkan semua tindakan Anda dengan awalan spesifik seperti "web" atau "layanan" dan mengonfigurasi bahwa semua url dengan awalan itu akan dicegat oleh DispatcherServlet.

Teja Kantamneni
sumber
1

Saya hanya menambahkan tiga aturan sebelum aturan default pegas (/ **) ke urlrewritefilter tuckey (urlrewrite.xml) untuk menyelesaikan masalah

<?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>
Pablo Cantero
sumber
1

Saya tahu ada beberapa konfigurasi untuk menggunakan konten statis, tetapi solusi saya adalah saya baru saja membuat folder aplikasi web massal dalam kucing jantan Anda. "Webapp massal" ini hanya melayani semua konten statis tanpa melayani aplikasi. Ini adalah solusi bebas rasa sakit dan mudah untuk menyajikan konten statis ke webapp musim semi Anda yang sebenarnya.

Misalnya, saya menggunakan dua folder aplikasi web pada kucing jantan saya.

  1. springapp : itu hanya menjalankan aplikasi web pegas tanpa isi statis seperti imgs, js, atau css. (didedikasikan untuk aplikasi musim semi.)
  2. sumber daya : ini hanya melayani konten statis tanpa JSP, servlet, atau segala jenis aplikasi web java. (didedikasikan untuk konten statis)

Jika saya ingin menggunakan javascript, saya cukup menambahkan URI untuk file javascript saya.

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

Untuk gambar statis, saya menggunakan metode yang sama.

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

Terakhir, saya menaruh " batasan keamanan " pada kucing jantan saya untuk memblokir akses ke direktori aktual. Saya menempatkan "tidak ada" pengguna-roll ke kendala sehingga halaman menghasilkan "403 galat terlarang" ketika orang mencoba mengakses jalur konten statis.

Sejauh ini bekerja dengan baik untuk saya. Saya juga memperhatikan bahwa banyak situs web populer seperti Amazon, Twitter, dan Facebook mereka menggunakan URI berbeda untuk menyajikan konten statis. Untuk mengetahuinya, klik kanan pada konten statis dan periksa URI mereka.

0DayHack
sumber
1

Ini melakukan pekerjaan nyata dalam kasus saya

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

...

Jorge Sanchez
sumber
1

Untuk konfigurasi pegas berbasis java, Anda dapat menggunakan yang berikut ini

Menggunakan ResourceHandlerRegistry yang menyimpan pendaftaran penangan sumber daya untuk melayani sumber daya statis.

More Info @ WebMvcConfigurerAdapter yang mendefinisikan metode panggilan balik untuk menyesuaikan konfigurasi berbasis Java untuk Spring MVC diaktifkan melalui @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");

    }
Vipul Panth
sumber
0

Setelah bertemu dan melalui proses pengambilan keputusan yang sama seperti yang dijelaskan di sini, saya memutuskan untuk pergi dengan proposal ResourceServlet yang bekerja dengan sangat baik.

Perhatikan bahwa Anda mendapatkan informasi lebih lanjut tentang cara menggunakan webflow dalam proses pembuatan pakar di sini: http://static.springsource.org/spring-webflow/docs/2.0.x/reference/html/ch01s05.html

Jika Anda menggunakan repositori pusat Maven standar artefaknya (berlawanan dengan bundel sumber mata air yang disebutkan di atas):

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

Ini dapat dicapai setidaknya dalam tiga cara.

Solusi :

  • mengekspos html sebagai file sumber daya
  • menginstruksikan JspServlet untuk juga menangani permintaan * .html
  • tulis servlet Anda sendiri (atau berikan permintaan servlet lain ke * .html).

Untuk contoh kode lengkap cara mencapai ini, silakan merujuk ke jawaban saya di pos lain: Bagaimana cara memetakan permintaan ke file HTML di Spring MVC?

walkeros
sumber
0

Masalahnya adalah dengan URLPattern

Ubah pola URL Anda pada pemetaan servlet Anda dari "/" ke "/ *"

Asif Malek
sumber
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>

dan jika Anda ingin menggunakan konfigurasi berbasis anotasi, gunakan kode di bawah ini

@Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }
Jekin Kalariya
sumber
0

Tempatkan konten statis seperti css, js di jalur berikut

resources 
        ->static
               ->css
               ->js
(or) 
resources 
        ->public
               ->css
               ->js
Gangatharan Arumugam
sumber