doGet() 、 doPost()、service()方法

  doGet()表示,当客户端是使用get方式请求该servlet时,那么就会触发执行doGet()方法中的代码。

  doPost()表示,当客户端是使用post方式请求该servlet时,那么就会触发执行doPost()方法中的代码。

  而service()方法,既可以接收并处理get请求,也可以接收并处理post请求。

  如果这三个方法都被重写时,service()的优先级是高于doGet()和doPost()的,所以,即使客户端使用get或者post方式请求该servlet,但是服务器因为存在service()方法,即使存在doGet()和doPost(),也是会调用service()方法,而不会调用doGet()和doPost()方法的。

  总结来说:如果servlet中有service()方法,那么会优先调用service()方法来处理请求。

package lixin.gan;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class SecondServlet extends HttpServlet { @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("收到GET请求");
} @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("收到POST请求");
} @Override
public void service(ServletRequest req, ServletResponse resp) throws ServletException, IOException {
System.out.println("收到请求(GET或者POST)");
}
}

  上面这个代码,无论是get请求,还是post请求,触发的都是service()方法,都会在服务器控制台输出 “收到请求(GET或者POST)”。

重写service()方法,并调用父类service()方法

package lixin.gan;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class SecondServlet extends HttpServlet { @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("收到GET请求");
} @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("收到POST请求");
} @Override
public void service(ServletRequest req, ServletResponse resp) throws ServletException, IOException {
System.out.println("收到请求(GET或者POST)");
super.service(req, resp); // 当前servlet的service()处理完之后,再调用父类的service()方法 // 其实super.service()会根据req中的http头信息,判断请求方式,在调用对应的doGet或者doPost
}
}

  运行测试:

// 收到get请求后,控制台的输出
收到请求(GET或者POST)
收到GET请求 // 收到post请求后,控制台的输出
收到请求(GET或者POST)
收到POST请求

  所以,在当前servlet中定义service()方法,并且调用super.service(),那么父类的service()会根据req中的http头信息,判断请求方式,在调用对应的doGet或者doPost。

  一般,我们都不会在当前service()中调用super.service()方法。如果当前servlet没有重写doGet()方法,当客户端发起get请求时,super.service()中调用doGet方法时,就会出现405错误。

Servlet中http错误状态码的产生原因

  404(资源未找到)

  1、客户端发起的请求中,输入的url中的servlet拼写错误,在web.xml中的找不到对应的url-pattern(注意区分大小写)。

  2、客户端发起的请求中,输入的url中的项目名称错误(注意区分大小写)。

  405(请求方式不支持)

  1、假设用户发起post请求,但是servlet中既没有重写service(),也没有重写doPost()方法,此时没有就会出现405错误。

  2、假设用户发起post请求,该servlet中没有重写doPost()方法,但是重写了service()方法,但是又在当前service()中调用super.service(),所以导致super.service()中调用doPost()失败,

  500(服务器内部错误)

  1、在web.xml中servlet的全限定路径拼写错误,web.xml写的是aa.bb类,但是实际的java文件名称是a.b类,导致url-pattern符合规则时,去找对应的class文件时,没有找到。

  2、servlet对象的处理逻辑出现错误,比如0作除数。

