【HM】第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>




      本文转自屠夫章哥  51CTO博客,原文链接:http://blog.51cto.com/4259297/1670706,如需转载请自行联系原作者


相关文章
|
3月前
|
存储 前端开发 Java
JavaWeb:Request & Response
在JavaWeb开发中,Request(请求)和Response(响应)是非常重要的概念。它们分别代表着客户端向服务器发送请求和服务器向客户端返回响应的过程。Request对象是由服务器创建的,用于封装来自客户端的请求信息。它包含了请求的HTTP方法(如GET或POST),URL,请求头部、参数等信息。你可以通过Request对象获取客户端发送的表单数据、URL参数、HTTP头部和Cookies等。Response对象则是服务器用来向客户端发送响应的工具。它包含了HTTP状态码、响应头部和响应体等信息。你可以使用Response对象设置响应的状态码、设置响应头部
37 3
 JavaWeb:Request & Response
|
6月前
|
Web App开发 Java 应用服务中间件
学习Request和Response这一篇就够啦~1
学习Request和Response这一篇就够啦~
|
6月前
|
IDE 开发工具
学习Request和Response这一篇就够啦~2
学习Request和Response这一篇就够啦~
|
10月前
|
存储
Request和Response详解
Request和Response详解
|
11月前
|
Java 应用服务中间件 Apache
|
11月前
|
存储 缓存 应用服务中间件
|
11月前
|
前端开发 Java 应用服务中间件
Request 和 Response详解
Request 和 Response详解
|
前端开发 Java 应用服务中间件
🤓 Request&Response(一)
🤓 Request&Response
63 0
|
SQL 前端开发 Java
🤓 Request&Response(三)
🤓 Request&Response(三)
82 0
|
存储 前端开发 Java
🤓 Request&Response(二)
🤓 Request&Response
95 0