Servlet处理GET和POST请求
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请求的更多相关文章
- Servlet交互【重定向 与 请求分派】详解
Servlet交互 在serlvet中,需要调用另外一个资源来对浏览器的请求进行响应,两种方式实现: 调用HttpServletResponse.sendRedirect 方法实现 重定向 调用Req ...
- Servlet(五):请求转发和重定向
请求转发: 问题: 服务器在接收到浏览器的请求后,仅仅使用一个 Servlet进行请求处理,会造成不同的Servlet逻辑代码 冗余,Servlet的职责不明确. 解决: 使用请求转发. 特点: 一次 ...
- jsp当做第二个servlet request的生命周期 请求 响应 不管中间经历多少个servlet 只要最后一个serlvt执行后 则生命周期结束 request的域消失
jsp当做第二个servlet request的生命周期 请求 响应 不管中间经历多少个servlet 只要最后一个serlvt执行后 则生命周期结束 request的域消失
- Servlet的学习之Request请求对象(3)
本篇接上一篇,将Servlet中的HttpServletRequest对象获取RequestDispatcher对象后能进行的[转发]forward功能和[包含]include功能介绍完. 首先来看R ...
- Servlet的学习之Request请求对象(2)
在上一篇<Servlet的学习(十)>中介绍了HttpServletRequest请求对象的一些常用方法,而从这篇起开始介绍和学习HttpServletRequest的常用功能. 使用Ht ...
- Servlet的学习之Request请求对象(1)
在本篇中开始对Servlet中的HttpServletRequest请求对象进行学习,请求对象同响应对象一样,我们可以根据该对象中的方法获取例如请求行,请求头和请求实体数据的方法. 在本篇中先对Htt ...
- servlet及jsp之间的请求转发
1.servlet间的请求转发 <dependencies> <dependency> <groupId>javax.servlet</groupId> ...
- 巧妙利用JQuery和Servlet来实现跨域请求
在网上看到很多的JQuery跨域请求的文章,比较有意思.这里我发表一个Servlet与JQuery配置实现跨域的代码,供大家参考.不足之处请指教 原理:JavaScript的Ajax不可以跨域,但是可 ...
- JQuery和Servlet来实现跨域请求
在网上看到很多的JQuery跨域请求的文章,比较有意思.这里我发表一个Servlet与JQuery配置实现跨域的代码,供大家参考.不足之处请指教 原理:JavaScript的Ajax不可以跨域,但是可 ...
随机推荐
- Win10改AHCI无需重装系统(无需改注册表)的方法
下面就开始:1.开机后按下WIN键 加 R键2.输入 msconfig3.如图中所示进行点击.1 引导界面 2安全引导打钩 .最小打钩 3 下面的确定.4.点击重新启动5.在重启时连续按 F2 进入B ...
- Unity琐碎(3) UGUI 图文混排解决方案和优化
感觉使用Unity之后总能看到各种各样解决混排的方案,只能说明Unity不够体恤下情啊.这篇文章主要讲一下个人在使用过程中方案选择和优化过程,已做记录.顺便提下,开源很多意味着坑,还是要开实际需求. ...
- Docker: dockerfile常用关键字
Dockerfile指令 Dockfile执行和shell命令一行,一行一行执行- 写Dockerfile注意点: 1. 尽量少RUN 2. 多个命令拼接在一起 ...
- 数据结构【查找】—平衡二叉树AVL
/*自己看了半天也没看懂代码,下次再补充说明*/ 解释: 平衡二叉树(Self-Balancing Binary Search Tree 或Height-Balanced Binary Search ...
- 【转】10条你不可不知的css规则
10条你不可不知的css规则 Posted on 2006-12-20 10:33 雨中太阳 阅读(343) 评论(1) 编辑 收藏 :[译]10条你不可不知的css规则正文: Published D ...
- win32gui.Findwindow(parm1,parm2)查找窗口的句柄方法
介绍之前先让大家了解一下win32gui的模块用法 和 获取窗口类名工具 使用Python时,有时也会要操作到系统窗口的一些东西,下面就介绍win32gui.Findwindow(param1,par ...
- 15.selenium_case04
# 用selenium实现一个头条号的模拟发文接口 import time import redis from selenium import webdriver from selenium.webd ...
- Python 中两个字典(dict)合并
dict1 = { "name":"owen", "age": 18 } dict2 = { "birthday": & ...
- 从零开始的ESP8266探索(1)-使用Server功能搭建Web Server
https://blog.csdn.net/Naisu_kun/article/details/80398667 文件系统 https://blog.csdn.net/solar_Lan/articl ...
- Oracle查询数据库中所有表的记录数
1.Oracle查询数据库中所有表的记录数,但是有可能不准建议用第二种方式进行查询 select t.table_name,t.num_rows from user_tables t 2.创建orac ...