Servlet处理GET和POST请求的更多相关文章

  1. Servlet交互【重定向 与 请求分派】详解

    Servlet交互 在serlvet中,需要调用另外一个资源来对浏览器的请求进行响应,两种方式实现: 调用HttpServletResponse.sendRedirect 方法实现 重定向 调用Req ...

  2. Servlet(五):请求转发和重定向

    请求转发: 问题: 服务器在接收到浏览器的请求后,仅仅使用一个 Servlet进行请求处理,会造成不同的Servlet逻辑代码 冗余,Servlet的职责不明确. 解决: 使用请求转发. 特点: 一次 ...

  3. jsp当做第二个servlet request的生命周期 请求 响应 不管中间经历多少个servlet 只要最后一个serlvt执行后 则生命周期结束 request的域消失

    jsp当做第二个servlet  request的生命周期   请求 响应  不管中间经历多少个servlet 只要最后一个serlvt执行后 则生命周期结束  request的域消失

  4. Servlet的学习之Request请求对象(3)

    本篇接上一篇,将Servlet中的HttpServletRequest对象获取RequestDispatcher对象后能进行的[转发]forward功能和[包含]include功能介绍完. 首先来看R ...

  5. Servlet的学习之Request请求对象(2)

    在上一篇<Servlet的学习(十)>中介绍了HttpServletRequest请求对象的一些常用方法,而从这篇起开始介绍和学习HttpServletRequest的常用功能. 使用Ht ...

  6. Servlet的学习之Request请求对象(1)

    在本篇中开始对Servlet中的HttpServletRequest请求对象进行学习,请求对象同响应对象一样,我们可以根据该对象中的方法获取例如请求行,请求头和请求实体数据的方法. 在本篇中先对Htt ...

  7. servlet及jsp之间的请求转发

    1.servlet间的请求转发 <dependencies> <dependency> <groupId>javax.servlet</groupId> ...

  8. 巧妙利用JQuery和Servlet来实现跨域请求

    在网上看到很多的JQuery跨域请求的文章,比较有意思.这里我发表一个Servlet与JQuery配置实现跨域的代码,供大家参考.不足之处请指教 原理:JavaScript的Ajax不可以跨域,但是可 ...

  9. JQuery和Servlet来实现跨域请求

    在网上看到很多的JQuery跨域请求的文章,比较有意思.这里我发表一个Servlet与JQuery配置实现跨域的代码,供大家参考.不足之处请指教 原理:JavaScript的Ajax不可以跨域,但是可 ...

随机推荐

  1. MATLAB常微分方程数值解——欧拉法、改进的欧拉法与四阶龙格库塔方法

    MATLAB常微分方程数值解 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 1.一阶常微分方程初值问题 2.欧拉法 3.改进的欧拉法 4.四阶龙格库塔 ...

  2. TestFlight的使用--再也不用担心环境打错了

    转赞请注明出处:http://www.cnblogs.com/zhanggui/p/7039651.html 一.前言 在iOS开发过程中,难免会遇到各种Bug.因此你会去解决所有的Bug,然后提交到 ...

  3. 【递推】ZSC1072: 数学、不容易系列之二—— LELE的RPG难题

    思路如下: f(n) = 1, ... , n-2 , n-1, n 前n-2个已涂好后,涂第n-1个即有2种情况: n-1的色与n-2和1的色都不相同,那么n就是剩下的那个色,没有选择. 即就是f( ...

  4. 《Java大学教程》—第15章 异常

    自测题:1.    什么是异常?P357异常是在程序生命周期内出现的事件,它会导致程序行为不可靠. 2. 已检查异常和未检查异常的区别是什么?P359在编译器允许程序被编译通过前,要求程序员必须编写代 ...

  5. nodejs前后分离

    proxy: { '/api': { target: 'http://localhost:3000/', pathRewrite: {'^/api' : ''}, changeOrigin: true ...

  6. ES5-ES6-ES7_严格模式

    运行模式 正常(混杂)模式与严格模式,除了正常运行模式(混杂模式),ES5添加了第二种运行模式:"严格模式"(strict mode) 顾名思义,这种模式使得Javascript在 ...

  7. CentOS 7 安装telnet服务

    今天测试zabbix需要用到telnet服务,查询到Centos7下下载安装telnet服务的方法,特此整理记录! 一.通过yum下载安装telnet yum -y install xinetd te ...

  8. 如何利用pip自动生成和安装requirements.txt依赖

    在查看别人的Python项目时,经常会看到一个requirements.txt文件,里面记录了当前程序的所有依赖包及其精确版本号.这个文件有点类似与Rails的Gemfile.其作用是用来在另一台PC ...

  9. [3] TensorFlow 深层神经网络

    深层神经网络简称为深度学习有两个非常重要的特性1. 多层2. 非线性 线性模型的局限性 :例如前面的神经网络有两层(不算输入层),但是它和单层的神经网络井没有区别,任意线性模型的组合仍然还是线性模型, ...

  10. Spring Security(二十八):9.4 Authentication in a Web Application

    Now let’s explore the situation where you are using Spring Security in a web application (without we ...