HttpServletRequest对象,自己学习的心得。
1.
HttpServletRequest介绍
HttpServletRequest对象代表客户端的请求,当客户端通过Http超文本传输协议访问服务器时,Http请求头中的所有信息都封装在这个对象中,通过这个对象提供的方法,可以获取客户端请求的所有信息。
2.
2.1常用方法!!!获得用户机请求参数(客户端提交得数据)
! getParameter(String)方法(***常用)
! getParameterValues(String name)方法(***常用)
getParameterNames()方法(不常用)
! getParameterMap()方法(***编写框架时常用)
* 获取客户端通过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");
18 /**
19 * 编 号(文本框):
20 <input type="text" name="userid" value="NO." size="2" maxlength="2">
21 */
22 String userid = request.getParameter("userid");//获取填写的编号,userid是文本框的名字,<input type="text" name="userid">
23 /**
24 * 用户名(文本框):<input type="text" name="username" value="请输入用户名">
25 */
26 String username = request.getParameter("username");//获取填写的用户名
27 /**
28 * 密 码(密码框):<input type="password" name="userpass" value="请输入密码">
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 = "<table>" +
51 "<tr><td>填写的编号:</td><td>{0}</td></tr>" +
52 "<tr><td>填写的用户名:</td><td>{1}</td></tr>" +
53 "<tr><td>填写的密码:</td><td>{2}</td></tr>" +
54 "<tr><td>选中的性别:</td><td>{3}</td></tr>" +
55 "<tr><td>选中的部门:</td><td>{4}</td></tr>" +
56 "<tr><td>选中的兴趣:</td><td>{5}</td></tr>" +
57 "<tr><td>填写的说明:</td><td>{6}</td></tr>" +
58 "<tr><td>隐藏域的内容:</td><td>{7}</td></tr>" +
59 "</table>";
60 htmlStr = MessageFormat.format(htmlStr, userid,username,userpass,sex,dept,instStr,note,hiddenField);
61
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 } 在服务端使用getParameterNames方法接收表单参数:代码如下
1 Enumeration<String> 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 }
在服务器端使用getParameterMap方法接收表单参数,代码见下:
1 //request对象封装的参数是以Map的形式存储的
2 Map<String, String[]> paramMap = request.getParameterMap();
3 for(Map.Entry<String, String[]> 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 }
post方式提jiao中文数据乱码产生的原因和解决方法【客户端使用中文发送,服务器使用中文接收,正常沟通】【客户端使用中文发送,服务器使用XXX文接收,无法沟通即乱码】
可以知道,之所以会产生乱码,就是因为服务器和客户端沟通的编码不一致造成的,因此解决办法是:在客户端和服务器之间设置一个统一的编码,之后就按照此编码进行数据的传输和接收。 由于客户端是以UTF-8字符编码将表单数据传输到服务器端的,因此服务器需要设置以UTF-8字符集进行接收,要想完成此操作,服务器可以直接使用从ServletRequest接口继承而来的“setCharcterEncoding(charset)”方法进行统一的编码设置,代码如下
1 public void doPost(HttpServletRequest request, HttpServletResponse response)
2 throws ServletException, IOException {
3 /**
4 * 客户端是以UTF-8编码传输数据到服务器端的,所以需要设置服务器端以UTF-8的编码进行接收,否则对于中文数据就会产生乱码
5 */
6 request.setCharacterEncoding("UTF-8");
7 String userName = request.getParameter("userName");
8 System.out.println("userName:"+userName);
9 }
!!!注意Get请求方式这种解决乱码的方法(post)是行不通的
get请求方式解决乱码的方法:
对于以get方式传输的数据,request即使设置了以指定的编码接收数据也是无效的(我也很蒙这块),默认的还是ISO8859-1这个字符编码来接收数据,客户端以UTF-8的编码传输数据到服务器端,而服务器端的request对象使用的是
ISO8859-1这个字符编码来接收数据,服务器和客户端沟通的编码不一致因此才会产生中文乱码的。解决办法:在接收到数据后,先获取request对象以ISO8859-1字符集码接收到的原始数据的字节数组,然后通过字节数组以指定的编码
构建字符串,解决乱码问题。【就是说获取请求得数据(get方式)以iso8859-1字符编码接收到的原始数据的字节数据,然后通过直接数组以指定的编码utf-8构建字符串,解决乱码问题】 !!!注意“请求数据”的默认字符编码格式和”响应数据“字符编码格式默认是iso8859-1字符编码
1 public void doGet(HttpServletRequest request, HttpServletResponse response)
2 throws ServletException, IOException {
3 /**
4 *
5 * 对于以get方式传输的数据,request即使设置了以指定的编码接收数据也是无效的,默认的还是使用ISO8859-1这个字符编码来接收数据
6 */
7 String name = request.getParameter("name");//接收数据
8 name =new String(name.getBytes("ISO8859-1"), "UTF-8") ;//获取request对象以ISO8859-1字符编码接收到的原始数据的字节数组,然后通过字节数组以指定的编码构建字符串,解决乱码问题
9 System.out.println("name:"+name);
10 }
提交中文数据乱码问题总结
1、如果提交方式为post,想不乱码,只需要在服务器端设置request对象的编码即可,客户端以哪种编码提交的,服务器端的request对象就以对应的编码接收,比如客户端是以UTF-8编码提交的,那么服务器端request对象就以UTF-8编码接收(request.setCharacterEncoding("UTF-8"))
2、如果提交方式为get,设置request对象的编码是无效的,request对象还是以默认的ISO8859-1编码接收数据,因此要想不乱码,只能在接收到数据后再手工转换,步骤如下:
1).获取获取客户端提交上来的数据,得到的是乱码字符串,data="???è?????"
String data = request.getParameter("paramName");
2).查找ISO8859-1码表,得到客户机提交的原始数据的字节数组
byte[] source = data.getBytes("ISO8859-1");
3).通过字节数组以指定的编码构建字符串,解决乱码
data = new String(source, "UTF-8");
通过字节数组以指定的编码构建字符串,这里指定的编码是根据客户端那边提交数据时使用的字符编码来定的,如果是GB2312,那么就设置成data = new String(source, "GB2312"),如果是UTF-8,那么就设置成data = new String(source, "UTF-8")
request对象作为一个域对象(Map容器)使用时,主要是通过以下的四个方法来操作
setAttribute(String name,Object o)方法,将数据作为request对象的一个属性存放到request对象中,例如:request.setAttribute("data", data);
getAttribute(String name)方法,获取request对象的name属性的属性值,例如:request.getAttribute("data")
removeAttribute(String name)方法,移除request对象的name属性,例如:request.removeAttribute("data")
getAttributeNames方法,获取request对象的所有属性名,返回的是一个,例如:Enumeration<String> attrNames = request.getAttributeNames();
请求重定向和请求转发的区别
一个web资源收到客户端请求后,通知服务器去调用另外一个web资源进行处理,称之为请求转发/307。
一个web资源收到客户端请求后,通知浏览器去访问另外一个web资源进行处理,称之为请求重定向/302。
2.2:获取用户机信息
getRequestURL方法返回客户端发出请求时的完整URL(即资源路径信息)。
getRequestURI方法返回请求行的资源名部分。
getQueryString方法返回请求行中的参数部分。
getPathInfo方法返回请求URL中的额外路径信息。额外路径信息是请求URL中的位于Servlet的路径之后和查询参数之前的内容,它以“/”开头。
getRemoteAddr方法返回发出请求的客户机的IP地址。
getRemoteHost方法返回发出请求的客户机的完整主机名。
getRemotePort方法返回客户机所使用的网络端口号。
getLocalAddr方法返回WEB服务器的IP地址。
getLocalName方法返回WEB服务器的主机名。
通过request对象获取客户端请求信息
1
2 public class RequestDemo01 extends HttpServlet {
3
4 public void doGet(HttpServletRequest request, HttpServletResponse response)
5 throws ServletException, IOException {
6 /**
7 * 1.获得客户机信息
8 */
9 String requestUrl = request.getRequestURL().toString();//得到请求的URL地址
10 String requestUri = request.getRequestURI();//得到请求的资源
11 String queryString = request.getQueryString();//得到请求的URL地址中附带的参数
12 String remoteAddr = request.getRemoteAddr();//得到来访者的IP地址1 String remoteHost = request.getRemoteHost();
14 int remotePort = request.getRemotePort();
15 String remoteUser = request.getRemoteUser();
16 String method = request.getMethod();//得到请求URL地址时使用的方法
17 String pathInfo = request.getPathInfo();
18 String localAddr = request.getLocalAddr();//获取WEB服务器的IP地址
19 String localName = request.getLocalName();//获取WEB服务器的主机名
20 response.setCharacterEncoding("UTF-8");//设置将字符以"UTF-8"编码输出到客户端浏览器
21 //通过设置响应头控制浏览器以UTF-8的编码显示数据,如果不加这句话,那么浏览器显示的将是乱码
22 response.setHeader("content-type", "text/html;charset=UTF-8");
23 PrintWriter out = response.getWriter();
24 out.write("获取到的客户机信息如下:");
25 out.write("<hr/>");
26 out.write("请求的URL地址:"+requestUrl);
27 out.write("<br/>");
28 out.write("请求的资源:"+requestUri);
29 out.write("<br/>");
30 out.write("请求的URL地址中附带的参数:"+queryString);
31 out.write("<br/>");
32 out.write("来访者的IP地址:"+remoteAddr);
33 out.write("<br/>");
34 out.write("来访者的主机名:"+remoteHost);
35 out.write("<br/>");
36 out.write("使用的端口号:"+remotePort);
37 out.write("<br/>");
38 out.write("remoteUser:"+remoteUser);
39 out.write("<br/>");
40 out.write("请求使用的方法:"+method);
41 out.write("<br/>");
42 out.write("pathInfo:"+pathInfo);
43 out.write("<br/>");
44 out.write("localAddr:"+localAddr);
45 out.write("<br/>");
46 out.write("localName:"+localName);
47 }
48
49 public void doPost(HttpServletRequest request, HttpServletResponse response)
50 throws ServletException, IOException {
51 doGet(request, response);
52 }
2.3:获得客户机请求头
getHeader(string name)方法:String
getHeaders(String name)方法:Enumeration
getHeaderNames()方法
获取客户端请求头信息
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");//设置将字符以"UTF-8"编码输出到客户端浏览器
20 //通过设置响应头控制浏览器以UTF-8的编码显示数据
21 response.setHeader("content-type", "text/html;charset=UTF-8");
22 PrintWriter out = response.getWriter();
23 Enumeration<String> reqHeadInfos = request.getHeaderNames();//获取所有的请求头
24 out.write("获取到的客户端所有的请求头信息如下:");
25 out.write("<hr/>");
26 while (reqHeadInfos.hasMoreElements()) {
27 String headName = (String) reqHeadInfos.nextElement();
28 String headValue = request.getHeader(headName);//根据请求头的名字获取对应的请求头的值
29 out.write(headName+":"+headValue);
30 out.write("<br/>");
31 }
32 out.write("<br/>");
33 out.write("获取到的客户端Accept-Encoding请求头的值:");
34 out.write("<hr/>");
35 String value = request.getHeader("Accept-Encoding");//获取Accept-Encoding请求头对应的值
36 out.write(value);
37
38 Enumeration<String> e = 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 }
HttpServletRequest对象,自己学习的心得。的更多相关文章
- java web学习总结(十) -------------------HttpServletRequest对象
一.HttpServletRequest介绍 HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象 ...
- javaweb学习总结(十)——HttpServletRequest对象(一)
一.HttpServletRequest介绍 HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象 ...
- java web 学习十(HttpServletRequest对象1)
一.HttpServletRequest介绍 HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象 ...
- JavaWeb学习 (九)————HttpServletRequest对象(一)
一.HttpServletRequest介绍 HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象 ...
- JavaWeb学习总结(八):HttpServletRequest对象
一.HttpServletRequest介绍 HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象 ...
- javaweb学习总结(十)——HttpServletRequest对象(一)(转)
(每天都会更新至少一篇以上,有兴趣的可以关注)转载自孤傲苍狼 一.HttpServletRequest介绍 HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器 ...
- Java Web学习总结(7)——HttpServletRequest对象
一.HttpServletRequest介绍 HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象 ...
- javaweb学习总结(十)——HttpServletRequest对象(一) https://www.cnblogs.com/xdp-gacl/p/3798347.html
一.HttpServletRequest介绍 HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象 ...
- httpServletRequest对象、filter、servlet、servlet容器、catalina、tomcat、以及web容器之间的关系
学习servlet的时候经常感到疑惑 HttpServletRequest是服务器创建的?还是servlet容器创建的? 过滤器是服务器创建的?还是servlet容器创建的? serlet容器和tom ...
随机推荐
- LoadRunner 比较字符串是否相等
int strcmp ( const char *string1, const char *string2 );大小写敏感.int stricmp ( const char *string1, con ...
- 深入浅出 - Android系统移植与平台开发(十二)- Android JNI机制
第五章.JNI机制 4.1 JNI概述 由前面基础知识可知,Android的应用层由Java语言编写,Framework框架层则是由Java代码与C/C++语言实现,之所以由两种不同的语言组合开发框架 ...
- 2016/05/13 thinkphp 3.2.2 ① 数据删除及执行原生sql语句 ②表单验证
[数据删除及执行原生sql语句] delete() 返回受影响的记录条数 $goods -> delete(30); 删除主键值等于30的记录信息 $goods -> delete( ...
- druid 参考配置
mysql <!-- 配置druid连接池 --> <context:property-placeholder location="classpath:jdbc.prope ...
- bean的scope属性
1.singleton (默认属性) Spring将Bean放入Spring IOC容器的缓存池中,并将Bean引用返回给调用者,spring IOC继续对这些Bean进行后续的生命管理.Bean ...
- mongo04---基本查询
核心: mongod: 数据库核心进程 mongos: 查询路由器,集群时用 mongo: 交互终端(客户端) 二进制导出导入: mongodump:导出bson数据 mongorestore: 导入 ...
- 2.7 xargs和exec详解【转】
本文转载自:http://ask.apelearn.com/question/13323 常用在查找中exec主要是和find一起配合使用,而xargs就要比exec用的地方要多了. exec 应用 ...
- USACO26 moofest 奶牛集会(归并排序)
听说这题也是bzoj的3378&&poj1990,然而没有权限号交不了..poj懒得登. 题意:有n个奶牛,他们相互发出max(a[i].v,a[j].v)*abs(a[i].p-a[ ...
- 函数,#include <>和#include " "区别
l 4..函数定义到使用分三步:1.声明.2.定义函数.3.调用函数. 2.函数的定义格式:返回值 函数名(形参列表){ 函数体; return } 命名规则:1.只能由字母.数字.下划线或者美元符号 ...
- 并不对劲的bzoj3529:loj2193:p3312:[SDOI2014]数表
题目大意 定义函数\(f(x)=\sum_{k|x}k\) \(t\)(\(t\leq2*10^4\))组询问,每组给定\(n,m,a\)(\(n,m\leq10^5,a\leq10^9\)),求: ...