准备工作
- 引入servlet-api、jsp-api相关jar包或者引入maven依赖
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
<scope>provided</scope>
</dependency>
HttpServlet是一个抽象类,继承自GenericServlet,GenericServlet实现了Servlet接口,因此本质是也是Servlet,由于实现Servlet接口必须要实现其他4个不用的方法,因此会造成非常的不方便,为了简化我们只需要执行我们自己也业务service()即可,因此可以用HttpServlet类代替更加方便,使用HttpServlet只需要继承,实现doGet()和doPost()方法即可
- HttpServlet将Servlet中的service()方法进行分发处理请求
- Http请求有GET、POST、PUT、DELETE等等请求方式
- 在当前的Servlet学习中还涉及不到其他请求方式,因此只需要实现doGet()和doPost()方法即可够用
- 浏览器默认的请求方式是GET请求方式
从HttpServlet中的源码中可以看出,最终还是通过service()方法进行分发执行oGet()和doPost()方法
代码示例
@WebServlet("/demo")
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=UTF-8");
resp.getWriter().println("Hello World,这是GET请求");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().println("Hello World,这是GET请求");
}
}
浏览器访问
通过流程图来分析以上过程
自定义一个HttpServlet类
自定义MyGenericServlet类
//这个类只帮我们把Servlet接口中的方法都实现掉,而我们只注重service()方法
public abstract class MyGenericServlet implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
自定义MyHttpServlet类
//这个类是将我们的service方法进行优化,将请求分发,根据请求方式来执行特定方法
public class MyHttpServlet extends MyGenericServlet{
//只关注业务service方法,其余方法实质性不操作
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//由于浏览器是HTTP请求方式,
// HttpServletRequest和HttpServletResponse是继承自ServletRequest和ServletResponse
//则先将先将ServletRequest和ServletResponse转化为HttpServletRequest和HttpServletResponse(向下转型)
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
//通过获取浏览器请求方式来进行分发
String method = request.getMethod();
//如果是GET请求调用doGet方法
if (method.equals("GET")) {
this.doGet(request, response);
} else if (method.equals("POST")) {
//如果是POST请求调用doPost方法
this.doPost(request, response);
}else {
//其他请求方式,暂时不处理
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
}
}
我们自己写业务方法的Servlet类
//只专注于GET和POST请求方式即可
@WebServlet("/myServlet")
public class HelloWorldServlet extends MyHttpServlet{
//我们自己写的MyHttpServlet类,继承写自己的业务方法
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().write("Hello World GET");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().write("Hello World POST");
}
}
测试示例(通过Postman工具来测试)