पैकेज 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। docx4j । wml दस्तावेज़ wmlDocumentEl = ( org। Docx4j । Wml । दस्तावेज़ ) दस्तावेज़पार्ट। 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" />
</ सेम >
- InternalResourceViewResolver - एक मानक दृश्य लोकेटर।
- UrlBasedViewResolver एक यूआरएल-आधारित लोकेटर है। Url विचारों का url है।
अधिक विस्तार से रोकने के लायक 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 में प्राप्त करते हैं।