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. SUSE 中文是乱码

    http://www.wo81.com/tec/os/suse/2014-04-30/186.html   操作系统:SUSE Linux Enterprise 11 问题:vi 打开文件,中文是乱码 ...

  2. ​ Markdown

    Cygwin ​ Markdown是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式. ​ Markdown具有一系列衍生版本,用于扩展Markdown ...

  3. asp.net webapi 随笔

    第一次写博客,文笔有限,记录下学习的过程 话不多说,直接开干 首先用vs2017建立一个空网站项目,然后只勾选api 项目建立后,如下结构 其中WebApiConfig类配置了路由相关信息 publi ...

  4. 我是如何一步步编码完成万仓网ERP系统的(七)产品库设计 3.品牌图片跨域上传

    https://www.cnblogs.com/smh188/p/11533668.html(我是如何一步步编码完成万仓网ERP系统的(一)系统架构) https://www.cnblogs.com/ ...

  5. Idea中Spring整合MyBatis框架中配置文件中对象注入问题解决方案

    运行环境:Spring框架整合MaBitis框架 问题叙述: 在Spring配置文件applicationContext-mybatis.xml中配置好mybatis之后 <?xml versi ...

  6. 在系统下文件上传报错:The temporary upload location [/tmp/tomcat.xxx/work/Tomcat/localhost/ROOT] is not valid

    线上的系统中长时间不访问时不能上传文件了,出现如下错误: 2019-03-11 23:37:42.741 ERROR 66505 --- [nio-8081-exec-3] o.a.c.c.C.[.[ ...

  7. Linux 批量查找并替换文件夹下所有文件的内容

    1.批量查找某个目下文件的包含的内容 cd etc grep -rn "查找的内容" ./ 2.批量替换某个目下所有包含的文件的内容 cd etc sed -i "s/查 ...

  8. 三、python对字符串和集合的内存垃圾回收机制

    变量声明: name1 = "andy" name2 = name1   这个时候我把name1的值给改成了“tom”,问现在name2的值是什么?为什么? 答:andy,因为你把 ...

  9. python socket 传输文件

    推荐资料 https://www.cnblogs.com/xiaokang01/p/9865724.html socket传输文件 思路: # 先将报头转换成字符串(json.dumps), 再将字符 ...

  10. 爬虫篇-python爬虫中多线程的使用

    queue介绍 queue是python的标准库,俗称队列.可以直接import引用,在python2.x中,模块名为Queue.python3直接queue即可 在python中,多个线程之间的数据 ...