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的生命周期。