Spring MVC 学习笔记 十二 PDF/Excel格式输出
来源:互联网 发布:mac 人民币符号 编辑:程序博客网 时间:2024/06/05 14:10
Spring mvc 中对于输出格式为pdf和xsl的view,提供了两个abstract的view类供继承分别为AbstractPdfView和AbstractExcelView。
Pdf格式输出
对于pdf格式的输出,spring 缺省提供的模板类为AbstractPdfView,并利用iText来实现pdf的输出。但此类只支持iText 2.x的版本,而目前iText最新的版本是5.x,为支持最新版本的iText类库,需要根据AbstractPdfView的内容依样画葫芦自己实现一个PdfView模板类。
修改pom.xml,增加对iText 5 的类库引用。
继承AbstractIText5PdfView ,实现自己的pdf输出实现类
修改MultiAction controll类,增加对pdf输出的handler method测试代码
这里我们将使用ResourceBundleViewResolver来作为pdf view的ViewResolver,修改servlet context xml配置文件如下
表示spring mvc将在classpath根目录下查找名为views.properties的配置文件来根据view name匹配对应的view实现类。
views.properties中的配置如下
helloPDF.(class)=net.zhepu.web.view.Pdfview
其中helloPDF与之前handler method返回的viewName相匹配,(class)表示此行配置是要将viewName和view实现类关联。
最后访问url http://localhost:8080/springmvc/pdf 以查看输出的pdf文件
Excel格式输出
Spring mvc利用POI或jExcel来实现对excel输出的支持,如果使用POI需要继承AbstractExcelView类,如果使用jExcel则需要继承AbstractJExcelView类。这里以POI为例。
首先修改pom.xml,增加对POI的引用。
再增加一个继承自AbstractExcelView的实现类,来实际输出excel
修改MultiAction controll类,增加对excel输出的handler method测试代码
同样可以使用ResourceBundleViewResolver来实现view name和view class的关联,但这里我们使用XmlViewResolver来实现。
修改servlet context xml配置文件,增加如下配置
以上配置表示XmlViewResolver将在views.xml中查找viewname和view class的对应关系。Views.xml配置文件实际上就是一个标准的spring bean的配置文件。内容如下
这样将bean name “excel”与view实现类相关联。
最后访问url http://localhost:8080/springmvc/excel 查看excel输出内容。
使用XmlViewResolver 和ResourceBundleViewResolver可能存在的问题
使用XmlViewReslover和ResourceBundleViewResolver后,访问sample工程的首页面helloWorld会发现页面出现报错信息 Bean named 'helloworld' must be of type [org.springframework.web.servlet.View], but was actually of type [net.zhepu.web.Helloworld]
,原因是这两个viewResolver本质上都是在配置文件中定义一个spring bean,并将bean name 和view name相关联来实现view mapping。因此实际上只要context中存在对应名字的bean name,spring 就可以根据相应的viewName找到匹配的view bean来生成视图。而这也导致类似如下的配置出现问题。
对应的controller代码如下
此时访问/helloworld原意是要返回对应/WEB-INF/helloworld.jsp,
但spring mvc在解析viewname时,根据配置文件中的order顺序,先找到ResourceBundleViewResolver来解析viewname,且发现此时context中存在bean name 为 helloWorld的bean,就试图使用helloWorld这个bean来解析view,因此出现了上述的报错。
因此在使用ResourceBundleViewResolver或XmlViewResolver时需要注意返回的viewname不要和当前工程中已经定义的beanName存在冲突。
Pdf格式输出
对于pdf格式的输出,spring 缺省提供的模板类为AbstractPdfView,并利用iText来实现pdf的输出。但此类只支持iText 2.x的版本,而目前iText最新的版本是5.x,为支持最新版本的iText类库,需要根据AbstractPdfView的内容依样画葫芦自己实现一个PdfView模板类。
- public abstract class AbstractIText5PdfView extends AbstractView {
- public AbstractIText5PdfView() {
- setContentType("application/pdf");
- }
- @Override
- protected boolean generatesDownloadContent() {
- return true;
- }
- @Override
- protected final void renderMergedOutputModel(Map<String, Object> model,
- HttpServletRequest request, HttpServletResponse response)
- throws Exception {
- ByteArrayOutputStream baos = createTemporaryOutputStream();
- Document document = newDocument();
- PdfWriter writer = newWriter(document, baos);
- prepareWriter(model, writer, request);
- buildPdfMetadata(model, document, request);
- document.open();
- buildPdfDocument(model, document, writer, request, response);
- document.close();
- writeToResponse(response, baos);
- }
- protected Document newDocument() {
- return new Document(PageSize.A4);
- }
- protected PdfWriter newWriter(Document document, OutputStream os)
- throws DocumentException {
- return PdfWriter.getInstance(document, os);
- }
- protected void prepareWriter(Map<String, Object> model, PdfWriter writer,
- HttpServletRequest request) throws DocumentException {
- writer.setViewerPreferences(getViewerPreferences());
- }
- protected int getViewerPreferences() {
- return PdfWriter.ALLOW_PRINTING | PdfWriter.PageLayoutSinglePage;
- }
- protected void buildPdfMetadata(Map<String, Object> model,
- Document document, HttpServletRequest request) {
- }
- protected abstract void buildPdfDocument(Map<String, Object> model,
- Document document, PdfWriter writer, HttpServletRequest request,
- HttpServletResponse response) throws Exception;
- }
- <dependency>
- <groupId>com.itextpdf</groupId>
- <artifactId>itext-asian</artifactId>
- <version>5.1.0</version>
- </dependency>
- <dependency>
- <groupId>com.itextpdf</groupId>
- <artifactId>itextpdf</artifactId>
- <version>5.1.0</version>
- </dependency>
- public class Pdfview extends AbstractIText5PdfView {
- @Override
- protected void buildPdfDocument(Map<String, Object> model,
- Document document, PdfWriter writer, HttpServletRequest request,
- HttpServletResponse response) throws Exception {
- Paragraph header = new Paragraph(new Chunk("PDF 输出测试",
- getChineseFont(24)));
- document.add(header);
- document.add(new Paragraph("测试",getChineseFont(12)));
- }
- private static final Font getChineseFont(float size) {
- Font FontChinese = null;
- try {
- BaseFont bfChinese = BaseFont.createFont("STSong-Light",
- "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
- FontChinese = new Font(bfChinese, size, Font.NORMAL);
- } catch (DocumentException de) {
- System.err.println(de.getMessage());
- } catch (IOException ioe) {
- System.err.println(ioe.getMessage());
- }
- return FontChinese;
- }
- }
- @RequestMapping("/pdf")
- public String helloPDF(){
- return "helloPDF";
- }
- <bean class="org.springframework.web.servlet.view.ResourceBundleViewResolver"
- p:basename="views" p:order="2" />
views.properties中的配置如下
helloPDF.(class)=net.zhepu.web.view.Pdfview
其中helloPDF与之前handler method返回的viewName相匹配,(class)表示此行配置是要将viewName和view实现类关联。
最后访问url http://localhost:8080/springmvc/pdf 以查看输出的pdf文件
Excel格式输出
Spring mvc利用POI或jExcel来实现对excel输出的支持,如果使用POI需要继承AbstractExcelView类,如果使用jExcel则需要继承AbstractJExcelView类。这里以POI为例。
首先修改pom.xml,增加对POI的引用。
- <!-- excel export support -->
- <dependency>
- <groupId>org.apache.poi</groupId>
- <artifactId>poi</artifactId>
- <version>3.7</version>
- </dependency>
- <!-- excel export support -->
- protected void buildExcelDocument(Map<String, Object> model,
- HSSFWorkbook workbook, HttpServletRequest request,
- HttpServletResponse response) throws Exception {
- HSSFSheet sheet;
- HSSFCell cell;
- sheet = workbook.createSheet("Spring");
- sheet.setDefaultColumnWidth((short) 12);
- // write a text at A1
- cell = getCell(sheet, 0, 0);
- setText(cell, "Spring-Excel 测试");
- }
- @RequestMapping("/excel")
- public String helloExcel(){
- return "excel";
- }
修改servlet context xml配置文件,增加如下配置
- <!-- excel output setting using XmlViewResolver -->
- <bean id="excelViewResolver" class="org.springframework.web.servlet.view.XmlViewResolver">
- <property name="order" value="3" />
- <property name="location" value="classpath:views.xml" />
- </bean>
- <bean name="excel" class="net.zhepu.web.view.ExcelView" />
最后访问url http://localhost:8080/springmvc/excel 查看excel输出内容。
使用XmlViewResolver 和ResourceBundleViewResolver可能存在的问题
使用XmlViewReslover和ResourceBundleViewResolver后,访问sample工程的首页面helloWorld会发现页面出现报错信息 Bean named 'helloworld' must be of type [org.springframework.web.servlet.View], but was actually of type [net.zhepu.web.Helloworld]
,原因是这两个viewResolver本质上都是在配置文件中定义一个spring bean,并将bean name 和view name相关联来实现view mapping。因此实际上只要context中存在对应名字的bean name,spring 就可以根据相应的viewName找到匹配的view bean来生成视图。而这也导致类似如下的配置出现问题。
- <bean class="org.springframework.web.servlet.view.ResourceBundleViewResolver"
- p:basename="views" p:order="1" />
- <bean id="viewResolver"
- class="org.springframework.web.servlet.view.InternalResourceViewResolver">
- <property name="prefix" value="/WEB-INF/jsp/" />
- <property name="suffix" value=".jsp" />
- </bean>
- @Controller("controllerHelloWorld")
- @RequestMapping("/helloworld")
- public class Helloworld {
- @RequestMapping(method=RequestMethod.GET)
- public ModelAndView hello() {
- ModelAndView mv = new ModelAndView();
- mv.setViewName("helloworld");
- return mv;
- }
- }
但spring mvc在解析viewname时,根据配置文件中的order顺序,先找到ResourceBundleViewResolver来解析viewname,且发现此时context中存在bean name 为 helloWorld的bean,就试图使用helloWorld这个bean来解析view,因此出现了上述的报错。
因此在使用ResourceBundleViewResolver或XmlViewResolver时需要注意返回的viewname不要和当前工程中已经定义的beanName存在冲突。
0 0
- Spring MVC 学习笔记 十二 PDF/Excel格式输出
- Spring MVC 学习笔记 PDF/Excel格式输出
- Spring MVC 学习笔记 json格式的输入和输出
- Spring MVC 学习笔记 json格式的输入和输出
- Spring MVC 学习笔记 json格式的输入和输出
- Spring MVC 学习笔记 json格式的输入和输出
- Spring MVC 学习笔记 json格式的输入和输出
- Spring MVC 学习笔记 json格式的输入和输出
- Spring MVC 学习笔记 json格式的输入和输出
- Spring MVC 学习笔记 json格式的输入和输出
- Spring MVC 学习笔记 json格式的输入和输出
- Spring MVC 学习笔记 json格式的输入和输出
- Spring MVC 学习笔记 九 json格式的输入和输出
- Spring MVC 学习笔记 九 json格式的输入和输出
- Spring MVC 学习笔记 九 json格式的输入和输出
- 用spring MVC 生成Excel和PDF
- 用spring MVC 生成Excel和PDF
- Asp.net MVC学习日记三(以PDF格式输出)
- ScrollView里面嵌套ViewPager 的问题
- 小火山 zzuli 1908 (围棋)
- linux sed 命令
- 关于java使用HttpClient获取环信功token
- POJ 1265 pick 定理
- Spring MVC 学习笔记 十二 PDF/Excel格式输出
- Spark-Sql源码解析之一 引言
- ossec 修改sendmail.c源码发送邮件
- Hibernate中设置MySQL的中文编码
- vector,map,list,queue的区别详细解析
- TCP/UDP Socket编程步骤
- Fixing the Great Wall
- Spring MVC 学习笔记 十三 xml格式输入输出
- struct和class