स्प्रिंग एमवीसी में स्थिर सामग्री को कैसे संभालें?


200

मैं स्प्रिंग एमवीसी 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>

अब यह विज्ञापन के रूप में काम करता है, हालांकि मैं स्थैतिक सामग्री को कैसे संभाल सकता हूं? इससे पहले, RESTful URL का उपयोग करने से पहले, मैंने सभी * .html को उदाहरण के लिए पकड़ा होगा और उसे भेजा होगा DispatcherServlet, लेकिन अब यह एक अलग बॉल गेम है।

मेरे पास एक / स्टैटिक / फोल्डर है जिसमें / स्टाइल्स /, / js /, / इमेज / आदि शामिल हैं और मैं / स्टैटिक / * को बाहर करना चाहूंगा DispatcherServlet

जब मैंने ऐसा किया तो मुझे स्थिर संसाधन मिल सकते हैं:

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

लेकिन मैं चाहता हूं कि इसके लिए अच्छे URL हों (स्प्रिंग एमवीसी 3 का उपयोग करने की बात) लैंडिंग पृष्ठ www.domain.com/app/ नहीं है

मैं टॉमकट या किसी अन्य सर्वलेट कंटेनर से जुड़ा एक समाधान भी नहीं चाहता हूं, और क्योंकि यह (अपेक्षाकृत) कम ट्रैफ़िक है, मुझे वेबसर्वर (अपाचे एचटीडी की तरह) की आवश्यकता नहीं है।

क्या इसका कोई साफ समाधान है?



@ थमो ए संबंधित थ्रेड: stackoverflow.com/questions/34279705/…
smwikipedia

जवाबों:


266

चूंकि मैंने इस मुद्दे पर बहुत समय बिताया है, मैंने सोचा कि मैं अपना समाधान साझा करूंगा। वसंत 3.0.4 के बाद से, एक कॉन्फ़िगरेशन पैरामीटर है जिसे कहा जाता है <mvc:resources/>( संदर्भ प्रलेखन वेबसाइट पर इसके बारे में अधिक ) जो कि आपकी साइट के रूट पर डिस्पैचर्वलेट का उपयोग करते समय स्थिर संसाधनों की सेवा के लिए उपयोग किया जा सकता है।

इसका उपयोग करने के लिए, एक निर्देशिका संरचना का उपयोग करें जो निम्न की तरह दिखता है:

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

फ़ाइलों की सामग्री इस तरह दिखनी चाहिए:

src / springmvc / वेब / 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 / वेब-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 / वेब-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
यह उदाहरण स्प्रिंग उपयोगकर्ता गाइड में होना चाहिए - इस विषय पर मैंने जो सबसे अच्छा देखा है। धन्यवाद Joris!
पॉल

इसने निश्चित रूप से मेरे लिए चाल चली - महज रोजकी सलाह है कि मैंने क्या करना शुरू कर दिया, लेकिन किसी कारणवश मेरे पृष्ठ के अलावा कोई भी पृष्ठ, संसाधन-URL के पृष्ठ के सापेक्ष प्रदान कर रहा था - इस सलाह का पालन करना उन्हें सापेक्ष बनाता है मेरे ऐप के संदर्भ-रूट के बजाय - और पूरी तरह से काम करता है! धन्यवाद!
बैन

धन्यवाद! मैं अपने बालों को तब तक बाहर निकाल रहा था जब तक मैं लाइन नहीं बदल देता: <mvc: resource mapping = "/ resource / **" location = "/, classpath: / META-INF / web-resource /" /> से <mvc: रिसोर्स मैपिंग = "/ संसाधन / **" स्थान = "/ संसाधन /" />
मार्क डी

2
जैसा कि @Bane ने बताया, <c: url value = ... /> इस समाधान का एक महत्वपूर्ण हिस्सा है। क्या आप (या कोई भी) मुझे यह बताने का मन करेगा? धन्यवाद!
मार्क

4
आप <mvc: रिसोर्स मैपिंग = "/ **" स्थान = "/ संसाधन /" /> का भी उपयोग कर सकते हैं और इसे रूट पर मैप किया जाएगा। (यानी: रूट में संसाधन और jsps दोनों शामिल होंगे)। यह आपको c: url को हर जगह इस्तेमाल करके बचा सकता है
efaj

