Day8
request&response
1. response的简介
http的响应包含三部分组成
组成部分 |
作用 |
方法 |
响应行 |
状态码 |
setStatus(int sc) :设置状态码的方法 |
响应头 |
是key-value结构, 可以有多个value |
setHeader(java.lang.String name, java.lang.String value) :设置响应头, 第一个参数是响应名称;第二个参数值, 针对一个key和一个value情况 addHeader(java.lang.String name, java.lang.String value) :设置响应头, 第一个参数是响应名称;第二个参数值, 针对一个key和多个value的情况
|
响应体 |
向页面显示的内容 |
getWriter():使用字符流向页面输出内容 getOutputStream():使用字节流向页面输出内容 |
2. 重定向☆☆☆
重定向到登录页面
//设置状态码
response.setStatus(302);
//使用头Location完成重定向
response.setHeader("Location","/day08-1/login.html");
代码简写的方式
response.sendRedirect("要重定向到的页面的路径");
3. 定时跳转
使用头信息Refresh实现
写法:response.setHeader("Refresh","在几秒值后跳转;url=要跳转到页面的路径");
倒计时的效果
(1)直接在html页面中实现操作
在html中使用meta标签实现页面的定时跳转
<metahttp-equiv="Refresh"content="3;url=/day08-1/login.html">
(2)倒计时
//每一秒向span标签里面写内容
//bom里面widow对象里面setInterval方法
varm = 5;
functionloadTime() {
//得到span标签
varspan1 = document.getElementById("spanid");
//向span里面写内容
span1.innerHTML= m;
m--;
}
setInterval("loadTime();",1000);
4. 设置响应体(向页面输出内容)☆
字节流
代码
response.getOutputStream().write("输出的内容".getBytes());
解决中文乱码问题
//设置浏览器的编码 使用头信息 Content-Type
response.setHeader("Content-Type","text/html;charset=utf-8");
//设置字节数组的编码
response.getOutputStream().write("字节流中文".getBytes("utf-8"));
字符流
代码
response.getWriter().write("response");
解决中文乱码问题
//设置response缓冲区的编码
response.setCharacterEncoding("utf-8");
//设置浏览器的编码
response.setHeader("Content-Type","text/html;charset=utf-8");
response.getWriter().write("字符流中文");
简写方式
response.setContentType("text/html;charset=utf-8");
5. response的流的注意事项
1.字节流和字符流是互斥的
2.使用字符流不能直接向页面输出数字
6. 验证码的案例
1. 实现验证码的步骤
第一步:生成图片
第二步:生成随机的数字和字母
第三步:把数字和字母画到图片上
第四步:把图片显示到页面上
2. 显示验证码
(1)把验证码显示到登录的页面中
<img src="验证码的servlet的路径"/>
(2)实现看不清换一张
//实现看不清换一张
function loadCode() {
//得到img标签
var img1 =document.getElementById("img1");
img1.src ="/day08-5/code?"+new Date().getTime();
}
7. 文件下载的案例
1.实现的步骤
(0)设置头信息 Content-Disposition,无论是什么格式的文件都以下载方式打开
(1)在服务器上面有一个可以下载的文件
(2)从服务器上拿到这个文件(使用文件输入流得到文件)
(3)使用输出流把文件写到浏览器
2. 代码实现文件的下载
//得到要下载文件的路径
String path =getServletContext().getRealPath("/down/a.zip");
//得到文件的名称
//得到最后一个\位置,根据位置进行截取
int lens =path.lastIndexOf("\\");
String filename =path.substring(lens+1);
//设置头信息
response.setHeader("Content-Disposition","attachment;filename="+filename);
//得到文件的输入流
InputStream in = newFileInputStream(path);
//使用输出流操作
OutputStream out =response.getOutputStream();
//流对接
int len = 0;
byte[] b = new byte[1024];
while((len=in.read(b))!=-1) {
out.write(b, 0, len);
}
//关闭流
in.close();
8. request
获取请求行的信息
☆(1)getMethod() :得到http请求方式
☆(2)getRequestURI() :得到请求地址(不包含ip+端口号)
(3)getProtocol():得到http的版本
获取请求头的信息
(1)getHeader(java.lang.Stringname) :根据名称得到请求头的值
User-Agent:获取当前请求的浏览器的类型
String agent =request.getHeader("User-Agent");
获取客户机的信息
☆(1)getContextPath():请求项目的名称
☆(2)getRequestURL():客户端发送的请求的路径
(3)getRemoteAddr():获取当前客户端的ip地址
☆☆☆获取表单提交的数据
(1) ☆String getParameter(java.lang.String name) :参数是表单输入项name属性的值,根据名称得到输入的值
(2) ☆String[] getParameterValues(java.lang.String name) :参数是表单输入项name的值,针对复选框的情况
(3) Map<java.lang.String,java.lang.String[]>getParameterMap() :返回的是map集合,key是表单输入项name属性的值,value是输入的值
(4) Enumeration<java.lang.String>getParameterNames()
获取表单提交的中文数据乱码问题的解决
(1) post提交方式解决方法
设置request缓冲区的编码
代码:request.setCharacterEncoding("utf-8");
(2) get提交中文乱码解决
第一种:修改tomcat的配置文件
<Connector port="80"protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="utf-8"/>
第二种:把数据先编码,再进行解码
第三种:使用string构造进行编码
代码:username =new String(username.getBytes("iso8859-1"),"utf-8");
☆☆☆request是域对象
(1) 域对象:在一定的范围内,可以存值和取值
(2) servletContext域对象:范围是整个web项目,存值setAttribute方法和取值 getAttribute方法
(3) request也是一个域对象:范围是一次请求,存值和取值
向request域里面存值的方法:setAttribute(java.lang.String name, java.lang.Object o)
从request域里面取值的方法:getAttribute(java.lang.String name)
(4) request域对象范围是一次请求,经常和转发一起使用
代码 request.getRequestDispatcher("转发的路径 不带项目名称").forward(..);
举例演示request域对象
创建servlet1,在servlet1里面向request域里面设置一个值,最后转发到servlet2里面
//向request域里面设置一个值
request.setAttribute("msg","itcast100");
//转发到servlet2
request.getRequestDispatcher("/servlet2").forward(request,response);
创建servlet2,在servlet2里面获取通过servlet1向request域里面设置的那个值
//获取通过servlet1向request里面设置的值
response.getWriter().write(""+request.getAttribute("msg"));
☆☆☆重定向和转发的区别
(1)重定向
=重定向请求两次,请求的地址带项目名称
=302+Location实现重定向的操作
=response.sendRedirect("路径带项目名称");
(2)转发
=转发请求一次,路径不需要带项目名称(在服务器内部进行操作)
=request.getRequestDispatcher("转发的路径 不带项目名称").forward(request,response);
(3)重定向:从一个网站到另外的一个网站
转发:请求的过程中需要携带数据操作
9. 转发的案例
9.1 使用request域对象+转发实现登录功能
(1)创建登录页面,在登录页面中写表单,提交到servlet里面
(2)创建servlet,在servlet里面获取表单提交的数据,判断用户名和密码是否正确
(3)如果用户名和密码都正确,表示登录成功,向页面输出内容
(4)如果用户名或者密码错误,表示登录失败,转发到登录页面(同时向页面显示错误信息)
= 转发的代码:request.getRequestDispatcher("登录的页面 不带项目名称").forward(request,response);
= 传递数据的页面:首先把显示内容放到request域里面,使用转发到登录页面,在登录页面中使用el表达式获取
request域里面的值
9.2 知识的引入
(1)jsp:sun公司用于动态网站的技术,jsp就是servelt,最终会编译成servlet
(2)el表达式:用于获取域对象里面的值 ${名称}
9.3 代码的实现
1、创建页面,写表单,表单里面写两个输入项,提交到servlet里面
2、创建servlet,在servlet获取表单数据,判断(用户名admin,密码 123456)是否正确
3、如果都正确,向页面输出success
4、如果有一个错误的,转发到登录页面,同时携带错误信息到页面中显示
9.4 代码
//获取表单提交的用户名和密码
String username =request.getParameter("username");
String password =request.getParameter("password");
//判断 用户名 admin,密码 123456
if("admin".equals(username)&& "123456".equals(password)) {
//登录成功
response.getWriter().write("loginsuccess");
} else { //登录失败
//转发到登录页面,同时向页面传递错误的信息
//把错误信息存到request域里面
request.setAttribute("msg","用户名或者密码错误");
request.getRequestDispatcher("/login.jsp").forward(request,response);
}