Day8request&response

本文详细介绍了HTTP协议中Request和Response的基本概念及使用方法,包括响应的状态码、响应头、响应体等内容,并深入探讨了重定向、定时跳转、文件下载等功能的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Day8

request&response

1.   response的简介

http的响应包含三部分组成

组成部分

作用

方法

响应行

状态码

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

响应头

是key-value结构, 可以有多个value

setHeader(java.lang.String name, java.lang.String value) :设置响应头, 第一个参数是响应名称;第二个参数值, 针对一个key和一个value情况

addHeader(java.lang.String name, java.lang.String value) :设置响应头, 第一个参数是响应名称;第二个参数值, 针对一个key和多个value的情况

 

响应体

向页面显示的内容

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

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

2.   重定向☆☆☆

重定向到登录页面

           //设置状态码

           response.setStatus(302);

           //使用头Location完成重定向

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

代码简写的方式

           response.sendRedirect("要重定向到的页面的路径");

3.   定时跳转

使用头信息Refresh实现

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

 

倒计时的效果

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

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

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

 

(2)倒计时

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

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

        varm = 5;

        functionloadTime() {

                 //得到span标签

                 varspan1 = document.getElementById("spanid");

                 //向span里面写内容

                 span1.innerHTML= m;

                 m--;

        }

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

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

字节流

代码

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

 

           解决中文乱码问题

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

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

           //设置字节数组的编码

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

 

字符流

代码

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

 

           解决中文乱码问题

           //设置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.   response的流的注意事项

1.字节流和字符流是互斥的

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

 

6.   验证码的案例

1. 实现验证码的步骤

第一步:生成图片

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

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

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

2. 显示验证码

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

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

(2)实现看不清换一张

           //实现看不清换一张

           function loadCode() {

                    //得到img标签

                    var img1 =document.getElementById("img1");

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

                    }

7.   文件下载的案例

1.实现的步骤

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

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

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

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

2. 代码实现文件的下载

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

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

           //得到文件的名称

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

           int lens =path.lastIndexOf("\\");

           String filename =path.substring(lens+1);

           //设置头信息

           response.setHeader("Content-Disposition","attachment;filename="+filename);

           //得到文件的输入流

           InputStream in = newFileInputStream(path);

           //使用输出流操作

           OutputStream out =response.getOutputStream();

           //流对接

           int len = 0;

           byte[] b = new byte[1024];

           while((len=in.read(b))!=-1) {

                    out.write(b, 0, len);

           }

           //关闭流

                    in.close();

8.   request

获取请求行的信息

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

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

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

获取请求头的信息

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

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

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

         获取客户机的信息

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

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

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

         ☆☆☆获取表单提交的数据

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

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

(3)      Map<java.lang.String,java.lang.String[]>getParameterMap() :返回的是map集合,key是表单输入项name属性的值,value是输入的值

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

 

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

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

设置request缓冲区的编码

代码:request.setCharacterEncoding("utf-8");

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

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

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

 connectionTimeout="20000"

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

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

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

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

                  

 

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

 

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

 

☆☆☆重定向和转发的区别

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

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

         String username =request.getParameter("username");

         String password =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);

         }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值