46

यह समस्या वसंत 3.0.4 में हल हो गई है। जहाँ आप <mvc:resources mapping="..." location="..."/> अपनी स्प्रिंग डिस्पैचर कॉन्फ़िगरेशन फ़ाइल में कॉन्फ़िगरेशन तत्व का उपयोग कर सकते हैं ।

वसंत प्रलेखन की जाँच करें


5
हालांकि वास्तव में "गलत" नहीं है, यह उत्तर बहुत संक्षिप्त है क्योंकि स्प्रिंग का स्वयं का प्रलेखन (जिसे आपने अपने उत्तर के रूप में संदर्भित किया है) कुछ गायब प्रतीत होता है। अधिक पूर्ण उत्तर के लिए जोरिस के उत्तर की जाँच करें ... तथ्य यह है कि यह लंबा नहीं है, लेकिन तथ्य यह है कि वह <c: url ...> के उपयोग का उल्लेख करता है, जो न तो आपके उत्तर और न ही स्प्रिंग के डॉक्स का उल्लेख करते हैं - और जो साबित हुआ समाधान का एक महत्वपूर्ण हिस्सा हो।
बैन

38

स्प्रिंग 3.0.x में अपने सर्वलेट-config.xml (संदर्भ के रूप में web.xml में कॉन्फ़िगर की गई फ़ाइल को निम्नलिखित जोड़ें। आपको mvc नाम स्थान के साथ-साथ Google को भी जोड़ने की आवश्यकता है, लेकिन यदि आपको नहीं पता कि यह कैसे है। ;)

ये मेरे लिए सही है

<mvc:default-servlet-handler/>

सादर

अयूब मलिक


जब मैं इस लाइन को जोड़ता हूं तो मुझे प्राप्त होता है: org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: पंक्ति 31 में XML पथ में क्लास पथ संसाधन [META-INF / spring / application-reference.xml] से अमान्य है; नेस्टेड अपवाद org.xml.sax.SAXParseException है; लाइननंबर: 31; कॉलमनंबर: 35; cvc-complex-type.2.4.c: मैचिंग वाइल्डकार्ड सख्त है, लेकिन तत्व 'mvc: default-सर्वलेट-हैंडलर' के लिए कोई घोषणा नहीं मिल सकती है।
एलेक्स वर्डेन

हैंडलर के आदेश से निपटना सुनिश्चित करें जब आपके पास कुछ अन्य दृश्य रिज़ॉल्वर भी हों।
फोनिक्स

20

यदि मैं आपकी समस्या को सही ढंग से समझता हूं, तो मुझे लगता है कि मुझे आपकी समस्या का हल मिल गया है:

मेरे पास एक ही मुद्दा था जहां कच्चे आउटपुट को बिना सीएसएस शैलियों, 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>

यह DispatcherRequest ऑब्जेक्ट से जावास्क्रिप्ट और सीएसएस फ़ाइल अनुरोधों को फ़िल्टर करना चाहिए।

फिर से, यकीन नहीं है कि यह वही है जो आप के बाद हैं, लेकिन इसने मेरे लिए काम किया। मुझे लगता है कि "डिफ़ॉल्ट" JBoss के भीतर डिफ़ॉल्ट सर्वलेट का नाम है। यह भी निश्चित नहीं है कि यह अन्य सर्वरों के लिए क्या है।


1
मैं वास्तव में डिफ़ॉल्ट
सर्वलेट

@ धाम क्यों एक समस्या है? (यह एक वास्तविक सवाल है, न कि एक तर्कपूर्ण प्रतिशोध)। आपको बस चलाने के लिए सर्वर (jboss / tomcat / jetty) को चलाने की आवश्यकता होगी, है ना?
मानव

3
और आप <url-pattern>उसी के अंदर सभी टैग जोड़ सकते हैं<servlet-mapping>
मिल्का

16

एक और स्टैक ओवरफ्लो पोस्ट है जिसमें एक उत्कृष्ट समाधान है

