HttpServletQequest对象的学习
HttpServletRequest
HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户这些信息。HttpServletRequest的对象时域对象。
常用方法:
获得客户机信息
getRequestURL方法返回客户端发出请求时的完整URL。
getRequestURI方法返回请求行中的资源名部分。
getQueryString 方法返回请求行中的参数部分。就是地址栏中?后面的内容
getRemoteAddr方法返回发出请求的客户机的IP地址
getRemoteHost方法返回发出请求的客户机的完整主机名
getRemotePort方法返回客户机所使用的网络端口号
getLocalAddr方法返回WEB服务器的IP地址。
getLocalName方法返回WEB服务器的主机名
getMethod得到客户机请求方式
获得客户机请求头
getHeader(name)方法
根据一个请求头的名称回去这个请求头的内容。获取的是单一的请求头内容
例:request.getHeader(“Accept-Encoding”)
getHeaders(String name)方法
getHeaderNames方法
代码演示:
//获取单一的请求头内容,根据请求头名称
String value = request.getHeader("Accept-Encoding");
System.out.println(value);//gzip, deflate
//获取所有请求头名称的枚举
System.out.println("所有请求头");
Enumeration en = request.getHeaderNames();
while(en.hasMoreElements()){
String headerName = (String) en.nextElement();
System.out.println(headerName+": "+request.getHeader(headerName));
}
System.out.println("=========================");
//获取重名的请求头内容,一个请求头名称可能对应多个不同的请求头内容
en = request.getHeaders("Accept-Encoding");
while(en.hasMoreElements()){
String headerValue = (String) en.nextElement();
System.out.println(headerValue);
}
获得客户机请求参数(客户端提交的数据)
getParameter(name)方法
getParameterValues(String name)方法
getParameterNames方法
getParameterMap方法 //做框架用,非常实用
getInputStream
代码演示:
//获取客户端请求参数---->例如:客户端提交的数据
//以客户端的表单form.html提交上来的数据就是请求参数
public class HttpServletRequestDemo2 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
test1(request);
}
//获取只单一名称输入域的参数
private void test1(HttpServletRequest request) {
//这里客服端输入的数据都是String类型的数据
String username = request.getParameter("usename");
String password = request.getParameter("password");
String code = request.getParameter("code");
System.out.println(username+"\t"+password+"\t"+code);
}
//获取具有重名的输入域参数
public void test2(HttpServletRequest request){
String username = request.getParameter("username");
//表单中有密码确认一项,所以对应的参数名称相同,获取所有参数值的数组
String[] passwords = request.getParameterValues("password");
if(passwords != null&&passwords.length>0){
for (String password : passwords) {
System.out.println(password);
}
}
String code = request.getParameter("code");
System.out.println(username+"\t"+code);
}
//做框架使用,获取客户端请求参数的Map集合,其中key:是参数名称,value:是参数值数组
public void test3(HttpServletRequest request){
Map<String,String[]> map = request.getParameterMap();
//遍历map集合
Set<Map.Entry<String,String[]>> en = map.entrySet();
for (Map.Entry<String,String[]> entry : en) {
System.out.println(entry.getKey()+": "+Arrays.toString(entry.getValue()));
}
}
//做框架使用,获取客户端请求参数的Map集合,其中key:是参数名称,value:是参数值数组
public void test4(HttpServletRequest request) throws Exception{
Map<String,String[]> map = request.getParameterMap();
//创建一个默认初始化值的JavaBean
User user = new User();
System.out.println("封装前:"+user);
//遍历map集合
Set<Map.Entry<String,String[]>> en = map.entrySet();
for (Map.Entry<String,String[]> entry : en) {
String paraName = entry.getKey();
String[] paraValues = entry.getValue();
//将得到的参数数据存储到JavaBean中:内省的过程
PropertyDescriptor pd = new PropertyDescriptor(paraName, User.class);
Method methodSet = pd.getWriteMethod();
//这里是为了兼容invoke方法JDK1.4版本,1.4版本:invoke(Objet,Object[])
//当传入的是的参数值有多个时,应将这个数组强转成一个Object对象使用1.5版本
//也可以将这个数组当成一个Object[]对象也可以
//如果参数值只有一个,1.4版本和1.5版本都可以使用
if(paraValues.length==1){
methodSet.invoke(user, paraValues);
}else{
//如果参数值不止一个时,要强转
methodSet.invoke(user,(Object)paraValues);
//或者创建一个新的Object[]
//methodSet.invoke(user, new Object[]{paraValues});
}
}
System.out.println("封装后:"+user);
}
//使用第三方工具类BeanUtils,可以大大减少代码
public void test5(HttpServletRequest request) throws Exception{
Map<String,String[]> map = request.getParameterMap();
//创建一个默认初始化值的JavaBean
User user = new User();
System.out.println("封装前:"+user);
//内省:通过BeanUtils的populate方法将map的数据存储到user中
BeanUtils.populate(user, map);
System.out.println("封装前:"+user);
}
//获取正文的内容:通过getInputStream()方法,只有当客户端的请求方式是post方式才可以
public voidtest6(HttpServletRequest request) throws IOException{
InputStream in = request.getInputStream();
byte[] buf = new byte[1024];
int len = 0;
while((len = in.read(buf))!=-1){
System.out.println(new String(buf,0,len));
}
}
注意:客服端请求参数的中文乱码问题,当请求的参数中有中文,反馈给服务器程序可能会出现乱码
public class HttpServletRequestDemo3 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//post请求方式使用的编码方式是根据客户端使用的编码表,通过setCharactetEncoding("UTF-8"),通常默认都是UTF-8码表,但只能在
request.setCharacterEncoding("UTF-8");
//得到的字符串就是通过UTF-8进行查表得到的
String value = request.getParameter("username");
//get方式默认使用的是ISO-8859-1编码表进行编码
String paraValue = request.getParameter("username");
byte[] vbuf = paraValue.getBytes("ISO-8859-1");
String result = new String(vbuf,"UTF-8");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}