在之前的博客中《Servlet基础知识》中讲解了Servlet的概念、编写步骤、运行原理及生命周期进行了讲解,这篇博客主要讲解Servlet接口及其子类
Servlet接口及子接口
GenericServlet
在之前的Servlet编写中,我们要实现Servlet
接口并且重写其中的5个方法,但是只有一个方法即service()
方法是我们在每次通过浏览器访问Servlet时会执行的方法,这个方法最为重要,那么对其他几个方法的重写就会比较多余,现在介绍Servlet
接口的子类GenericServlet
在之前的servlet包下编写ServletDemo2
package com.westos.web.servlet;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
@WebServlet("/demo2")
public class ServletDemo2 extends GenericServlet {
}
在继承 GenericServlet
类后我们需要重写其中的一个抽象方法service()
package com.westos.web.servlet;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
@WebServlet("/demo2")
public class ServletDemo2 extends GenericServlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("你好GenericServlet");
}
}
启动服务器后在浏览器访问http://127.0.0.1:8080/web/demo2,可以看到控制台的输出
访问服务器中的Servlet成功
查看GenericServlet
这个类的结构
它实现了
Servlet
接口,并且对其中的getServletConfig()
、getServletInfo()
、destroy()
以及init(javax.servlet.ServletConfig config)
方法进行了非常简单的重写,将service()
方法设置为抽象方法,凡是继承GenericServlet
类的子类都必须重写service()
方法,
如果在以后我们编写Servlet类的时候直接继承GenericServlet
类即可,只需要对service()
方法进行重写,其他方法也被继承,但是是隐式的,我们并看不到,这个类相对于之前的Servlet接口来说简单了许多
HttpServlet
有了GenericServlet
这个类让我们的编码简单了许多,但是如果我们要在访问Servlet的同时遵守HTTP协议就必须知道GenericServlet
的子类HttpServlet
HttpServlet
:对http协议的一种封装,简化操作
我们在servlet目录下编写ServletDemo3
,继承HttpServlet
,首先查看一下HttpServlet
类的结构
HttpServlet
继承自GenericServlet
,继承这个类后对其中的service()
方法进行了重写
这个
service()
方法中的GET POST
等单词表示我们提交请求的方式,如果是以GET
方式请求,就执行doGet(req, resp)
,如果是POST
方式请求就执行doPost(req, resp)
,当然在现阶段我们最常用的两种请求的提交方式就是GET
和POST
,我们主要使用的是doGet(req, resp)
和doPost(req, resp)
,对于其他的请求方式我们暂时不研究
在我们继承了HttpServlet
类后就能直接重写doGet(req, resp)
和doPost(req, resp)
,关于这两个方法的参数req
和resp
我们在后面会讲解
现在对HttpServlet
这个类进行简单的演示
在ServletDemo3
中
package com.westos.web.servlet;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/demo3")
public class ServletDemo3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doGet(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
我们重写doGet
和doPost
两个方法,重写完成后,因为浏览器提交请求的默认方式是Get,所以我们只需要在doGet
方法中添加语句来看访问Servlet的效果
package com.westos.web.servlet;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/demo3")
public class ServletDemo3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("HTTPServlet");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
启动服务器,之后再浏览器访问http://localhost:8080/web/demo3,在控制台查看输出语句
可以看到控制台的输出,访问成功
在讲解完HttpServlet
后我们后续就会讲解和这个类有关的HTTP协议及Request
对象