• Servlet——Request和Response


    Servlet——Request和Response

    1.Request体系结构
    ![](https://img2020.cnblogs.com/blog/1668748/202004/1668748-20200426225304886-1264206014.png)
        *ServletRequest:是一个接口
        *HttpServletRequest:是一个接口
        *org.apache.catalina.connector.RequestFacade:是 Tomcat 的一个类
    RequestFacade 类实现了 HttpServletRequest 接口,HttpServletRequest 接口继承了 ServletRequest 接口
    

    HttpServletRequest常用方法

    *ServletRequest接口: 请求对象, 封装了获取所有请求信息(请求行, 请求头, 请求实体)的方法
    *HttpServletRequest接口:是ServletRequest的子接口, 处理HTTP协议请求的方法.
    1.常用方法
        1.String getMethod(): 返回请求方式(GET/POST)
        2.String getRequestURI():返回请求行中资源名字部分: 如/test/index.html(统一资源标识符)
        3.StringBuffer getRequestURL():返回浏览器地址栏内容(统一资源定位符)
        4.String getContextPath():返回虚拟目录
        5:String getRemoteAddr():返回客户端的IP地址
        6.String getHeader(String headName):根据指定的请求头获取对应的请求头的值
    2.获取请求参数的方法
        1.String getParameter(String name):根据参数名称,获取对应参数的值.
        2.String[] getParameterValues(String name):根据参数名称,获取该参数的多个值.
        3.Enumeration <String> getParameterNames():获取所有请求参数的名称
        4.Map<String,String[]> getParameterMap():返回请求参数组成的Map集合.
        key:参数名称
        value:参数值,封装在String数组中.
    

    // 注解: 表示Web.xml中给这个Servlet配置的8句
    @WebServlet("/req")
    public class HttpServletRequestDemo extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    //- String getMethod(): 返回请求方式(GET/POST)
    System.out.println(req.getMethod());
    //- String getRequestURI():返回请求行中资源名字部分: 如/test/index.html
    System.out.println(req.getRequestURI());
    //- StringBuffer getRequestURL():返回浏览器地址栏的内容
    System.out.println(req.getRequestURL());
    //- String getContextPath():获取上下文路径,<Context path="上下文" ../>
    System.out.println(req.getContextPath());
    //- String getRemoteAddr():返回请求服务器的客户端的IP地址
    System.out.println(req.getRemoteAddr());
    //- String getHeader(String headName):根据指定的请求头获取对应的请求头的值.
    String userAgent = req.getHeader("User-Agent");
    System.out.println(userAgent.contains("MSIE"));
    System.out.println(userAgent);
    System.out.println("-----------获取请求参数的方法----------");
    // String getParameter(String name):根据参数名称,获取对应参数的值.
    System.out.println(req.getParameter("username"));
    // String[] getParameterValues(String name):根据参数名称,获取该参数的多个值.
    String[] hobbies = req.getParameterValues("hobby");
    System.out.println(Arrays.toString(hobbies));
    // Enumeration getParameterNames():获取所有请求参数的名字
    Enumeration parameterNames = req.getParameterNames();
    while (parameterNames.hasMoreElements()) {
    System.out.println("====>" + parameterNames.nextElement());
    }
    // Map<String,String[]> getParameterMap():返回请求参数组成的Map集合.
    Map<String, String[]> parameterMap = req.getParameterMap();
    System.out.println(parameterMap);
    }
    }

    请求转发

    1.通过request对象获取请求转发器对象:request.getRequestDispachter(url)
    2.使用RequestDispatcher对象来进行转发 forward(req,resp)
    特点:
        1.浏览器地址栏路径不发生变化
        2.只能转发到当前服务器内部资源中
        3.转发只发送一次请求
    

    共享数据

    1.域对象: 一个有作用范围的对象,可以在范围内共享数据
    2.request域: 代表一次请求的范围,一般用于请求转发的多个资源中共享数据
    3.方法
        void setAttribute(String name,Object obj):存储数据
        Object getAttitude(String name):通过键获取值
        void removeAttribute(String name):通过键移除键值对
    

    请求的中文乱码处理

    1.在Tomcat中, 对于POST和GET请求,默认是ISO-8859-1的编码格式, 而该编码格式不支持中文, 所以会产生乱码.
    解决方案 :
        1.第一种方式:
            1.对乱码使用ISO-8859-1解码—>byte数组.
            2.对byte数组重新使用UTF-8编码
    

    String username1 = req.getParameter("username");
    // 按照ISO-8859-1把乱码恢复成二进制形式
    byte[] data = username1.getBytes("ISO-8859-1");
    // 再把二进制形式的数据使用UTF-8重新编码
    String username2 = new String(data, "UTF-8");
    System.out.println(username2);
    问题: 这种方式当一个参数需要使用这两行代码来转码,如果有N个中文参数,就需要写N次,如此一来, 冗余代码很多.
    2.第二种方式:
    针对POST请求方式
    // 对于POST请求 可以设置请求的编码
    req.setCharacterEncoding("UTF-8");
    String username = req.getParameter("username");
    System.out.println(username);
    注意: 这种方式只对POST有效, 必须放在获取任意参数之前

    HttpServletResponse常用方法

    ServletResponse接口: 响应对象, 封装了获取所有响应信息(状态行, 响应头, 请求实体)的方法
    HttpServletResponse接口:是ServletResponse的子接口, 处理HTTP协议响应的方法.
    1.常用方法
        OutputStream getOutputStream():获取字节输出流对象. :文件下载
        Writer getWriter():获取字符输出流对象 :输出内容
        *使用字符输出流,中文会出现乱码,需要设置两行代码
        1.设置文档的MIME类型
            resp.setContentType("text/html");
        2.设置输出数据的编码方式
            resp.setCharacterEncoding("UTF-8");
        3.这两行可以统一设置
            resp.setContentType("text/html;character=utf-8");
    

    重定向

    1.重定向是一种资源跳转的方式
    2.语法:resp.sendRedirect(url)
    3.重定向的特点:redirect
        1.地址栏发生变化
        2. 重定向是两次请求。不能使用request对象来共享数据
        3. 重定向可以访问其他站点(服务器)的资源
    4.路径写法:
        1.相对路径:通过相对路径不可以确定唯一资源
            *如:./index.html
            *不以/开头,以.开头路径
            规则:找到当前资源和目标资源之间的相对位置关系
            ./:当前目录
            ../:后退一级目录
        2.绝对路径:通过绝对路径可以确定唯一资源
            *如:http://localhost/day15/responseDemo2
            /day15/responseDemo2
            *以/开头的路径
            规则:判断定义的路径是给谁用的?判断请求将来从哪儿发出
            *给客户端浏览器使用:需要加虚拟目录(项目的访问路径)
            *建议虚拟目录动态获取:request.getContextPath()
            <a> , <form> 重定向…
            给服务器使用:不需要加虚拟目录
            转发路径
  • 相关阅读:
    LeetCode "Palindrome Partition II"
    LeetCode "Longest Substring Without Repeating Characters"
    LeetCode "Wildcard Matching"
    LeetCode "Best Time to Buy and Sell Stock II"
    LeetCodeEPI "Best Time to Buy and Sell Stock"
    LeetCode "Substring with Concatenation of All Words"
    LeetCode "Word Break II"
    LeetCode "Word Break"
    Some thoughts..
    LeetCode "Longest Valid Parentheses"
  • 原文地址:https://www.cnblogs.com/linjing111/p/12787244.html
Copyright © 2020-2023  润新知