JavaWeb笔记(8)-HTTP的Request对象

  1. HTTP:Hyper Text Transfer Protocol超文本传输协议
1. 传输协议:
    定义了客户端和服务器端通信时发送数据的格式
2. 特点:
    a. 基于TCP/IP的高级协议
    b. 默认端口号:80
    c. 基于请求/响应模型 -- 一次请求对应一次响应
    d. 无状态的:即每次请求之间相互独立,不能交互数据
3. 历史版本:
    1.0:每一次请求/响应都会建立新的连接
        -- 每个图片,js,css等都会建立新的连接
        -- 耗费资源与时间
    1.1:传输完数据后会等待一会,如果还有数据需要传输,则复用当前连接,如果没有则断开
4. URL和URI:
    * URL:统一资源定位符 -- http://localhost/Project_name/demo1
    * URI:统一资源标识符 -- /Project_name/demo1
  1. 请求消息的数据格式:
1. 请求行
    a. 格式:
        请求方式 请求url 请求协议/版本
    b. 例如:
        GET /login.html HTTP/1.1
    c. HTTP有7中请求方式,常用2种:
        GET:
            1. 请求参数在请求行中url后
            2. 请求的url长度有限制
        POST:
            1. 请求参数在请求体中
2. 请求头
    a. 格式:
        请求头名称:请求值
    b. 例如:
        Host:localhost
        User-Agent:Mozilla/5.0 ... -- 通过该值可以在服务器判定,用来实现对不同版本浏览器的兼容
        Referer:http://localhost/xxx.html
            -- 该属性表示:当前的请求是来自哪里
            -- 通过对请求头中Referer属性值的判断,可以防止盗链(即其他人非法访问我独有的资源)
            -- 判断该属性值符合要求再加载资源页面,否则执行其他操作
            -- 还可以判定不同的来源用作统计工作
3. 请求空行
    在请求头和请求体中需要一行空行来分隔两种信息
4. 请求体
    用来封装POST请求参数
  1. Request对象与Response对象
1. 在Servlet接口的service方法中,带有两个参数,其表示的就是Request对象与Response对象
    a. 在浏览器中输入url回车后,tomcat服务器会依据url中的资源路径创建对应的Servlet对象
    b. tomcat然后创建Request对象与Response对象,将浏览器提交的请求消息数据封装到Request对象中
    c. 然后将Request对象与Response对象作为参数传递个service方法,接着调用该方法
2. 因此,在service方法在我们书写获取Request对象数据的逻辑和设置Response对象数据的逻辑
  1. request对象:获取请求消息
1. request对象体系结构:
    a. 在Servlet接口的service方法中有一个ServletRequest对象
    b. 在HttpServlet抽象类的doGet方法中有一个HttpServletRequest对象
    c. 在打印获取到的HttpServletRequest对象的信息时,提示对象信息为
        org.apache.catalina.connector.RequestFacade
    查看API文档可知关系:
        ServletRequest:接口
        HttpServletRequest:接口 -- 继承自ServletRequest接口
        RequestFacade:类 -- HttpServletRequest的实现类,该实现类由tomcat编写创建
2. 获取请求消息数据:
    a. 获取请求行:
        * 获取请求方式:GET/POST/...
            String getMethod()
        * 获取虚拟目录:/Project_name
            String getContextPath()
        * 获取Servlet路径:/demo1
            String getServletPath()
        * 获取get方式请求参数:name属性名称=属性值
            String getQueryString() -- 获取所有的在URL中的参数,每对&分隔
        * 获取请求URI:/Project_name/demo1
            String getRequestURI() -- /Project_name/demo1
            StringBuffer getRequestURL() -- http://localhost/Project_name/demo1
        * 获取协议和版本:HTTP/1.1
            String getProtocol() -- 该方法继承自父类ServletRequest
        * 获取客户机的IP地址:
            String getRemoteAddr() -- 该方法继承自父类ServletRequest
    b. 获取请求头:
        * 通过请求头的属性获取属性值:User-Agent:Xxxxx
            String getHeader(String name) -- getHeader("User-Agent")
            -- 可以使用获取到的agent字符串判定属于哪种浏览器:
            -- if(agent.contain("Chrome")){}else if(agent.contain("Firefox")){}
            -- 可以获取referer属性值来防止盗链
        * 获取所有请求头名称:{host, connection, user-agent, ...}
            Enumeration<String> getHeaderNames() -- 返回值可以用nextElement()获取元素
    c. 获取请求体:
        * 请求体:只有POST请求才有请求体存在,其中封装了POST请求的参数
        * 使用步骤:
            1. 获取请求的流对象:
                * BufferedReader getReader():获取字符输入流,只能操作字符
                * ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据
                    -- 常用与上传文件操作
            2. 再从流中获取数据
                * 使用流对象的成员方法获取数据
