Servlet的封装过程
GenericServlet抽象类的封装:
servlet中有5个基本方法,我们常用的只有service方法
自定义MyGenericServlet实现Servlet, ServletConfig接口
将service定义为抽象方法,当前MyGenericServlet就是抽象类
子类MyHttpServlet继承MyGenericServlet只需要重写service即可
这样的话,ServletConfig对象就无法初始化,需要在MyGenericServlet定义
一个ServletConfig类型的成员变量,在有参init中初始化
public abstract class MyGenericServlet
implements Servlet, ServletConfig, java.io.Serializable{
private transient ServletConfig config;
public void init(ServletConfig config) throws ServletException {
this.config = config;
this.init();
}
}
同时定义一个无参init给子类重写,在有参init中调用无参init
这样在MyGenericServlet的有参init中就完成了ServletConfig对象初始化,
同时还可以调用子类MyHttpServlet中重写的无参init方法
子类中的无参init方法中就可以获取ServletConfig对象
编译期:MyGenericServlet的有参init调用自身的无参init
运行期:MyGenericServlet的有参init调用子类重写的无参init
HttpServlet的封装:
HttpServlet用于HTTP协议的Servlet程序,主要用来实现Web应用
继承GenericServlet抽象类后拥有service方法
service(ServletRequest req, ServletResponse res)
为了处理Http请求,在方法对参数进行了增强,同时调用了同名方法
HttpServletRequest request;
HttpServletResponse response;
try {
request = (HttpServletRequest) req;
response = (HttpServletResponse) res;
} catch (ClassCastException e) {
throw new ServletException("non-HTTP request or response");
}
service(request, response);
在处理Http请求的service方法中,先判断请求的类型(get/post/put...)
调用当前对应的doGet/doPost/..方法
最后我们自定义的servlet类默认继承HttpServlet
重写doGet/doPost方法即可,其他请求暂不考虑
我们常见的请求就是get和post请求
所以在doGet/doPost方法只需要进行数据的处理即可,
对于什么请求方式不做处理,直接在doPost中调用doGet(),传入自身的request和response参数即可
HTTP请求的过程
服务器接受到客户端请求,解析这个http请求的信息,
封装为一个request对象,再创建一个response对象代表响应对象
创建servlet对象,调用service方法
将request和response作为service方法的参数
service方法结束后,Tomcat会去response缓冲区获取内容信息封装为一个http响应
一次请求对应一个请求对象,一次响应对应一个响应对象
请求对象和响应对象只存在于当前这一次请求中
这一次请求和下一次请求的对象是不一样
HTTP请求的格式
http请求分为请求行,请求头,请求体
请求行格式:请求方式 请求资源地址(uri) 协议名称/协议版本
例如:POST test/index.html HTTP/1.1
请求头格式:
键值对存在的数据,请求头是浏览器自动封装的,这是浏览器要告知服务器的一些信息
请求体格式:
post请求的请求参数
(get请求的参数在地址栏显示)
响应的格式:响应行,响应头,响应体
响应行:协议名称/协议版本 状态码 响应状态码的描述
例如:HTTP/1.1 200 OK
响应头:服务器与客户端通信的暗码
响应体:和网页右键“查看源码”看到的内容一样
使用网络编程获取请求返回响应
public static void main(String[] args) throws IOException {
ServerSocket servers = new ServerSocket(8089);
Socket accept = servers.accept();
InputStream in = accept.getInputStream();
byte[] b = new byte[10240];
int len = in.read(b);
System.out.println(new String(b, 0, len));
OutputStream out = accept.getOutputStream();
out.write("helloworld".getBytes());
out.close();
accept.close();
}