में पुट और डिलीट विधियों का उपयोग करके मैं स्प्रिंग एमवीसी नियंत्रक (संस्करण 3.0.2) में RequestMethod.PUT
और RequestMethod.DELETE
का उपयोग करने का प्रयास कर रहा हूं। स्प्रिंग कंट्रोलर क्लास में यूआरएल के साथ मैप किए गए तीन तरीके हैं जो क्रमशः प्रदर्शन उद्देश्य के लिए क्रमशः (पुट, जीईटी और पोस्ट करें) हैं।स्प्रिंग एमवीसी
@RequestMapping(method = {RequestMethod.PUT}, value = {"admin_side/Temp"}, headers = {"content-type=multipart/form-data"})
public String update(@ModelAttribute("tempBean") TempBean tempBean, BindingResult error, Map model, HttpServletRequest request, HttpServletResponse response) {
if (ServletFileUpload.isMultipartContent(request)) {
System.out.println("true");
}
System.out.println("Request method PUT");
return "admin_side/Temp";
}
@RequestMapping(method = {RequestMethod.GET}, value = {"admin_side/Temp"})
public String showForm(@ModelAttribute("tempBean") TempBean tempBean, BindingResult error, Map model, HttpServletRequest request, HttpServletResponse response) {
System.out.println("Request method GET");
return "admin_side/Temp";
}
@RequestMapping(method = {RequestMethod.POST}, value = {"admin_side/Temp"})
public String onSubmit(@ModelAttribute("tempBean") TempBean tempBean, BindingResult error, Map model, HttpServletRequest request, HttpServletResponse response) {
System.out.println("Request method POST");
return "admin_side/Temp";
}
जब पृष्ठ लोड होने पर GET
विधि स्पष्ट रूप में, लेकिन अन्य सभी मामलों (जब पेज प्रस्तुत किया जाता है), केवल विधि लागू किया जा करने के लिए POST
है में शुरू हो जाती है, विधि RequestMethod.PUT
के साथ निर्दिष्ट नहीं है सक्रिय किया गया।
स्प्रिंग प्रपत्र केवल एक बटन और रूप में एक छवि ब्राउज़र सबमिट करें,
<form:form id="mainForm"
name="mainForm"
method="PUT"
action="Temp.htm"
enctype="multipart/form-data"
commandName="tempBean">
<input type="file" id="myFile" name="myFile"/>
<input type="submit" id="btnSubmit" name="btnSubmit" value="Submit"/>
</form:form>
सृजित HTML इस प्रकार है के रूप में, में
<form id="mainForm"
name="mainForm"
action="Temp.htm"
method="post"
enctype="multipart/form-data">
<input type="hidden" name="_method" value="PUT"/>
<!--This hidden field is implicitly included-->
<input type="file" id="myFile" name="myFile"/>
<input type="submit" id="btnSubmit" name="btnSubmit" value="Submit"/>
</form>
मेरी spring-config.xml
(dispatcher-servlet.xml
मेरे मामले में), मैंने CommonsMultipartResolver
का संदर्भ जोड़ा है:
<bean id="filterMultipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>
और मेरे web.xml
फ़ाइल में, HiddenHttpMethodFilter
इस प्रकार कॉन्फ़िगर किया गया है,
<filter>
<filter-name>MultipartFilter</filter-name>
<filter-class>org.springframework.web.multipart.support.MultipartFilter</filter-class>
<init-param>
<param-name>multipartResolverBeanName</param-name>
<param-value>filterMultipartResolver</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>MultipartFilter</filter-name>
<servlet-name>/*</servlet-name>
</filter-mapping>
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<servlet-name>/*</servlet-name>
</filter-mapping>
PUT
(और DELETE
भी) विधि कभी नहीं शुरू हो जाती है (कोई अपवाद या त्रुटि के साथ)। मुझे यहां क्या समझ नहीं आ रहा है?
अद्यतन:
web.xml
में निम्नलिखित विन्यास के साथ
,
<filter>
<filter-name>MultipartFilter</filter-name>
<filter-class>org.springframework.web.multipart.support.MultipartFilter</filter-class>
<init-param> <!-- Makes no difference, if excluded. -->
<param-name>multipartResolverBeanName</param-name>
<param-value>filterMultipartResolver</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>MultipartFilter</filter-name>
<servlet-name>dispatcher</servlet-name> <!--Changed from /* to dispatcher-->
</filter-mapping>
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<servlet-name>dispatcher</servlet-name> <!--Changed from /* to dispatcher-->
</filter-mapping>
यह निम्नलिखित अपवाद फेंकता है।
org.springframework.beans.factory.NoSuchBeanDefinitionException: -
org.springframework.web.servlet.DispatcherServlet
पहले से ही web.xml में मैप किया गया कोई सेम 'filterMultipartResolver' नाम
कहाँ नाम dispatcher
सर्वलेट का नाम है परिभाषित किया गया है निम्नलिखित नुसार।
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>
मुझे यकीन नहीं है कि और क्या चाहिए? क्या फ़िल्टर HiddenHttpMethodFilter
हमारे अपने विस्तारित OncePerRequestFilter
पर लागू करने के लिए आवश्यक है जैसे here दिखाया गया है? (यह एक अंतर्निहित कक्षा है)
महत्वपूर्ण अंक here सूचीबद्ध हैं।
लिए मुझे लगता है कि टैग पुस्तकालय का उपयोग कर रहा - ' ... ' और छिपी हुई फ़ील्ड '' स्वचालित रूप से जेनरेट किए गए HTML ** में शामिल है जैसा कि प्रश्न में दूसरे और तीसरे कोड स्निपेट में दिखाया गया है। मैंने इस साइट पर और साथ ही साथ अन्य ट्यूटोरियल्स पर इतनी सारी पोस्ट देखी हैं। मैं उनके द्वारा वर्णित लगभग कर रहा हूं हालांकि मामला काम नहीं करता है, मेरे मामले में। मुझे यकीन नहीं है कि मैं क्या खो रहा हूं। जवाब के लिए धन्यवाद। –
Tiny
क्षमा करें, मैंने आपकी पोस्ट को गलत तरीके से पढ़ा है ... मेरा बुरा। – Guillaume
आपका टेक्स्ट, "* NoSuchBeanDefinitionException सबसे अधिक असंबंधित समस्या है *" सही है। एकमात्र समस्या यह थी कि मैंने इस 'org.springframework.web.multipart.commons.CommonsMultipartResolver' को गलत कॉन्फ़िगर किया था और इसे' applicationContext.xml' में रखने के बजाय गलत xml फ़ाइल में रखा था। इसलिए, यह अपवाद पैदा कर रहा था। यह अब काम करता है और स्प्रिंग नियंत्रक में 'RequestMethod.PUT' के साथ नामित विधि का आह्वान किया जाता है। एक समस्या अभी भी बनी हुई है कि 'ServletFileUpload.isMultipartContent (अनुरोध)' हमेशा झूठी रिटर्न देता है। यह केवल 'POST' पर सत्य देता है। क्या आपको कारण पता है? – Tiny