Request&Response_重定向和转发

来源:互联网 发布:阿里农村淘宝事业部 编辑:程序博客网 时间:2024/06/10 10:16

Request和Response总结

Response包含三组成

第一部分:响应头

= setStatus(int sc) :设置状态码的方法

         ==response.setStatus(302)

第二部分:响应行

         =setIntHeader(java.lang.String name, int value) :针对int类型值的方法

         =setDateHeader(java.lang.String name, long date) :值long类型,是毫秒数(19701 1至今的毫秒数)

 

         =addHeader(java.lang.String name, java.lang.String value) :设置响应头

                                                     setHeader("","");

                          (302+)Location:重定向 | 要重定向的地址

                          定时跳转:Refresh:   |  秒;url=地址

                  设置页面编码:Content-Type| text/html;charset=utf-8

 

第三部分:响应体

(1)向页面显示的内容

         (2)方法

         =getWriter():使用字符流向页面输出内容

         =getOutputStream():使用字节流向页面输出内容

//设置响应体

                  1)getOutputStream().write();

                  2)getWriter().write();

 

案例:重定向的案例

重定向的原理:


         2.1使用重定向实现登录的操作

         (1)需求的描述:

         在登录页面中,输入用户名和密码,判断输入的用户名和密码是否正确;

         如果用户名和密码都正确,登录成功,向页面输出内容;

         如果用户名或者密码有一个是错误的,重定向到登录页面。

(2)实现的步骤:

         第一步:创建登录页面,写表单,在表单里面写两个输入项,一个输入用户名,一个输入密码,提交到一个servlet里面

         第二步:创建servlet,在这个servlet里面首先获\取到输入的用户名和密码,根据用户名和密码进行判断(用户名如果是

         admin,密码如果是123456表示正确的)

         如果用户名和密码都正确,登录成功,向页面输出内容;

                  response.getWriter().write("loginsuccess");

         否则重定向到登录页面

                  //设置状态码

                  response.setStatus(302);

                  //使用头Location完成重定向

                  response.setHeader("Location","/day08-1/login.html");

案例:定时跳转的案例

3.1 当注册一个网站,注册完成之后,5秒之后跳转到登录页面

         3.2实现方式

         (1)使用头信息Refresh实现

         (2)写法: response.setHeader("Refresh","在几秒值后跳转;url=要跳转到页面的路径");

         3.3创建servlet,在servlet实现,在五秒之后跳转到一个页面

                  response.setHeader("Refresh","5;url=/day08-1/login.html");

        

         3.4倒计时的效果

         (1)直接在html页面中实现操作

         在html中使用meta标签实现页面的定时跳转

         <metahttp-equiv="Refresh" content="3;url=/day08-1/login.html">

 

         (2)倒计时

         //每一秒向span标签里面写内容

      //bom里面widow对象里面setInterval方法

      var m = 5;

      function loadTime() {

               //得到span标签

               var span1 =document.getElementById("spanid");

               //向span里面写内容

               span1.innerHTML = m;

               m--;

      }

      setInterval("loadTime();",1000);

设置响应体(向页面输出内容)

4.1 使用字节流向页面输出内容

         (1)getOutputStream()

         (2)代码

                  response.getOutputStream().write("输出的内容".getBytes());

         (3)如果向页面输出中文,根据不同的浏览器的编码设置会产生乱码问题

                  *解决方法:

                  /*

                   * 1、设置浏览器的编码

                   * 2、设置字节数组的编码

                   * 让浏览器的编码和字节数组的编码一致

                   * */

                  //设置浏览器的编码 使用头信息Content-Type

                  response.setHeader("Content-Type","text/html;charset=utf-8");

                  //设置字节数组的编码

                  response.getOutputStream().write("字节流中文".getBytes("utf-8"));

 

      4.2 使用字符流向页面输出内容

         (1)getWriter()

         (2)代码

                  response.getWriter().write("response");

         (3)如果使用字符流向页面输出中文,一定会有乱码

                  /*

                   * 使用字符流向页面输出内容;首先会把内容放到response缓冲区里面,

                   * response缓冲区默认的编码是 iso8859-1,这个编码不支持中文,一定会有乱码

                   *

                   * 解决方法:

                   * 1、设置response缓冲区的编码

                   * 2、设置浏览器的编码

                   * response缓冲区的编码和浏览器的编码一致

                   * */

                  //设置response缓冲区的编码

                  response.setCharacterEncoding("utf-8");

                  //设置浏览器的编码

                  response.setHeader("Content-Type","text/html;charset=utf-8");

                  response.getWriter().write("字符流中文");