यह टॉमकैट विशिष्ट नहीं लगता है, सरल है, और महान काम करता है। मैंने इस पोस्ट में स्प्रिंग 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/>, जैसा कि @ जॉरिस द्वारा प्रदर्शित किया गया है।
पॉल

11

मैं बस स्प्रिंग एमवीसी 3.0 में इस मुद्दे से जूझ रहा हूं और मैं शुरू में UrlRewriteFilter विकल्प के साथ गया था। हालाँकि मैं इस समाधान से खुश नहीं था क्योंकि यह "सही नहीं लगा" (मैं केवल एक ही नहीं हूं - ऊपर दिए गए लिंक को स्प्रिंग फ़ोरम में देखें जहां "हैक" शब्द कुछ समय में प्रकट होता है)।

इसलिए मैं ऊपर "अज्ञात (Google)" के समान समाधान के साथ आया था, लेकिन / स्थिर / (पेट स्टोर ऐप के स्प्रिंग रो संस्करण से लिया गया) से सभी स्थिर सामग्री होने का विचार उधार लिया था। "डिफ़ॉल्ट" सर्वलेट मेरे लिए काम नहीं करता था, लेकिन स्प्रिंग वेबफ्लो रिसोर्ससर्वलेट ने (स्प्रिंग रोओ उत्पन्न ऐप से भी लिया)।

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 के लिए मैंने जो एकमात्र परिवर्तन किया, वह था CSS / JS और छवियों के लिए URL में / स्थिर / पथ जोड़ना। जैसे "$ {pageContext.request.contextPath} /static/css/screen.css"।

मावेन उपयोगकर्ताओं के लिए "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
स्प्रिंग पेट क्लिनिक ऐप के मानक (गैर-रूओ) संस्करण पर वापस देखते हुए, मैंने देखा कि "डिफ़ॉल्ट" के लिए सर्वलेट परिभाषा में अतिरिक्त टिप्पणी के साथ टिप्पणी की गई है: "कंटेनरों में इसे रद्द करें (ग्लासफिश) जो इसे घोषित नहीं करते हैं। बॉक्स के बाहर निहित परिभाषा "। डिफ़ॉल्ट के लिए स्पष्ट पैकेज घोषणा org.apache.catalina.servlets.DefaultServlet है। तो यह आपका "आउट ऑफ द बॉक्स" संसाधन सर्वलेट (?) हो सकता है। मैं जेट्टी का उपयोग देव कार्य के लिए करता हूं और ऐसा लगता है कि जेट्टी एक अंतर्निहित डिफ़ॉल्ट सर्वलेट (जैसे ग्लासफिश) प्रदान नहीं करता है।
निकदोस

8

इस समस्या के साथ मेरा अपना अनुभव इस प्रकार है। अधिकांश स्प्रिंग से संबंधित वेब पेज और किताबें यह बताती हैं कि सबसे उपयुक्त वाक्यविन्यास निम्नलिखित है।

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

उपर्युक्त वाक्य-विन्यास से यह पता चलता है कि आप अपने स्थैतिक संसाधनों (CSS, जावास्क्रिप्ट, चित्र) को अपने आवेदन के मूल में "संसाधन" नामक फ़ोल्डर में रख सकते हैं, अर्थात / webapp / resource /।

हालांकि, मेरे अनुभव में (मैं एक्लिप्स और टॉमकैट प्लगइन का उपयोग कर रहा हूं), एकमात्र तरीका जो काम करता है वह है यदि आप अपने संसाधन फ़ोल्डर को 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("/")

आशा है कि ये आपकी मदद करेगा।


यही एकमात्र उपाय था जो मेरे लिए काम करता था। एक दिलचस्प बात मैंने देखी कि वेबप को शुरू करने के बाद नए संसाधन जोड़े गए जो कि पुनः आरंभ होने तक नहीं पाए गए। उपयोगकर्ता के नजरिए से कोई मतलब नहीं है, लेकिन ज्यादातर समय एक बड़ी समस्या नहीं होनी चाहिए।
राफेल स्टिल

आपने टॉमकैट परिप्रेक्ष्य के साथ कहा, भयानक :)
ओंकार सर्रा

