JavaEE知识整理(三)(HttpServletRequest)

HttpServletRequest

1 HttpServletRequest概述

客户端发送给服务器端的数据。

我们在创建Servlet时会覆盖service()⽅法,或doGet()/doPost(),这些⽅法都有两个参数,代表请求的request和代表响应response。

service⽅法中的request的类型是ServletRequest⽽doGet/doPost⽅法的request的类型是HttpServletRequest,HttpServletRequest是ServletRequest的⼦接⼝,功能和⽅法更加强⼤,所以我们学习HttpServletRequest。

2 request的运行流程

在这里插入图片描述

3 通过抓包工具抓取Http请求

在这里插入图片描述

因为request代表请求,所以我们可以通过该对象分别获得Http请求的请求⾏、请求头和请求体。

4 通过request获得请求行

  • 获得客户端的请求方式:String getMethod()
  • 获得请求的资源:
    • String getRequestURI() – 获取请求UPI()
    • StringBuffer getRequestURL()
    • String getContextPath() – 获取虚拟目录
    • String getServletPath() – 获取Servlet路径
    • String getQueryString() – 获取get⽅式请求参数
      username=zhangsan&password=123
    • String getRemoteAddr() – 获取客户机的IP地址

5 通过request获得请求头

  • long getDateHeader(String name)
  • String getHeader(String name)
  • int getIntHeader(String name)
  • Enumeration<String> getHeaderNames() – 获取所有的请求头名称

常⻅的请求头:

  1. User-Agent:浏览器告诉服务器,我访问你使⽤的浏览器版本信息

    作⽤:可以在服务器端获取该头的信息,解决浏览器的兼容性问题

  2. Referer:告诉服务器,我(当前请求)从哪⾥来?

    作⽤:防盗链

referer.contains(“day03_war_exploded”) 判断是否包含这个字段,用来判断是否在同一应用中

//处理盗链的部分代码
@WebServlet("/ServletRequest/Demo03")
public class Demo03 extends HttpServlet {
    @Override

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //处理盗链
        String referer = req.getHeader("referer");
        if (referer == null || referer.contains("day03_war_exploded")){
            resp.getWriter().write("success!");
        }else {
            System.out.println("fail");
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req, resp);
    }
}

6 通过request获得请求体

请求体:只有POST请求⽅式,才有请求体,在请求体中封装了POST请求的请求参数。
步骤:

  1. 获取流对象
    • BufferedReader getReader():获取字符输⼊流,只能操作字符数据
    • ServletInputStream getInputStream():获取字节输⼊流,可以操作所有类型数据
//是下面的7.1功能的底层原理
@WebServlet("/Servlet/Demo05")
public class Demo05 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //读?后面的参数
        String queryString = req.getQueryString();
        System.out.println(queryString);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletInputStream inputStream = req.getInputStream();
        inputStream.readAllByte();
    }
}

7 request的其他功能

7.1 获取请求参数通⽤⽅式

不论get还是post请求⽅式都可以使⽤下列⽅法来获取请求参数

  1. String getParameter(String name):根据参数名称获取参数值
    username=zs&password=123
  2. String[] getParameterValues(String name):根据参数名称获取参数值的数组
    hobby=xx&hobby=game
  3. Enumeration<String> getParameterNames():获取所有请求的参数名称
  4. Map<String,String[]> getParameterMap():获取所有参数的map集合
  • 中⽂乱码问题
    get⽅式:tomcat 8 已经将get⽅式乱码问题解决了
    post⽅式:会乱码(ISO8859-1)
    • 解决:在获取参数前,设置request的编码request.setCharacterEncoding(“utf-8”);
@WebServlet("/ServletRequest/Demo04")
public class Demo04 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置请求字符集 - 只针对Post请求方式有效 解决中文乱码问题
        req.setCharacterEncoding("UTF-8");
        //适用于一个name对应一个值的情况
        String username = req.getParameter("username");
        System.out.println(username);
       /* //假设下列代码只针对Post()
        //编码
        byte[] bytes = username.getBytes("ISO8859-1");
        username = new String(bytes,"UTF-8");*/
        String password = req.getParameter("password");
        System.out.println(password);

        //适用于多选,也就是一个name对应多个值的情况
        String[] hobbies = req.getParameterValues("hobby");
        System.out.println(Arrays.toString(hobbies));

        //将所有参数封装成map格式,key就是参数名,value就是参数值[数值]
        Map<String, String[]> parameterMap = req.getParameterMap();
        Set<Map.Entry<String, String[]>> entries = parameterMap.entrySet();
        for (Map.Entry<String,String[]> entry : entries){
            System.out.print(entry.getKey() + ":");
            System.out.println(Arrays.toString(entry.getValue()));
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req, resp);
    }
}

7.2 请求转发

请求转发:⼀种在服务器内部的资源跳转⽅式[默认当前应用], path 不需要加应用名

  1. 步骤:
    1. 通过request对象[域范围(一次请求)]获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)
    2. 使⽤RequestDispatcher对象来进⾏转发:forward(ServletRequest request,ServletResponse response)
  2. 特点:
    1. 浏览器地址栏路径不发⽣变化
    2. 只能转发到当前服务器内部资源中
    3. 转发是⼀次请求
@WebServlet("/Servlet/Demo06")
public class Demo06 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获得应用名
        req.getContextPath();
        //request 作为域对象使用
        req.setAttribute("user","张三");
        System.out.println("Demo06存进去了数据");
        //请求转发 - Demo07Servlet
        req.getRequestDispatcher("/Demo07Servlet").forward(req,resp);
        //下面不要写代码了
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req, resp);
    }
}

@WebServlet("/Demo07Servlet")
public class Demo07 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Object name = req.getAttribute("user");
        System.out.println(name);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req, resp);
    }
}
/* /Demo07Servlet  -> 服务器端路径
直接访问属于客户端和服务器之间的行为, 必须要加应用名
/day03/Demo07Servlet -> 客户端路径 */

7.3 共享数据

域对象:⼀个有作⽤范围的对象,可以在范围内共享数据

request域:代表⼀次请求的范围,⼀般⽤于请求转发的多个资源中共享数据

⽅法:

  1. void setAttribute(String name,Object obj):存储数据
  2. Object getAttitude(String name):通过键获取值
  3. void removeAttribute(String name):通过键移除键值对

注意:ServletContext域与Request域的⽣命周期⽐较?

  • ServletContext

    创建:服务器启动

    销毁:服务器关闭

    域的作⽤范围:整个web应⽤

  • request

    创建:访问时创建request

    销毁:响应结束request销毁

    域的作⽤范围:⼀次请求中

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值