HttpServletRequest

本文总结自,B站-遇见狂神说

代表客户端的请求,用户通过Http协议访问服务器,HTTP请求中的所有信息会被封装到HttpServletRequest,通过这个HttpServletRequest方法,获取客户端的信息。

1. 常用方法

获取请求行数据

获取方法
请求方式:getString getMethod()
虚拟目录:/day12String getContextPath()
Servlet路径:/demo1String getServletPath()
get方式请求参数:name=zhangsanString getQueryString()
请求URL:http://localhost/day14/demo1StringBuffer getRequestURL()
协议及版本:HTTP/1.1String getProtocol()
客户机的IP地址:0:0:0:0:0:0:0:1 (ipv6地址)String getRemoteAddr()

获取请求消息数据

  1. 通过请求头的名称获取请求头的值【重点】
String getHeader(String name)
  1. 获取所有的请求头名称
Enumeration<String> getHeaderNames()

代码

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //演示获取请求头数据
        
        //1.获取所有请求头名称
        Enumeration<String> headerNames = request.getHeaderNames();
        //2.遍历
        while(headerNames.hasMoreElements()){
            String name = headerNames.nextElement();
            //根据名称获取请求头的值
            String value = request.getHeader(name);
            System.out.println(name+"---"+value);
        }
    }

结果:

host---localhost:8080
connection---keep-alive
upgrade-insecure-requests---1
user-agent---Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36
accept---text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site---none
sec-fetch-mode---navigate
accept-encoding---gzip, deflate, br
accept-language---zh-CN,zh;q=0.9
cookie---JSESSIONID=3EE93198598AA8F1AD69EB36BD30EAAA; Idea-7cd18826=9b14ca0c-a678-40b9-a3e6-7aa1355f37d9

获取请求体数据

只有POST请求方式,才有请求体,封装了POST请求的请求参数。获取去流对象,在从中拿到数据

  • 获取字符输入流,只能操作字符数据
BufferedReader getReader()	
  • 获取字节输入流,可以操作所有类型数据
ServletInputStream getInputStream()

代码

regist.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>注册页面</title>
</head>
<body>
    <!--必需的 action 属性规定当提交表单时,向何处发送表单数据。-->
    <form action="/07_Request_Respons/requestDemo5" method="post">
        <input type="text" placeholder="请输入用户名" name="username"><br>
        <input type="text" placeholder="请输入密码" name="password"><br>
        <input type="submit" value="注册">

    </form>

</body>
</html>

servlet

@WebServlet("/requestDemo5")
public class RequestDemo5 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取请求消息体--请求参数

        //1.获取字符流
        BufferedReader br = request.getReader();
        //2.读取数据
        String line = null;
        while((line = br.readLine()) != null){
            System.out.println(line);
        }
    }
}

结果:

username=zhangsan&password=12

获取请求参数通用方式

  • get和post请求方式都可以使用下列方法来获取请求参数
获取值方法
根据参数名称获取参数值String getParameter(String name)
根据参数名称获取参数值的数组:【如复选框】String[] getParameterValues(String name)
获取所有请求的参数名称Enumeration<String> getParameterNames()
获取所有参数的map集合Map<String,String[]> getParameterMap()
  • 获取所有请求的参数名称
        Enumeration<String> parameterNames = request.getParameterNames();
        while(parameterNames.hasMoreElements()){
            String name = parameterNames.nextElement();
            System.out.println(name);
            // 获取参数名称对应的值
            String[] values = request.getParameterValues(name);
            for (String value : values) {
                System.out.println(value);
            }         
        }
  • 取所有参数的map集合
        Map<String, String[]> parameterMap = request.getParameterMap();
        //遍历
        Set<String> keyset = parameterMap.keySet();
        for (String name : keyset) {
            
            //获取键获取值
            String[] values = parameterMap.get(name);
            System.out.println(name);
            for (String value : values) {
                System.out.println(value);
            }
        }

2. 中文乱码

请求方式:

  • get:tomcat 8 已经将乱码问题解决了
  • post:会乱码

解决方法:

  • 在获取请求参数前,设置request的编码
request.setCharacterEncoding("utf-8");

3. 请求转发

一种在服务器内部的资源跳转方式

步骤

  1. 通过request对象获取请求转发器对象
RequestDispatcher getRequestDispatcher(String path);
  1. 使用RequestDispatcher对象来进行转发
forward(ServletRequest request, ServletResponse response);

简写

request.getRequestDispatcher("/aservlet").forward(request,response);

特点:forward

  1. 转发地址栏路径不变
  2. 转发只能访问当前服务器下的资源
  3. 转发是一次请求,可以使用request对象来共享数据

4. 域对象:共享数据

一个有作用范围的对象,可以在范围内共享数据

request域:只有请求转发才会有此域

代表一次请求的范围,一般用于请求转发的多个资源中共享数据。

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

5. 获取ServletContext

ServletContext servletContext = request.getServletContext();

结果:

org.apache.catalina.core.ApplicationContextFacade@33e2b08a

案例: 获取前端传递的参数、请求转发

 	@Override
    protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
        // 后台接收中文乱码问题
        request.setCharacterEncoding("utf-8");
        // 发送到前端乱码问题
        response.setCharacterEncoding("utf-8");
        String name = request.getParameter("name");
        String pwd = request.getParameter("pwd");
        String[] hobbys = request.getParameterValues("hobbys");
        System.out.println("===================");
        System.out.println(name);
        System.out.println(pwd);
        System.out.println(Arrays.toString(hobbys));
        System.out.println("===================");

        // 请求转发(/代表当前的web应用)
        request.getRequestDispatcher("/success.jsp").forward(request, response);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值