स्प्रिंग एमवीसी में आपका दृष्टिकोण

यदि आपने स्प्रिंग एमवीसी के साथ काम किया है, तो आपने शायद देखा कि यह कई अलग-अलग विचारों का समर्थन करता है, जो आपको jstl, फ्रीमार्कर, वेलोसिटी और जसपरपोर्ट्स का उपयोग करके पीडीएफ, एक्सेल, सीएसवी उत्पन्न करने की अनुमति देता है। लेकिन क्या होगा यदि आपको टेम्प्लेट के अनुसार डॉक्स प्रारूप में एक दस्तावेज़ को भरने और उपयोगकर्ता को स्थानांतरित करने की आवश्यकता है? एक तरफ, आप विधि में मानक प्रतिक्रिया तक पहुंच का उपयोग कर सकते हैं, और यदि आप कई बार इस पीढ़ी का उपयोग करने की योजना बनाते हैं, तो इसे एक अलग वर्ग में रखें। लेकिन इस तरह का समाधान बहुत सुरुचिपूर्ण नहीं है और एमवीसी पैटर्न का उल्लंघन करता है। ऐसा होने से रोकने के लिए, आप अपना स्वयं का दृश्य लिख सकते हैं। ऐसा करने के लिए, आपको AbstractTemplateView से उदाहरण के लिए एक सार दृश्य (दृश्य) से विरासत में प्राप्त करने की आवश्यकता है। डॉक्स के लिए, यह दृश्य इस तरह दिखता है:

पैकेज ru.habrahabr.spring.view ;



आयात org.apache.commons.codec.binary.Base64 ;

आयात org.docx4j.XmlUtils ;

आयात org.docx4j.openpackaging.io.SaveToZipFile ;

आयात org.docx4j.openpackaging.packages.WordprocessingMLPackage ;

आयात org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart ;

आयात org.docx4j.wml.Document ;

आयात org.springframework.web.servlet.view.AbstractTemplateView ;



आयात javax.servlet.ServletOutputStream ;

आयात javax.servlet.http.HttpServletRequest ;

आयात javax.servlet.http.HttpServletResponse ;

आयात java.net.URLEncoder ;

आयात java.util.HashMap ;

आयात java.util.Locale ;

आयात java.util.Map ;



सार्वजनिक वर्ग DocxView ने AbstractTemplateView {



सार्वजनिक DocxView ( ) {

setContentType ( "एप्लिकेशन / vnd.openxmlformats-officedocument.wordprocessingml.document" ) ;

}



@ ओवरराइड

संरक्षित बूलियन उत्पन्न करता है डाउनलोड ( ) {

सच लौटना ;

}



@ ओवरराइड

संरक्षित शून्य रेंडरमेयरडेमटेम्पलेटमॉडल ( मानचित्र < स्ट्रिंग, ऑब्जेक्ट > मॉडल,

HttpServletRequest अनुरोध, HttpServletResponse प्रतिक्रिया ) अपवाद फेंकता है {



WordprocessingMLPackage wordMLPackage =

WordprocessingMLPackage। load ( getApplicationContext ( )getResource ( getUrl ( ) )getFile ( ) ) ;



MainDocumentPart documentPart = wordMLPackage। getMainDocumentPart ( ) ;

org। docx4jwml दस्तावेज़ wmlDocumentEl = ( org। Docx4jWmlदस्तावेज़ ) दस्तावेज़पार्ट। getJaxbElement ( ) ;

स्ट्रिंग xml = XmlUtils। marshaltoString ( wmlDocumentEl, true ) ;



HashMap < स्ट्रिंग, स्ट्रिंग > मैपिंग = नया HashMap < स्ट्रिंग, स्ट्रिंग > ( ) ;

for ( ऑब्जेक्ट कुंजी: मॉडल। keySet ( ) ) {

मैपिंग। put ( की। toString ( ) , मॉडल। get ( की )) toString ( ) ;

}



ऑब्जेक्ट obj = XmlUtils। unmarshallFromTemplate ( xml, mappings ) ;

documentPart। setJaxbElement ( ( डॉक्यूमेंट ) obj ) ;



स्ट्रिंग नाम = मॉडल। get ( "फ़ाइल नाम" ) + ".docx" ;



प्रतिक्रिया। setHeader ( "सामग्री- विवाद " , "अनुलग्नक" + नाम ) ;



ServletOutputStream बाहर = प्रतिक्रिया। getOutputStream ( ) ;

( new SaveToZipFile ( wordMLPackage ) )बचा ( बाहर ) ;



बाहर। फ्लश ( ) ;



}



सार्वजनिक बूलियन checkResource ( लोकेल लोकेल ) {

वापसी getApplicationContext ( )getResource ( getUrl ( ) )मौजूद ( ) ;

}



}



