当服务器收到一次浏览器的Http(http底层是基于TCP传输协议)请求后在服务器同时会产生一个Request对象和一个Response对象
经过request请求对象得到客户端向服务器提交的数据,在经过响应生成数据由服务器把数据发送到客户端 。html
HttpServletResponse:
setStatus(int) 设置响应的状态码
setHeader(String,String) 设置响应头信息java
其中,addHeader()与setHeader()区别:
addHeader 用于一个key多个value 状况 ------- key:value,value,value ... 在原有值添加新值
setHeader 用于 一个key一个value 状况 ------- 用新的value 覆盖以前value web
getWriter() 得到响应体字符输出流,也就是往浏览器些数据
getOutputStream() 得到响应体字节输出流,一样是往浏览器写数据
setContentType("text/html;charset=utf-8") 设置服务器返回的数据是什么类型的而且是以什么编码打开
setCharacterEncoding("utf-8") 服务器是以什么编码解释浏览器提交的数据
注意:(1)writer 和 getOutputStream 生成的内容是Http协议响应体数据,它不可以生成状态行和头信息
(2)ServletResponse 接口不提供与协议相关的API 可是HttpServletResponse是面向Http协议,因此提供协议相关的API
(3) HttpServletResponse :HttpServletRequest
它们的实现类不在JavaEE API中(request和response实现类在tomcat源码中) ,实现类是由服务器提供在服务器接收到请求发生时,由服务器构造出Request和Response对象
apache
状态码是结合Location响应头使用的
response.setStatus(302);
response.setHeader("Location", "/day6/response/demo2.html")Location的value指定要重定向的地址
以上两行代码能够简化,经过sendRedirect方法实现:response.sendRedict("/day6/response/demo2.html");
经过refresh完成自动刷新页面:
refresh 格式: 时间(秒);url=跳转页面路径
例如: response.setHeader("refresh", "5;url=/day6/hello.html"); === 生成响应头信息中
在HTML中meta标签,一样能够产生Http响应头信息相同的效果
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
http-equiv 响应头信息name
content 响应头信息value
例如: <meta http-equiv="refresh" content="5;url=/day6/hello.html" /> === 生成响应体中
注意问题:
1)、文件复制时用getOutputStream , 手动生成响应内容时用getWriter
2)、getOutputStream和getWriter相互排斥不能同时使用
3)、getOutputStream和getWriter生成响应体内容,不能改变状态行和头信息的
4)、tomcat服务器会自动调用response输出流 close方法,调用close时自动flush缓冲区内容 api
一、得到客户机经常使用信息
getMethod 请求方式
getProtocol 协议
getRequestURI 和 getRequestURL 得到请求资源路径
getRemoteAddr 得到客户机IP地址
* 将 127.0.0.1 localhost 加入本机 hosts文件
getContextPath 得到工程虚拟目录名称
URI和URL区别
URI:/day6/request1
URL:http://localhost/day6/request1
URI范围比URL大,http://localhost/day6/request1 是URL也是 URI ,/day6/request1 是URI 不是 URL浏览器
二、得到请求头信息
getHeader(name) 得到指定头信息
User-Agent 客户端浏览器类型 (文件下载)
MSIE IE浏览器
Firefox 火狐浏览器
Chrome google浏览器
三、得到请求参数
GET方式请求,参数位于请求行中
POST方式请求,参数位于请求体中tomcat
getParameter(name) 根据参数名称得到参数值 (一个值)
getParameterValues(name) 根据参数名称得到参数值 (多个值) -------- 结合checkbox 一块儿使用
getParameterNames() 得到全部参数名称
getParameterMap() 将参数name和value 保存到一个map中,返回map服务器
POST请求乱码 :request.setCharacterEncoding("utf-8");
GET请求乱码
解决方案一:修改server.xml
<Connector port="80" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="utf-8"/>
* 必须有修改tomcat服务器配置文件权限post
解决方案二:逆向编解码
username = URLEncoder.encode(username, "ISO-8859-1");
username = URLDecoder.decode(username, "utf-8");
简化
username = new String(username.getBytes("ISO-8859-1"),"utf-8");网站
结论:能用post时 不用get ---- form提交都用post
<a href="url?name=中国"> ---- 手动处理 get
URL编码和解码
1) 浏览器提交一次请求,请求中中文字符,自动进行URL编码 (由浏览器完成)
2) web服务器接收到内容以后,自动URL解码
URLEncoder 完成URL编码 , URLDecoder 完成URL解码
服务器端接收请求,请求url : http://localhost/day6/request3?name=aaa+bbb
问题:在服务器端执行 request.getParameter("name"); 值 aaa bbb
四、请求转发传递数据
请求转发forward 和 请求重定向redirect 区别 ???
1) 转发一次请求 一次响应; 重定向两次请求 两次响应
2) 转发URL地址 不变,重定向URL地址改变第二个资源地址
3) 转发只能转发给同一个网站内部资源,重定向能够定向到任何网站
4) 转发中/属于服务器内部路径 不写工程名,重定向/来自客户端必需要写工程名
servlet的最佳应用:Servlet处理数据获得数据处理结果,经过请求转发,将处理结果传递JSP显示
* Servlet处理数据得到结果,JSP负责数据显示的。
http://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/http/HttpServletResponse.html