Request对象
即HttpServletRequest对象,该对象它继承自ServletRequest接口,专门用来封装HTTP请求消息。由于HTTP请求消息分为请求行、请求消息头和请求消息体三部分,因此,在HttpServletRequest接口中定义了获取请求行、请求头和请求消息体的相关方法.
Http请求包含哪些东西
Get请求中没有请求体,它请求体中的参数都附带在请求路径上了
Request获取请求行
请求行主要有两个重要的东西,请求方式和请求路径
//获取请求方式。如:post,get
request.getMethod();
//获取项目路径
request.getContextPath();
获取项目访问路径非常重要,在servlet中进行重定向时,可以不把项目名写死,如;
访问项目下的loginServlet
//原先的方式
response.sendRedirect("/项目名/login");
//现在的方式
response.sendRedirect(request.getContextPath()+"/login");
Request 获取请求头
从上图中可以看出,请求头的数据和响应头的数据格式都是键值对的形式。所以HttpServletRequest提供了输入key就可以获得value的方法。
- 获取单个value
//根据键获取对应的值
String getHeader(String name) ;
//获取浏览器的信息
tring userAgent = request.getHeader("User-Agent");
- 一次性获取所有的key,再进行迭代
//返回所有key
Enumeration<String> enumeration = request.getHeaderNames();
//迭代获取value
while(enumeration.hasMoreElements()){
String key = enumeration.nextElement();
//根据 key获取value
String value = request.getHeader(key);
System.out.println(key+":"+value);
}
Request获取请求体
只有Post请求的方式才有请求体,Get方式请求的参数附加在请求路径上。但都可以通过相同的方式获取。
- 方法一: 获取单个请求参数
//根据一个参数名,获取参数的值
String getParameter(String name) ;
String username = request.getParameter("username");
- 方法二: 单个参数有多个值
//根据一个参数名,获取参数的多个值 如果没有值,则返回null
String[] getParameterValues(String name) 一个键多个值
- 方式三: 获取所有请求参数的key,通过迭代获取value
getParamterValues()
Map<String,String[]> map = request.getParameterMap();
//取出map中所有的key
Set<String> keys = map.keySet();
for(String key:keys){
System.out.println(key+" "+Arrays.toString(map.get(key)));//get方法根据key查找value
}
Request获取请求参数出现中文乱码
请求参数出现乱码的原因还是由于浏览器和tomcat默认的编码方式不同,浏览器通过本地的默认编码方式(GBK,UTF-8)将中文进行编码,tomcat使用默认的iso-8859-1编码进行解码,这样当然会出现乱码;
-
方式一:修改tomcat的xml配置文件,更改默认编码方式
打开tomcat中conf目录下的server.xml文件,找到
添加URIEncoding属性,设置为UTF-8。即可将默认编码方式改为UTF-8.
这种方式虽然一劳永逸,但会导致服务器并不灵活,不推荐 -
方式二: post请求乱码,只需要设置request对象的编码即可。
request.setCharacterEncoding("UTF-8");
-
方式三: get请求乱码
- tomcat8.5及其以后get请求不会乱码
- get请求乱码通过设置setCharacterEncoding并不管用,需要将字符串进行iso-8859-1解码,再使用utf-8编码.
接上图:
get请求乱码原因是这样:
可以将乱码反过来用:
代码实现为:
//data = ??? String data = request.getParameter("country"); //将data进行iso-8859-1编码 byte[] bytes = data.getBytes("iso-8859-1"); //utf-8解码 String str = new String(bytes,"utf-8"); //一步到位 String str = new String(data.getBytes("iso-8859-1"),"utf-8");
Request转发
Request转发的原理是:当前Sevlet接收到请求后,处理不了或者还需交给其他servlet处理,服务器将你的请求转发给其他servlet。转发容易与重定向弄混,现在说明下区别:
- 重定向:
两次请求,两次响应
重定向不携带数据
重定向地址栏发生改变 - 转发
一次请求,一次响应
转发需要携带数据
转发地址栏不会发生变化
代码实现:
request.getRequestDispatcher("/login").forward(request,response);
注1:从服务端请求自己的资源路径都不需要项目路径名,如转发请求资源;从客户端发起的请求都需要加上项目路径名,如用户提交表单。
注2: 如果重定向和转发都可以实现效果,建议优先使用转发,转发只会产生一次请求,可以减少服务端的负担。
注3:在URL路径上添加中文参数一定要使用URL编码,在浏览器上填写的路径浏览器会自动帮我们编码,但自己创建的URL路径附件中文参数,需要使用URLEncoder对象进行编码。
String url = "http://localhost:8080/MyWeb/login?username=张三";
URLEncoder.encode(url,"UTF-8");
,