(参考http://www.cnblogs.com/xdp-gacl/p/3798347.html 点击打开链接,以此为模板 自己做了整理、修改)
Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象,和代表响应的response对象。那我们要获取客户机提交过来的数据,只需要找request对象就行了。要向客户机输出数据,只需要找response对象就行了。
1.1 HttpServletRequest对象的介绍
HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个HttpServletRequest对象中,通过这个HttpServletRequest对象提供的方法,可以获得客户端请求的所有信息。
1.2 Request常用方法
1.2.1 Request中获得客户端信息的方法
getRequestURL() 方法返回客户端(浏览器)发出请求时的完整URL。
getRequestURI() 方法返回请求行中的资源名部分(注意URL和URI 的区别)。
getQueryString() 方法返回请求行中的参数部分。
getPathInfo() 方法返回请求URL中的额外路径信息。额外路径信息是请求URL中的位于Servlet的路径之后和查询参数之前的内容,它以“/”开头。
getRemoteAddr() 方法返回发出请求的客户机的IP地址。
getRemoteHost() 方法返回发出请求的客户机的完整主机名。
getRemotePort() 方法返回客户机所使用的网络端口号。
getLocalAddr() 方法返回WEB服务器的IP地址。注意LocalAddr和RemoteAddr的区别。
getLocalName() 方法返回WEB服务器的主机名。
IP地址:为了达到通信的目的,需要给参与通信的主机一个号码,这个就是ip地址,它具有唯一性。
主机名:就是在一个特定网络范围内一个计算机的名字。
域名: 则是在因特网范围内某一个服务器的名字。
好比,一个小区里面有好多住户,IP地址相当于某个住户家的门牌号(如17栋2楼201室),主机名相当于与这个门牌号对应的人家(如张三家),域名相当于住户所处在的小区(如幸福佳园小区)
范例:通过request对象获取客户端请求信息
1 package gacl.request.study; 2 import java.io.IOException; 3 import java.io.PrintWriter; 4 import javax.servlet.ServletException; 5 import javax.servlet.http.HttpServlet; 6 import javax.servlet.http.HttpServletRequest; 7 import javax.servlet.http.HttpServletResponse; 8 /** 9 * @author gacl 10 * 通过request对象获取客户端请求信息 11 */ 12 public class RequestDemo01 extends HttpServlet { 13 14 public void doGet(HttpServletRequest request, HttpServletResponse response) 15 throws ServletException, IOException { 16 /** 17 * 1.获得客户机信息 18 */ 19 String requestUrl = request.getRequestURL().toString();//得到客户端请求的URL地址 20 String requestUri = request.getRequestURI();//得到客户端请求的资源 21 String queryString = request.getQueryString();//得到客户端请求的URL地址中附带的参数 22 String remoteAddr = request.getRemoteAddr();//得到来访者(客户端)的IP地址 23 String remoteHost = request.getRemoteHost();//得到来访者(客户端)的完整主机名 24 int remotePort = request.getRemotePort();//得到客户端的网络端口号 25 String remoteUser = request.getRemoteUser(); 26 String method = request.getMethod();//得到请求URL地址时使用的方法 27 String pathInfo = request.getPathInfo(); 28 String localAddr = request.getLocalAddr();//获取WEB服务器的IP地址 29 String localName = request.getLocalName();//获取WEB服务器的主机名 30 response.setCharacterEncoding("UTF-8");//设置将字符以"UTF-8"编码服务器端输出到客户端浏览器 31 //通过设置响应头控制浏览器以UTF-8的编码显示数据,如果不加这句话,那么浏览器端显示的将是乱码 32 response.setHeader("content-type", "text/html;charset=UTF-8"); 33 PrintWriter out = response.getWriter(); 34 out.write("获取到的客户机信息如下:"); 35 out.write("
WEB服务器的IP地址 29 String localName = request.getLocalName();//获取WEB服务器的主机名 30 response.setCharacterEncoding("UTF-8");//设置将字符以"UTF-8"编码服务器端输出到客户端浏览器 31 //通过设置响应头控制浏览器以UTF-8的编码显示数据,如果不加这句话,那么浏览器端显示的将是乱码 32 response.setHeader("content-type", "text/html;charset=UTF-8"); 33 PrintWriter out = response.getWriter(); 34 out.write("获取到的客户机信息如下:"); 35 out.write("
"); 36 out.write("请求的URL地址:"+requestUrl); 37 out.write("
"); 38 out.write("请求的资源:"+requestUri); 39 out.write("
"); 40 out.write("请求的URL地址中附带的参数:"+queryString); 41 out.write("
"); 42 out.write("来访者的IP地址:"+remoteAddr); 43 out.write("
"); 44 out.write("来访者的主机名:"+remoteHost); 45 out.write("
"); 46 out.write("使用的端口号:"+remotePort); 47 out.write("
"); 48 out.write("remoteUser:"+remoteUser); 49 out.write("
"); 50 out.write("请求使用的方法:"+method); 51 out.write("
"); 52 out.write("pathInfo:"+pathInfo); 53 out.write("
"); 54 out.write("localAddr:"+localAddr); 55 out.write("
"); 56 out.write("localName:"+localName); 57 } 58 59 public void doPost(HttpServletRequest request, HttpServletResponse response) 60 throws ServletException, IOException { 61 doGet(request, response); 62 } 63 64 }
"); 36 out.write("请求的URL地址:"+requestUrl); 37 out.write("
"); 38 out.write("请求的资源:"+requestUri); 39 out.write("
"); 40 out.write("请求的URL地址中附带的参数:"+queryString); 41 out.write("
"); 42 out.write("来访者的IP地址:"+remoteAddr); 43 out.write("
"); 44 out.write("来访者的主机名:"+remoteHost); 45 out.write("
"); 46 out.write("使用的端口号:"+remotePort); 47 out.write("
"); 48 out.write("remoteUser:"+remoteUser); 49 out.write("
"); 50 out.write("请求使用的方法:"+method); 51 out.write("
"); 52 out.write("pathInfo:"+pathInfo); 53 out.write("
"); 54 out.write("localAddr:"+localAddr); 55 out.write("
"); 56 out.write("localName:"+localName); 57 } 58 59 public void doPost(HttpServletRequest request, HttpServletResponse response) 60 throws ServletException, IOException { 61 doGet(request, response); 62 } 63 64 }
运行结果:
1.2.2 获得客户端请求头
getHeader(string name)方法: String
getHeaders(String name)方法: Enumeration
getHeaderNames()方法
案例,通过request对象获取客户端请求头信息。代码如下:
1 package gacl.request.study; 2 import java.io.IOException; 3 import java.io.PrintWriter; 4 import java.util.Enumeration; 5 import javax.servlet.ServletException; 6 import javax.servlet.http.HttpServlet; 7 import javax.servlet.http.HttpServletRequest; 8 import javax.servlet.http.HttpServletResponse; 9 /** 10 * @author gacl 11 * 获取客户端请求头信息 12 * 客户端请求头: 13 * 14 */ 15 public class RequestDemo02 extends HttpServlet { 16 17 public void doGet(HttpServletRequest request, HttpServletResponse response) 18 throws ServletException, IOException { 19 response.setCharacterEncoding("UTF-8");//response.setCharacterEncoding()设置服务端输出到客户端浏览器的编码方式 20 //通过设置响应头控制浏览器以UTF-8的编码显示数据 21 response.setHeader("content-type", "text/html;charset=UTF-8");//设置响应头控制浏览器端显示数据的编码格式 22 PrintWriter out = response.getWriter(); 23 Enumeration
response.setCharacterEncoding("UTF-8");//response.setCharacterEncoding()设置服务端输出到客户端浏览器的编码方式 20 //通过设置响应头控制浏览器以UTF-8的编码显示数据 21 response.setHeader("content-type", "text/html;charset=UTF-8");//设置响应头控制浏览器端显示数据的编码格式 22 PrintWriter out = response.getWriter(); 23 EnumerationreqHeadInfos = request.getHeaderNames();//获取所有的请求头 24 out.write("获取到的客户端所有的请求头信息如下:"); 25 out.write("
"); 26 while (reqHeadInfos.hasMoreElements()) { 27 String headName = (String) reqHeadInfos.nextElement(); 28 String headValue = request.getHeader(headName);//根据请求头的名字获取对应的请求头的值 29 out.write(headName+":"+headValue); 30 out.write("
"); 31 } 32 out.write("
"); 33 out.write("获取到的客户端Accept-Encoding请求头的值:"); 34 out.write("
"); 35 String value = request.getHeader("Accept-Encoding");//获取Accept-Encoding请求头对应的值 36 out.write(value); 37 38 Enumeratione = request.getHeaders("Accept-Encoding"); 39 while (e.hasMoreElements()) { 40 String string = (String) e.nextElement(); 41 System.out.println(string); 42 } 43 } 44 45 public void doPost(HttpServletRequest request, HttpServletResponse response) 46 throws ServletException, IOException { 47 doGet(request, response); 48 } 49 50 } reqHeadInfos = request.getHeaderNames();//获取所有的请求头 24 out.write("获取到的客户端所有的请求头信息如下:"); 25 out.write("
"); 26 while (reqHeadInfos.hasMoreElements()) { 27 String headName = (String) reqHeadInfos.nextElement(); 28 String headValue = request.getHeader(headName);//根据请求头的名字获取对应的请求头的值 29 out.write(headName+":"+headValue); 30 out.write("
"); 31 } 32 out.write("
"); 33 out.write("获取到的客户端Accept-Encoding请求头的值:"); 34 out.write("
"); 35 String value = request.getHeader("Accept-Encoding");//获取Accept-Encoding请求头对应的值 36 out.write(value); 37 38 Enumeratione = request.getHeaders("Accept-Encoding"); 39 while (e.hasMoreElements()) { 40 String string = (String) e.nextElement(); 41 System.out.println(string); 42 } 43 } 44 45 public void doPost(HttpServletRequest request, HttpServletResponse response) 46 throws ServletException, IOException { 47 doGet(request, response); 48 } 49 50 }
运行结果如下:
1.2.3 获得客户端提交的数据(获得客户机请求参数)
getParameter(String)方法 (常用)
getParameterValues(String name)方法 (常用)
getParameterNames()方法 (不常用)
getParameterMap()方法 (编写框架时常用)
比如现在有如下的form表单
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
Html的Form表单元素
案例一,在服务器端使用getParameter()方法 和 getParameterValues()方法接收表单参数,代码如下:
1 package gacl.request.study;
2 import java.io.IOException;
3 import java.text.MessageFormat;
4 import javax.servlet.ServletException;
5 import javax.servlet.http.HttpServlet;
6 import javax.servlet.http.HttpServletRequest;
7 import javax.servlet.http.HttpServletResponse;
8 /**
9 * @author gacl
10 * 获取客户端通过Form表单提交上来的参数
11 */
12 public class RequestDemo03 extends HttpServlet {
13
14 public void doGet(HttpServletRequest request, HttpServletResponse response)
15 throws ServletException, IOException {
16 //客户端是以UTF-8编码提交表单数据的,所以需要设置服务器端以UTF-8的编码进行接收,否则对于中文数据就会产生乱码
17 request.setCharacterEncoding("UTF-8"); // request.setCharacterEncoding()设置服务器端的编码方式
18 /**
19 * 编 号(文本框):
20
21 */
22 String userid = request.getParameter("userid");//服务器端获取填写的编号,userid是文本框的名字,
23 /**
24 * 用户名(文本框):
25 */
26 String username = request.getParameter("username");//获取填写的用户名
27 /**
28 * 密 码(密码框):
29 */
30 String userpass = request.getParameter("userpass");//获取填写的密码
31 String sex = request.getParameter("sex");//获取选中的性别
32 String dept = request.getParameter("dept");//获取选中的部门
33 //获取选中的兴趣,因为可以选中多个值,所以获取到的值是一个字符串数组,因此需要使用getParameterValues方法来获取
34 String[] insts = request.getParameterValues("inst");
35 String note = request.getParameter("note");//获取填写的说明信息
36 String hiddenField = request.getParameter("hiddenField");//获取隐藏域的内容
37
38 String instStr="";
39 /**
40 * 获取数组数据的技巧,可以避免insts数组为null时引发的空指针异常错误!
41 */
42 for (int i = 0; insts!=null && i < insts.length; i++) {
43 if (i == insts.length-1) {
44 instStr+=insts[i];
45 }else {
46 instStr+=insts[i]+",";
47 }
48 }
49
50 String htmlStr = "" +
51 "填写的编号: {0} " +
52 "填写的用户名: {1} " +
53 "填写的密码: {2} " +
54 "选中的性别: {3} " +
55 "选中的部门: {4} " +
56 "选中的兴趣: {5} " +
57 "填写的说明: {6} " +
58 "隐藏域的内容: {7} " +
59 "
";
60 htmlStr = MessageFormat.format(htmlStr, userid,username,userpass,sex,dept,instStr,note,hiddenField);
61 //MessageFormat.format()重要方法
62 response.setCharacterEncoding("UTF-8");//设置服务器端以UTF-8编码输出数据到客户端
63 response.setContentType("text/html;charset=UTF-8");//设置客户端浏览器以UTF-8编码解析数据
64 response.getWriter().write(htmlStr);//输出htmlStr里面的内容到客户端浏览器显示
65 }
66
67 public void doPost(HttpServletRequest request, HttpServletResponse response)
68 throws ServletException, IOException {
69 doGet(request, response);
70 }
71 }
request.setCharacterEncoding()设置服务器端的编码方式
18 /**
19 * 编 号(文本框):
20
21 */
22 String userid = request.getParameter("userid");//服务器端获取填写的编号,userid是文本框的名字,
23 /**
24 * 用户名(文本框):
25 */
26 String username = request.getParameter("username");//获取填写的用户名
27 /**
28 * 密 码(密码框):
29 */
30 String userpass = request.getParameter("userpass");//获取填写的密码
31 String sex = request.getParameter("sex");//获取选中的性别
32 String dept = request.getParameter("dept");//获取选中的部门
33 //获取选中的兴趣,因为可以选中多个值,所以获取到的值是一个字符串数组,因此需要使用getParameterValues方法来获取
34 String[] insts = request.getParameterValues("inst");
35 String note = request.getParameter("note");//获取填写的说明信息
36 String hiddenField = request.getParameter("hiddenField");//获取隐藏域的内容
37
38 String instStr="";
39 /**
40 * 获取数组数据的技巧,可以避免insts数组为null时引发的空指针异常错误!
41 */
42 for (int i = 0; insts!=null && i < insts.length; i++) {
43 if (i == insts.length-1) {
44 instStr+=insts[i];
45 }else {
46 instStr+=insts[i]+",";
47 }
48 }
49
50 String htmlStr = "
填写的编号: | {0} |
填写的用户名: | {1} |
填写的密码: | {2} |
选中的性别: | {3} |
选中的部门: | {4} |
选中的兴趣: | {5} |
填写的说明: | {6} |
隐藏域的内容: | {7} |
案例二,在服务器端使用getParameterName()方法,接收表单参数,代码如下
1 Enumeration paramNames = request.getParameterNames();//服务器端获取所有的参数名
2 while (paramNames.hasMoreElements()) {
3 String name = paramNames.nextElement();//得到参数名
4 String value = request.getParameter(name);//服务器端通过参数名获取对应的值
5 System.out.println(MessageFormat.format("{0}={1}", name,value));
6 }
request.getParameterNames();//服务器端获取所有的参数名
2 while (paramNames.hasMoreElements()) {
3 String name = paramNames.nextElement();//得到参数名
4 String value = request.getParameter(name);//服务器端通过参数名获取对应的值
5 System.out.println(MessageFormat.format("{0}={1}", name,value));
6 }
案例三,如果request对象中封装的参数是一Map形式存储的,则在服务器端使用getParameterMap()方法接收表单参数,代码如下:
1 //request对象封装的参数是以Map的形式存储的 2 Map
request.getParameterMap();//服务器端接收表单参数 3 for(Map.EntryparamMap = request.getParameterMap();//服务器端接收表单参数 3 for(Map.Entry entry :paramMap.entrySet()){ 4 String paramName = entry.getKey(); 5 String paramValue = ""; 6 String[] paramValueArr = entry.getValue(); 7 for (int i = 0; paramValueArr!=null && i < paramValueArr.length; i++) { 8 if (i == paramValueArr.length-1) { 9 paramValue+=paramValueArr[i]; 10 }else { 11 paramValue+=paramValueArr[i]+","; 12 } 13 } 14 System.out.println(MessageFormat.format("{0}={1}", paramName,paramValue)); 15 } entry :paramMap.entrySet()){ 4 String paramName = entry.getKey(); 5 String paramValue = ""; 6 String[] paramValueArr = entry.getValue(); 7 for (int i = 0; paramValueArr!=null && i < paramValueArr.length; i++) { 8 if (i == paramValueArr.length-1) { 9 paramValue+=paramValueArr[i]; 10 }else { 11 paramValue+=paramValueArr[i]+","; 12 } 13 } 14 System.out.println(MessageFormat.format("{0}={1}", paramName,paramValue)); 15 }
1.3 request接收表单提交中文参数出现乱码的问题
1.3.1 以POST方式提交表单中文参数的乱码问题
例如下面的form表单页面:
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
2
3
4
5
6 request接收中文参数乱码问题
7
8
9
10
14
15
post">
11 用户名:
12
13
14
15