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

<pre>

 

day08

 

昨天内容回顾

         1servlet三种实现的方式

 

         2servlet的生命周期

                   *三个方法 init service  destroy

        

         3URL-Pattern的配置有三种

 

         4)路径的问题

                   *绝对路径 /day09/....

                   *重定向和转发

 

         5ServletConfig对象

                   *初始化参数的配置

                   <init-param>

                            <param-name>

                            <param-value>

                   .....

 

         6ServletContext对象

                   *第一,获取全局初始化参数

                   *第二,域对象,存值和取值

                   *第三,读取web项目中文件

                            *路径:第一个位置是固定/,后面写文件在tomcat里面具体路径的地址

        

         7)类的加载器来读文件

                   *如何得到类加载器:

                   **首先Class

                   **使用Class类里面方法

 

         8)反射的原理

     

 思维导图

wKiom1WWnDvBROT4AAHF4E_dpfI341.jpg

今天学习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) :值是毫秒数,从197011日至今的毫秒数

 

                   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)创建loginservlet

                   *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实现验证码的开发

         *验证码:防止恶意注册....

 

 

=========================================================================

         上午内容的总结

         1response对象对应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)获取请求的头信息

         *重要的头 RefererUser-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集合,mapkey-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");

 

 

         5request域对象

         *之前学过servletContext域对象,范围是整个的web项目

 

         *request也是一个域对象,范围是一次请求,存值和取值

                   =存值:setAttribute(String name, Object o)

                   =取值:getAttribute(String name)

 

         *经常和转发在一起使用

                   *使用request实现转发的代码

                   request.getRequestDispatcher("转发的路径,不带项目名称").forward();

 

         *举例说明request

         **创建一个servlet1,向request域里面设置一个值,同时转发到servlet2里面去

         **创建servlet2,在servlet2里面获取request域对象里面的值

 

         *重定向和转发

 

         *重定向:从一个系统到另外一个系统

         *转发:做跳转操作时候需要携带数据

 

案例六:使用转发重写登录案例

         *需求描述:当输入正确用户名和密码,向页面输出success

         如果输入的用户名或者密码有错误,转发到登录页面,同时在页面中显示错误信息

 

         *引入知识:

         *jspjsp最终会被编译成servlet,在jsp里面可以写java代码

         *el表达式:获取域对象里面的值,一般使用在jsp页面中

                   **${域对象名称}

 

======================================================================

         今天内容的总结

         1response

         *response里面对应http协议里面的对应的方法

         *response里面做了四个案例(不包含验证码)代码至少写三遍

         *验证码的案例,看懂就可以了。

         *重点掌握看不清换一张实现

         *Response向页面输出中文乱码解决(****

 

         2request

         *获取客户机信息和头信息的方法

         *获取表单提交的数据

         *获取表单提交中文数据乱码问题解决(****

         *request

         *重定向和转发的区别

         

</pre>

你可能感兴趣的:(黑马课程)