zoukankan      html  css  js  c++  java
  • javaweb-request与response(未处理)

    request:代表请求,在浏览器的地址栏输入地址,点击回车,这个过程称为一次请求,同时,它也是一个域对象(一次请求)

    response:代表响应,服务器端根据的请求,返回数据到浏览器中进行显示,这个过程称为一次响应

    Ps:笔记写的挺好的,我就不多做修改了(主要是时间比较紧凑,没时间做拓展了,等以后有时间再弄吧,不然只怕连这篇笔记都找不到)

    1response的简介

    1.1 HttpServletResponse,是一个接口,父接口是ServletResponse,代表响应对象

    1.2 http的响应包含三部分组成(请求类似)

    第一部分:响应行

    1)状态码

    2)主要的方法

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

    == response.setStatus(302)

    第二部分:响应头

    1)是key-value结构,一个key可以有一个value,一个key也可以有多个value

    2)方法

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

    == 两个参数:第一个参数是响应名称;第二个参数值

    == 针对一个key和一个value情况

    == setHeader("aa","11");

       setHeader("aa","22");

       结果:名称 aa ,值 22

    = 针对特殊的类型,设置头的方法

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

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

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

    == 两个参数:第一个参数是响应名称;第二个参数值

    == 针对一个key和多个value的情况

    == addHeader("bb","55");

       addHeader("bb","66");

       结果:名称 bb ,值 55,66

    = 针对特殊的类型,设置头的方法

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

    = addDateHeader(java.lang.String name, long date) :值long类型,是毫秒数

    第三部分:响应体

    1)向页面显示的内容

    2)方法

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

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

    2、重定向的案例

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

    1)需求的描述:

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

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

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

    2)实现的步骤:

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

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

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

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

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

    否则重定向到登录页面

    //设置状态码

    response.setStatus(302);

    //使用头Location完成重定向

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

    3)代码实现

    //得到输入的用户名和密码

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

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

    //根据用户名和密码判断,(用户名admin、密码123456

    if("admin".equals(username) && "123456".equals(password)) {

    //向页面输出内容

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

    } else { //重定向到登录页面

    //设置状态码

    response.setStatus(302);

    //使用头Location完成重定向

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

    }

    4)重定向的代码简写的方式

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

    3、定时跳转的案例

    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标签实现页面的定时跳转

    <meta http-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、设置响应体(向页面输出内容)

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

    1getOutputStream()

    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 使用字符流向页面输出内容

    1getWriter()

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

    6、验证码的案例(了解)

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

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

    第一步:生成图片

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

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

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

    6.3 代码实现验证码

    6.4 显示验证码

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

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

    2)实现看不清换一张

    //实现看不清换一张

    function loadCode() {

    //得到img标签

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

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

    }

    7、文件下载的案例(重点)

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

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

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

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

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

    7.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 = new FileInputStream(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();

    8request对象

    8.1 代表请求的对象,HttpServletRequest接口,父接口是ServletRequest

    8.2 获取请求行的信息

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

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

    3getProtocol() :得到http的版本

    8.3 获取请求头的信息(*)

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

    = 头信息 User-Agent:获取当前请求的浏览器的类型(微软 ie9,0)

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

    8.4 获取客户机的信息

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

    2getRequestURL() :客户端发送的请求的路径http://127.0.0.1/day07

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

    主流的浏览器:ie 谷歌 欧朋 火狐 苹果家

    8.5 获取表单提交的数据

    1String getParameter(java.lang.String name) :参数是表单输入项name属性的值,根据名称得到输入的值,针对复选框的情况.

    = 代码

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

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

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

    = 代码

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

    兴趣爱好,love,Arrays.toString(),可以将数组中的数据打印

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

    = 返回的是map集合,key是表单输入项name属性的值,value是输入的值(注意是数组)

    = 代码

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

    //得到map集合里面的keyvalue,遍历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));

    }

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

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

    1post提交方式解决方法

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

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

    = 解决方法:

    设置request缓冲区的编码

    = 代码:

    request.setCharacterEncoding("utf-8");

    2get提交中文乱码解决

    = 有三种方式

    第一种:修改tomcat的配置文件config中的server.xml

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

                   connectionTimeout="20000"

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

    第二种:把数据先编码,再进行解码: url = encodeURI('/day08/login?username=张三&pwd=123')

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

    new String("");

    = 代码:

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

    8.7 request是域对象

    1)域对象:在一定的范围内,可以存值和取值

    2servletContext域对象:范围是整个web项目,存值 setAttribute方法 和取值 getAttribute方法

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

    = request域里面存值的方法:setAttribute(java.lang.String name, java.lang.Object o)

    = request域里面取值的方法:getAttribute(java.lang.String name)

    4request域对象范围是一次请求,经常和转发一起使用

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

    5)举例演示request域对象(一次请求地址栏不会发生变化)response.setRedirect()requestresponse俩个方法区别,张三李四借钱!

    = 创建servlet1,在servlet1里面向request域里面设置一个值,最后转发到servlet2里面

    == //request域里面设置一个值

    request.setAttribute("msg", "itcast100");

    //转发到servlet2

    request.getRequestDispatcher("/servlet2").forward(request, response);

    = 创建servlet2,在servlet2里面获取通过servlet1request域里面设置的那个值

    == //获取通过servlet1request里面设置的值

    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 知识的引入

    1jspsun公司用于动态网站的技术,jsp就是servelt,最终会编译成servlet

    2el表达式:用于获取域对象里面的值  ${名称},不能再HTML中使用,只能在jsp中使用

    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("login success");

    } else { //登录失败

    //转发到登录页面,同时向页面传递错误的信息

    //把错误信息存到request域里面

    request.setAttribute("msg", "用户名或者密码错误");

    request.getRequestDispatcher("/login.jsp").forward(request, response);

    }

  • 相关阅读:
    初学微信小程序 TodoList
    设计一个基于svg的涂鸦组件(一)
    基于51单片机的12864驱动
    java 使用xom对象数据序列化为xml、反序列化、Preferences相关操作小案例
    ios UIWebView 播放优酷土豆视频
    VMware Player 使用错误集锦
    Django 使用UEditor
    Entity Framework底层操作封装V2版本号(3)
    cocos2dx笔记1:概述
    oracle10g精简版安装步骤
  • 原文地址:https://www.cnblogs.com/adventurer/p/5521938.html
Copyright © 2011-2022 走看看