HttpServletResponse:
1、HttpServletResponse(请求)
常用的API:
setStatus设置响应状态码
setHeader设置响应头信息
getWriter获得响应体字符输出流
getWriter和getOutputStream生成内容是Http协议响应体,不能够生成状态行和头信息
ServletResponse接口不提供与协议相关的API,HttpServletResponse是面向协议的,提供协议相关的API,HttpServletResponse实现类不再JavaEE API中,实现类由服务器提供,在反生请求时,由服务器构造Resquest和Response对象,resquest和Response实现类在tomcat源码中
2、302+Location完成请求重定向
addHeader用于一个key多个value情况,在原有值上添加新值
setHeader用于一个key一个value情况,用新的value覆盖之前的value
应用:用户登陆时,用户名和密码错误,重定向回登陆页面,登陆页面有提交用户名和密码,登陆处理Servlet程序,判断用户名和密码是否正确,如果正确显示,则登陆成功,否则重定向登陆页面
方法:response.setstatus(302);
response.setHeader(”Location”,”/day6/response/demo2.html”(重定向页面))
以上两行代码就可以实现重定向,也就是让页面跳转到自定义的页面上,这两行代码可以由一条代码来实现,就是通过sendRedirect方法
response.sendRedict(“/day6/response/demo2.html”);
3、refresh完成自动刷新页面
refresh格式:时间(秒);url=跳转页面路径
例:response.setHeader(“refresh”,”5;url=/day06/hello.html”);===>>生成响应头信息中
HTML中有meta标签,可以产生Http响应头信息相同的效果
<meta http-equiv=”Content-type”content=”text/html”;charset=UTF-8>
http-equiv:响应头信息name
content:响应头信息value
例:<metahttp-equiv="refresh" content="5;url=/day6/hello.html"/> 生成响应体中
读秒JavaScript效果
vari = 5;
functioninit(){
document.getElementById("mytimes").innerHTML= i;
//每隔1秒重复调用 init方法 i--
i--;
//通过window 内置对象 setTimeOut 完成每隔1秒重复调用
window.setTimeout("init();",1000);
}
4、设置三个Http头信息禁用浏览器缓存
Cache-Control : no-cache
Pragma : no-cache
Expires: Thu, 01 Dec 1994 16:00:00 GMT (非常特殊,转换特定日期格式才可以)
有些动态页面,每次访问内容都不同--->>但是如果浏览器缓存页面,则无法查看最近内容
存放缓存文件夹:工具—>internet选项—>设置—>查看文件
response.setHeader(“Cache-Control”,”no-cache”);
response.setHeader("Pragma","no-cache");
response.setDateHeader("Expires",-1);
5、生成Http响应体内容
getWriter getOutputStream
响应是一个数据文件 ---- 设置文件MIME类型,与文件字符集
setContentType 设置文件MIME类型
setCharacterEncoding 设置字符集
* 设置字符集代码 必须要位于getWriter/ getOutputStream 之前
setCharacterEncoding 设置响应内容编码集,无法通知浏览器用哪种编码查看该页面
需要通知浏览器查看编码类型response.setContentType("text/html;charset=utf-8");
response.setContentType 指定charset 具备对响应编码功能,完全取代 setCharacterEncoding
注意问题
1)、文件复制时 getOutputStream , 手动生成响应内容时 getWriter
2)、getOutputStream和getWriter相互排斥不能同时使用
3)、getOutputStream和getWriter生成响应体内容,不能改变状态行和头信息的
4)、tomcat服务器会自动调用response输出流 close方法,调用close时自动flush缓冲区内容
6、response生成验证码图片
为什么需要验证码? 防止程序恶意攻击
弧度 2PI弧度 = 360角度
点击图片切换验证码 使用JavaScript 代码 ---- 重新载入图片
document.getElementById("myimg").src="/day6/response7"; ---- 加载本地缓存图片
解决1 :禁用response7 程序缓存
// 禁止浏览器缓存 验证码图片
response.setHeader("cache-control","no-cache");
response.setHeader("pragma","no-cache");
response.setDateHeader("expires",-1);
解决2 : 重新载入response7 程序路径每次都不同
document.getElementById("myimg").src="/day6/response7?"+new Date().getTime();
HttpServletRequest
1、获得客户机常用信息
getMethod请求方式
getProtocol协议
getRequestURI和 getRequestURL 获得请求资源路径
getRemoteAddr获得客户机IP地址 (::1IPV6地址)
*将 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
思考:
如何获得当前请求 访问资源路径? 服务器网站内部路径
uri : /day6/request1
contextpath : /day6
request.getRequestURI().substring(request.getContextPath().length());--> /request1
2、获得请求头信息
getHeader(name) 获得指定头信息
防止盗链案例 referer
User-Agent 客户端浏览器类型 (文件下载)
MSIE IE浏览器
Firefox 火狐浏览器
Chrome google浏览器
3、获得请求参数
GET方式请求,参数位于请求行中
POST方式请求,参数位于请求体中
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服务器配置文件权限,不建议使用
解决方案二:逆向编解码
username = URLEncoder.encode(username,"ISO-8859-1");
username = URLDecoder.decode(username,"utf-8");
简化
username = newString(username.getBytes("ISO-8859-1"),"utf-8");
非空有效校验
if (username != null &&username.trim().length() > 0) {
System.out.println("username有效");
}else{
// username 无效
}
URL编码和解码
1) 浏览器提交一次请求,请求中中文字符,自动进行URL编码 (由浏览器完成)
2) web服务器接收到内容之后,自动URL解码
URLEncoder 完成URL编码 , URLDecoder 完成URL解码
服务器端接收请求,请求url :http://localhost/day6/request3?name=aaa+bbb
问题:在服务器端执行request.getParameter("name"); 值 aaa bbb
4、请求转发传递数据
请求转发forward 和 请求重定向redirect 区别 ???
1) 转发一次请求 一次响应; 重定向两次请求 两次响应
2) 转发URL地址 不变,重定向URL地址改变第二个资源地址
3) 转发只能转发给同一个网站内部资源,重定向可以定向到任何网站
4) 转发中 / 属于服务器内部路径 不写工程名,重定向/ 来自客户端必须要写工程名
最佳应用:Servlet处理数据得到数据处理结果,通过请求转发,将处理结果传递JSP显示 , Servlet处理数据获得结果,JSP负责数据显示
request.setAttribute传递数据,必须要结合request.getRequestDispatcher().forward 转发一起使用!!!
写路径诀窍(独家秘方):
先写斜杠,问斜杠给谁用,是给浏览器还是给web应用用的
若是给浏览器就是代表localhost
若是给web工程用的就是代表web跟目录