servlet中的doGet()與doPost()以及service()的用法


doget和dopost的區別

get和post是http協議的兩種方法,另外還有head, delete等

1.這兩種方法有本質的區別,get只有一個流,參數附加在url后,大小個數有嚴格限制且只能是字符串。post的參數是通過另外的流傳遞的,不通過url,所以可以很大,也可以傳遞二進制數據,如文件的上傳。 

2.doGet在地址欄中顯示請求的內容,doPost隱藏.
其時說來很簡單,在servlet中doPost方法里還是調用了doGet方法,所以在創建servlet時可以不要doPost方法,但在做大型項目涉及密碼的傳送時doPost方法會更安全些,通常情況下二者沒什么區別。

在servlet開發中,以doGet()和doPost()分別處理get和post方法。 
首先判斷請求時是get還是post,如果是get就調用doGet(), 如果是post就調用doPost()。都會執行這個方法。 

1.doGet
GET 調用用於獲取服務器信息,並將其做為響應返回給客戶端。當經由Web瀏覽器或通過HTML、JSP直接訪問Servlet的URL時,一般用GET調用。 GET調用在URL里顯示正傳送給SERVLET的數據,這在系統的安全方面可能帶來一些問題,比如用戶登錄,表單里的用戶名和密碼需要發送到服務器端, 若使用Get調用,就會在瀏覽器的URL中顯示用戶名和密碼。
例:
jsp頁代碼:(Ajax-type)

$.ajax({
      type: "GET",
      url: "UserServlet?action=listAll",
      dataType: "json",
      success: function(data) {
        $("#users tbody").empty();  // 每次載入前先清空顯示區域,防止數據重復顯示
        var users = data.users;
        for (var i in users) {
          var user = users[i];
          var userStr = JSON.stringify(user);
          $("#users tbody").append('<tr><td>'+ user.name + '</td>'
            + '<td>' + user.psw + '</td>'
            + '<td><button onclick=\'showUpdateUserModal(' + userStr + ')\'>更新</button>&nbsp;'
            + '<button onclick="deleteUser(' + user.id + ')">刪除</button></td></tr>');
        }
      },
      error: function() {
        console.log("ajax error!");
      }
    });

 

servlet代碼:

protected void doGet(HttpServletRequest request, HttpServletResponse response)
             throws ServletException, IOException {
         // 設置返回編碼格式,解決中文亂碼
         response.setCharacterEncoding("utf-8");
        
         // 根據action的值來執行不同的動作,例如顯示所有用戶或顯示單個用戶
         String action = request.getParameter("action");
        
         // 顯示所有用戶
         if (action.equals("listAll")) {
          //System.out.println("servlet——listAll");
             UserService userService = new UserServiceImpl();
             List<User> users = userService.listAll();
             //System.out.println(users.get(0).getName());
             System.out.println(users.get(0).getCreateTime());
             // 返回JSON數據格式
             JSONArray jsonArr = JSONArray.fromObject(users);
             JSONObject jsonObjOut = new JSONObject();
             jsonObjOut.put("users", jsonArr);
             JsonUtil.setJSON(request, response, jsonObjOut);
         }
}

 

這樣提交表單后,參數會自動添加到瀏覽器地址欄中,帶來安全性問題。

2.doPost
它用於客戶端把數據傳送到服務器端,也會有副作用。但好處是可以隱藏傳送給服務器的任何數據。Post適合發送大量的數據。
例:
jsp頁代碼:

// 添加用戶
  function addUser() {
    // 獲取序列化表單信息
    var user = $("#add-user-form").serializeJSON();
    var userStr = JSON.stringify(user);
    
    $.ajax({
      type: "POST",
      url: "UserServlet",
      data: userStr,
      dataType: "json",
      success: function(data) {
        if (data.isSuccess) {
          $("#add-user-modal").dialog("close");
          showMsg('添加成功!');
          listAllUser();
        } else {
          $("#add-user-modal").dialog("close");
          showMsg('添加失敗!');
          listAllUser();
        }
      },
      error: function() {
        console.log("ajax error");
      },
    });
  }

 