5、使用response的流的注意事项

         5.1使用字符流向页面输出中文乱码问题解决,简写方式

                  response.setContentType("text/html;charset=utf-8");

 

         5.2字节流和字符流是互斥的

                 

         5.3使用字符流不能直接向页面输出数字

                  //根据数字到码表中查询数字对应的字符,把字符输出

                  response.setCharacterEncoding("utf-8");

                  response.getWriter().write(111);

 

6、验证码的案例

6.1 什么验证码:防止恶意注册

         6.2实现验证码的步骤(画图分析)

         第一步:生成图片

         第二步:生成随机的数字和字母

         第三步:把数字和字母画到图片上

         第四步:把图片显示到页面上

6.4 显示验证码

         (1)把验证码显示到登录的页面中

                  <imgsrc="验证码的servlet的路径"/>

         (2)实现看不清换一张

                  //实现看不清换一张

                  function loadCode() {

                          //得到img标签

                          varimg1 = document.getElementById("img1");

                          img1.src= "/day08-5/code?"+new Date().getTime();

                  }

7、文件下载的案例

         7.1文件下载的基本实现的步骤

         (0)设置头信息Content-Disposition,无论是什么格式的文件都以下载方式打开

         (1)在服务器上面有一个可以下载的文件

         (2)从服务器上拿到这个文件(使用文件输入流得到文件)

         (3)使用输出流把文件写到浏览器

 

         7.2代码实现文件的下载

                  //得到要下载文件的路径

                  Stringpath = getServletContext().getRealPath("/down/a.zip");

                  //得到文件的名称

                  //得到最后一个\位置,根据位置进行截取

                  intlens = path.lastIndexOf("\\");

                  Stringfilename = path.substring(lens+1);

                  //设置头信息

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

 

8、request对象

      8.1 代表请求的对象,

HttpServletRequest接口,父接口是ServletRequest

 

      8.2 获取请求行的信息

         (1)getMethod() :得到http请求方式

         (2)getRequestURI():得到请求地址(不包含ip+端口号)

         (3)getProtocol():得到http的版本

 

      8.3 获取请求头的信息

         (1)getHeader(java.lang.Stringname) :根据名称得到请求头的值

         =头信息 User-Agent:获取当前请求的浏览器的类型

         =String agent = request.getHeader("User-Agent");

 

      8.4 获取客户机的信息

         (1)getContextPath():请求项目的名称

         (2)getRequestURL():客户端发送的请求的路径

         (3)getRemoteAddr():获取当前客户端的ip地址

 

      8.5 获取表单提交的数据

         (1)StringgetParameter(java.lang.String name) :参数是表单输入项name属性的值,根据名称得到输入的值

         =代码

                  Stringusername = request.getParameter("username");

                  Stringpassword = request.getParameter("password");

 

         (2)String[]getParameterValues(java.lang.String name) :参数是表单输入项name的值,针对复选框的情况

         =代码

                  String[]loves = request.getParameterValues("love");

 

         (3)Map<java.lang.String,java.lang.String[]>getParameterMap() :

         =返回的是map集合,key是表单输入项name属性的值,value是输入的值

         =代码

                  Map<String,String[]>map = request.getParameterMap();

                  //得到map集合里面的key和value,遍历map

                  Set<String>keys = map.keySet();

                  //遍历set集合

                  for(String key : keys) {

                          //根据key得到value

                          String[]values = map.get(key);

                          //key和对应的value输出(表单输入项name的属性值和输入的值)

                          System.out.println(key+":: "+Arrays.toString(values));

                  }

 

         (4)Enumeration<java.lang.String>getParameterNames() 

        

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

         (1)post提交方式解决方法

         =使用post提交数据时候,会把数据放到request缓冲区里面,

         request缓冲区默认的编码iso8859-1,不支持中文

         =解决方法:

                  设置request缓冲区的编码

         =代码:

                  request.setCharacterEncoding("utf-8");

 

         (2)get提交中文乱码解决

         =有三种方式

         第一种:修改tomcat的配置文件

                  ==     <Connector port="80"protocol="HTTP/1.1"

              connectionTimeout="20000"

               redirectPort="8443"URIEncoding="utf-8"/>

         第二种:把数据先编码,再进行解码

         第三种:使用string构造进行编码

                  newString("");

         =代码:

                  username= new String(username.getBytes("iso8859-1"),"utf-8");

        

 

      8.7 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(..);

 

         (5)举例演示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"));

        

 

      8.8 重定向和转发的区别

         (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代码

         //获取表单提交的用户名和密码

         Stringusername = request.getParameter("username");

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

         }

 

 

 

 

 

 

 

 

 

 

 

1 0
原创粉丝点击