HttpServletResponse和HTTPServletRequest
HttpServletResponse
1、介绍
1)HttpServletResponse接口来自于Servlet规范中,在Tomcat中存在于servlet-api.jar
2)HttpServletResponse接口实现类由Http服务器负责提供
3)HttpServletResponse接口负责将doGet/doPost方法执行结果写入到【响应体】中交给浏览器
4)开发人员习惯于将HttpServletResponse接口修饰的对象称为【响应对象】
2、主要功能
1)将执行结果以二进制的形式写入到【响应体】中
2)设置响应头中【content-type】属性值,控制浏览器使用对应的编译器将响应体中的二进制数据编译为【文字,图片,视频,相关命令】
3)设置响应头中的location属性,将一个请求地址赋值给location。控制浏览器向指定的服务器发送请求。
将执行结果以二进制的形式写入到【响应体】中
public class OneServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//响应结果
String result="Hello World!!!";
//-------------响应对象将结果写入到响应体中----------------start
//1、通过响应对象,向Tomcat服务器索要输出流
PrintWriter out=response.getWriter();
//通过输出流,将执行结果以二进制形式写入响应体中
out.write(result);
//-------------响应对象将结果写入到响应体中----------------end
}//doGet执行完毕
//Tomcat将响应包推给浏览器
}
设置响应头中【content-type】属性值,控制浏览器使用对应的编译器将响应体中的二进制数据编译为【文字,图片,视频,相关命令】
不改变content-type属性的值所得结果如下
public class ThreeServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String result="Java<br/>MYSQL<br/>HTML<br/>";
String result2="林允儿<br/>李智恩<br/>鞠婧祎<br/>";
String result3="<a href=\"第二版互联网通信流程图.png\">图片</a>";
//设置响应头content-type
response.setContentType("text/html;charset=utf-8");
//向Tomcat索要输出流
PrintWriter out=response.getWriter();
//通过输出流将结果写入到响应体中
out.print(result);
out.print(result2);
out.print(result3);
}
}
执行
response.setContentType("text/html;charset=utf-8");
设置响应头中的location属性,将一个请求地址赋值给location。控制浏览器向指定的服务器发送请求。
public class FourServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String result="http://www.baidu.com?username=\"zhangsan\"";
//通过响应对象,将地址赋值个给响应头中的location属性
response.sendRedirect(result);
}
/*
* 浏览器在接收响应包之后,如果
* 发现响应头中存在location属性
* 自动通过地址栏向location指定网站发送请求
*
*
* sendRedirect方法远程控制浏览器请求行为【请求地址,请求方式,请求参数】
*/
}
当访问该Servlet接口实现类时会直接跳转到百度。
HttpServletRequest
1、介绍
1)HttpServletRequest接口来自于Servlet规范中,在Tomcat中存在于servlet-api.jar
2)HttpServletRequest接口实现类由Http服务器负责提供
3)HttpServletRequest接口负责在doGet()/doPost()方法运行的时候读取Http请求协议包中信息
4)开发人员与习惯于将HTTPServletRequest接口修饰的对象称为【请求对象】
2、主要功能
1)可以读取Http请求协议包中【请求行】信息
2)可以读取Http请求协议包中【请求头】或【请求体】中请求参数信息
3)可以代替浏览器向Http服务器申请资源文件的调用
可以读取Http请求协议包中【请求行】信息
public class OneServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//通过请求对象,读取【请求行】中的URL信息
String url=request.getRequestURL().toString();
//通过请求对象,读取【请求行】中的method信息
String method=request.getMethod();
//通过请求对象,读取【请求行】中uri属性
/*
URI:资源文件精准定位地址,在请求行中并没有URI这个属性。
实际上是从URL中截取的一个字符串,这个字符串的格式"/网站名/资源文件名"
URI用于让Http服务器对被访问的资源文件进行定位处理
*/
String uri=request.getRequestURI();
System.out.println("URL:"+url);
System.out.println("method:"+method);
System.out.println("URI:"+uri);
}
}
可以读取Http请求协议包中【请求头】或【请求体】中请求参数信息
浏览器以GET方式发送请求,请求参数保存在【请求头】中。在Http请求协议包到达Http服务器之后,第一件事就是进行解码
请求头二进制内容由Tomcat负责解码,Tomcat9.0默认使用【utf-8】字符集,可以解释一切国家的文字
浏览器以POST方式发送请求,请求参数保存在【请求体】中,在Http请求协议包到达Http服务器之后,第一件事就是进行解码
请求体二进内容由当前请求对象(request)负责解码,request默认情况下使用的是【ISO-8859-1】字符集,一个东欧语系的字符集
此时如果请求体参数内容是中文,将无法解码,只能得到乱码。
在Post请求方式下,在读取请求的内容之前,应该通知请求对象去使用【utf-8】字符集
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<center>
<form action="/myWeb/three" method="get">
请求参数<input type="text" name=username />
<input type="submit" value="get方式访问ThreeServlet"/>
</form>
<form action="/myWeb/three" method="post">
请求参数<input type="text" name=username />
<input type="submit" value="post方式访问ThreeServlet"/>
</form>
</center>
</body>
</html>
public class ThreeServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//通知请求对象,使用utf-8字符集对请求体二进制内容进行解码
request.setCharacterEncoding("utf-8");
//通过请求对象,读取【请求体】中参数
Enumeration paraNames=request.getParameterNames();
while(paraNames.hasMoreElements()){
String paraName=(String)paraNames.nextElement();
//通过请求对象获取【请求体】中参数对象的值
String value=request.getParameter(paraName);
System.out.println("Post----"+paraName+"-------"+value);
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//通过请求对象,读取【请求头】中参数
Enumeration paraNames=request.getParameterNames();
while(paraNames.hasMoreElements()){
String paraName=(String)paraNames.nextElement();
//通过请求对象获取【请求头】中参数对象的值
String value=request.getParameter(paraName);
System.out.println("Get----"+paraName+"-------"+value);
}
}
}
请求对象和响应对象的生命周期
1、在Http服务器接收到浏览器发送的【http请求协议包】之后
自动为当前的【http请求协议包】生成一个【请求对象】和一个【响应对象】
2、在Http服务器调用doGet和doPost方法时,负责将【请求对象】和【响应对象】作为实参传递给doGet和doPost方法,确保方法正常执行
3、在Http服务器准备推送Http响应协议包之前,负责将本次请求关联的【请求对象】和【响应对象】销毁。
***【请求对象】和【响应对象】的生命周期贯穿一次请求处理过程中。
***【请求对象】和【响应对象】相当于用户在服务端的代言人。
推荐阅读
-
call()和apply()方法有什么区别
-
MySQL学习笔记1:安装和登录(多种方法)
-
MySQL慢查询查找和调优测试
-
详解Android中提示对话框(ProgressDialog和DatePickerDialog和TimePickerDialog&PopupWindow)
-
用c#实现简单的登录和注册功能
-
末流985和顶尖211哪个好?附中国各省211大学名单一览表
-
Android中系统默认输入法设置的方法(输入法的显示和隐藏)
-
3-docker 架构和底层技术简介
-
浅谈Python类的__getitem__和__setitem__特殊方法
-
MySQL中CHAR和VARCHAR类型演变和详解