使用Servlet和JSP,如何讀取一個pdf文件到頁面上
阿新 • • 發佈:2019-02-19
步驟如下
- 建立一個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而言,它的作用有三點,其一是獲取表單資料,其二是呼叫業務邏輯,其三是分發請求
- 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格式檔案,需要下載後顯示。