1. 程式人生 > >使用Servlet和JSP,如何讀取一個pdf文件到頁面上

使用Servlet和JSP,如何讀取一個pdf文件到頁面上

步驟如下

  1. 建立一個JSP,提供一個簡易的登入功能,這個JSP的action指向了一個Servlet。
<form action="./check.do" method="get">
        使用者名稱:<input type="text" name="username"/><br>
        密碼:<input type="password" name="password"/><br>
        <input type="submit" value="提交"/>
</form>

對於Servlet而言,它的作用有三點,其一是獲取表單資料,其二是呼叫業務邏輯,其三是分發請求

  1. Servlet的程式碼如下:
package com.hardstudy.servlet;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import
javax.servlet.http.HttpServletResponse; @WebServlet("/check.do") public class CheckServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username=request.getParameter("username"
); String password=request.getParameter("password"); if(username.trim().equals("zhangyue") && password.trim().equals("123")){ // response.setContentType("text/plain"); response.setContentType("application/pdf"); // InputStream inputStream = getServletContext().getResourceAsStream("/WEB-INF/hello.txt"); InputStream inputStream = getServletContext().getResourceAsStream("/WEB-INF/work.pdf"); OutputStream outputStream = response.getOutputStream(); writeObject(inputStream,outputStream); } else{ response.setContentType("text/html;charset=utf-8"); // response.getOutputStream().print("張玥大傻逼!!!"); response.getWriter().print("登入失敗!!!"); request.setCharacterEncoding("UTF-8"); request.getRequestDispatcher("check.jsp").forward(request, response); } } private void writeObject(InputStream is, OutputStream os){ byte[] buffer = new byte[1024]; int length = 0; try { while(-1!=(length=is.read(buffer))){ os.write(buffer, 0, length); } os.flush(); } catch (IOException e) { e.printStackTrace(); }finally{ if(os!=null){ try { os.close(); os = null; } catch (IOException e) { e.printStackTrace(); }finally{ try { is.close(); is = null; } catch (IOException e) { e.printStackTrace(); } } } } } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } }

其中核心的程式碼有以下幾部分:

  • 將響應格式設定為application/pdf格式:
response.setContentType("application/pdf");
  • 根據上下文物件獲取輸入流(此處的路徑是一個令人疑惑的地方):
getServletContext().getResourceAsStream("/WEB-INF/work.pdf");
  • 根據響應物件獲取輸出流物件,此處的輸出流為ServletOutputStream,是OutputStream的子類:
ServletOutputStream outputStream = response.getOutputStream();

然後呼叫一個方法,這個方法就是一個純的對Java流的操作,將輸入流輸出流進行互動。最後的結果會在瀏覽器上顯示出pdf檔案。

注意:可能會出現以下問題:其一,pdf的路徑不正確,獲取不到輸入流。其二,有的瀏覽器不支援pdf格式檔案,需要下載後顯示。

最後在瀏覽器顯示的結果

這裡寫圖片描述