概述 Java Servlet 编程可以很方便地将 HTML 文件发送到客户端的 Web 浏览器。然而许多站点还允许访问非 HTML 格式的文档,包括 Adobe PDF、Microsoft Word 和 Micorsoft Excel 等。事实上这些非 HTML 格式只要能用 MIME 类型表示,就可以利用 servlet 来发送。本文将以 PDF为例,向你介绍如何使用 servlet 传送非 HTML 格式文件及该文件是如何在服务器端用Java生成的。
你只要将文件写到servlet 的输出流中,就可以利用 servlet 在浏览器中打开一个文件。首先从获得 servlet 的输出流开始:
ServletOutputStream out = res.getOutputStream();
互联网上使用 MIME (multipurpos Internet mail extension 多目的互联网邮件扩展协议)来传送混合格式、多媒体和二进制数据文件。如果要在 servlet 的 response 对象中打开某个文档,就必须设置该文档的 MIME 类型。
向Web客户端发送PDF文档
(一)MIME类型
Web 浏览器使用 MIME 类型来识别非 HTML 文档,并决定如何显示该文档内的数据。将插件 (plug-in) 与 MIME 类型结合使用,则当 Web 浏览器下载 MIME 类型指示的文档时,就能够启动相应插件处理此文档。某些 MIME 类型还可以与外部程序结合使用,浏览器下载文档后会启动相应的外部程序。
MIME 类型非常有用。它们允许 Web 浏览器处理不同格式的文档,却不需要事先嵌入相关知识。Java Servlets 可以使用 MIME 类型来向浏览器传送非 HTML 文件,比如 Adobe PDF 和 Micorsoft Word。使用正确的 MIME 类型能够保证这些非 HTML 文件被正确的插件或外部程序显示。
PDF 文件的 MIME 类型是 "application/pdf"。要用servlet 来打开一个 PDF 文档,需要将 response 对象中 header 的 content 类型设置成 "application/pdf":
// PDF 文件的 MIME 类型
res.setContentType( "application/pdf" );
//也可以通过下面的方式来设置
response.setHeader("Content-type", "application/pdf");
(二)Content disposition
HTTP response header中的content-disposition 允许 servlet 指定文档表示的信息。使用这种header ,你就可以将文档指定成单独打开(而不是在浏览器中打开),还可以根据用户的操作来显示。如果用户要保存文档,你还可以为该文档建议一个文件名。这个建议名称会出现在 Save As 对话框的“文件名”栏中。如果没有指定,则对话框中就会出现 servlet 的名字。在 servlet 中,你需要将 header 设置成下面这样:
res.setHeader("Content-disposition",
"attachment; filename=" +
"Example.pdf" );
// attachment -因为不希望在浏览器中直接打开它,而是利用Adobe Acrobat。
// 可以通过设置default file name来确定保存文当时的建议名称。
//response.setHeader("Content-Disposition", "inline; filename=report.pdf");
(三)封装非 HTML 文档
完成上述工作后,剩下的就非常简单了。你需要根据待传送文件的名字,创建一个 java.net.URL 对象。交给 URL 构造器的字符串必须是指向该文件的一个有效 URL 地址。在这里,我要打开本地的PDF文档:
String fileURL = "http://localhost/aboutadobe/careeropp/pdfs/tables.pdf;
URL 字符串也可以类似于 http://www.gr.com/pub/somefile.doc 或 http://www.gr.com/pub/somefile.xls。但必须确保待传送文件类型与先前在 HTTP response 对象中设置的 MIME 类型一致。
(四)其他
开始阅读传送的文档之前,首先要从 URL 对象中获得输入流 InputStream,用 BufferedInputStream 将 InputStream 封装起来。
BufferedInputStreambis = newBufferedInputStream(url.openStream());
一旦你完成上述操作,就只要简单地将 InputStream 中的字节,写入到 servlet 的输出流 OutputStream 中:
BufferedOutputStreambos = new BufferedOutputStream(out);
byte[] buff = new byte[2048];
intbytesRead;
// 一个简单的读写循环
while(-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
bos.write(buff, 0, bytesRead);
}
在最后的代码块中,关闭这些流 ,如:bos.close();
PDF文档在服务器端的生成
利用iText040工具包可以很方便的输出一个十分漂亮的PDF文档。
1.Document的创建
Document document=new Document(p0, p1, p2, p3, p4)
其中,p0为页面的大小,如 PageSize.A4; p1?p4分别描述上下左右页边空白。
2. 构造复写器
PdfWriter.getInstance(document, new FileOutputStream("tables.pdf"))
执行程序后,将在当前目录下生成一个名为tables.pdf的文件。
接着打开Document:document.open()
3. 根据需要定义一个Table
//一个拥有十列的Table
Table datatable = new Table(10);
//定义Cell与Cell之间的距离为零
datatable.setCellpadding(0);
//定义Cell的间隔
datatable.setCellspacing(3);
//使Table
分享到:
相关推荐
3. **配置Servlet**:在Web应用的配置文件`web.xml`中注册Servlet,包括定义Servlet的名称、类名以及URL映射。例如: ```xml <servlet> <servlet-name>Hello</servlet-name> <servlet-class>j5_01</servlet-...
PDF文档可能包含了以下内容: 1. **Servlet简介**:解释了Servlet的基本概念,它是如何作为Java平台上的Web应用接口来扩展服务器功能的。 2. **Servlet生命周期**:详述了Servlet的初始化、服务、销毁三个阶段,...
其中,第二个参数可以是任何一种流,你可以写入文件中或者直接输出到 servlet 等等。 打开 Document 创建了 Writer 实例后,需要打开 Document 对象,以便开始生成 PDF 文件: ```java document.open(); ``` 请...
从提供的文件内容中,我们可以提取出关于Tomcat开发JSP与Servlet的关键知识点。下面将对这些知识点进行详细说明: 1. Tomcat服务器简介: - Apache Tomcat是一个开源的Servlet容器,它实现了Java Servlet和Java...
// 输出流必须关闭,否则生成的PDF文件可能损坏 response.getOutputStream().close(); } } ``` #### 七、结论 Servlet作为一种强大的Web开发技术,在处理复杂的业务逻辑、生成动态内容等方面具有显著优势。结合...
通过使用 `AsyncContext` 的 `readBody()` 和 `writeTo()` 方法,可以在不阻塞主线程的情况下处理输入和输出流,从而提高服务器的并发处理能力。 #### 三、版权与许可 Servlet 3.1 规范由 Oracle Corporation 发布...
《JSP+Servlet+Tomcat应用开发从零开始学》这本书是针对初学者设计的一本教程,旨在帮助读者从零基础开始...书中的PDF版本方便你随时随地进行学习,而压缩包中的"还是空.txt"和"空.txt"可能是无关的文件,可以忽略。
这个Servlet输出的内容是一个简单的HTML页面,显示“Hello, World!”和当前时间。 2. Servlet的部署配置: 为了让Servlet能够被Web服务器识别并正确地处理请求,需要在Web应用程序的部署描述符文件`web.xml`中进行...
Servlet和JSP是Java Web开发中的核心技术,..."Servlet与JSP核心编程(第2版第1卷).pdf"这本书很可能是对这些概念的深入讲解,涵盖了从基础到进阶的各种主题,对于想要提升Java Web技能的开发者来说是一份宝贵的资源。
标题中的“JasperReport浏览器输出PDF为空白页”通常意味着在使用JasperReport生成PDF报表时,浏览器未能正确显示内容。这可能是由多种原因引起的,包括但不限于以下几点: 1. **XML解析错误**:`test.jrxml`文件是...
使用`java.io`包中的类,如`FileInputStream`和`ServletOutputStream`,从服务器的文件系统读取文件内容,并将其写入到响应输出流中。这将把文件内容实际发送到客户端。 5. **配置Web应用** 将项目解压后,将其...
最后,为了使用户能够下载PDF文件,你需要在JSP页面上创建一个链接或按钮,触发上述Servlet。例如,可以创建一个`<a>`标签,链接到Servlet,并附带HTML内容作为请求参数: ```jsp ${pageContext.request.context...
1. **初始化**:服务器启动或首次接收到请求时,Servlet容器根据`web.xml`配置文件创建Servlet实例,并调用`init()`方法。`init()`方法只执行一次,可以用于进行一些初始化操作。 2. **服务**:每次客户端请求时,...
3. **流化输出**:通过调用`ServletResponse`对象的`getOutputStream()`方法,我们可以获取一个`ServletOutputStream`,用于将文件内容写入HTTP响应。使用`write()`方法逐字节地写入文件内容。 4. **关闭资源**:...
在给定的文件中,我们看到了三个基本的Java Servlet实例,它们分别展示了如何以纯文本、HTML以及处理请求参数的方式输出内容。 例 8.1 - 纯文本输出: 在`HelloServlet.java`中,我们看到一个简单的Servlet,它只...
通过File类提供的delete()方法,可以直接删除文件系统中的PDF文件。在执行删除操作前,务必检查权限,并确保没有其他进程正在使用该文件。 5. **PDF修改**: PDF文件的修改较为复杂,因为PDF格式是静态且二进制的...
- **写文件**:通过文件输出流(如`FileOutputStream`)来写入文件。 ```java FileOutputStream fos = new FileOutputStream(new File(path)); fos.write(data.getBytes()); fos.close(); ``` #### 六、用...
在 JSP 文件中,可以使用表单将用户输入发送到 Servlet,并使用 HttpServletResponse 对象设置响应内容类型和输出响应信息。 使用 @WebServlet 注解可以简化 Servlet 的配置,减少 web.xml 文件中的配置项。Servlet...