Servlet中的Request和Response的请求和响应概述
============================================================================================
1.请求和响应描述:
request:代表请求,在浏览器的地址栏输入地址,点击回车,这个过程称为一次请求
response:代表响应,服务器端根据的请求,返回数据到浏览器中进行显示,这个过程称为一次响应
2、response的简介
2.1 HttpServletResponse,是一个接口,父接口是ServletResponse,代表响应对象
2.2 常用api
(1)响应行
* 设置状态码:setStatus(int sc) ,setStatus(int sc,String message)
(2)响应头
(1)是key-value结构,一个key可以有一个value,一个key也可以有多个value
(2)方法
= setHeader(java.lang.String name, java.lang.String value) :设置响应头
== 两个参数:第一个参数是响应名称;第二个参数值
== 针对一个key和一个value情况
== setHeader("aa","11");
setHeader("aa","22");
结果:名称 aa ,值 22
= 针对特殊的类型,设置头的方法
= setIntHeader(java.lang.String name, int value) :针对int类型值的方法
= setDateHeader(java.lang.String name, long date) :值long类型,是毫秒数(1970 1 1至今的毫秒数)
= addHeader(java.lang.String name, java.lang.String value) :设置响应头
== 两个参数:第一个参数是响应名称;第二个参数值
== 针对一个key和多个value的情况
== addHeader("bb","55");
addHeader("bb","66");
结果:名称 bb ,值 55,66
= 针对特殊的类型,设置头的方法
= addIntHeader(java.lang.String name, int value) :针对int类型值的方法
= addDateHeader(java.lang.String name, long date) :值long类型,是毫秒数
(3)响应体
(1)向页面显示的内容
(2)方法
= getWriter():使用字符流向页面输出内容
= getOutputStream():使用字节流向页面输出内容
2.3 重定向
(1)需求的描述:
在登录页面中,输入用户名和密码,判断输入的用户名和密码是否正确;
如果用户名和密码都正确,登录成功,向页面输出内容;
如果用户名或者密码有一个是错误的,重定向到登录页面。
(2)实现的步骤:
第一步:创建登录页面login.html,写表单,在表单里面写两个输入项,一个输入用户名,一个输入密码,提交到一个servlet里面
第二步:创建servlet,在这个servlet里面首先获取到输入的用户名和密码,根据用户名和密码进行判断(用户名如果是
admin,密码如果是123456表示正确的)
如果用户名和密码都正确,登录成功,向页面输出内容;
response.getWriter().write("login success");
否则重定向到登录页面
//设置状态码
response.setStatus(302);
//使用头Location完成重定向
response.setHeader("Location", "/day12_1/login.html");
简写方式:
response.sendRedirect("重定向的路径");
2.4 定时刷新
1.需求分析:注册成功,等待5秒以后,跳转到登陆页面。
实现步骤:
1.注册成功,跳转到RefreshServlet,在这里实现定时跳转到登陆页面
setHeader("Refresh","5;url=/要跳转的地址");
2.倒计时效果:
(1)直接在html页面中实现操作
在html中使用meta标签实现页面的定时跳转
<meta http-equiv="Refresh" content="3;url=/day08-1/login.html">
(2)定时器实现:
/每一秒向span标签里面写内容
//bom里面widow对象里面 setInterval方法
var m = 5;
function loadTime() {
//得到span标签
var span1 = document.getElementById("spanid");
//向span里面写内容
span1.innerHTML = m;
m--;
}
setInterval("loadTime();",1000);
2.5 设置响应体:
*1.响应体:response把响应体(数据)给浏览器,显示在网页上。
*2.字节流向浏览器响应数据:
response.getOutputStream().write("内容".getBytes());
字节流输出中文出现了乱码
原因: 字节数组的编码格式和浏览器的编码格式不一致导致的。
比如:字节编码是utf-8,浏览器的编码是GBK.
response.getOutputStream().write("中文".getBytes("utf-8"));
解决方案:把浏览器的编码和字节编码保持一致。
设置浏览器的编码:response.setHeader("Content-Type","text/html;charset=UTF-8");
*3.字符流向浏览器响应数据
response.getWriter().write("内容");
字符流出现中文乱码
*首先会把内容放到response缓冲区里面,
response缓冲区默认的编码是 iso8859-1,这个编码不支持中文,一定会有乱码
*
* 解决方法:
* 1、设置response缓冲区的编码:response.setCharacterEncoding("utf-8");
* 2、设置浏览器的编码:response.setHeader("Content-Type","text/html;charset=UTF-8");
* response缓冲区的编码和浏览器的编码一致
2.6 细节问题:
1.处理字符流中文乱码问题:
response.setContentType("text/html;charset=utf-8");
等同于 设置浏览器和缓冲区的编码一致。
2.字符流和字节流是互斥的,不能同时使用。
报异常:IllegalStateException: getWriter() has already been called for this response
3.字符流不能直接向页码输出数字:
原因:输出数字时,数字根据指定的码表找对应的字符
================================================================
3.Request
3.1 HttpServletRequest:它是一个接口,代表请求对象。
3.2 常用api:
(1)请求行
*请求方式:getMethod()
*请求地址:getRequestURL() getRequestURI()
*请求协议:getProtocol
URL 和 URI区别:
URL: uniform resource location 统一资源定位符(完整的web路径)。
URI: uniform resource identify 统一资源标识符(缺少了协议和ip地址、端口号)
(2)请求头:
*请求头信息:getHeader(java.lang.String name),根据名称得到请求头的值
= 头信息 User-Agent:获取当前请求的浏览器的类型
= String agent = request.getHeader("User-Agent");
(3)获取客户机信息:
*项目名称: getContextPath()
*主机地址: getRemoteAddr, getRemoteHost,
(4) 获取表单数据
* 1.一个参数对应一个值:
String value = request.getParameter(String name);
参数:表单输入项name属性对应的值,
比如: <input type="text" name="username" />
String username = request.getParameter("username");
* 2.一个参数对应多个值:
String[] values = request.getParameterValues();
参数:表单输入项name属性对应的值,
* 3.没有参数,获取所有值:
Map<String,String[]> map = request.getParamterMap();
map的key: 表单中name属性的值。
map的value:表单用户输入的值。
* 4.获取所有表单中name属性的值:
Enumeration names = getParameterNames();
3.3 request请求的中文乱码:
1.post请求出现中文乱码:
原因:post提交数据时,会把数据存放到request缓冲区,默认编码是iso-8859-1,不支持中文,所以乱码。
解决方案:
****设置request缓冲区的编码支持中文的编码格式即可:
request.setCharacterEncoding("utf-8");
2.get请求出现中文乱码:
解决方案:
****1.修改tomcat的conf目录下的server.xml配置文件:
<Connector connectionTimeout="20000"
port="80" protocol="HTTP/1.1"
redirectPort="8443"
URIEncoding="utf-8"
/>
****2.String的构造函数解决:
代码如下:
String username = request.getParameter("username");
username = new String(username.getBytes("iso-8859-1"),"utf-8");
3.4 request作为域对象
(1)域对象:在一定的范围内,可以存值和取值。
(2)request作用范围:一次请求。
= void setAttribute(java.lang.String name, java.lang.Object o)
= Object getAttribute(java.lang.String name)
(3)request域对象范围是一次请求,经常和转发一起使用
= 代码 request.getRequestDispatcher("转发的路径 不带项目名称").forward(..);
(4)演示request域对象的作用范围:
步骤:1.创建servlet1,在servlet1里面存值
2.创建servlet2,在servlet2里面获取servlet1里面存的值。
(5)重定向和转发的区别:
1.两次请求,两次响应
2.浏览器的地址栏发生了变化,
3.浏览器行为,重定向地址需要携带项目名称
*** 转发:
1.一次请求,一次响应,
2.浏览器的地址栏没有变化
3.服务器行为,转发的地址不需要携带项目名称