JavaWeb(二)——Http请求

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对象
		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("HTTP\\1.1 200 OK \\r\\n\\r\\n helloworld".getBytes());
		out.write("helloworld".getBytes());
		// 关闭资源
		out.close();
		accept.close();
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值