延續我們上一週寫的,接下來來接收外部傳進來的 Http 請求吧!
這次的分享會比較集中在 HttpServletRequest 的部分
ServletRequest
先來看一下官方的介紹
Defines an object to provide client request information to a servlet. The servlet container creates a ServletRequest
object and passes it as an argument to the servlet’s service
method.
A ServletRequest
object provides data including parameter name and values, attributes, and an input stream. Interfaces that extend ServletRequest
can provide additional protocol-specific data (for example, HTTP data is provided by HttpServletRequest
.)
簡單來說就是 ServletRequest 這個介面定義了用戶端該怎麽跟我們的 Servlet 物件交流這樣。
HttpServletRequest
這篇,我們主要打交道的 HttpServletRequest 就是專門面向 Http 要求實現了 ServletRequest 介面的類別。
基本上我們能想到的 Http 要求,Header、參數、檔案、 cookie… 全部能幫我們處理。
現在就開始把一些基本、我們這個專案要用到的方法簡單介紹一下吧!
- getParameter()
指定請求參數名稱取得對應的值,例如:
String userName = req.getParameter("name");
getParameter() 回傳的一定會是 String 物件,如果有需要用到一些基本形態的話,就必須自己轉換一下,類似像這樣
Boolean.parseBoolean
Integer.parseInt
- getParameterValues()
如果我們的表單中,有可複選的項目,像是 CheckBox 之類的多選清單,
Http 查詢字串會類次像這樣:
(age=15&age=25&age=35)
那就可以用到 getParameterValues() 方法一次把所有同樣的值。
String[] ages = req.getParameterValues("age");
上面講的都是比較通用的方法,但是這次專案要用到檔案的,
所以 client 端在傳送檔案過來的時候一定要用到 post 方法,
並且把 enctype 設定為 multipart/form-data
<form method="post" enctype="multipart/form-data"> </form>
- Part
有看到剛剛傳過來的是 multipart ,這個 Part 就是我們的關鍵字了,假設我們傳送了一個檔案過來,放在 Post 的 Body 內,就可以用這樣的方法去取得:
InputStream fileInputStream = req.getPart("file").getInputStream();
如果常常有在寫後端處理檔案的話,就會知道,拿到 InputStream 之後基本上就跟拿到檔案一摸一樣了~~
不過現在這樣測試的話應該不能動,因為還有很多設定要寫,我先把可以動測試的程式碼丟上來,下一周再一一詳細的解說設定吧!
不然真的太多了…
// 為了接收 Part 一定要加的設定 @MultipartConfig @WebServlet( name = "RequestTest", urlPatterns = {"/request-test"}, // 等等要把這串敲在網頁根目錄之後 loadOnStartup = 1 ) public class RequestTest extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 查看回傳 為了讓回傳的中文字串可以正常顯示 resp.setContentType("text/html; charset=UTF-8"); PrintWriter writer = resp.getWriter(); writer.println("<!DOCTYPE html>"); writer.println("<html>"); writer.println("<head>"); writer.println("<meta charset= \"UTF-8\">"); writer.println("<title>ServletRequest Tutorial</title>"); writer.println("</head>"); writer.println("<body>"); writer.println("<h1>Http ServletRequest Tutorial</h1>"); writer.println("測試中文字串"); writer.printf("<p>getParameter(\"name\") = %s</p>", req.getParameter("name") == null ? "未傳入 name 參數 " : req.getParameter("name")); String[] ages = req.getParameterValues("age"); // 先確定有輸入 age 參數 if (ages != null) { for (int i = 0; i < ages.length; i++) { String age = ages[i]; writer.printf("<p>age 參數輸入了 %s</p>", age); } } else { writer.println("<p>沒有輸入 age 參數</p>"); } writer.println("</body>"); writer.println("</html>"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 取得檔案 InputStream fileInputStream = req.getPart("file").getInputStream(); PrintWriter writer = resp.getWriter(); // 因為我們還沒學到解析檔案,所以先印出記憶體位置感覺一下就好 writer.println(fileInputStream.toString()); } }