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作除数。