[Java][Servlet] GET、POST 簡單應用

 這邊要簡單介紹關於 Web專案 以 Servlet類 實作 GET、POST方法的應用。寫這程式會用到幾個步驟:

一、新建 Web 專案
二、新增 Servlet、web.xml 檔案
三、撰寫 Servlet 程式
四、撰寫 web.xml 程式




一、新建 Web 專案
二、新增 Servlet、web.xml 檔案

這兩步驟請到上一篇文章看,那邊已經有詳細的介紹~


三、撰寫 Servlet 程式

project name: servlet
class name: FirstServlet
package name: idv.ycc.servlet

package idv.ycc.servlet;
import java.io.IOException;
import java.io.PrintWriter;
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("/FirstServlet")
public class FirstServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
       
    public FirstServlet() {
        super();
    }

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    this.log("doGet()");
    this.execute(request, response);
}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    this.log("doPost()");
    this.execute(request, response);
}

public long getLastModified(HttpServletRequest request) {
    this.log("getLastModified()");
    return -1;
}

//執行
private void execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
    response.setCharacterEncoding("UTF-8");    //設定response 編碼方式
    request.setCharacterEncoding("UTF-8");     //設定request 編碼方式
    String requestURI = request.getRequestURI();   //此Servlet 的URI
    String method = request.getMethod();           //呼叫Servlet 的方式(GET or POST)
    String param = request.getParameter("param");  //client(客戶端) 提交的參數
    response.setContentType("text/html");      //設定內容類型為 html
    PrintWriter out = response.getWriter();    //取得response 的PrintWriter 字元流
    out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
    out.println("<HTML");
    out.println("  <HEAD><TITLE>First Servlet</TITLE></HEAD>");
    out.println("  <BODY>");
    out.println("   以 " + method + " 方式瀏覽頁面。取得的 param 參數為: " + param + "<br/>");
    out.println("  <form action='" + requestURI + "' method='get'>"
                  + "<input type='text' name='param' value='param string'>"
                  + "<input type='submit' value='以 GET 方式查詢頁面 " + requestURI + "'>"
                + "</form>");
    out.println("  <form action='" + requestURI + "' method='post'>"
                  + "<input type='text' name='param' value='param string'>"
                  + "<input type='submit' value='以 POST 方式提交到頁面 " + requestURI + "'>"
                + "</form>");
    //client 瀏覽器讀取該文件的更新時間
    out.println("  <script type=\"text/javascript\">document.write('本頁面最後更新時間: ' + document.lastModified) </script>");
    out.println("  </BODY");
    out.println("</HTML");
    out.flush();
    out.close();
}
}

doGet():
以 GET 方式來瀏覽網頁時,會執行此方法
開啟此 Servlet 就會先執行 doGet()
執行 doGet() 前,會先執行 getLastModified() 方法,並取得執行 GET 方法的時間
過程:開啟FirstServlet.java → getLastModified() → doGet()

可於 Console 欄看到執行的過程


doPost():
以 POST 方式瀏覽網頁時,會執行此方法
不會執行 getLastModified() 

Console 欄可以看到 getLastModified() 沒有被執行到,僅有 doPost()


getLastModified():
執行 GET 時會產生執行時間
return -1,表示只要有執行 GET 就會產生時間


execute():
<form
action: 將數據發送到此屬性指定之 URL
method: 可以選擇使用 GET 或 POST,對應doGet() 或 doPost() 方法 >
</form>
document.lastModified: 取得最後此頁面最後更新時間
其他參考程式碼上之註解,更詳細的話可以到 Google 上搜尋及了解~


另外 GET、POST 可以看到網址上有無參數,那就是最大的差別,當然這是表面上,內部要解的時候也會不一樣。

執行GET,網址帶有參數
執行POST,網址無參數

  GET POST
 網址有無參數 有無 
安全性較差較好
 傳輸效率較好較差
 使用容易度較容易較麻煩



四、撰寫 web.xml 程式

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1"
         xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                             http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
<!-- 瀏覽方式 -->
<servlet>
   <!-- servlet-name 可以任意取,但必須唯一,因要給<servlet-mapping>, <filter>等使用 -->
   <servlet-name>FirstServlet</servlet-name>
   <!-- Servlet 的類別名 -->
   <servlet-class>idv.ycc.servlet.FirstServlet</servlet-class>
   
   <!-- 一個<serlet>元素可以配置多個 <init-param>(初始化參數) -->
   <!-- Servlet類別 可以使用getServletContext().getInitParam(String paramName) 來取得<param-value> -->
   <init-param>
       <param-name>message</param-name>
       <param-value>welcome to FirstServlet</param-value>
   </init-param>
   <init-param>
       <param-name>encoding</param-name>
       <param-value>utf-8</param-value>
   </init-param>
   
   <!-- 可設 0 or 1 -->
   <!-- 設1,則Tomcat 在啟動時會加載該 Servlet,否則必須有請求時才會加載 -->
   <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
   <!-- <servlet-mapping><servlet-name>配對<servlet><servlet-name> -->
   <!-- 並瀏覽其<servlet-class> -->
   <servlet-name>FirstServlet</servlet-name>
   <!-- 配置其Servlet 的地址,可以多對一 -->
   <url-pattern>/idv.ycc.servlet.FirstServlet</url-pattern>
   <url-pattern>/FirstServlet.do</url-pattern>
   <url-pattern>/FirstServlet.php</url-pattern>
</servlet-mapping>
                   
</web-app>
程式碼上都有註解,可以參考看看
其中以下是最為重要的程式碼

<servlet>
  <servlet-name></servlet-name>   //自己定義,供 <servlet-mapping>搜尋用的名稱
  <servlet-class></servlet-class>     //當<servlet-mapping>搜尋到後,會執行此 class
</servlet>
<servlet-mapping>
  <servlet-name></servlet-name>  //<servlet-mapping>會搜尋此name,並與<servlet>的<servlet-name>對應用
  <url-pattern></url-pattern> //自己定義,賦予此頁面的路徑
</servlet-mapping>

此 web.xml 程式告訴我們,網址後面為 .php、.asp、.jsp 並不一定就是該程式語言,且路徑也可以多個對一個頁面。
以此程式為例,網頁上輸入以下網址,也是可以進入此頁面,但卻不是 php 的語言!
http://localhost:8080/servlet/FirstServlet.php



以上介紹到此,這邊以簡單的應用及解釋為主,如有問題再請下方留言

留言

這個網誌中的熱門文章

[日文] Google日文輸入法 簡單安裝說明

[面試] 日月光 設備工程師

[Windows] 還我 win7 相片檢視器!!