• request response 区别


    request:
    有关于客户端请求的信息,都可以由它来取得,例如请求标头、请求方法、请求参数、使用者IP等等信息。
    response:
    有关于对客户端请求之响应,可以利用它来设定一些要响应的讯息,例如标题信息、响应状态码等.
     
    response:

               属于重定向请求;

               其地址栏的URL会改变;

               会向服务器发送两次请求;

     sendRedirect用法:
           response.sendRedirect("跳转页面路径或需要执行的操作路径");
           不保持request中设置属性,也就是说会产生一个新的request。跳转到得页面刷新仍然是当前页面。

    sendRedirect用法:

        response.sendRedirect("hello.jsp")    是在响应后转向 


     

     request:

                属于请求转发;

               其地址栏的URL不会改变;

               向服务器发送一次请求;

     forward用法:
           RequestDispatcher view = request.getRequestDispatcher("跳转页面路径或需要执行的操作路径");
           view.forward(request, response);

          也可以写成:

          request.getRequestDispatcher("跳转页面路径或需要执行的操作路径").forward(request, response);
          保持request中设置的属性,跳转页面后刷新会重新执行操作。
          例如:
          index.html  ->(submit 数据) -> http://......../submit.do
          submit.do  对应的 Servlet 为 submit.java.  其中包含下列片段的两种情况:

         1.     response.sendRedirect("hello.html") .           浏览器会指向hello.html,并且地址栏是http://...../hello.html
         2.      RequestDispatcher view = request.getRequestDispatcher("hello.html");
                 view.forward(request, response);
                 浏览器会指向hello.html, 但是地址栏仍然是http://...../submit.do

      forward用法:
            RequestDispatcher     rd     =     request.getRequestDispatcher(URL);   
            request.setAttribute("str",str);   
            rd.forward(request,response);   
            是响应前转向,可以把参数带过去,你也可以在这里设置request.setAttribute("str",str);

    笔记:

    回顾:
    http::
    超文本传输协议
    请求和响应
    servlet:
    运行在服务器端的一个java小程序,本质就是一个类
    接受请求,处理逻辑,生成动态内容
    编写步骤:
    1.编写一个类
    继承HttpServlet
    重写doGet或者doPost方法
    2.编写路径
    <servlet>
    <serlvet-name>
    <serlvet-class>

    <servlet-mapping>
    <serlvet-name>
    <url-pattern>
    3.测试
    http://主机:端口号/项目名/路径
    servlet的体系结构:
    Servlet--->GenericServlet-->HttpServlet
    HttpServlet:
    实现了service方法,强转了两个参数,调用了重载的service方法
    重载的service方法中,获取请求的方式,根据请求方式的不同调用相应的doXxx方法
    doGet():处理get请求的逻辑
    doPostt():处理post请求的逻辑 (只有表单提交的时候把method设置成post的时候)
    servlet的生命周期:
    init(ServletConfig config):
    service(ServletRequest request,ServletResponse response):
    destroy():
    /////////////////////
    url-pattern的配置:
    完全匹配 /a/b
    目录匹配 /a/b/*
    后缀名匹配 *.jsp
    优先级:完全匹配 >目录匹配 >后缀名匹配
    一个路径对应一个servlet
    一个servlet可以对应多个路径
    //////////////////////
    load-on-startup:修改servlet的初始化时机
    ////////////////////////
    当我们的项目处理不了请求的时候,服务器里面defaultservlet来处理.
    //////////////////////////
    路径的写法:
    相对路径
    绝对路径:(常用)
    带主机和协议的路径(访问站外资源)
    不带主机和协议的路径(最常用的)
    /项目名/资源路径
    ////////////////////////////
    servletConfig:(了解)
    servlet的配置对象
    作用:
    获取servlet的名称
    获取servlet初始化参数
    ★获取全局管理者
    servletContext:
    上下文(全局管理者)
    作用:
    1.获取全局的初始化参数
    2.共享资源
    3.获取资源
    4.获取文件的mime类型
    获取:
    在servlet中直接调用 getServletContext()
    常用方法:
    String getInitParameter(String key):根据key获取指定的初始化参数
    <context-param>
    <param-name>
    <param-value>

    String getRealPath(String 文件路径):获取的指定文在在tomcat上的绝对路径
    文件路径从项目的根目录往后写
    InputStream getREsourceAsStream(String 文件路径):以流的形式返回一个文件

    String getMimeType(文件名):格式 大类型/小类型

    /////////////////////////////////////
    域对象:
    创建:在服务器启动的时候,服务器会为每一个项目创建一个全局管理者,servletcontext就是当前项目的引用
    销毁:在项目被移除或者服务器关闭的时候销毁
    常用的方法:
    xxxAttribute()
    setAttribute(String key,Object value)
    Object getAttribute(String key)
    removeAttribute(String key)
    //////////////////////////////////////////
    通过类加载器获取文件的路径(处于classes目录下的文件)
    类.class.getClassLoader().getReource("文件路径").getPath()
    类.class.getClassLoader().getReourceAsStream("文件路径")
    /////////////////////////////////////////////////////////////////////////
    /////////////////////////////////////////////////////////////////////////
    要求:会使用request和response
    案例1-文件下载案例
    技术分析:
    response
    文件下载
    //////////////////////
    response:响应
    作用:
    往浏览器写东西
    组成部分:
    响应行 响应头 响应体
    操作响应行
    格式:
    协议/版本 状态码 状态码说明
    状态码:
    1xx:已发送请求
    2xx:已完成响应
    200:正常响应
    3xx:还需浏览器进一步操作
    302:重定向 配合响应头:location
    304:读缓存
    4xx:用户操作错误
    404:用户操作错误.
    405:访问的方法不存在
    5xx:服务器错误
    500:内部异常
    常用方法:
    setStatus(int 状态码):针对于 1 2 3
    了解 :
    sendError(int 状态码):针对于 4xx和5xx
    操作响应头
    格式:key/value(value可以是多个值)
    常用的方法:
    setHeader(String key,String value):设置字符串形式的响应头
    了解:setIntHeader(String key,int value):设值整形的响应头
    了解:setDateHeader(String key,long value):设值时间的响应头

    addHeader(String key,String value):添加置字符串形式的响应头 之前设置过则追加,若没有设置过则设置
    了解:addIntHeader(String key,int value):添加整形的响应头
    了解:addDateHeader(String key,long value):添加时间的响应头
    常用的响应头:
    location:重定向
    refresh:定时刷新
    content-type:设置文件的mime类型,设置响应流的编码及告诉浏览器用什么编码打开
    content-disposition:文件下载

    重定向:
    方式1:
    ★response.sendRedirect("/day10/loc2");
    方式2:
    response.setStatus(302);
    respooen.setHeader("location","/day10/loc2");

    定时刷新:
    方案1:设置头 refresh 昨天做过
    respooen.setHeader("refresh","秒数;url=跳转的路径");
    方案2:http的meta标签
    <meta http-equiv="refresh" content="3;url=/day10/refresh2.html">

    /////////////////////
    操作响应体:
    页面上要展示的内容
    常用方法:
    Writer getWriter():字符流
    ServletOutputStream getOutputStream() :字节流

    自己写的东西用字符流,其他一概用字节流.

    处理响应中文乱码:
    方式1:★
    response.setContentType("text/html;charset=utf-8");
    方式2:理解
    response.setHeader("content-type", "text/html;charset=utf-8");

    注意:
    两个流互斥
    当响应完成之后,服务器会判断一下流是否已经关闭,若没有关闭,服务器会帮我们关闭.(底层使用的缓冲流)
    //////////////////////////////
    文件下载:
    下载方式:
    1.超链接下载
    <a href="/day10/download/day10.txt">下载 day10.txt</a>
    若浏览器能解析该资源的mime类型,则打开;若不能接下则下载;
    2.编码下载 通过servlet完成
    <a href="/day10/download?name=day10.txt">下载 day10.txt</a>
    a.设置文件的mime类型
    String mimeType=context.getMimeType(文件名)
    response.setContentType(mimeType);

    b.设置下载头信息 content-disposition
    response.setHeader("content-disposition", "attachment;filename="+文件名称);

    c.提供流
    response.getOutputStream();

    扩展:使用commons-io工具类
    对拷流:
    IOUtils.copy(is,os);
    /////////////////////////////
    扩展:
    通过response生成验证码
    验证码:
    作用:防止暴力攻击
    点击换一张的js代码:
    function changeImg(obj){
    //操作src属性
    obj.src="/day10/code?i="+Math.random();
    //alert(1)
    }
    //////////////////////////////////////////////
    案例2-完成用户注册操作
    需求:
    在一个表单页面上填写用户数据,点击提交,将所有的数据提交的服务器上,通过java代码最终保存到数据库中.
    技术分析:
    表单
    request
    ////////////////////////////////
    request:请求
    作用:获取浏览器发送过来的数据
    组成部分:
    请求行 请求头 请求体
    操作请求行
    格式:
    请求方式 请求资源 协议/版本
    常用方法:HttpServletRequest
    掌握
    String getMethod():获取请求方式
    String getRemoteAddr():获取ip地址
    String getContextPath() :在java中获取项目名称 (/day10)


    了解:
    getRequestURI():获取的是 从项目名到参数之前的内容 /day10/regist
    getRequestURL():获取的带协议的完整路径 http://localhost/day10/regist
    String getQueryString():get请求的所有参数 username=tom&password=123
    String getProtocol():获取协议和版本

    例如:请求行
    GET /day10/row?username=tom&password=123 HTTP/1.1
    //////////////////
    操作请求头
    格式:key/value(value可以是多个值)
    常用方法:
    ★String getHeader(String key):通过key获取指定的value (一个)

    了解:
    Enumeration getHeaders(String name) :通过key获取指定的value(多个)
    Enumeration getHeaderNames() :获取所有的请求头的名称
    int getIntHeader(String key):获取整型的请求头
    long getDateHeader(String key):获取时间的请求头
    重要的请求头:
    user-agent:浏览器内核 msie firefox chrome
    referer:页面从那里来 防盗链

    ///////////////////
    操作请求参数 ★
    username=tom&password=123&hobby=drink&hobby=sleep
    常用方法:
    String getParameter(String key):获取一个值
    String[] getParameterValues(String key):通过一个key获取多个值
    Map<String,String[]> getParameterMap():获取所有的参数名称和值


    username:tom
    ---------values---------
    hobby:[drink, sleep]
    =====map=======
    username::[tom]
    password::[123]
    hobby::[drink, sleep]
    //////////////////////
    请求的中文乱码:
    对于get请求:参数追加到地址栏,会使用utf-8编码,服务器(tomcat7)接受到请求之后,使用iso-8859-1解码,所以会出现乱码
    对于post请求,参数是放在请求体中,服务器获取请求体的时候使用iso-8859-1解码,也会出现乱码

    通用的方法:
    new String(参数.getBytes("iso-8859-1"),"utf-8");
    针对于post请求来说:只需要将请求流的编码设置成utf-8即可
    request.setCharacterEncoding("utf-8");
    /////////////////////////////////////////////////////////////
    域对象:
    request:
    创建:一次请求来的时候
    销毁:响应生成的时候
    作用:
    一次请求里面的数据
    请求转发(请求链,请求串)
    request.getRequestDispatcher("内部路径").forward(request,response);
    ///////////////////////////////////////////////////////////////
    ///////////////////////////////////////////////////////////////

    案例2-步骤分析:
    1.数据库和表(day09)
    2.页面(表单)
    给每个字段添加name属性
    还需修改表单提交的路径 method=post
    3.表单提交到一个servlet(RegistServlet)
    4.RegistServlet:
    操作:
    接受数据,封装成一个user
    调用UserSerivce完成保存操作 int regist(User user)
    判断结果是否符合我们预期
    若int=1; 插入成功
    若int!=1; 插入失败
    相应的提示信息在当前的servlet不做处理,将信息转发给另一个servlet展示(MsgServlet);
    5.UserService
    调用dao
    6.userdao 通过dbutils在数据库中插入一条记录.
    //////////////////
    封装对象:
    apache提供的一个工具类
    BeanUtils
    封装数据
    使用步骤:
    1.导入jar包
    2.调用 BeanUtils.populate(Object bean,Map<> 参数);

    /////////////////////////////////////////////
    /////////////////////////////////////////////
    请求转发和重定向区别:
    重定向发送两次请求,请求转发一次请求

    重定向地址栏发生该表,请求转发不变

    重定向是从浏览器发送,请求转发是服务器内部

    重定向不存在request域对象,请求转发可以使用request域对象

    重定向是response的方法,请求转发是request的方法

    重定向可以请求站外资源,请求转发不可以


    /////////////////////////////////////////////
    /////////////////////////////////////////////
    扩展:
    URLEncoder.encode(s, "utf-8"); 指定编码
    URLDecoder.decode(s8, "iso8859-1");指定解码
    文件下载扩展:
    中文名称的文件名下载的时候名称会出现问题
    常见的浏览器需要提供文件名称的utf-8编码
    对于火狐来说需要提供文件名称的base64编码
    方案1:使用工具类
    方案2:网上的方式(8成好使)
    new String(filename.getByte("gbk"),"iso8859-1");

    ///////////////////////////////////////////////////////////////
    ///////////////////////////////////////////////////////////////
    ///////////////////////////////////////////////////////////////
    ///////////////////////////////////////////////////////////////

    上午回顾:
    response:
    操作响应行
    状态码
    常用方法:
    setStatus(int code) 针对的1xx 2xx 3xx
    操作响应头:
    setHeader(String key,String value):设置
    addHeader(String key,String value):添加

    常用的响应头:
    location:重定向:
    response.sendRedirect("跳转路径");
    refresh:定时刷新
    response.setHeader("refresh","秒数;url=路径");//java
    meta标签//html代码
    content-type:设置文件的mimeType,及设置响应流的编码并且通知浏览器用什么编码打开
    response.setContentType("text/html;charset=utf-8");
    content-disposition:设置文件下载
    response.setHeader("content-disposition","attachment;filename="+文件名称);
    操作响应体
    getWriter():
    getOutputStream():
    注意:俩流互斥,服务器帮我们关闭此流
    响应的中文乱码:
    response.setContentType("text/html;charset=utf-8");
    ////////////////////////////////
    文件下载:
    1.超链接下载
    2.编码下载(两个头一个流)
    设置文件的mimetype
    设置下载头信息
    对拷流
    扩展:
    文件名称中文问题:
    方法1:
    firefox :base64
    其他:utf-8
    方法2:(八九成可以使用)
    new String(filename.getBytes("gbk"),"iso8859-1");
    ////////////////////////////////
    request:请求 获取浏览器发送过来的数据
    操作请求行
    getMethod():请求方式
    getContextPath():获取项目名称
    getRemoteAddr():获取请求的ip地址

    操作请求头
    String getHeader(String key)
    常见的头信息:
    user-agent:获取浏览器内核
    referer:页面从那里跳转过来的
    操作请求参数
    String getParameter(String key):
    String[] getParameterValues(String key):
    Map<String ,String[]> getParameterMap();

    请求的中文乱码:
    对于get请求:参数追加到地址栏,会使用utf-8编码,服务器(tomcat7)接受到请求之后,使用iso-8859-1解码,所以会出现乱码
    对于post请求,参数是放在请求体中,服务器获取请求体的时候使用iso-8859-1解码,也会出现乱码

    通用的方法:
    new String(参数.getBytes("iso-8859-1"),"utf-8");
    针对于post请求来说:只需要将请求流的编码设置成utf-8即可
    request.setCharacterEncoding("utf-8");
    域对象:request
    请求转发:
    request.getRequestDispatcher("内部路径").forward(request,response);
    request生命周期:
    一次请求
    ////////////////
    扩展:封装数据:
    apache的BeanUtils
    1.导入两个jar包
    2.调用 BeanUtils.populate(Object bean,map);

  • 相关阅读:
    关于yyyy-MM-dd格式日期字符串,解析成LocalDateTime遇到的问题
    idea设置代码提示不区分大小写
    不错的Django技术网址
    Django-Rest-Framework 教程: 快速入门
    Djanto static静态文件配置
    Html5 touch event
    Zepto.js touch模块深入分析
    Python单元测试框架之pytest -- fixtures
    Python:高级主题之(属性取值和赋值过程、属性描述符、装饰器)
    Nginx基本配置、性能优化指南
  • 原文地址:https://www.cnblogs.com/Jixiangwei/p/6838937.html
Copyright © 2020-2023  润新知