<pre>
day08
昨天内容回顾
(1)servlet三种实现的方式
(2)servlet的生命周期
*三个方法 init service destroy
(3)URL-Pattern的配置有三种
(4)路径的问题
*绝对路径 /day09/....
*重定向和转发
(5)ServletConfig对象
*初始化参数的配置
<init-param>
<param-name>
<param-value>
.....
(6)ServletContext对象
*第一,获取全局初始化参数
*第二,域对象,存值和取值
*第三,读取web项目中文件
*路径:第一个位置是固定/,后面写文件在tomcat里面具体路径的地址
(7)类的加载器来读文件
*如何得到类加载器:
**首先Class类
**使用Class类里面方法
(8)反射的原理
思维导图
今天学习servlet里面两个对象一个是请求的对象request,一个是响应的对象response
请求:打开浏览器输入一个地址,点击回车,这个过程称为一个请求
响应:服务器根据发送的请求,返回内容显示到浏览器的页面上,这个过程称为响应
1、响应的对象 HttpServletResponse
*通过api查看这个对象,在javax.servlet.http包里面,是一个接口,父接口是ServletResponse
*http响应组成
第一,响应行
*设置状态码 setStatus(int sc)
=setStatus(302);
常见状态码
200 302 304 404 500 503
第二,响应头
*结构:key-value形式,可以有一个key和一个value,一个key多个value
*设置响应头的方法:
setHeader(Stringname, String value)
**针对一个key和一个value的情况
***setHeader("aa","123");
setHeader("aa","456");
结果:名称是aa,值是456
针对特殊的类型设置头的方法:
setIntHeader(Stringname, int value)
setDateHeader(Stringname, long date) :值是毫秒数,从1970年1月1日至今的毫秒数
addHeader(Stringname, String value)
**针对一个key和多个value的情况
***addHeader("bb","444");
addHeader("bb","555");
结果:名称bb,值是 444,555
addIntHeader(Stringname, int value)
addDateHeader(Stringname, long date)
第三,响应体
*什么是响应体:在页面上显示的内容
*有两种方法向页面输出内容
第一种:getOutputStream()使用字节流
第二种:getWriter()使用字符流
2、案例一:使用response的重定向完成登录的操作
*需求的描述:首先登录页面,输入用户名和密码,如果用户名和密码正确,向页面输出一个成功的信息;
如果用户名或者密码错误,重定向到登录页面
*重定向:使用状态码是 302,重定向需要使用到一个响应的头信息 Location
**response.setHeader("Location", "重定向到的路径,使用绝对路径");
*具体操作:
(1)创建一个登录页面(两个输入框,分别是用户名和密码;有表单,使用表单提交到一个servlet里面)
(2)创建login的servlet
*在servlet里面首先得到输入的用户名和密码
*判断用户名和密码是否正确(用户名和密码值是固定 admin 123456)
*如果用户名和密码都正确,表示验证成功,向页面输出success
*用户名或者密码有一个错误,验证失败,重定向到登录页面
*代码
//得到输入的用户名和密码
Stringusername = request.getParameter("username");
Stringpassword = request.getParameter("password");
//判断用户名 admin ,密码 123456
if("admin".equals(username)&& "123456".equals(password)) {//验证成功
//向页面输出success
response.getWriter().write("success");
}else {
//重定向到登录页面
//设置状态码
response.setStatus(302);
//设置头Location
response.setHeader("Location","/day08/response/login.html");
}
3、案例二:使用response实现页面的定时跳转
(1)需要使用到一个头信息Refresh
*设置头信息,使用方法
**response.setHeader("Refresh","秒数;url=跳转到的路径");
//使用头信息 Refresh
response.setHeader("Refresh","5;url=/day08/response/login.html");
(2)实现倒计时的效果
*代码:
//在html里面可以使用头标签meta标签可以实现类似setHeader方法实现的效果
<meta http-equiv="Refresh"content="5;url=/day08/response/login.html">
//使用js实现倒计时的效果
//每一秒向span标签里面写一个值
//setInterval("js",毫秒数)
var m = 5;
function load1() {
//得到span
var span1 =document.getElementById("spanid");
span1.innerHTML = m;
m--;
}
setInterval("load1();",1000);
4、response向页面输出中文乱码问题的解决(****)
*使用response向页面输出内容:
第一种:getOutputStream()使用字节流向页面输出中文
* 使用字节流向页面输出中文,是否会有乱码?
* 不一定,与浏览器的编码有关
* 解决乱码问题方式:
* 1、设置浏览器的默认的编码
* 2、设置字节数组的编码
* 最终,浏览器的编码和字节数组的编码一样,不会有乱码
** 代码
//设置浏览器的编码 使用到头信息content-type
response.setHeader("Content-Type","text/html;charset=utf-8");
//设置字节数组的编码
//向页面输出中文
response.getOutputStream().write("字节流中文".getBytes("utf-8"));
第二种:getWriter()使用字符流向页面输出中文
* 使用字符流向页面输出中文,是否会有乱码?
* 一定会
*
* 字符流输出中文乱码的解决方式:
* 输出机制:在response里面有输出的缓冲区,先把内容放到response缓冲区,通过缓冲区进行输出
* response缓冲区有默认的编码,是iso8859-1,不支持中文,输出时候肯定会有乱码。
*
* 1、设置response缓冲区的编码(支持中文的编码)
* 2、设置浏览器的编码
** 代码
//设置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、注意的地方
(1)字节流和字符流不能在一起使用(互斥)
(2)不能使用字符流直接向页面输出数字
(3)重定向的操作简写方式
=response.sendRedirect("/day08/response/login.html");
6、案例三:使用response实现文件的下载
*基本步骤
**首先在服务器上有一个可以下载的文件
**把服务器上的文件保存到本地磁盘
***拿到服务器上面的文件
***把文件输入流保存到本地硬盘(使用response把文件流写到浏览器)
*在做文件下载时候,需要一个头信息 Content-Disposititon,如果不设置这个头,如果是图片格式,
在浏览器里面直接打开,这种这个头的目的就是无论是什么格式,都以下载的方式打开。
*如果下载的文件名称包含中文,会有问题(到10天时候详细讲文件上传和下载)
**设置编码方式,不同的浏览器需要不同的设置方式(ie和火狐)
***ie浏览器采用的编码方式url编码,只有把中文文件名称进行url编码才可以正常显示
**代码
//得到文件的完全路径
Stringpath = getServletContext().getRealPath("/img/a.jpg");
// System.out.println(path);
//I:\0621\apache-tomcat-7.0.53\webapps\day08\img\a.jpg
//先找到最后/位置,位置进行截取
intlens = path.lastIndexOf("\\");
Stringfilename = path.substring(lens+1);
// System.out.println(filename);
//设置头信息
response.setHeader("Content-Disposition","attachment;filename="+filename);
//从服务器上拿到文件
InputStreamin = new FileInputStream(path);
//使用输出流把文件写到浏览器
OutputStreamout = response.getOutputStream();
//流的对接
intlen = 0;
byte[]b = new byte[1024];
while((len=in.read(b))!=-1){
out.write(b,0, len);
}
//关闭流
in.close();
7、使用response实现验证码的开发
*验证码:防止恶意注册....
=========================================================================
上午内容的总结
(1)response对象对应http响应里面方法
*响应行 响应头 响应体
(2)案例一:使用Response实现登录重定向
*如何实现重定向操作 302+location
*重定向简写方式
(3)案例二:使用Response实现页面定时刷新
*使用头Refresh实现定时跳转
*使用js实现倒计时效果
(4)使用response向页面输出中文乱码解决(***)
*字节流
*字符流
(5)案例三:使用Response实现文件的下载
*文件下载的步骤(设置头信息 Content-Disposition)
*文件下载的代码
8、中文验证码和验证码写在登录页面
*代码
9、request对象代表请求,HttpServletRequest的父接口是ServletRequest
(1)获取客户机的信息
*getMethod():获取表单提交的方式(get或者post或者其他...)
*getContextPath() 获取当前项目的名称
*getRemoteAddr() 获取当前请求的ip地址
(2)获取请求的头信息
*重要的头 Referer、User-Agent
*getHeader(String name) :获取请求头信息
(3)获取表单提交的数据
*方法
*getParameter(String name):得到表单提交的数据,参数是表单输入项的name的值
=//getParameter(String name)方法的使用
Stringusername = request.getParameter("username");
Stringpassword = request.getParameter("password");
*String[] getParameterValues(String name):得到多个输入项的值,一般使用在复选框的情况下
=//getParameterValues(String name) 获取复选框的值
String[]loves = request.getParameterValues("love");
System.out.println(Arrays.toString(loves));
*Map getParameterMap() :返回map集合,map是key-value结构,
key就是表单输入项的name的值,value是输入的值
=//getParameterMap()
Map<String,String[]>map = request.getParameterMap();
//遍历
//得到所有的key
Set<String>keys = map.keySet();
for(String key : keys) {
//根据key得到value
String[]values = map.get(key);
System.out.println("key:"+key+":: value:"+Arrays.toString(values));
}
*Enumeration getParameterNames() :获取所有的表单输入项的name的值
(4)使用表单提交数据包含中文问题解决
*当提交数据里面有中文,会有中文乱码的
*解决:
**分别处理get提交和post提交
***post提交数据有中文
*设置request缓冲区的编码
* 使用post提交数据放到request缓冲区里面,request缓冲区的编码是iso8859-1
* * 解决方法:设置request缓冲区的编码解决post提交中文乱码的问题
***get提交数据有中文
**有三种解决方法
解决方案一:修改server.xml
<Connectorport="80" protocol="HTTP/1.1"
connectionTimeout="20000"redirectPort="8443" URIEncoding="utf-8"/>
*必须有修改tomcat服务器配置文件权限
解决方案二:逆向编解码
username = URLEncoder.encode(username,"ISO8859-1");
username = URLDecoder.decode(username,"utf-8");
解决方案三:简化(重点记住)
username= new String(username.getBytes("ISO8859-1"),"utf-8");
**代码
Stringgetusername = request.getParameter("getusername");
getusername= new String(getusername.getBytes("iso8859-1"),"utf-8");
(5)request域对象
*之前学过servletContext域对象,范围是整个的web项目
*request也是一个域对象,范围是一次请求,存值和取值
=存值:setAttribute(String name, Object o)
=取值:getAttribute(String name)
*经常和转发在一起使用
*使用request实现转发的代码
request.getRequestDispatcher("转发的路径,不带项目名称").forward();
*举例说明request域
**创建一个servlet1,向request域里面设置一个值,同时转发到servlet2里面去
**创建servlet2,在servlet2里面获取request域对象里面的值
*重定向和转发
*重定向:从一个系统到另外一个系统
*转发:做跳转操作时候需要携带数据
案例六:使用转发重写登录案例
*需求描述:当输入正确用户名和密码,向页面输出success
如果输入的用户名或者密码有错误,转发到登录页面,同时在页面中显示错误信息
*引入知识:
*jsp:jsp最终会被编译成servlet,在jsp里面可以写java代码
*el表达式:获取域对象里面的值,一般使用在jsp页面中
**${域对象名称}
======================================================================
今天内容的总结
(1)response
*response里面对应http协议里面的对应的方法
*在response里面做了四个案例(不包含验证码)代码至少写三遍
*验证码的案例,看懂就可以了。
*重点掌握看不清换一张实现
*Response向页面输出中文乱码解决(****)
(2)request
*获取客户机信息和头信息的方法
*获取表单提交的数据
*获取表单提交中文数据乱码问题解决(****)
*request域
*重定向和转发的区别
</pre>