मैंने इस पृष्ठ पर प्रत्येक उत्तर की कोशिश की। शुक्र है कि जब मुझे यह मिला तो मुझे कोई और कोशिश नहीं करनी पड़ी।
टाइमट्रैक्स

6

मुझे वही समस्या मिली और मुझे जॉरिस का जवाब बहुत मददगार लगा। लेकिन इसके अलावा मुझे जोड़ने की जरूरत है

<mvc:annotation-driven /> 

सर्वलेट कॉन्फ़िगरेशन फ़ाइल के लिए। इसके बिना रिसोर्स मैपिंग काम नहीं करेगी और सभी हैंडलर काम करना बंद कर देंगे। उम्मीद है कि यह किसी की मदद करेगा।


2

URLRrrite एक "हैक" की तरह है अगर आप इसे कॉल करना चाहते हैं। क्या यह नीचे आता है, आप पहिया का फिर से आविष्कार कर रहे हैं; जैसा कि पहले से ही मौजूद समाधान हैं। याद रखने वाली एक और बात है Http Server = स्टेटिक कंटेंट और ऐप सर्वर = डायनेमिक कंटेंट (यह इसी तरह तैयार किया गया है)। प्रत्येक सर्वर के लिए उपयुक्त ज़िम्मेदारियों को सौंपकर आप दक्षता को अधिकतम कर सकते हैं ... लेकिन अब-एक-दिन शायद यह केवल एक प्रदर्शन महत्वपूर्ण वातावरण में एक चिंता का विषय है और टॉमकैट जैसा कुछ होने की संभावना सबसे अधिक समय में दोनों भूमिकाओं में अच्छी तरह से काम करेगी; लेकिन यह अभी भी कम कुछ भी ध्यान में रखना है।


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>

यह टॉमकैट और टोर्काट जॉबॉस पर काम करता है। हालांकि अंत में मैंने समाधान का उपयोग करने का फैसला किया वसंत प्रदान करता है (जैसा कि रज़की ने उल्लेख किया है) जो कि कहीं अधिक पोर्टेबल है।


2

मैंने दोनों तरीकों का उपयोग किया है जो स्प्रिंग mvc 3.0.x में आधारित urlrewrite और एनोटेशन है और पाया कि एनोटेशन आधारित दृष्टिकोण सबसे उपयुक्त है

<annotation-driven />

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

Urlrewrite के मामले में, बहुत सारे नियम को परिभाषित करना होगा और कुछ समय के लिए UrlRewriteFilter के लिए वर्ग नहीं मिला है, क्योंकि इसके लिए पहले से ही निर्भरता प्रदान की गई है। मैंने पाया कि यह सकर्मक निर्भरता की उपस्थिति के कारण हो रहा है, इसलिए फिर से एक कदम बढ़ेगा और उस निर्भरता को pom.xml से बाहर करना होगा

<exclusion></exclusion> tags.

इसलिए एनोटेशन आधारित दृष्टिकोण अच्छा सौदा होगा।


2

स्प्रिंग 3 से, सभी संसाधनों को एक अलग तरीके से मैप करने की आवश्यकता है। संसाधनों के स्थान को निर्दिष्ट करने के लिए आपको टैग का उपयोग करने की आवश्यकता है।

उदाहरण :

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

इस तरह से, आप डिस्पैचर सर्वलेट को डायरेक्ट्री रिसोर्स में देखने के लिए स्टैटिक कंटेंट देखने के लिए निर्देशित कर रहे हैं।


1

इस समस्या को हल करने का मेरा तरीका आपके सभी कार्यों को "वेब" या "सेवा" जैसे एक विशिष्ट उपसर्ग के साथ रख रहा है और कॉन्फ़िगर करता है कि सभी उपग्रहों को उस उपसर्ग के साथ डिस्पैचरसर्वलेट द्वारा इंटरसेप्ट किया जाएगा।


1

मैं समस्या को हल करने के लिए tuckey's urlrewritefilter (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

