Request & Response
HeetpServletResponse接口
来自于Servlet规范
接口位于tomcat的servlet-api.jar中。 HttpServletResponse接口实现类由Http服务器提供,该接口负责将doXXX方法的执行结果写到报文的实体体部分。这个接口实现对象也被叫做响应对象。
主要功能:
- 将执行结果以二进制写入响应体(响应报文的实体体)中
- 设置响应报文首部行中的[content-type]属性值,从而控制浏览器采用对应的方式将二进制解析为文字、图片、命令
- 设置响应报文首部行中location属性,将一个请求地址赋值给location。从而控制浏览器向指定服务器再度发送请求。
注意事项
1、tomcat中有一个连接响应报文的输出流,通过响应对象,能拿到输出流 通过输出流,将结果以二进制写到响应体中,注意,这个输出流不是response创建的,是借用的,不用关闭
2、在默认的情况下 content-type = “text” 浏览器把响应体内容当成文本去解析一定要在得到输出流之前,通过响应对象对[content-type]进行一次重新赋值,用于指定浏览器的解析方式。
respnonse.setContentType(“text/html;charset = utf-8”);
3、 默认情况下响应头(首部行)中是没有location属性的,浏览器在接收到相应包之后,如果发现有locaiton属性,就会自动对location地址发起GET请求,从而重定位到location。
后端工程师控制浏览器行为的方式:通过响应对象,将地址赋值给响应头中的location属性
HttpServletRequest接口
自于Servlet规范
在Tomcat中的servlet-api.jar。HttpServlet接口实现类由Http服务器负责提供。这个接口实现类对象负责在doXXX方法运行时读取Http请求协议包中信息,因此它也被称为请求对象
主要功能:
- 可以读取Http请求协议包中,
- 可以读取保存在Http请求协议包中请求行信息、请求头、请求体中的信息
- 可以代替浏览器向Http服务器申请资源文件调用
通过请求对象,读取请求行中的url信息
String url = request.getRequestURL().toString();
通过请求对象,读取请求行中method信息
String method = request.getMethod();
读取uri信息:资源文件精准定位地址,在请求行中,并没有uri属性,uri是从url中截取的一个字符串,格式是:/网站名/资源文件名。
String uri = getRequestURI();
将所有请求参数名称保存到一个枚举对象返回
Enumeration paramNames = getParameterNames();
while(paramNames.hasMoreElements()){
String paramName = (String)paramNames.nexElement();
System.out.println("请求参数:" +paramName);
}
根据参数名称读取参数的值,不管是参数在请求头还是请求体
String value = request.getParameter(paramName);
一个问题:
以GET方式发送中文请求参数内容,Http服务器可以将其解释为正确结果
以POST方式发送中文请求参数内容,Http将其解释为乱码 why?
若浏览器以GET方式发送请求,请求参数保存在请求头中,在Http请求协议包到达Http服务器后,第一件事就是解码,请求头中的二进制内容由Tomcat负责解码,Tomcat9.0默认使用utf-8字符集,可以解释一切国家的文字
以POST方式发送请求,请求参数保存在请求体中,请求体中的二进制内容由当前的请求对象request解码,它默认使用[ISO-8859-1]字符集无法解码中文,只能得到乱码。
解决方案在POST请求方式下,在读取请求体内容之前,应该先通知请求对象的合适的字符集进行解码,”哥们,你刚才理解错了“
request.setCharacterEncoding(“utf-8”);
请求对象和响应对象他们的生命周期
1、创建:Tomcat接受到浏览器所发送的Http请求协议包之后,自动为当前的Http请求协议包,生成一个请求对象,一个响应对象
假如Http请求协议包索要的是one—>OneServelt,Tomcat会new一个oneServlet对象,然后调用它的service方法,进而进一步调用doXXX方法。注意,此时请求对象和响应对象要作为实参传递到doXXX方法中。
因为在doXXX方法中,可能需要请求对象来获取请求报文的信息,也一定需要响应对象来写入响应报文信息doXXX方法运行完毕时,意味着本次的请求也处理完毕,此时在服务端会有一个响应协议包出现,tomcat推送其回至浏览器
2、销毁 :在推回之前,tomcat会销毁掉这两个对象。
这两个对象生命周期就是一次请求的处理周期。
请求对象相当于浏览器在服务端的嘴巴,跟服务器“说”一些信息
响应对象相当于浏览器在服务端的耳朵,从服务器“听”一些信息