рдпрджрд┐ рдЖрдкрдиреЗ рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдорд╡реАрд╕реА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдЖрдкрдиреЗ рд╢рд╛рдпрдж рджреЗрдЦрд╛ рдХрд┐ рдпрд╣ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ 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ред 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 рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред