zoukankan      html  css  js  c++  java
  • W9-请求响应[JavaWeb]

    1.请求响应的流程

      1.1 服务器每次接收到请求时,都会为这个请求开辟一个新的线程;

      1.2 服务器会把客户端的请求数据封装到request对象中,request是请求数据的载体;

      1.3 服务器还会创建response对象,每个对象与客户端连续在一起,可以用来向客户端发送响应;

    2.Response

      2.1 在HttpServletResponse接口中

      (1)状态码:200表示成功,302表示重定向,404表示客户端错,500表示服务器端错;

        sendError(int sc)  发送错误状态码,例如404,500;

        sendError(int sc,String mag)  发送错误状态码,可以携带一个错误信息;

        sendError(int sc)  发送成功的状态码,可以用来发送302;

      (2)响应头:Content-Type,Refresh,Location等

        setHeader(String name,String value)  适用于单值的响应头

        addHeader(String name, String value)  适用于多值的响应头

        setIntHeader(String name, int value) 适用于单值的int类型的响应头

        addIntHeader(String name, int value)  适用于多值的int类型的响应头

        setDateHeader(String name, long date)  适用于单值的毫秒类型的响应头

        addDateHeader(String name, long date)  适用于多值的毫秒类型的响应头

      (3)响应体:通常是html,也可以是图片;

        response的两个流:

        -ServletOutputStream:用来向客户端发送字节数据;ServletOutputStream out=response.getOutputStream() 

        -PrintWriter:用来向客户端发送字符数据,需要设置编码;PrintWriter writer=response.getWriter() 

        -使用PrintWriter发送字符数据;(字符与字节的区别

        -使用ServletOutputStream发送字节数据(图片);

        -两个流不能同时使用;

      (4)重定向

       sendRedirect(String location) 

    3. Request:封装了客户端所有的请求数据;

      3.1 在HttpServletRequest接口中和ServletRequest接口中

      (1)获取请求方式:getMethod() ,可能是POST或者是GET;

      (2)获取HTTP请求头:

        String getHeader(jString name):适用于单值头;

        int getIntHeader(String name) :适用于单值int类型的请求头;

        long  getDateHeader(String name) :适用于单值毫秒类型的请求头;

           Enumeration  getHeaders(String name) :适用于多值请求头;

      (2)获取请求URL

      示例:http://localhost:8080/Day10-2/AServlet?username=xxx&password=yyy

        String getScheme() :获取协议 http

        String getServerName():获取服务器名 localhost

        int getServerPort() :获取服务器端口号 8080

        String getContextPath() :获取项目名 /Day10-2

        String getServletPath():获取Servlet路径 /AServlet

        String  getQueryString() :获取参数部分,即问号后面的部分 username=xxx&password=yyy

        String getRequestURI() :获取请求URI,项目名+Servlet路径  0/Day10-2/AServlet

        String getRequestURL() :获取请求URL,等于不包含参数的整个请求路径 http://localhost:8080/Day10-2/AServlet

      (3)获取请求参数:请求参数是由客户端发送给服务器的,有可能是请求体中(POST),也有可能是URL之后(GET)

         请求参数:有一个参数一个值的,还有一个参数多个值的;

        String getParameter(String name):获取指定名称的请求参数值,适用于单值请求参数

        String[] getParameterValues(String name) :获取指定名称的请求参数值,适用于多值请求参数

        Enumeration<String>  getParameterNames() :获取所有请求参数名称;

        Map<String ,String[]> getParameterMap():获取所有请求参数,其中key为参数名,value为参数值;

      (4)请求转发和请求包含:

    RequestDispatcher rd=request.getRequestDispatcher("/TwoServlet");//使用request获取RequestDispatcher对象,方法的参数是被转发或包含的Servlet
    rd.forward(request,response);//请求转发
    rd.include(request,response);//请求包含

        有时一个请求需要多个Servlet协作才能完成,需要一个Servlet跳转到另一个Servlet;

        一个请求跨多个Servlet,需要使用转发和包含;

        请求转发:由下一个Servlet完成响应体,当前Servlet可以设置响应头(留头不留体);

        请求包含:由两个Servlet共同完成响应体;(留头又留体);

        无论是请求转发还是请求包含:都在一个请求范围内:使用同一个request和response;

      (5)request域

        Servlet中三大域对象:request,session,application,都有如下方法:

        void setAttribute(String name,Object name)

        Object getAttribute(String name)

        void  removeAttribute(String name)

      (6)请求转发和重定向的区别

        请求转发是一个请求一次响应,而重定向是两次请求两次响应;

        请求转发地址栏不变化,而重定向会显示后一个请求的地址;

        请求转发只能转发到本项目其他Servlet,而重定向不只能重定向到本项目的其他Servlet,还能定向到其他项目;

        请求转发是服务器端行为,只需要给出转发的Servlet路径,而重定向需要给出requestURI,即包含项目名;

        请求转发相比于重定向效率更高,因为是一个请求;当需要地址栏发生变化时,使用重定向;需要下一个Servlet中获取域对象,需要用请求转发;

    4.编码

      4.1常见字符编码:iso-8859-1(不支持中文),gb2312,gbk,gb18030(系统默认编码,中国的国标码),utf-8(万国码)

      4.2 响应编码

      

      4.3 请求编码

      4.4 URL编码

       

    5.路径

      5.1 web.xml中<url-pattern>路径(Servlet路径):要么以“*”开头,要么以“/”开头;

      5.2 以“/”开头:相对当前项目路径;不以“/”开头:相对当前Servlet路径;

      5.3 重定向路径(客户端路径):以“/”开头,相对当前主机,需要自己添加项目名;

      5.4 页面中超链接和表单路径:与重定向相同,都是客户端路径,需要添加项目名;

      5.5 ServletContext获取资源路径:相对当前项目目录,即当前index.jsp所在目录;

      5.6 ClassLoader获取资源路径:相对classes目录;

      5.7 Class获取资源路径:以“/”开头相对classes目录,不以“/”开头相对当前.class文件所在目录;

  • 相关阅读:
    oracle内核参数详解
    oracle分区表原理学习
    expdp导出时报错ora-16000
    【CS224n-2019学习笔记】Lecture 1: Introduction and Word Vectors
    【SQL必知必会笔记(3)】SELECT语句的WHERE子句数据过滤操作
    【SQL必知必会笔记(2)】检索数据、排序检索数据
    【SQL必知必会笔记(1)】数据库基础、SQL、MySQL8.0.16下数据库、表的创建及数据插入
    win10,64位操作系统安装mysql-8.0.16经验总结(图文详细,保证一次安装成功)
    【机器学习实战笔记(3-3)】关于朴素贝叶斯实现代码中的一些错误总结
    【机器学习实战笔记(3-2)】朴素贝叶斯法及应用的python实现
  • 原文地址:https://www.cnblogs.com/ERFishing/p/11376716.html
Copyright © 2011-2022 走看看