कंस्ट्रक्टर में हम कंटेंट टाइप सेट करते हैं, और जेनरेट्सडाउनलोड कॉन्टेंट विधि में हम संकेत देते हैं कि कंटेंट टाइप डाउनलोड करने योग्य है। और renderMergedTemplateModel में हम फाइल को पढ़ते हैं, getUrl से इसे प्राप्त करते हैं और टेम्पलेट के अनुसार दस्तावेज़ भरते हैं। टेम्पलेट डेटा पढ़ना मॉडल से आता है। checkResouce को व्यू फाइल की उपस्थिति के लिए जांचना आवश्यक है।



अब जब दृश्य तैयार हो गया है, तो आपको mvc-config.xml ऐड में, इसके लिए व्यू लोकेटर्स (रिज़ॉल्यूशन व्यूवर्स) की श्रृंखला को कॉन्फ़िगर करने की आवश्यकता है।

< bean id = "docxViewResolver" वर्ग = " org.springframework.web.servlet.view.UrlBasedViewResolver " >

< संपत्ति का नाम = "viewClass" मान = "en.habrabr.spring.view.DocxView" > </ property >

< संपत्ति का नाम = "आदेश" मूल्य = "1" />

< संपत्ति का नाम = "उपसर्ग" मान = "/ वेब-इन / विचार /" />

< संपत्ति का नाम = "प्रत्यय" मूल्य = ".docx" />

</ सेम >



< bean id = "jspViewResolver" class = " org.springframework.web.servlet.view.InternalResourceViewResolver " >

< संपत्ति का नाम = "उपसर्ग" मान = "/ वेब-इन / विचार /" />

< संपत्ति का नाम = "प्रत्यय" मूल्य = ".jsp" />

</ सेम >





अधिक विस्तार से रोकने के लायक UrlBasedViewResolver की स्थापना पर। यह लोकेटर आपको मूल दृश्य सहित किसी भी दृश्य का उपयोग करने की अनुमति देता है , जिसे viewClass के माध्यम से इंगित किया जाता है, फिर उपसर्ग , प्रत्यय को एक मानक दृश्य लोकेटर के लिए निर्दिष्ट किया जाता है, श्रृंखला में स्थानीय लोगों के प्रसंस्करण क्रम को निर्दिष्ट करने के लिए आदेश की आवश्यकता होती है। नतीजतन, लोकेटर UrlBasedViewResolver को पहले कहा जाएगा , जो व्यू बनाएगा और व्यू के लिए आवश्यक फ़ाइल की उपस्थिति की जांच करने के लिए checkResource () विधि को कॉल करेगा। यदि यह नहीं है, तो विधि झूठी वापस आ जाएगी, और लोकेटर दृश्य के बजाय अशक्त लौट आएगा और श्रृंखला आंतरिकResourceViewResolver पर कूद जाएगी।

इसके बाद, आप test.docx फ़ाइल को विचारों में रख सकते हैं, उदाहरण के लिए, दृश्य / docx निर्देशिका में। और फिर सामान्य तरीके से हम एक नियंत्रक विधि बनाते हैं:

पैकेज ru.habrahabr.spring.controller ;



आयात org.springframework.stereotype.Controller ;

आयात org.springframework.ui.Model ;

आयात org.springframework.util.MultiValueMap ;

आयात org.springframework.web.bind.annotation.RequestMapping ;



नियंत्रक

सार्वजनिक वर्ग DocxController {



@RequestMapping ( मान = "/ get / docx" , विधि = RequestMethod। GET )

सार्वजनिक स्ट्रिंग doGenerate ( मॉडल मॉडल ) {

मॉडल। addAttribute ( "फ़ाइल नाम" , "परीक्षण" ) ;

मॉडल। AddAttribute ( "परीक्षण" , "परीक्षण" ) ;

वापसी "docx / परीक्षण" ;



आगे, हम get / docx विधि को कॉल करते हैं और फ़ाइल को docx में प्राप्त करते हैं।



All Articles