2009-11-23 11 views
10

किसी जेएसपी फ़ाइल के रूट को हल करने का एक आसान तरीका क्या है जो वेब अनुप्रयोग की मूल जेएसपी निर्देशिका में स्थित नहीं है SpringMVCs ViewResolvers का उपयोग कर? उदाहरण के लिए, मान लीजिए हम निम्न वेब अनुप्रयोग संरचना है:स्प्रिंग एमवीसी: वेब अनुप्रयोग में रूट 'जेएसपी' फ़ोल्डर की उप-निर्देशिकाओं के पथ को कैसे हल करें

web-app 
    |-WEB-INF 
    |-jsp 
     |-secure 
     |-admin.jsp 
     |-admin2.jsp 
     index.jsp 
     login.jsp 

मैं jsp रूट फ़ोल्डर के भीतर JSP फ़ाइलें और सुरक्षित को हल करने के लिए कुछ बाहर के बॉक्स घटकों का उपयोग करना चाहते हैं उपनिर्देशिका। मैं एक *-servlet.xml फ़ाइल है कि परिभाषित करता है:

एक आउट-ऑफ-द-बॉक्स, InternalResourceViewResolver:

<bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property> 
    <property name="prefix" value="/WEB-INF/jsp/"></property> 
    <property name="suffix" value=".jsp"></property> 
</bean> 

हैंडलर मैपिंग:

<bean id="handlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> 
<property name="mappings"> 
    <props> 
    <prop key="/index.htm">urlFilenameViewController</prop> 
    <prop key="/login.htm">urlFilenameViewController</prop> 
    <prop key="/secure/**">urlFilenameViewController</prop> 
    </props> 
</property> 
</bean> 

एक आउट-ऑफ-द-बॉक्स UrlFilenameViewController नियंत्रक:

<bean id="urlFilenameViewController" class="org.springframework.web.servlet.mvc.UrlFilenameViewController"> 
</bean> 

मेरी समस्या यह है कि अनुरोध सुरक्षित निर्देशिका में JSPs को हल नहीं किया जा सकता है, क्योंकि jspViewResolver में केवल /jsp/ और /jsp/secure/ के रूप में परिभाषित एक उपसर्ग है।

क्या इस तरह की उपनिर्देशिका को संभालने का कोई तरीका है? मैं इस संरचना को रखना पसंद करूंगा क्योंकि मैं वसंत सुरक्षा का उपयोग करने की कोशिश कर रहा हूं और उपनिर्देशिका में सभी सुरक्षित पृष्ठ यह करने का एक अच्छा तरीका है।

शायद इसे स्वीकार करने का एक आसान तरीका है लेकिन मैं वसंत और वसंत एमवीसी ढांचे के लिए नया हूं इसलिए किसी भी पॉइंटर्स की सराहना की जाएगी।

+0

असंबद्ध नोट, लेकिन आपको 'jstlView' को 'viewClass' के रूप में निर्दिष्ट करने की आवश्यकता नहीं है, वसंत डिफ़ॉल्ट रूप से इसे समझ जाएगा। – skaffman

उत्तर

0

आप इस प्रकार संपत्ति निर्धारित करने की आवश्यकता:

<property name="prefix" value="/WEB-INF/jsp/"/> 

और फिर आप यूआरआई का उपयोग कर सकते secure/admin1.jsp

+0

क्षमा करें कि उपसर्ग एक टाइपो था, मैंने इसे अभी ठीक कर दिया है। हालांकि, अगर मुझे सुरक्षित/admin1.jsp (या सुरक्षित/admin1.htm) सुरक्षित करना है, जो /WEB-INF/jsp/admin1.jsp में दिखाई देगा और सुरक्षित फ़ोल्डर को शामिल नहीं करेगा क्योंकि यह उपसर्ग का हिस्सा नहीं है (मुझे लगता है) – chrisjleu

+0

आप किस वसंत संस्करण का उपयोग कर रहे हैं? यह 2.5.x –

+0

