代码的一些优化

举报
兰舟千帆 发表于 2022/07/21 19:19:12 2022/07/21
【摘要】 代码的一些优化我们主要再来看这个doGet()和doPost()两个方法这两个方法中的参数体是一样的,参数名只是名字不同。然后处理逻辑可能有一点点差异。但是我们是否可以提供一种统一获取请求参数的方式,来统一一下doGet和doPost方法体当中的代码。在这之前我们再来理一下相关的方法HTTP请求数据中包含了请求行、请求头和请求体,针对这三部分内容,Request对象都提供了对应的API方法...

代码的一些优化

我们主要再来看这个doGet()和doPost()两个方法
在这里插入图片描述
这两个方法中的参数体是一样的,参数名只是名字不同。然后处理逻辑可能有一点点差异。
但是我们是否可以提供一种统一获取请求参数的方式,来统一一下doGet和doPost方法体当中的代码。

在这之前我们再来理一下相关的方法

HTTP请求数据中包含了请求行、请求头和请求体,针对这三部分内容,Request对象都提供了对应的
API方法来获取对应的值:

请求行
getMethod()获取请求方式 getContextPath()获取项目访问路径getRequestURL()获取请求URL getRequestURI()获取请求URI getQueryString()获取GET请求方式的请求参数
请求头
getHeader(String name)根据请求头名称获取其对应的值请求体
注意: 浏览器发送的POST请求才有请求体如果是纯文本数据:getReader()
如果是字节数据如文件数据:getInputStream()

我们来演示一下getQueryString();
我们需要在访问地址栏中填入参数。

这是我们用到的代码

package jgd;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/demo4")
public class ServletDemo4 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        super.doGet(req, resp);
        System.out.println("get...");
        String queryString = req.getQueryString();
        System.out.println(queryString);

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        super.doPost(req, resp);
        System.out.println("post...");
    }
}

这是我们启动项目后访问地址并填入参数的例子。
在这里插入图片描述
然后回车看输出。
下面最后一行的字段就是我们这个方法获取到的数据。我们这个叫请求数据。
在这里插入图片描述
于是我们归结上面的我们提出两种获取请求数据的方式。
对于请求参数的获取,常用的有以下两种:
GET方式:

String getQueryString()

POST方式:

BufferedReader getReader();

针对不同的请求,我们首先可以这样。

package jgd;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
@WebServlet("/demo4")
public class ServletDemo4 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        super.doGet(req, resp);
        System.out.println("get...");
        String queryString = req.getQueryString();
        System.out.println(queryString);

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        super.doPost(req, resp);
        BufferedReader reader = req.getReader();
        String s = reader.readLine();
        System.out.println(s);

    }
}

在这里插入图片描述
重复了,当然你可能说一行不多,但是很有代表性的是,如果是请求方式的不同将来业务逻辑要求我们类似这样做出很多重复代码呢?这样就不是很好。

我们可以这样解决。原因在于方法体参数一样。

package jgd;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;

@WebServlet("/demo4")
public class ServletDemo4 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        super.doGet(req, resp);
//        System.out.println("get...");
//        String queryString = req.getQueryString();
//        System.out.println(queryString);
        String params = " ";
        String method = req.getMethod();
        if ("GET".equals(method)) {
            params = req.getQueryString();
        } else if ("POST".equals(method)) {
            BufferedReader reader = req.getReader();
            params = reader.readLine();
        }
        System.out.println(params);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        super.doPost(req, resp);
//        BufferedReader reader = req.getReader();
//        String s = reader.readLine();
//        System.out.println(s);
        this.doGet(req,resp);

    }
}

但是这样的方式还需要写很多代码,我们想要寻求
一种更加简单的方式。

我们来看一些方法
获取所有参数得Map集合

Map<String,String[]> getParameterMap()

这个方法让我们获取的是Map集合类型的数据。对应键值对,键唯一,值可以多,是一个数组。

根据名称获取到值(数组)

String[] getParameterValues(String name)

根据名称获取到单个值

String getParameter(String name)

测试代码
先写一个表单

package jgd;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Map;
@WebServlet("/jgdabc00")
public class ServletDemo10 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        super.doGet(req, resp);
//        Get请求逻辑
        System.out.println("get---");
//        获取所有参数的map集合
        Map<String, String[]> map = req.getParameterMap();
        String queryString = req.getQueryString();
        System.out.println(queryString);
        for (String key:map.keySet())
        {
            System.out.print(key+":");
            String[] values = map.get(key);
            //获取value
            for (String value:values)
                System.out.println(value+" ");

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

    }
//



    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("post---");
    }
}

启动!
访问到这个地址,把表单填写了。
在这里插入图片描述
在这里插入图片描述

提交以后
在这里插入图片描述

这是我们的一个代码举例。

我们刚刚说这是一个统一的获取的请求方式的代码。我们验证一下。我们把这些方法放到doPost里面,然后把表单的提交方式变为post。

package jgd;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Map;
@WebServlet("/jgdabc00")
public class ServletDemo10 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        super.doGet(req, resp);
//        Get请求逻辑
        System.out.println("get---");
//
    }
//



    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("post---");
//        获取所有参数的map集合
        Map<String, String[]> map = req.getParameterMap();
        String queryString = req.getQueryString();
        System.out.println(queryString);
        for (String key:map.keySet())
        {
            System.out.print(key+":");
            String[] values = map.get(key);
            //获取value
            for (String value:values)
                System.out.println(value+" ");

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


    }
}

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="/jgdabc00" method="post">
    <input type="text" name="username">
    <input type="password" name="password">
    <input type="checkbox" name="hobby" value="1">游泳
    <input type="checkbox" name="hobby" value="2">爬山<br>
    <input type="submit">

</form>

</body>
</html>

然后我们再次开启运行一次。看看能不能获取到数据。

在我们提交表单数据后,这里没有参数,代表了我们是按照post方式提交的。然后我们看控制台输出。
在这里插入图片描述

在这里插入图片描述
可见该段代码可以在两个方法中通用。于是我们写出一种简化的方式。

package jgd;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Map;
@WebServlet("/jgdabc00")
public class ServletDemo10 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        super.doGet(req, resp);
//        Get请求逻辑
        System.out.println("get---");
        this.doPost(req,resp);
//
    }
//



    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("post---");
//        获取所有参数的map集合
        Map<String, String[]> map = req.getParameterMap();
        String queryString = req.getQueryString();
        System.out.println(queryString);
        for (String key:map.keySet())
        {
            System.out.print(key+":");
            String[] values = map.get(key);
            //获取value
            for (String value:values)
                System.out.println(value+" ");

        }
//        根据key获取参数值,数组
        String[] hobbies = req.getParameterValues("hobby");
//        for(String hobby:hobbies){
//            System.out.println(hobby);
//        }
//        根据key获取单个参数值
        String password = req.getParameter("password");
        System.out.println(password);
//        等相同业务代码


    }
}
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。