Http之请求对象

本文详细介绍了如何使用Servlet处理HTTP请求,包括获取请求行、请求头和请求参数的方法,以及如何解决请求参数中文乱码的问题。通过示例代码展示了HttpServletRequest对象的常用方法,如获取请求方式、请求头、请求参数等,并提供了两种解决POST请求中文乱码的解决方案:先编码再解码或设置字符编码。同时,提到了在Tomcat7.0中处理GET和POST请求中文乱码的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

请求对象获取请求行

请求对象获取请求头

请求对象获取请求参数

请求参数的封装

请求参数中文乱码问题 重点!

  • ServletRequest对象包含了请求信息(请求行、请求头、请求体),通过Servlet的services方法传递的;

  • HttpServletRequest提供了额外的针对HTTP协议相关的功能。

请求对象获取请求行

@WebServlet("/demo13")
public class Demo13Servlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //getMethod : 获取请求方式
        System.out.println("请求方式 = " + request.getMethod());
        //getContextPath : 获取项目访问路径
        System.out.println("项目访问路径 = " + request.getContextPath());
        //getServletPath : 获取Servlet访问路径
        System.out.println("Servlet访问路径 = " + request.getServletPath());
        //getRemoteAddr : 获取客户端地址
        System.out.println("客户端地址 : " + request.getRemoteAddr());
        //getLocalAddr : 获取服务器地址
        System.out.println("服务器地址 : " + request.getLocalAddr());
        //getRequestURL : 找设备 -> 找tomcat -> 找项目 -> 找资源
        System.out.println("统一资源定位符 : " + request.getRequestURL());
        //getRequestURI : 找项目 -> 找资源
        System.out.println("统一资源标识符 : " + request.getRequestURI());
        //getQueryString(了解) : 获取URL后的参数
        System.out.println("QueryString : " + request.getQueryString());


    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

请求对象获取请求头

@WebServlet("/demo14")
public class Demo14Servlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //getHeader : 根据指定请求头名称获取值
        String userAgent = request.getHeader("User-Agent");
        System.out.println("userAgent = " + userAgent);
        //getHeaders : 根据指定请求头名称获取一组值
        Enumeration<String> headerValues = request.getHeaders("User-Agent");
        while (headerValues.hasMoreElements()) {
            String headerValue = headerValues.nextElement();
            System.out.println("userAgent = " + headerValue);
        }
        //getHeaderNames: 获取所有请求头名称
        Enumeration<String> headerNames = request.getHeaderNames();
        while (headerNames.hasMoreElements()) {
            String headerName = headerNames.nextElement();
            String headerValue = request.getHeader(headerName);
            System.out.println("headerName = " + headerName + " , headerValue = " + headerValue);
        }


    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

请求对象获取请求参数

@WebServlet("/demo15")
public class Demo15Servlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //getParameter : 根据指定请求参数名称获取值
        String username = request.getParameter("username");
        System.out.println("username = " + username);
        String password = request.getParameter("password");
        System.out.println("password = " + password);

        //getParameterValues : 根据指定请求参数名称获取一组值(多选)
        String username2 = request.getParameterValues("username")[0];
        System.out.println("username2 = " + username2);
        String password2 = request.getParameterValues("password")[0];
        System.out.println("password2 = " + password2);

        //getParameterNames : 获取所有请求参数名称
        Enumeration<String> parameterNames = request.getParameterNames();
        while (parameterNames.hasMoreElements()) {
            String parameterName = parameterNames.nextElement();
            String parameterValue = request.getParameter(parameterName);
            System.out.println("parameterName = " + parameterName + " , parameterValue = " + parameterValue);
        }

        //getParameterMap : 获取请求参数,并将其封装成map(键=参数名,值=一组参数值)
        Map<String, String[]> parameterMap = request.getParameterMap();
        Set<Map.Entry<String, String[]>> entrySet = parameterMap.entrySet();
        for (Map.Entry<String, String[]> entry : entrySet) {
            String parameterName = entry.getKey();
            String[] parameterValues = entry.getValue();
            System.out.println("parameterName = " + parameterName + " , parameterValues = " + Arrays.toString(parameterValues));

        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

请求参数的封装

一般都是使用工具类自动封装即可。

User user = new User();
        try {
            BeanUtils.populate(user, request.getParameterMap());
            System.out.println("user = " + user);
        } catch (Exception e) {
            e.printStackTrace();
        }

注意事项

  • ①ClassNotFoundException: org.apache.commons.beanutils.BeanUtils,一般都是jar包导入有问题;javaweb项目,jar包的lib目录应该在WEB-INF目录中。

  • ②使用BeanUtils工具类时,表单中的name属性值和setXxx方法名一致,和javabean中的属性名无关。

请求参数中文乱码问题 重点!

  • GET请求

    • 没有请求参数中文乱码问题

  • POST请求

    • 有请求参数中文乱码问题

  • 解决方案

    • ①先编码(iso8859-1),再解码(utf-8)

    • ②告诉服务器,以utf-8解码请求正文

方案1:

@WebServlet("/demo18")
public class Demo18Servlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = request.getParameter("username");
        //先编码(iso8859-1)
        byte[] bys = username.getBytes("iso8859-1");
        //再解码(utf-8)
        username = new String(bys,"utf-8");

        System.out.println("username = " + username);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

解决方案2:

@WebServlet("/demo19")
public class Demo19Servlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //告诉服务器,以utf-8解码请求正文
        request.setCharacterEncoding("utf-8");

        String username = request.getParameter("username");
        System.out.println("username = " + username);

        String password = request.getParameter("password");
        System.out.println("password = " + password);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}
  • tomcat7.0(了解)

    • GET请求

      • 有请求参数中文乱码问题

      • ①先编码(iso8859-1),再解码(utf-8)

      • ②告诉服务器,以utf-8解码路径后参数 ( URIEncoding="UTF-8")

    • POST请求

      • 有请求参数中文乱码问题

      • ①先编码(iso8859-1),再解码(utf-8)

      • ②告诉服务器,以utf-8解码请求正文

  • 注意事项

    • request.setCharacterEncoding("utf-8");必须放在所有获取请求参数之前,否则无效!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值