HttpServletRequest对象
HttpServletRequest对象介绍
HttpServletRequest 对象:主要作用是用来接收客户端发送过来的请求信息,例如:请求的参数,发送的头信息等 都属于客户端发来的信息,service()方法中形参接收的是 HttpServletRequest 接口的实例化对象,表示该对象主要 应用在 HTTP 协议上,该对象是由 Tomcat 封装好传递过来。
HttpServletRequest 是 ServletRequest 的子接口,ServletRequest 只有一个子接口,就HttpServletRequest。 既然只有一个子接口为什么不将两个接口合并为一个? 从长远上讲:现在主要用的协议是 HTTP 协议,但以后可能出现更多新的协议。若以后想要支持这种新协议,只需要 直接继承 ServletRequest 接口就行了。
在 HttpServletRequest 接口中,定义的方法很多,但都是围绕接收客户端参数的。但是怎么拿到该对象呢?不需 要,直接在 Service 方法中由容器传入过来,而我们需要做的就是取出对象中的数据,进行分析、处理。
Service方法使用
Service方法主要是通过调用get(),post()等方法到响应客户端的请求。可以直接重写Service方法,也可以只重写各个请求类型对应的方法
接收方法常用的方法
-
getRequestURL() 获取客户端发出的请求时的完整URL -
getRequestURI() 获取请求行中的资源部分名称(项目名称开始) -
getQueryString() 获取请求行中的参数部分 -
getMethod() 获取客户端的请求方式 -
getProtocol() 获取HTTP版本号 -
getContextPath() 获取webapp名字
例子
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String URL = request.getRequestURI().toString();
System.out.println("URL = " + URL);
String URI = request.getRequestURI();
System.out.println("URI = " + URI);
String Method = request.getMethod();
System.out.println("Method = " + Method);
String param = request.getQueryString();
System.out.println("Param = " + param);
String Version = request.getProtocol();
System.out.println("Version = " + Version);
String Project = request.getContextPath();
System.out.println("Project name = " + Project);
}
输入localhost:8080/study/tmp?name = tom&age = 10
打印结果为
URL = /study/tmp
URI = /study/tmp
Method = GET
Param = name%20=%20tom&age%20=%2010
Version = HTTP/1.1
Project name = /study
注意
这里出现了字符%20 这是空格的ASC码的16进制数
重点: 获取请求中的参数
-
getParameter(name) //获取参数name 的值 String name = request.getParameter("name");
System.out.println(name);
-
getParametersValues(name) //获取name的所有值 String[] parameters = request.getParameterValues("age");
if (parameters == null) return;
for(String tmp : parameters){
System.out.print(tmp + " ");
}
处理请求中含有中文的乱码问题
由于现在的 request 属于接收客户端的参数,所以必然有其默认的语言编码,主要是由于在解析过程中默认使用的编 码方式为 ISO-8859-1(此编码不支持中文),所以解析时一定会出现乱码。要想解决这种乱码问题,需要设置 request 中的编码方式,告诉服务器以何种方式来解析数据。或者在接收到乱码数据以后,再通过相应的编码格式还原。
-
方法一: 通过setCharacterEncoding(“UTF-8”)这种方法只针对POST请求有效 在获取参数之前加上request.setCharacterEncoding(“UTF-8”) -
方法二:借助了String 对象的方法,该种方式对任何请求有效,是通用的。 这种方法是通用的但是也不能乱用,如果编码正确,可能反而转换成了错误的编码。 同过new String(request.getParameter(name).getBytes("ISO-8859-1"),"UTF-8");
GET方法在Tomcat8以后就不会出现乱码的情况。所以不用管GET请求乱码。
|