• 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> 重定向…
            给服务器使用:不需要加虚拟目录
            转发路径
  • 相关阅读:
    c#缓存技术(Dictionary)
    反射Reflection创建
    SQL Server手注之延时型盲注
    MySQL——事务
    MySQL——NULL值处理
    MySQL——连接的使用
    SQL server手注之报错注入
    SQL Serves手注之联合查询注入
    MySQL手注之ROOT权限处理
    MySQL——正则表达式
  • 原文地址:https://www.cnblogs.com/linjing111/p/12787244.html
Copyright © 2020-2023  润新知