`

struts2整合jasper模版生成PDF导出下载<四>

阅读更多
(2)先生成pdf文件,然后通过strut2下载:

response.setHeader("Cache-Control", "public"); 
response.setHeader("Pragma", "public"); 					//response.setHeader("Content-Disposition", "attachment; filename=" + docName+".pdf");
					response.setContentType("application/pdf");
					String reportBasePath = ServletActionContext.getServletContext().getRealPath(DOWNLOADFILEPATH);
					//System.out.println("reportBasePath....is : "+reportBasePath);
					String template =  reportBasePath+"/"+"convenientVisa.jasper";
					//System.out.println("template....is : "+template);
					String reportOutputBasePath = ServletActionContext.getServletContext().getRealPath(DOWNLOADFILEPATH);
					String pdfCn = ReportUtil.createReportName(pdfNameCn,reportType);
					String pdfEn = ReportUtil.createReportName(pdfNameEn,reportType);
					String outputFileCn = reportOutputBasePath +"/"+ pdfCn;
					String outputFileEn = reportOutputBasePath +"/"+ pdfEn;
					//System.out.println("outputFileCn....is : "+outputFileCn);
					//System.out.println("outputFileEn....is : "+outputFileEn);
					if(!new File(template).exists()){
						//System.out.println("报表模版不存在");
						throw new Exception("报表模版不存在");
					}
					 
	
						File reportOutputBaseFile = new File(reportBasePath + reportOutputBasePath);
						if(!reportOutputBaseFile.exists())reportOutputBaseFile.mkdirs();
						
						//确定要导出的文件的名称	
						if(url.indexOf("/cn/")>-1){
							ReportUtil.exportReports(ffpTravelDetailList, reportParameter,ReportUtil.REPORT_FORMAT_PDF,template, outputFileCn);
						}else{
							ReportUtil.exportReports(ffpTravelDetailList, reportParameter,ReportUtil.REPORT_FORMAT_PDF,template, outputFileEn);
						}
						
						//InputStream in = ServletActionContext.getServletContext().getResourceAsStream(outputFile);


public boolean regex(String regex, String str) {
		Pattern p = Pattern.compile(regex, Pattern.MULTILINE);
		Matcher m = p.matcher(str);
		return m.find();
	}




获取登录用户以及链接地址:

LpAccount user=(LpAccount) ActionContext.getContext().getSession().get("user");//获取登录用户名
String url = ServletActionContext.getRequest().getRequestURL().toString();//获取响应的链接地址


获取文件,这个必须有:

// 从下载文件原始存放路径读取得到文件输出流
	public InputStream getDownloadFile() {
		String url = ServletActionContext.getRequest().getRequestURL().toString();
		if(url.indexOf("/cn/")>-1){
			return ServletActionContext.getServletContext().getResourceAsStream(
					DOWNLOADFILEPATH + pdfNameCn+".pdf");
		}else{
			return ServletActionContext.getServletContext().getResourceAsStream(
					DOWNLOADFILEPATH + pdfNameEn+".pdf");
		}		
		
	}



ReportUtil.java

package com.csair.skypearl.utils;

import java.io.PrintWriter;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletResponse;

import net.sf.jasperreports.engine.JRExporter;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.export.JRHtmlExporter;
import net.sf.jasperreports.engine.export.JRHtmlExporterParameter;
import net.sf.jasperreports.engine.export.JRPdfExporter;
import net.sf.jasperreports.engine.export.JRXlsExporter;
import net.sf.jasperreports.engine.export.ooxml.JRDocxExporter;
import net.sf.jasperreports.engine.export.ooxml.JRXlsxExporter;
import net.sf.jasperreports.j2ee.servlets.ImageServlet;

import org.apache.commons.lang.time.DateFormatUtils;
import org.apache.struts2.ServletActionContext;

public class ReportUtil {
	public static final String REPORT_FORMAT_XLS = "XLS";
	public static final String REPORT_FORMAT_XLSX = "XLSX";
	public static final String REPORT_FORMAT_DOC = "DOC";
	public static final String REPORT_FORMAT_PDF = "PDF";
	public static final String REPORT_FORMAT_HTML = "HTML";

	/**
	 * <B>导出报表</B><br />
	 * create by:vakin 
	 *             at:2011-1-7
	 * @param <T>
	 * @param reportDatas
	 * @param parameters
	 * @param exportType
	 * @param template
	 * @param outputFile
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public static <T> void exportReports(List<T> reportDatas,
			Map parameters,String exportType, String template, String outputFile) throws Exception {
		 
		//HttpServletRequest request =  ServletActionContext.getRequest();
		JasperReport jasperreport = DynamicColumnReport.dynamicColumnReport( null, template); //根据参数判断是否需要动态生成列
		JasperPrint print = JasperFillManager.fillReport(jasperreport,parameters,new JRBeanCollectionDataSource(reportDatas));

		JRExporter exporter = null;
		
		if(REPORT_FORMAT_XLS.equalsIgnoreCase(exportType)){
			exporter = new JRXlsExporter();
		}else if(REPORT_FORMAT_DOC.equalsIgnoreCase(exportType)){
			exporter = new JRDocxExporter();
		}else if(REPORT_FORMAT_PDF.equalsIgnoreCase(exportType)){
			exporter = new JRPdfExporter();
		}else if(REPORT_FORMAT_HTML.equalsIgnoreCase(exportType)){
			exporter = new JRHtmlExporter();
		}else if(REPORT_FORMAT_XLSX.equalsIgnoreCase(exportType)){
			exporter = new JRXlsxExporter();
		}
		exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME,
				outputFile);

		exporter.setParameter(JRExporterParameter.JASPER_PRINT, print);

		exporter.exportReport();

	
	}
	
	/**
	 * <B>输出报表图</B><br />
	 * create by:vakin 
	 *             at:2011-1-7
	 * @param <T>
	 * @param reportDatas
	 * @param parameters
	 * @param template
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public static <T> void createReportChart(List<T> reportDatas,
			Map parameters, String template) throws Exception {

		HttpServletResponse response = ServletActionContext.getResponse();
		PrintWriter printWriter = response.getWriter();

		JasperPrint jasperPrint = JasperFillManager.fillReport(template,
				new HashMap(), new JRBeanCollectionDataSource(reportDatas));
		JRHtmlExporter htmlExporter = new JRHtmlExporter();
		response.setContentType("text/html");
		ServletActionContext.getRequest().getSession().setAttribute(
				ImageServlet.DEFAULT_JASPER_PRINT_SESSION_ATTRIBUTE,
				jasperPrint);

		htmlExporter.setParameter(JRExporterParameter.JASPER_PRINT,
				jasperPrint);
		htmlExporter.setParameter(JRExporterParameter.OUTPUT_WRITER,
				printWriter);
		htmlExporter.setParameter(
				JRHtmlExporterParameter.CHARACTER_ENCODING, "utf-8");
		String imageUrl = "reportChart?__r="+ System.currentTimeMillis() +"&image=";
		htmlExporter.setParameter(JRHtmlExporterParameter.IMAGES_URI,
				imageUrl);
		htmlExporter.exportReport();
		printWriter.flush();
		printWriter.close();
	}
	
	public static String getReportBasePath(){
		return ServletActionContext.getServletContext().getRealPath("/jasreportTemplete/");
	}
	
	public static String createReportName(String modelName,String docType){
		return modelName  +  "."+docType.toLowerCase();
	}

}




值得注意的是:对于ie7及以下版本的浏览器必须设置浏览器相应头的缓存设置:
网上有解释:This is a typical MSIE error message when a download is been provided over HTTPS (SSL) while the response headers are been set to disable the browser cache

添加的代码:
response.setHeader("Cache-Control", "public"); 
response.setHeader("Pragma", "public");


对于火狐浏览器,有可能文件名过长,而背截取,导致文件类型错误,无法下载打开等,可以作如下设置:

String browser = this.getRequest().getHeader("User-Agent");

if(browser != null && browser.indexOf("MSIE") == -1) { 
				if(!(url.indexOf("/cn/")>-1)){		
					 docmNameEn = "=?UTF-8?B?" + (new String (Base64.encodeBase64(docmNameEn.getBytes("UTF-8")))) + "?=";  
				}			
			}


struts2配置文件:
<param name="fileName">${docNameEn}.pdf</param>  
            <result name="download" type="stream">  
                <!-- 下载文件类型定义 -->  
                <param name="contentType">application/pdf</param>  
                <!-- 下载文件处理方法 -->  
                <param name="contentDisposition">  
                    attachment;filename="${docNameEn}.pdf"  
                </param>  
                <!-- 下载文件输出流定义 -->  
                <param name="inputName">downloadFile</param>  
           </result>


对于中文文件名的处理:

String docmName=new String(new String(pdfNameCn).getBytes("GBK"),"ISO8859-1");
String docmNameEn = new String(new String(pdfNameEn).getBytes("GBK"),"ISO8859-1");



struts2的一些配置也可以直接在java类里面设置:

response.setHeader("Content-Disposition", "attachment; filename=" + docName+".pdf");//[color=red]attachment表示下载,inline表示在线查看[/color]
					response.setContentType("application/pdf");//文件格式设置,具体可百度ContentType


还需要注意:如果项目发布在linux上,需注意,windows上的“/”对应linux上的“\”,但是windows上这个不用区别开来,都可以识别路径
分享到:
评论

相关推荐

    struts2整合jasperreport

    Struts2是一个流行的Java Web应用程序框架,它提供了MVC(模型-视图-控制器)架构,而JasperReport则是一个强大的报表生成库,可以生成多种格式的报表,如PDF、HTML、Excel等。iReport是JasperReport的可视化设计...

    struts2 + jasper report

    总结来说,`struts2 + jasper report`的组合为Java Web应用提供了强大的报表生成能力,通过Struts2的控制层管理和JasperReport的报表引擎,可以方便地将后台数据转化为直观的报表展示给用户。在项目`...

    Struts2 + JasperReport应用一:导PDF,Excel,HTML显示

    总之,结合Struts2和JasperReport,我们可以轻松地在web应用程序中实现动态报表生成和导出,提供给用户方便的数据查看和下载功能。通过熟练掌握这一技术,可以提升企业级应用的用户体验,同时简化开发流程。

    Struts2整合jasperReports报表

    在Struts2中整合jasperReports,可以实现Web应用中的动态报表生成和展示功能。首先,我们需要确保系统环境中已经安装了jasperReports库以及其依赖的iReport设计工具。iReport是用于设计jasperReports报表的图形化...

    struts2 jasper iReport 报表

    Struts2、 Jasper 和 iReport 是Java开发领域中用于创建动态和复杂的报表的重要工具。Struts2是一个基于MVC(模型-视图-控制器)架构的Web应用框架,它为开发者提供了一种组织和控制应用程序逻辑的方式。...

    struts2利用jasperreport导出excel

    6. **Struts2配置**:在Struts2的配置文件(struts.xml)中,定义一个导出Excel的Action,返回类型设置为流类型(通常为“stream”),并将生成的Excel内容设置到HttpServletResponse的输出流中。 7. **Action实现*...

    Struts2整合JasperReport所需要的jar包

    将这两者整合,可以让Struts2应用程序轻松地实现动态报告的生成与展示。 在整合Struts2和JasperReport时,我们需要一些特定的jar包来确保两者能正确通信和协同工作。这些jar包通常包含了Struts2的核心组件、...

    整合Struts2.1+jasperreport

    Struts2.1和JasperReport的整合是Java Web开发中的一个重要话题,它涉及到Web应用程序的MVC(模型-视图-控制器)架构和数据报告的生成。Struts2.1是一个强大的MVC框架,而JasperReport则是一个用于创建复杂报表的...

    jasperreports-5.5.1_struts2.3整合用到的jar包

    同时,还需要确保所有的jar包都已正确导入到项目的类路径中,包括Struts2的核心库、JasperReports的库以及可能需要的第三方依赖如iText(用于PDF生成)等。 在实际使用过程中,开发者通常会遇到以下几个关键步骤: ...

    jasperreport的操作步骤

    &lt;param name="format"&gt;PDF&lt;/param&gt; &lt;/result&gt; &lt;/action&gt; &lt;!-- 可以添加更多格式的导出 --&gt; &lt;/package&gt; ``` #### 参数解释 - `location`:指向JasperReport生成的.jasper文件的路径。 - `dataSource`:指向数据...

    Struts2 + JasperReports4 + DB2 Demo

    Struts2 + JasperReports4 + DB2 Demo是一个典型的Java企业级应用示例,结合了流行的MVC框架Struts2、报表工具JasperReports4以及关系型数据库DB2,用于展示如何在实际项目中进行数据展示和处理。在这个项目中,...

    在struts2中使用JasperReports

    将JasperReports与Struts2整合,可以帮助我们在Web应用中轻松创建复杂的报表。 首先,JasperReports是用Java编写的开源报表库,能够设计和生成多种格式的报表,如PDF、HTML、Excel、CSV等。它的强大之处在于能够...

    Struts2JasperReportIreport实例

    在Struts2 Action中,根据业务逻辑获取数据,然后使用JasperReport API填充数据到`.jasper`模板,生成最终的报表(如PDF、HTML或Excel格式)。 5. **集成步骤**: - 在Struts2项目中添加JasperReport和iReport的...

    jasperreports 3 struts2开发资料

    4. **返回结果**:Struts2会根据配置将报表结果以流的形式返回给浏览器,用户可以选择下载或者在页面上查看。 在提供的"JasperReportsDemo"文件中,可能包含了如何配置和使用JasperReports与Struts2的示例代码。...

    客户端打印pdf以及服务器打印(jasperreport)

    2. **生成报表**:按照客户端打印的步骤,编译模板,填充数据并生成PDF。 3. **返回响应**:有两种常见方式: - 直接输出到浏览器:设置HTTP响应头为“Content-Type: application/pdf”,并将PDF内容作为响应体返回...

    java报表(jasperreport_ireport+struts2)

    6. **Struts2集成**:在Struts2的Action类中,编写方法来处理报表请求,调用上述步骤生成并导出报表。Action的结果可以配置为一个流结果类型,直接将报表内容发送到浏览器。 7. **前端展示**:在HTML页面中,使用...

Global site tag (gtag.js) - Google Analytics