3. 其他功能:
    a. 获取请求参数的通用方式:不论GET/POST都可以使用
        1. String getParameter(String name)
            -- 根据参数名称获取参数值:username=xxx&password=xxx
        2. String[] getParameterValues(String name)
            -- 根据参数名获取参数值列表:hobby=xxx1&hobby=xxx2
            -- 多用于复选框
        3. Enumeration<String> getParameterNames()
            -- 返回参数名称的枚举集合
        4. Map<String, String[]> getParameterMap()
            -- 返回所有请求参数的map集合
        中文乱码问题:
            * 对于GET请求,tomcat 8.0+已经解决了乱码问题
            * 对于POST请求,需要在doPost方法中对HttpServletRequest对象设置字符集
                request.setCharacterEncoding("html页面的字符集")
    b. 请求转发:服务器内部资源跳转的方式 
        a. 内部资源跳转:
            某个Servlet提供一部分服务后,由另一个Servlet提供剩余的服务
        b. 成员方法:
            1. 获取资源调度对象RequestDispatcher对象,传入下一个提供服务的Servlet的urlPattern
                RequestDispatcher rd = request.getRequestDispatcher("Next_Servlet_urlPattern");
            2. 调用RequestDispatcher对象的成员方法forward,传入当前的request和response对象
                rd.forward(request,response);
            3. 链式编程简化,同时使用匿名对象:
                request.getRequestDispatcher("Next_Servlet_urlPattern").forward(request,response);
        特点:
            1. 浏览器地址栏没有因为内部资源跳转而发生变化
            2. 由于是内部资源跳转,所以只能转发跳转到该web项目内的资源,urlPattern不能是外部资源
            3. 在浏览器的开发者工具中查看,请求转发的请求只发出一次请求,即原始的请求
    c. 数据共享:
        1. 域对象:一个有作用范围的对象,可以在范围内共享数据
        2. request域:代表一次request请求的范围
            * 由于多个Servlet对象在内部请求转发时,浏览器只发送一个request请求
            * 即该次请求中的多个资源跳转的Servlet可以使用同一个request域来共享数据
            存储数据:
                request成员方法:void setAttribute(String name, Object obj);
            获取数据:
                request成员方法:Object getAttribute(String name);
            移除数据:
                request成员方法:void removeAttribute(String name);
        3. request域仅用于一次request请求
    d. 获取ServletContext对象:
        1. 成员方法:
            ServletContext getServletContext() -- HttpServletRequest继承ServletRequest类成员方法
  1. 使用BeanUtils工具包简化对象封装
1. 在获取request请求来的额数据时,如果键值对过多,逐个由键取值getParameter(key)太过繁琐
2. 我们将请求过来的数据键属性封装称一个独立的类,然后通过getParameterMap()方法返回键值对的集合
3. 使用BeanUtils工具包,将键值对的map集合直接封装成类对象,就不用我们逐个去setXxx
4. 使用步骤:
    a. 导包:
        commons-beanutils-1.8.0.jar
    b. 获取所有请求参数,返回map集合:
        Map<String, String[]> map = req.gerParameterMap();
    c. 创建一个封装类对象
        Xxx new_obj = new Xxx();
    d. 调用成员方法populate -- 注意,使用apache的BeanUtils工具类
        BeanUtils.populate(new_obj, map);
    e. 封装完毕,直接通过封装类的getXxx获取成员变量值
5. BeanUtils工具包的其他功能:
    a. 用于封装JavaBean的
        1. JavaBean:标准的Java类
            * 类必须被public修饰
            * 必须提供空参的构造器
            * 成员变量必须使用private修饰
            * 必须提供公共的setter和getter方法
        2. JavaBean类功能:封装数据
    b. 实现细节:
        对于setXxx方法,会截取Xxx,然后首字母小写xxx --> 使用xxx作为属性名
        在BeanUtils工具包中,操作的是属性,而非成员变量,由于自动生成的setter和getter方法符合这一要求
        特例:如果非要set方法与成员变量名不一致,则以set方法的属性名为准
            private String name;
            public void setHehe(String name){
                this.name = name;
            }
            此时必须设置属性名hehe才能设置name成员变量的值,即
            BeanUtils.setProperty(user,"hehe","zhangsan");
    c. 常用成员方法:
        * setProperty(Object obj, String name, String value):设置属性值
        * getProperty(Object obj, String name):获取属性值
        * populate(Object obj, Map<K,V> map):封装对象
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值