Servlet-Request通用方式获取请求参数

Servlet-Request通用方式获取请求参数

GET请求方式和POST请求方式区别主要在于获取请求参数的方式不一样,是否可以提供统一获取请求参数的方式,从而统一doGet和doPost方法内的代码?

核心结论

HttpServletRequest#getParameter* 系列可以统一读取:

所以“统一代码”的关键不是区分 GET/POST,而是:把参数读取与业务处理抽出来复用。

三组常用 API 的职责

它们适合“表单参数”。如果请求体是 JSON(application/json),需要读 Body 自己解析(见 Servlet-获取请求参数 / Ajax)。

@WebServlet("/req2")
public class RequestDemo2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // GET请求逻辑
        System.out.println("get....");

        // 1. 获取所有参数的Map集合
        Map<String, String[]> map = req.getParameterMap();
        for (String key : map.keySet()) {
            //username:zhangsan
            System.out.print(key+":");

            //获取值
            String[] values = map.get(key);
            for (String value : values) {
                System.out.print(value + " ");
            }

            System.out.println();
        }

        System.out.println("-----------");

        // 2. 根据key获取参数值,数组
        String[] hobbies = req.getParameterValues("hobby");
        for (String hobby : hobbies) {
            System.out.println(hobby);
        }

        System.out.println("------------");

        // 3. 根据Key获取单个参数值
        String username = req.getParameter("username");
        String password = req.getParameter("password");

        System.out.println(username);
        System.out.println(password);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // POST请求逻辑
        System.out.println("post....");

        // 1. 获取所有参数的Map集合
        Map<String, String[]> map = req.getParameterMap();
        for (String key : map.keySet()) {
            //username:zhangsan
            System.out.print(key+":");

            //获取值
            String[] values = map.get(key);
            for (String value : values) {
                System.out.print(value + " ");
            }

            System.out.println();
        }

        System.out.println("-----------");

        // 2. 根据key获取参数值,数组
        String[] hobbies = req.getParameterValues("hobby");
        for (String hobby : hobbies) {
            System.out.println(hobby);
        }

        System.out.println("------------");

        // 3. 根据Key获取单个参数值
        String username = req.getParameter("username");
        String password = req.getParameter("password");

        System.out.println(username);
        System.out.println(password);
    }
}

更推荐的“统一写法”(更贴近 MVC)

把“读取参数 + 业务处理”封装到一个方法里,然后 GET/POST 都调用它:

private void handle(HttpServletRequest req, HttpServletResponse resp) throws IOException {
    String username = req.getParameter("username");
    String password = req.getParameter("password");
    resp.setContentType("text/plain;charset=utf-8");
    resp.getWriter().write(username + ":" + password);
}

这样做的好处:

关联:MVC模式 / Request & Response / Servlet-请求参数中文乱码解决方式