深入体验JavaWeb开发内幕——关于HttpServletRequestRequest对象
HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,开发人员通过这个对象的相关方法,即可以获得客户的这些信息。
一、通过request常用方法获得相关信息:
1、通过request常用方法获得客户机信息
getRequestURL方法返回客户端发出请求时的完整URL。
getRequestURI方法返回请求行中的资源名部分。
getQueryString 方法返回请求行中的参数部分。
getRemoteAddr方法返回发出请求的客户机的IP地址
getRemoteHost方法返回发出请求的客户机的完整主机名
getRemotePort方法返回客户机所使用的网络端口号
getLocalAddr方法返回WEB服务器的IP地址。
getLocalName方法返回WEB服务器的主机名
getMethod得到客户机请求方式
例如在Request.Java中加入如下代码:
//返回相关请求的信息 String uri=request.getRequestURI(); Stringrad = request.getRemoteAddr(); Stringrh = request.getRemoteHost(); Stringru = request.getRemoteUser(); intrp = request.getRemotePort(); Stringcp = request.getContextPath(); Stringla = request.getLocalAddr(); Stringce = request.getCharacterEncoding(); Stringgm = request.getMethod(); Stringqs = request.getQueryString(); System.out.println(uri); System.out.println(rad); System.out.println(rh); System.out.println(ru); System.out.println(rp); System.out.println(cp); System.out.println(la); System.out.println(ce); System.out.println(gm); System.out.println(qs);</div>
即可获取相关信息。
2、通过request常用方法获得客户机请求头信息
getHead(name)方法
getHeaders(String name)方法
getHeaderNames方法
如:
private void getRequestValue(HttpServletRequest request) { //获得客户机请求头及请求头的值 System.out.println(request.getHeader("method")); Enumeration e = request.getHeaderNames(); while(e.hasMoreElements()){ String name = (String)e.nextElement(); String value = request.getHeader(name); System.out.println(name+":"+value); } }</div>
3.获得客户机请求参数(客户端提交的数据)
getParameter(name):获取指定名称的参数值。这是最为常用的方法之一。
getParameterValues(String name):获取指定名称参数的所有值数组。它适用于一个参数名对应多个值的情况。如页面表单中的复选框,多选列表提交的值。
getParameterNames():返回一个包含请求消息中的所有参数名的Enumeration对象。通过遍历这个Enumeration对象,就可以获取请求消息中所有的参数名
getParameterMap():返回一个保存了请求消息中的所有参数名和值的Map对象。Map对象的key是字符串类型的参数名,value是这个参数所对应的Object类型的值数组。
二、request的常见应用
1、 各种表单输入项数据的获取
如可以获取form表单中的text、password、radio、checkbox、 file、select、textarea、 hidden、image、button等组件的值进行数据库操作或其他处理操作。
来看一个具体应用:
界面代码主体部分如下:
Register.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01Transitional//EN"> <html> <head> <title>Register.html</title> <metahttp-equivmetahttp-equiv="keywords"content="keyword1,keyword2,keyword3"> <metahttp-equivmetahttp-equiv="description" content="this is my page"> <meta http-equiv="content-type" content="text/html;charset=UTF-8"> <!--<link rel="stylesheet" type="text/css"href="./styles.css" rel="external nofollow" >--> </head> <body> <form action ="RequestLogin" method ="post"> 用户名:<input type="text"name = "username" ><br/> 密码: <inputtypeinputtype="password" name = "password"><br/> 性别:<input type="radio"name = "sex" value ="male">男 <input type="radio" name = "sex" value="female">女<br/> 籍贯: <select name="city"> <option value ="HeBei">河北</option> <opton value ="HuBei">湖北</opton> <option value ="ShanXi">山西</option> </select><br/> 简历:<br/> &nsp;<textarea rows="5" cols="20" name="intro"></textarea> <br/> 爱好:<br/> <input type="checkbox" name="hobbies" value ="sing"/>唱歌 <input type="checkbox" name="hobbies" value ="dance"/>跳舞 <input type="checkbox" name="hobbies" value ="readbook"/>读书 <input type="checkbox" name="hobbies" value ="readnewspaper"/>看报<br/> 上传头像:<br/> <input type="file" value="image" name ="browser"><br/> <input type="submit" value="提交"/> </form> </body> </html></div>
然后,定义一个RequestLogin.java类通过request对象获取表单中组件的值:
如调用自定义方法:
private void getInformation(HttpServletRequest request) throws UnsupportedEncodingException { //取出参数值 String name = request.getParameter("username"); String pass = request.getParameter("password"); String sex = request.getParameter("sex"); String city = request.getParameter("city"); String intro = request.getParameter("intro"); String [] hobbies = request.getParameterValues("hobbies"); String hobby =""; //hobbies!=null对所取值为空时进行设置 for(int i=0;hobbies!=null&&i<hobbies.length;i++) { String hovalue = hobbies[i]; hobby += hovalue; } //获取头像信息 // String image = request.getParameter("image"); System.out.println("username:"+name); System.out.println("password:"+pass); System.out.println("sex:"+sex); System.out.println("city:"+city); System.out.println("intro:"+intro); System.out.println("hobby:"+hobby);}</div>
即可获取表单中组件的值。
2、请求参数的中文乱码问题
前面我们提到了Response对象中出现乱码问题及相应的解决措施,那么在Request中如何解决编码问题呢?
下面来看具体的例子:
例如我想将一个form表单中的信息提取到并在控制台输出如图:
假设在服务端并未Request对象给指定编码时即服务器端接收请求的字符编码为ISO8859-1,这时你在客户端添加信息如:
当填入的信息有中文时,假设设置表单的提交方式为post方式提交
则在服务端输出如下:
此时输出结果出现乱码。
客户端主体代码同上:
Register.html <body> <form action ="RequestLogin" method ="post"> 用户名:<input type="text" name = "username" ><br/> 密码: <input type="password" name = "password"><br/> 性别:<input type="radio" name = "sex" value ="male">男 <input type="radio" name = "sex" value ="female">女<br/> 籍贯: <select name ="city"> <option value ="HeBei">河北</option> <opton value ="HuBei">湖北</opton> <option value ="ShanXi">山西</option> </select><br/> 简历:<br/> &nsp;<textarea rows="5" cols="20" name ="intro"></textarea> <br/> 爱好:<br/> <input type="checkbox" name ="hobbies" value ="sing"/>唱歌 <input type="checkbox" name ="hobbies" value ="dance"/>跳舞 <input type="checkbox" name ="hobbies" value ="readbook"/>读书 <input type="checkbox" name ="hobbies" value ="readnewspaper"/>看报<br/> 上传头像