में काम करना चाहिए मैं 2.5.6.SEC01 का उपयोग कर रहा हूँ। मैंने कोशिश की है लेकिन समस्या यह है कि सरल यूआरएल हैंडलर मैपिंग में मैपिंग्स मेरे उदाहरण में निर्दिष्ट हैं। किसी भी अनुरोध/सुरक्षित/** के परिणामस्वरूप स्प्रिंग जेएसपी फ़ाइल को/WEB-INF/jsp/में रहने की उम्मीद कर रहा है, जब निश्चित रूप से वास्तविक फ़ाइल/WEB-INF/jsp/safe/में स्थित है। मैंने एक उपयुक्त कामकाज खोजा है जो मेरे उद्देश्यों को पूरा करता है लेकिन इसकी सीमाएं हैं। मैं इसे भी पोस्ट करने के लिए आगे बढ़ जाऊंगा। – chrisjleu

1

आप

<property name="formView" value="secure/admin"/> 
<property name="successView" value="secure/admin2"/> 
तरह नियंत्रक में विचारों का नाम देने की कोशिश कर सकते

<bean id="viewResolver" 
    class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <property name="prefix" value="/WEB-INF/jsp/" /> 
    <property name="suffix" value=".jsp" /> 
से नीचे उपसर्ग और प्रत्यय मैप किया गया है

यह अंततः /WEB-INF/jsp/secure/admin.jsp और /WEB-INF/jsp/secure/admin2.jsp

+0

मुझे यकीन नहीं है कि मैं समझता हूं कि प्रॉपर्टी फॉर्म कैसे देखें और सफलता देखें जब मैं UrlFilenameViewController का उपयोग करना चाहता हूं। – chrisjleu

+0

फॉर्म दृश्य और सफलता दृश्य दृश्य दृश्य हैं जिन्हें आप अपने नियंत्रकों में इंजेक्ट कर सकते हैं, यदि आप कॉन्फ़िगर करने योग्य दृश्य चाहते हैं। यदि आप SimpleFormController का उपयोग करते हैं तो यह 2 डिफ़ॉल्ट रूप से आपके लिए उपलब्ध हैं। –

+0

इस के पास फॉर्म के साथ कुछ लेना देना नहीं है, वे केवल थोड़ी सी सामग्री वाले जेएसपी पेज हैं, और हालांकि मैंने दिए गए उदाहरण में दो पेज हैं, यह दो तक सीमित नहीं है। मैं एक * फॉर्म * नियंत्रक का उपयोग भी नहीं कर रहा हूं और मुझे लगता है कि यह फ़ॉर्म दृश्य और सफलता देखें गुणों का दुरुपयोग करेगा यदि मैं इसका सुझाव देने के तरीके में इसका उपयोग करने का प्रयास करता हूं। यह भी सुनिश्चित नहीं है कि यह वैसे भी कैसे काम करेगा। – chrisjleu

1

करने के लिए नक्शे होगा आप में में alwaysUseFullPath गुण सेट करने की जरूरत है सच करने के लिए हैंडलर:

<bean id="handlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> 
    ... 
    <property name="alwaysUseFullPath" value="true" /> 
</bean> 

यह '/ सुरक्षित /' URI का हिस्सा उपयोग करने के लिए हैंडलर के लिए बाध्य करेगा और उसके बाद समाधानकर्ता यह शामिल होंगे जब वेब-INF/jsp में एक JSP की तलाश में।

+0

इसके साथ कोई भाग्य नहीं है। अभी भी जड़ जेएसपी फ़ोल्डर में देख रहे हैं। – chrisjleu

2

मैं पूछे गए प्रश्न के सटीक समाधान को खोजने में सक्षम नहीं हूं लेकिन मेरे पास एक विशेष कार्य है जो मेरी विशेष आवश्यकताओं के अनुरूप है। समस्या हैडर मैपिंग में झूठ बोलती है।यदि पोस्ट में उदाहरण के रूप में निर्दिष्ट किया गया है, तो सुरक्षित फ़ोल्डर में पृष्ठों के लिए किसी भी अनुरोध के परिणामस्वरूप /WEB-INF/JSP/ फ़ोल्डर में वास्तविक जेएसपी फ़ाइल का पता लगाने में असफल प्रयास होता है, जब वास्तविक फ़ाइल /WEB-INF/jsp/secure/ में स्थित होती है।

हालांकि, यदि ऐसा है तो तरह निर्दिष्ट:

<bean id="handlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> 
    <property name="mappings"> 
    <props> 
    <prop key="/login.htm">loginFormController</prop> 
    <prop key="**/*.htm">urlFilenameViewController</prop> 
    </props> 
    </property> 