मुझे पता है कि स्थैतिक सामग्री का उपयोग करने के लिए कुछ कॉन्फ़िगरेशन हैं, लेकिन मेरा समाधान यह है कि मैं सिर्फ आपके टॉमकैट के भीतर एक थोक वेब-एप्लिकेशन फ़ोल्डर बनाता हूं। यह "बल्क वेबैप" केवल सभी स्टैटिक-कंटेंट को बिना सेवारत ऐप परोस रहा है। यह आपके वास्तविक स्प्रिंग वेब पर स्थिर सामग्री परोसने के लिए दर्द मुक्त और आसान उपाय है।

उदाहरण के लिए, मैं अपने टॉमकैट पर दो वेबैप फ़ोल्डर का उपयोग कर रहा हूं।

  1. बसंत : यह केवल स्प्रिंग वेब एप्लिकेशन को स्टैम्प -कंटेंट जैसे इमग, जेएस या सीएसएस के बिना चला रहा है। (स्प्रिंग ऐप्स के लिए समर्पित है।)
  2. संसाधन : यह JSP, सर्वलेट या जावा वेब एप्लिकेशन के किसी भी प्रकार के बिना केवल स्थिर सामग्री परोस रहा है। (स्थिर-सामग्री के लिए समर्पित)

अगर मुझे जावास्क्रिप्ट का उपयोग करना है, तो मैं अपनी जावास्क्रिप्ट फ़ाइल के लिए बस यूआरआई जोड़ता हूं।

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

स्थैतिक छवियों के लिए, मैं उसी विधि का उपयोग कर रहा हूं।

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

अंतिम, मैंने वास्तविक निर्देशिका तक पहुंच को अवरुद्ध करने के लिए अपने टास्किट पर " सुरक्षा-बाधा " डाल दी । मैंने "कोई भी" उपयोगकर्ता-रोल को बाधा में नहीं डाला ताकि पृष्ठ "403 निषिद्ध त्रुटि" उत्पन्न हो जब लोगों ने स्थिर-सामग्री पथ तक पहुंचने का प्रयास किया।

अब तक यह मेरे लिए बहुत अच्छा काम करता है। मैंने यह भी देखा कि अमेज़ॅन, ट्विटर और फेसबुक जैसी कई लोकप्रिय वेबसाइट्स वे स्थैतिक-सामग्री की सेवा के लिए अलग-अलग यूआरआई का उपयोग कर रहे हैं। यह जानने के लिए, बस किसी भी स्थिर सामग्री पर राइट क्लिक करें और उनके 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

जावा आधारित वसंत विन्यास के लिए आप निम्नलिखित का उपयोग कर सकते हैं

का उपयोग करना रिसोर्सहैंडलेरजिस्ट्री जो स्थैतिक संसाधनों की सेवा के लिए संसाधन संचालकों के पंजीकरण को संग्रहीत करता है।

अधिक जानकारी @ WebMvcConfigurerAdapter जो स्प्रिंगबैक 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

यहां वर्णित एक ही निर्णय लेने की प्रक्रिया से सामना करने और जाने के बाद, मैंने रिसोर्सस्लेट प्रस्ताव के साथ जाने का फैसला किया, जो काफी अच्छी तरह से काम करता है।

ध्यान दें कि आप अपने मावेन बिल्ड प्रक्रिया में वेबफ्लो का उपयोग करने के बारे में अधिक जानकारी प्राप्त करें: http://static.springsource.org/spring-webflow/docs/2.0.x/reference/html/ch01s03.html

यदि आप मानक मावेन केंद्रीय भंडार का उपयोग करते हैं तो विरूपण साक्ष्य (ऊपर उल्लिखित स्प्रिंग्ससोर्स बंडल के विपरीत) है:

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

0

इसे कम से कम तीन तरीकों से हासिल किया जा सकता है।

समाधान :

  • HTML को एक संसाधन फ़ाइल के रूप में उजागर करें
  • JspServlet को भी * .html अनुरोधों को संभालने का निर्देश दें
  • अपना स्वयं का सर्वलेट लिखें (या * .html पर अन्य मौजूदा सर्वलेट अनुरोधों को पास करें)।

पूर्ण कोड उदाहरणों के लिए यह कैसे प्राप्त करें कृपया मेरे जवाब को किसी अन्य पोस्ट में देखें: स्प्रिंग एमवीसी में HTML फ़ाइल के लिए अनुरोध कैसे करें?


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();
    }

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.