servlet代碼:

protected void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            // 獲取JSON數據
            JSONObject jsonObjIn = JsonUtil.getJSON(request, response);

            User user = new User();
            user.setPsw(jsonObjIn.getString("password"));
            user.setName(jsonObjIn.getString("name"));
            
            UserService userService = new UserServiceImpl();
            boolean isSuccess = userService.add(user);
            
            // 返回JSON數據格式
            JSONObject jsonObjOut = new JSONObject();
            jsonObjOut.put("isSuccess", isSuccess);
            JsonUtil.setJSON(request, response, jsonObjOut);
        }
        

 

1、安全

GET調用在URL里顯示正傳送給SERVLET的數據,這在系統的安全方面可能帶來問題,例如用戶名和密碼等

POST就可以在一定程度上解決此類問題

2、服務器接收方式

服務器隨機接受GET方法的數據,一旦斷電等原因,服務器也不知道信息是否發送完畢

而POST方法,服務器先接受數據信息的長度,然后再接受數據

 

 service() 方法

service() 方法是 Servlet 的核心。每當一個客戶請求一個HttpServlet 對象,該對象的service() 方法就要被調用,而且傳遞給這個方法一個"請求"(ServletRequest)對象和一個"響應"(ServletResponse)對象作為參數。 在 HttpServlet 中已存在 service() 方法。缺省的服務功能是調用與 HTTP 請求的方法相應的 do 功能。例如, 如果 HTTP 請求方法為 GET,則缺省情況下就調用 doGet() 。Servlet 應該為 Servlet 支持的 HTTP 方法覆蓋 do 功能。因為 HttpServlet.service() 方法會檢查請求方法是否調用了適當的處理方法,不必要覆蓋 service() 方法。只需覆蓋相應的 do 方法就可以了。

當一個客戶通過HTML 表單發出一個HTTP POST請求時,doPost()方法被調用。與POST請求相關的參數作為一個單獨的HTTP 請求從瀏覽器發送到服務器。當需要修改服務器端的數據時,應該使用doPost()方法。

當一個客戶通過HTML 表單發出一個HTTP GET請求或直接請求一個URL時,doGet()方法被調用。與GET請求相關的參數添加到URL的后面,並與這個請求一起發送。當不會修改服務器端的數據時,應該使用doGet()方法。

上述servlet可以改寫為:

protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            /**
             * 方法選擇
             */
            req.setCharacterEncoding("utf-8");
            String method = req.getParameter("method");
            if (method.equals("listAll")) {
                listAll(req, resp);
            }else if(method.equals("getById")) {
                getById(req, resp);
            }else if(method.equals("addUser")) {
                addUser(req, resp);
            }
        }
        
     private void addUser(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {
        // 獲取JSON數據
            JSONObject jsonObjIn = JsonUtil.getJSON(req, resp);

            User user = new User();
            user.setPsw(jsonObjIn.getString("password"));
            user.setName(jsonObjIn.getString("name"));
            
            UserService userService = new UserServiceImpl();
            boolean isSuccess = userService.add(user);
            
            // 返回JSON數據格式
            JSONObject jsonObjOut = new JSONObject();
            jsonObjOut.put("isSuccess", isSuccess);
            JsonUtil.setJSON(req, resp, jsonObjOut);
        }

        private void listAll(HttpServletRequest req, HttpServletResponse resp)  throws IOException, ServletException {
            // TODO 自動生成的方法存根
            //System.out.println("servlet——listAll");
            UserService userService = new UserServiceImpl();
            List<User> users = userService.listAll();
            //System.out.println(users.get(0).getName());
            System.out.println(users.get(0).getCreateTime());
            // 返回JSON數據格式
            JSONArray jsonArr = JSONArray.fromObject(users);
            JSONObject jsonObjOut = new JSONObject();
            jsonObjOut.put("users", jsonArr);
            JsonUtil.setJSON(req, resp, jsonObjOut);
        }

個人認為service()方法方便一些,易操作,代碼可讀性也高

摘自:https://www.cnblogs.com/justdoitba/articles/8058024.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM