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

posted @ 2019-12-04 19:24  田智凯  阅读(2419)  评论(0编辑  收藏  举报