HttpServlet

1.适配器模式

上篇文章中介绍了实现Servlet接口的方式来书写一个servlet类,但是如果我们实现了Servlet接口的话,就必须要重写那五个方法,但是我们需要的就只有init()、service()、destroy(),适配器模式就能解决这一问题。

什么是适配器模式呢?

假如现在有一个接口,里面有A,B,C,D,E五个方法,但是我们经常使用的就只有A,B,C三个方法,那么此时我们就可以书写一个类去实现这个方法,然后将A,B,C设置为抽象的方法,然后再书写我们需要的类去继承刚刚实现接口的这个类,那么E,F方法就不是必须要实现啦!

这种设计模式就叫做适配器模式。

所以我们也可以利用适配器模式的思想,书写一个类去实现Servlet接口,然后我们再去继承这个类。

但是这件事情已经不需要我们去做了,贴心的SUN公司已经为我们写好了,这个类就是GenericServlet

2.GenericServlet

GenericServlet是Servlet接口的实现子类。

它不仅实现了Servlet接口中的五个反法,还有一些自己独特的方法。

我们可以通过继承GenericServlet来书写一个servlet类,必须重写的方法:service方法。

package com.dh.servlet;

import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;

public class Servlet02 extends GenericServlet {
    
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
		
    }
}

3.get和post请求方式

在html的表单中,我们知道action可以有两种请求方式,get和post,先了解一下这两种请求方式的不同。

首先要介绍HTTP协议。

Http协议

http协议是w3c制定的超文本传输协议,是用于互联网中浏览器和服务器通信的协议。

其分为请求协议和响应协议:

  • 请求协议:由请求行、消息报头、空白行、请求体组成;
  • 响应协议:由状态行、响应报头、空白行、响应体组成。
    • 在响应报头中有一个状态码信息
      • 200:ok
      • 404:not found,要访问的资源找不到,可能是路径错误或者是资源不存在
      • 500:服务器内部错误,一般是代码错误,好好检查代码吧

(除了在form表单中指定了action为post,其余的请求都是get请求)


  • get请求是在请求行中提交数据,格式为URI?name=value&......,这种提交方式提交的数据会显示在浏览器的地址栏上,不安全;并且由于是在请求行中提交数据,所以提交的数据长度有限制,提交的数据类型也只能是普通字符串;但是get请求会将结果缓存到浏览器的缓存中,可以提高用户的体验。

    • 当结果需要使用缓存时,使用get请求。
  • post请求是在请求体中提交数据,格式为name=value&...,这种提交方式数据不会显示在浏览器的地址栏上,比较安全;并且由于是在请求体中提交数据,所以提交的数据长度没有限制,并且提交的数据类型可以是任意的数据类型;使用post请求方式获取到的内容,不会缓存到浏览器中。

    • 当有敏感的数据时,使用post请求;
    • 当数据很大时,使用post请求;
    • 当数据类型不是普通字符串时,使用post请求;
    • 当要修改服务器资源时,使用post请求。

但是在开发中,怎么去保证前端开发人员和后端开发人员处理的方式一致呢?如果不一致的话,会发生405错误。

体贴的SUN公司又帮我们写了一个类:HttpServlet。

4.HttpServlet

HttpServlet是GenericServlet的实现子类。

我们可以通过继承HttpServlet类去书写一个servlet这也是最常用的方式。HttpServlet中的每一个方法都不需要重写;

但是通常会实现doGet()和doPost():用于编写处理业务逻辑的代码,就相当于service()。

package com.dh.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class Servlet03 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //书写代码
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //在doPost()中调用doGet()
        //然后在doGet()中书写代码
        //如果是get请求方式就会直接调用doGet()执行代码
        //如果是post请求就会执行doPost(),第一行会调用doGet(),也会执行代码
        doGet(req,resp);
    }
}

注意:

doGet()和doPost()不属于servlet的生命周期。

posted @ 2021-03-11 16:28  deng-hui  阅读(159)  评论(0编辑  收藏  举报