【黑马程序员】第8课:Request与Response详解

<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);

4response向页面输出中文乱码问题的解决(****

*使用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、中文验证码和验证码写在登录页面

*代码

9request对象代表请求,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>

时间: 2024-11-11 21:59:46

【黑马程序员】第8课:Request与Response详解的相关文章

黑马程序员——C语言基础---二维数组详解

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- 二维数组: 可以看做是一个特殊的一维数组 ,这个一维数组的每个元素又是一个一维数组 二维数组的定义 数据类型   数组名[第一维的长度(行)][第二维的长度(列)]; int a[2][3];       理解方法:       1)这是

好程序员web前端学习路线分享Jsonp详解

好程序员web前端学习路线分享Jsonp详解,Jsonp原理: 咱们先看看POST的数据发送位置: GET的数据发送位置 那什么情况下会发生跨域呢? 当本机请求服务器上数据的时候:会发生跨域: 当本地服务器请求其他服务器数据的时候回发生跨域: 为什么要跨域呢? 同源策略:基于浏览器的安全考虑,浏览器各个厂商之间出现了一个约定,这个约定叫做同源策略.这个约定的主要内容就是,域和域之间数据不共通. 跨域的用途是什么? 当网站发展壮大到一定地步的时候,会建立很多的节点,各个节点的IP是不同的,所以跨域

好程序员Java教程Java动态代理机制详解

好程序员Java教程Java动态代理机制详解:在java的动态代理机制中,有两个重要的类或接口,一个是 InvocationHandler(Interface).另一个则是 Proxy(Class),这一个类和接口是实现我们动态代理所必须用到的.首先我们先来看看java的API帮助文档是怎么样对这两个类进行描述的: InvocationHandler: 1InvocationHandler is the interface implemented by the invocation handle

程序员必知之浮点数运算原理详解

导读:浮点数运算是一个非常有技术含量的话题,不太容易掌握.许多程序员都不清楚使用==操作符比较float/double类型的话到底出现什么问题. 许多人使用float/double进行货币计算时经常会犯错.这篇文章是这一系列中的精华,所有的软件开发人员都应该读一下. 随着你经验的增长,你肯定 想去深入了解一些常见的东西的细节,浮点数运算就是其中之一. 1. 什么是浮点数? 在计算机系统的发展过程中,曾经提出过多种方法表达实数. [1]典型的比如相对于浮点数的定点数(Fixed Point Num

【转载】程序员必知之浮点数运算原理详解

https://blog.csdn.net/tercel_zhang/article/details/52537726 导读:浮点数运算是一个非常有技术含量的话题,不太容易掌握.许多程序员都不清楚使用==操作符比较float/double类型的话到底出现什么问题. 许多人使用float/double进行货币计算时经常会犯错.这篇文章是这一系列中的精华,所有的软件开发人员都应该读一下. 随着你经验的增长,你肯定 想去深入了解一些常见的东西的细节,浮点数运算就是其中之一. 1. 什么是浮点数? 在计

【好程序员笔记分享】——UIView与CALayer详解

-iOS培训,iOS学习-------型技术博客.期待与您交流!------------ UIView与CALayer详解 研究Core Animation已经有段时间了,关于Core Animation,网上没什么好的介绍.苹果网站上有篇专门的总结性介绍,但是似乎原理性的东西不多,看得人云山雾罩,感觉,写那篇东西的人,其实是假 设读的人了解界面动画技术的原理的.今天有点别的事情要使用Linux,忘掉了ssh的密码,没办法重新设ssh,结果怎么也想不起来怎么设ssh远程登 陆了,没办法又到网上查

Servlet中Request和Response 详解

一.Response 1.Resonse的继承结构:   ServletResponse--HttpServletResponse 2.Response代表响应,于是响应消息中的 状态码.响应头.实体内容都可以由它进行操作,由此引伸出如下实验: 3.利用Response输出数据到客户端  response.getOutputStream().write("中文".getBytes())输出数据,这是一个字节流,是什么字节输出什么字节,而浏览器默认用平台字节码打开服务器发送的数据,如果服

Request和Response详解

转自:http://zhidao.baidu.com/link?url=8BI0cjlcFdBSJKHTZlpo874eqtbTJoZfrh3miQgM_05RvSER8skPiBc1wSPZtXT8OGGCHfVXFAzAosa6E5HBl_ 内置对象request:请求对象request.getParameter("名字") 获得客户端输入的信息***************request.getParameterValues("名字") 获得客户端输入的一组信

应试教育之后,我在黑马程序员找到突破口

正在上高三的弟弟前几天打电话告诉我说"姐姐,我们现在晚自习要上到晚上十一点,今年6月的高考把班级每个学生都弄得人心惶惶--"我突然想起自己当年的高考来-- 高考,于我而言已经是六年前的事情了.但每每提及高考,我仍然会从心底升起一层压力,偶尔在工作或生活中遇到难题,晚上做梦都会梦到自己坐在考场里答题的场景,由此可见高考成了我挥之不去的梦魇.再加之最近应试教育的负面新闻频出,我在搜索引擎中键入"应试教育"四个字,出现的新闻都是:"应试教育还在消磨孩子的个性&q