Saya mengembangkan aplikasi web menggunakan Spring MVC 3 dan mendapatkan DispatcherServlet
semua 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?
sumber
Jawaban:
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:
Isi file akan terlihat seperti:
src / springmvc / web / HelloWorldController.java:
Konten Web / WEB-INF / web.xml:
Konten Web / WEB-INF / springmvc-servlet.xml:
Konten Web / jsp / index.jsp:
Semoga ini membantu :-)
sumber
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
sumber
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
Salam
Ayub Malik
sumber
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:
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.
sumber
<url-pattern>
tag di dalam yang sama<servlet-mapping>
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:
sumber
Saya menemukan cara mengatasinya menggunakan urlrewritefilter tuckey. Silakan berikan jawaban yang lebih baik jika Anda punya!
Di web.xml:
Di urlrewrite.xml:
Ini berarti bahwa setiap uri dengan '.' di dalamnya (seperti style.css misalnya) tidak akan ditulis ulang.
sumber
<mvc:resources/>
, seperti yang ditunjukkan oleh @Joris.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:
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:
sumber
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.
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.
Di JSP Anda (atau serupa), referensi sumber daya sebagai berikut.
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.
Akhirnya, karena saya menggunakan praktik terbaik saat ini, saya memiliki yang berikut di servlet xml pengontrol depan saya (lihat di atas).
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.
Saya harap ini membantu.
sumber
Saya mendapat masalah yang sama dan menemukan jawaban Joris sangat membantu. Tapi selain itu saya perlu menambahkan
ke file konfigurasi servlet. Tanpa itu pemetaan sumber daya tidak akan berfungsi dan semua penangan akan berhenti bekerja. Semoga ini bisa membantu seseorang.
sumber
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.
sumber
Saya memecahkannya dengan cara ini:
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.
sumber
Saya menggunakan kedua cara yaitu urlrewrite dan anotasi berbasis di spring mvc 3.0.x dan menemukan bahwa pendekatan berbasis anotasi paling cocok yaitu
Jadi pendekatan berbasis anotasi akan bagus.
sumber
Dari Spring 3, semua sumber daya perlu dipetakan dengan cara yang berbeda. Anda perlu menggunakan tag untuk menentukan lokasi sumber daya.
Contoh:
Dengan melakukan cara ini, Anda mengarahkan servlet operator untuk melihat ke sumber direktori untuk mencari konten statis.
sumber
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.
sumber
Saya hanya menambahkan tiga aturan sebelum aturan default pegas (/ **) ke urlrewritefilter tuckey (urlrewrite.xml) untuk menyelesaikan masalah
sumber
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.
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.
sumber
Ini melakukan pekerjaan nyata dalam kasus saya
di web.xml:
...
sumber
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.
sumber
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):
sumber
Ini dapat dicapai setidaknya dalam tiga cara.
Solusi :
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?
sumber
Masalahnya adalah dengan URLPattern
Ubah pola URL Anda pada pemetaan servlet Anda dari "/" ke "/ *"
sumber
dan jika Anda ingin menggunakan konfigurasi berbasis anotasi, gunakan kode di bawah ini
sumber
Tempatkan konten statis seperti css, js di jalur berikut
sumber