Servlet请求对象的使用方法

1. 请求对象概述

所谓请求本质就是通过网站获取资源,在B/S架构中,就是客户浏览器向服务器发出询问。

所谓请求对象,就是在JavaEE工程中,用于发送请求的对象。我们常用的对象ServletRequest和HttpServletRequest,它们的区别就是是否和HTTP协议有关。

ServletRequest和HttpServletRequest实际上是两个接口,但我们使用请求对象不需要去实现接口,有服务器去实现,我们直接使用请求对象就可以了

2. 请求对象常用方法-获取各种路径

/*
* 获取路径的方法
* */
@WebServlet("/servletDemo01")
public class ServletDemo01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1. 获取虚拟路径名称(自己配置的名称)
        String contextPath = req.getContextPath();
        System.out.println(contextPath);// /request

        //2. 获取servlet的映射路径(资源路径)
        String servletPath = req.getServletPath();
        System.out.println(servletPath);// /servletDemo01

        //3. 获取访问者的ip地址
        String remoteAddr = req.getRemoteAddr();
        System.out.println(remoteAddr);// 127.0.0.1本机地址

        //4. 获取请求消息的数据(username&password)
        String queryString = req.getQueryString();
        System.out.println(queryString);// null

        //5. 获取统一资源标识符(虚拟路径+servlet映射路径)
        String requestURI = req.getRequestURI();
        System.out.println(requestURI); // /request/servletDemo01

        //6. 获取统一资源定位符(全路径)
        StringBuffer requestURL = req.getRequestURL();
        System.out.println(requestURL); // http://localhost:8080/request/servletDemo01
    }

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

3. 请求对象常用方法-获取请求头信息

请求头:可以通过网页 检查---Network---Request Headers 查看

/*
* 获取请求头信息的相关方法
* */
@WebServlet("/servletDemo02")
public class ServletDemo02 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.根据请求头名称获取其对应的一个值
        String connection = req.getHeader("connection");
        System.out.println(connection);
        System.out.println("---------------------");
        //2.根据请求头名称获取其对应的多个值
        Enumeration<String> values = req.getHeaders("accept-encoding");
        System.out.print("accept-encoding: ");
        while (values.hasMoreElements()){
            String value = values.nextElement();
            System.out.print(value+ " ");
        }
        System.out.println("");
        System.out.println("---------------------");

        //3.获取所有请求头名称
        Enumeration<String> headerNames = req.getHeaderNames();
        while (headerNames.hasMoreElements()){
            String name = headerNames.nextElement();
            String value = req.getHeader(name);
            System.out.println(name + ":" + value);
        }
    }

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

4. 请求对象常用方法-获取请求参数(非常重要)

注册页面用于提交参数:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>注册页面</title>
</head>
<body>
    <form action="/request/servletDemo03" method="get" autocomplete="off">
        姓名:<input type="text" name="username"><br>
        密码:<input type="password" name="password"><br>
        爱好:<input type="checkbox" name="hobby" value="game">游戏
             <input type="checkbox" name="hobby" value="study">学习<br>
        <button type="submit">注册</button>
    </form>
</body>
</html>

常用方法:

/*获取请求参数相关方法*/

@WebServlet("/servletDemo03")
public class ServletDemo03 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.根据name属性获取对应的数据
        String username = req.getParameter("username");
        System.out.println(username);
        String password = req.getParameter("password");
        System.out.println(password);
        System.out.println("-----------------------");
        //2.根据那么属性获取所有数据
        String[] hobbies = req.getParameterValues("hobby");
        for (String hobby : hobbies) {
            System.out.println(hobby);
        }
        System.out.println("-----------------------");
        //3.获取所有name属性
        Enumeration<String> parameterNames = req.getParameterNames();
        while(parameterNames.hasMoreElements()){
            String name = parameterNames.nextElement();
            System.out.println(name);
        }
        System.out.println("-----------------------");
        //4.获取所有参数键值对
        Map<String, String[]> parameterMap = req.getParameterMap();
        Set<String> set = parameterMap.keySet();
        for (String name : set) {
            String[] values = parameterMap.get(name);
            System.out.print(name + ":");
            for (String value : values) {
                System.out.print(value + " ");
            }
            System.out.println("");
        }

    }

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

5. 封装请求参数到实体类中

  • 方法一:直接封装,不适用于参数过多的情况;
  • 方法二:使用反射方式封装参数,有点复杂;
  • 方法三: 使用apache的commons-beanutils实现封装,使用第三方jar包,方便简单;

方法三:

/*将参数封装*/

@WebServlet("/servletDemo04")
public class ServletDemo04 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //若请求方式为post,需要解决中文乱码问题
        req.setCharacterEncoding("utf-8");//和注册页面编码一致

        Map<String, String[]> parameterMap = req.getParameterMap();
        //使用BeanUtils工具类进行封装
        Student stu = new Student();
        try {
            BeanUtils.populate(stu,parameterMap);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        System.out.println(stu);

    }

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

6. 流对象获取数据

/*流对象获取数据*/

@WebServlet("/servletDemo05")
public class ServletDemo05 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //字符流--了解(注册页面必须使用post提交)
        /*BufferedReader br = req.getReader();
        String line;
        while((line=br.readLine())!=null){
            System.out.println(line);
        }*///username=liulu&password=123&hobby=game&hobby=study
        //br.close(); 不需要手动释放资源

        //字节流--可以获取图片等二进制文件(提交方式为post)
        ServletInputStream si = req.getInputStream();
        byte[] arr = new byte[1024];
        int len;
        while((len=si.read(arr))!=-1){
            System.out.println(new String(arr,0,len));
        }//username=liulu&password=123&hobby=game&hobby=study
    }

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

7. 请求域和请求转发

请求域:可以在一次请求范围类进行数据共享,一般用于请求转发的多个资源中共享数据

请求转发:客户端在发出一次请求到达ServletA后,ServletA不能实现其功能,需要借助ServletB来实现功能

请求转发特点:

  • 浏览器地址栏不变
  • 请求域对象中的数据不会丢失
  • 负责转发的Servlet转发前后的响应正文会丢失
  • 由转发的目的地来响应客户端

访问servletDemo06会直接执行servletDemo07:

/*请求转发*/

@WebServlet("/servletDemo06")
public class ServletDemo06 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置一个请求域共享数据
        req.setAttribute("desc","gong xiang shu ju");
        //获取请求调度对象
        RequestDispatcher dispatcher = req.getRequestDispatcher("/servletDemo07");
        //通过请求调度对象,将req,和resp都转发给servletDemo07
        dispatcher.forward(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
/*请求转发*/

@WebServlet("/servletDemo07")
public class ServletDemo07 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取到共享数据
        Object desc = req.getAttribute("desc");
        System.out.println(desc);

        System.out.println("servlet07执行了。。。。");
    }

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

如有错误欢迎留言评论,2021年7月7日  羽露风

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

羽露风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值