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

servlet中的doGet()与doPost()以及service()的用法的更多相关文章

  1. SERVLET中的doGet与doPost两个方法之间的区别

    get和post是http协议的两种方法,另外还有head, delete等 这两种方法有本质的区别,get只有一个流,参数附加在url后,大小个数有严格限制且只能是字符串.post的参数是通过另外的 ...

  2. 1.2(学习笔记)Servlet基础(doGet、doPost、生命周期、页面跳转)

    一.doGet()与doPost() 我们在TestServlet类中重写doGet().doPost().service(). import javax.servlet.ServletExcepti ...

  3. servlet中为什么doGet方法没有被调用的一种可能(笔记)

    创建了一个servlet,然后在doGet()方法内写一些简单的测试语句,但是在实际运行中发现并没有调用到doGet()方法,后来发现自己在创建servlet是将service()方法也勾选上去了,而 ...

  4. Servlet学习二——doGet和doPost

    1.get和post是http协议中的两种方法,还有其它,读写一般数据还能满足: 2.get只有一个流,参数附加在url后,且大小个数有严格限制,这个限制因浏览器而有所不同,get传递数据,实际上是将 ...

  5. 自定义servlet重写doGet或doPost方法是如何实现多态的

    我们知道,如果我们自定义一个servlet继承HttpServlet,并且重写HttpServlet中的doGet或doPost方法,那么从浏览器发送过来的request请求将调用HttpServle ...

  6. servlet中doGet()和doPost()的区别

    1.生成方式 get方法有四种: ①直接在URL地址栏中输入URL ②网页中的超链接 ③form中method为get ④form中method为空时,默认是get提交 post只知道有一种:form ...

  7. servlet中doGet()和doPost()的用法

    转自:https://blog.csdn.net/qq_38963960/article/details/79468182 1.servlet中doGet()和doPost()的用法 一般来说我们是用 ...

  8. 去除myeclipse中doget和dopost方法中的注释

    当我们使用myeclipse新建servlet时发现doget和dopost方法中有一些无用的注释,每次新建一个servlet时都要手动删除特别麻烦. 下面就教大家如何去除这些注释! 以myeclip ...

  9. Servlet----------在使用doGet()和doPost()是如何处理中文乱码

    如果在登录界面跳转到时servlet中使用doGet()方法显示中文出现乱码时,可以添加这两行代码来解决,但这不是唯一的方法 request.setCharacterEncoding("GB ...

随机推荐

  1. NPOI读写

    NPOI 是开源的 POI 项目的.NET版,可以用来读写Excel,Word,PPT文件. 在处理Excel文件上,NPOI 可以同时兼容 xls 和 xlsx.官网提供了一份 Examples, ...

  2. PLSQL注册码

    Product code:lhsuyk8rp65b3mp3xpd875ppqtng4nprSerial number:75282 Password:xs374ca 网上自己找的,我可以用

  3. VS Code如何在浏览器中打开Html文件?

    1.首先打开扩展 “ 文件 → 首选项 → 按键映射扩展” 快捷键:[ Ctrl+K Ctrl+M ] 2.在出现的窗口输入“open in browser”,安装 3.打开Html文件 Alt+B: ...

  4. ta和夏天一起来了

    目录 ta和夏天一起来了 上半年,过去的就让去过去,遗憾的也别再遗憾. 下半年,拥有的请好好珍惜,想要的请努力去追. ta和夏天一起来了 ​ 转眼结束了2019的上半年,在这个月末, 季度末, 周末, ...

  5. centos7安装mysql注意点

    yum安装yum -y install mariadb-server 启动服务systemctl start mariadb.service 开机自动启动systemctl enable mariad ...

  6. Nginx配置文件 nginx.conf 和default.conf 讲解

    nginx.conf /etc/nginx/nginx.conf ######Nginx配置文件nginx.conf中文详解##### #定义Nginx运行的用户和用户组 user www www; ...

  7. MySQL复制技术

    MySQL高可用方案 投票选举机制,较复杂 MySQL本身没有提供replication failover的解决方案,自动切换需要依赖MHA脚本 可以有多台从库,从库可以做报表和备份 MySQL复制技 ...

  8. HAProxy的调度算法

      HAProxy通过固定参数balance指明对后端服务器的调度算法,该参数可以配置在listen或backend选项中.   HAProxy的调度算法分为静态和动态调度算法,但是有些算法可以根据参 ...

  9. PAT 乙级 1038.统计同成绩学生 C++/Java

    题目来源 本题要求读入 N 名学生的成绩,将获得某一给定分数的学生人数输出. 输入格式: 输入在第 1 行给出不超过 1 的正整数 N,即学生总人数.随后一行给出 N 名学生的百分制整数成绩,中间以空 ...

  10. 任务型对话(二)—— DST(对话状态追踪)

    1,概述 关于任务型对话的简介看任务型对话(一)—— NLU(意识识别和槽值填充). 首先我们来看下对话状态和DST的定义. 对话状态:在$t$时刻,结合当前的对话历史和当前的用户输入来给出当前每个s ...