</bean> 

तो सभी पृष्ठों को सही ढंग से हल कर रहे हैं। /login.html पर एक अनुरोध एक विशिष्ट फॉर्म नियंत्रक पर जाएगा, लेकिन अन्य सभी पृष्ठों के लिए अनुरोध करता है, इससे कोई फर्क नहीं पड़ता कि वे रूट जेएसपी निर्देशिका में हैं या उप निर्देशिका पाए जाएंगे। मेरे लिए यह ठीक है क्योंकि मैं वास्तव में जो खोज रहा था वह एप्लिकेशन में प्रत्येक पृष्ठ के लिए नियंत्रक को निर्दिष्ट करने से बचने का एक तरीका था (हमम ... शायद मुझे पहले पोस्ट में यह स्पष्ट करना चाहिए था - और शायद बेहतर तरीके हैं वैसे भी ऐसा करें (?))। **/*.htm कैच-ऑल केस के रूप में कार्य करता है और किसी भी पेज को जिसे मैं एक अलग नियंत्रक द्वारा संभाला चाहता हूं, को इस संपत्ति के ऊपर स्पष्ट रूप से निर्दिष्ट किया जा सकता है, जैसा कि /login.htm द्वारा प्रदर्शित किया गया है।

2

डॉक्स के अनुसार, काम करने के लिए के साथ UrlFilenameViewController या return new ModelAndView("secure/login");

1

यह इस तरह लगता है चाहिए का प्रयास करें:

http://static.springsource.org/spring/docs/3.0.x/api/org/springframework/web/servlet/mvc/UrlFilenameViewController.html

कॉन्फ़िगरेशन आप से पता चला है दस्तावेज़ में उदाहरण के साथ मिलते हुए लगते हैं । यदि आपका स्प्रिंग एमवीसी डिस्पैचर सर्वलेट "/" मैप किया गया है तो "{context} /secure/whatever.jsp" के अनुरोधों को "सुरक्षित/जो भी" नाम देखने के लिए अनुवादित किया जाना चाहिए। शायद यह "**" वाइल्डकार्ड के साथ कुछ करने के लिए है? या शायद आपकी कुछ अन्य कॉन्फ़िगरेशन सही नहीं हैं? क्या आप अपने web.xml का हिस्सा शामिल कर सकते हैं जहां आपने अपना स्प्रिंग डिस्पैचर सर्वलेट सेट किया है और आप अपने ब्राउज़र में अनुरोध कर रहे पूर्ण पथ भी शामिल कर सकते हैं?

समस्या को खोजने के लिए अपने अनुप्रयोग में वसंत MVC स्रोत कोड डाउनलोड करने के लिए करने के लिए और शामिल यह है, तो देखने के लिए वास्तव में क्या दोनों SimpleUrlHandlerMapping और UrlFilenameViewController सेम में चल रहा है एक डिबगर का उपयोग इंगित करने के लिए प्रयास करने के लिए किया जाएगा एक और तरीका है त्रुटि। आपको बहुत जल्दी यह निर्धारित करने में सक्षम होना चाहिए कि इस तरह से चीजें गलत क्यों हो रही हैं।

0

सभी सब फ़ोल्डर उपसर्ग में वाइल्ड कार्ड का उपयोग कर

नियंत्रक से आप बस jsp लौट सकते हैं स्ट्रिंग के रूप में नाम और jsp भले ही वह/वेब के सब फ़ोल्डर किया जा रहा है प्रदर्शित किया जाएगा द्वारा पहुँचा जा सकता -आईएनएफ/जेएसपी/जैसे/वेब-आईएनएफ/जेएसपी/एबीसी

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^