2020-03-02
JAVASERVLET

Servlet 接收參數

這次分享比較集中在 HttpServletRequest 的部分。

Servlet Request

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>

有看到剛剛傳過來的是 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());
    }
}