Servlet-HttpServletRequest

Servlet-HttpServletRequest

HttpServletResquest是一个接口,其父接口是ServletRequest

他是由Tomcat将请求报文转换封装而来的对象,在Tomcat调用service时传入

他代表着客户端发来的请求,所有请求中的信息都可以通过该对象获得


获取请求行信息相关(方式,请求的url,协议及版本)

API说明
StringBuffer getRequestURL()获取客户端请求的URL
String getRequestURL()获取客户端请求项目中的具体资源
String getRequestURI()获取客户端请求的URI
int getServerPort()获取客户端发送请求时的端口
int getLocalPort()获取本应用所在容器的端口
int getRemotePort()获取客户端程序的端口
String getScheme()获取请求协议
String getProtocol()获取请求协议以及版本号
String getMethod()获取请求方式
URI与URL

URI:统一资源标识符

interface URI{}

资源定位的要求和规范

URL:统一资源定位符

class URL implements URI{}

一个具体的资源路径


获取请求头信息相关

API说明
String getHeader(String headerName)根据头名称获取请求头
Emumeration<String> getHeaderNames()获取所有请求头名字
String ContentType()获取content-type请求头

获取请求参数相关

API说明
String getParameter(String ParameterName)根据请求参数名获取请求单个参数值
String[] getParameterValues(String paramaterName)根据请求参数名获取请求多个参数值数组
Emumeration<String> getParameterNames()获取所有请求参数名
Map<String,String[]> getParameterMap()获取所有请求参数的键值对集合
BufferedReader getReader() throws IOException获取读取请求体的字符输入流
ServletInputStrem getInputStream() throws IOException获取读取请求体的字节输入流
int getContentLength()获得请求体长度的字节数
表单例子

使用API获取键值对参数时,无论这些参数在url后还是在请求体中

并不是说get就没有请求体,或者无法将参数放到请求体中,post也不是只能将参数放到请求体中,不能放到URI中😶

<form action="HttpServletRequestTest" method="get">
    账号:<input type="text" name="username"><br>
    密码:<input type="text" name="password"><br>
    篮球<input type="checkbox" name="hobby" value="篮球">
    足球<input type="checkbox" name="hobby" value="足球">
    羽毛球<input type="checkbox" name="hobby" value="羽毛球">
    乒乓球<input type="checkbox" name="hobby" value="乒乓球">
    <input type="submit" value="提交">
</form>
获取参数值(包括多个参数)
@WebServlet("/HttpServletRequestTest")
public class HttpServletRequestTest extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //根据key获取value
        String username = req.getParameter("username");
        System.out.println(username);
        //根据key获取多个value(比如多选框)
        String[] hobbies = req.getParameterValues("hobby");
        System.out.println(Arrays.toString(hobbies));
        }
    }
}
获取所有参数名和参数值(使用getParameterNames)
@WebServlet("/HttpServletRequestTest")
public class HttpServletRequestTest extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Enumeration<String> parameterNames = req.getParameterNames();
        while (parameterNames.hasMoreElements()) {
            String parameterName = parameterNames.nextElement();
            String[] parameter = req.getParameterValues(parameterName);
            if (parameter.length > 1) {
                System.out.println(parameterName + ":" + Arrays.toString(parameter));
            } else {
                System.out.println(parameterName + ":" + parameter[0]);
            }
        }
    }
}
获取所有参数名和参数值(使用getParameterMap)
@WebServlet("/HttpServletRequestTest")
public class HttpServletRequestTest extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Map<String, String[]> parameterMap = req.getParameterMap();
        for (Map.Entry<String, String[]> stringEntry : parameterMap.entrySet()) {
            String key = stringEntry.getKey();
            String[] value = stringEntry.getValue();
            if (value.length > 1) {
                System.out.println(key + ":" + Arrays.toString(value));
            } else {
                System.out.println(key + ":" + value[0]);
            }
        }
    }
}

获取请求体中非键值对的内容

请求体中还会存放一些其他内容,比如json串和文件等

BufferedReader reader = req.getReader();//从请求体获得一个字符输入流来读取json串
ServletInputStream inputStream = req.getInputStream();//从请求体中获得一个字节输入流来读取文件

请求体中存json串和文件一般用于文件上传,使用异步请求时可以测试这两个API🙂


其他API

API说明
String getServletPath()获取请求的Servlet的映射路径
ServletContext getServletContext()获取ServletContext对象
Cookie[] getCookies()获取请求中的所有cookie
HttpSession getSession()获取Session对象
void setCharacterEncoding(String encoding)设置请求体字符集