HttpServletRequest Request对象

HttpServletRequest Request对象:

1. request对象和response对象的原理.
  	1. request和response对象是由服务器创建的. 我们来使用他们.
  	2. request对象是来获取请求消息, response对象是来设置响应消息
  	
  	
2. request对象继承体系结构:
		ServletRequest			-- 接口
					| 继承
		HttpServletRequest		-- 接口
					| 实现
		org.apache.catalina.connector.RequestFacade	类(Tomcat)
      
    
3. request功能:
		1. 获取请求消息数据
				1. 获取请求行数据
						* GET /tomcat/demo1?name=zhangsan HTTP/1.1
		      			* 方法:
							  1. 获取请求方式: GET
									* String getMethod()
			                  2. (重点)获取虚拟目录: /tomcat
			                  		* String getContextPath()
			                  3. 获取Servlet路径: /demo1
			                  		* String getServletPath()
			                  4. 获取get方式请求参数: name=zhangsan
			                  		* String getQueryString()
			                  5. (重点)获取请求URI: /tomcat/demo1
			                  		* String getRequestURI():						/tomcat/demo1
			                    	* StringBuffer getRequestURL():			http://localhost/tomcat/demo1
			                    	
									* URI: 统一资源标识符:  /tomcat/demo1
									* URL: 统一资源定位符:	 http://localhost/tomcat/demo1	
			
			                  6. 获取协议及版本: HTTP/1.1
			                    	* String getProtocol()
			                  7. 获取客户机的IP地址:
									* String getRemoteAddr()
			            * 代码:
							  package cn.xiaoge.web.request;
			
			                  import javax.servlet.ServletException;
			                  import javax.servlet.annotation.WebServlet;
			                  import javax.servlet.http.HttpServlet;
			                  import javax.servlet.http.HttpServletRequest;
			                  import javax.servlet.http.HttpServletResponse;
			                  import java.io.IOException;
			
			                  /**
			                   * @Author: HWB
			                   * @DateTime: 2020/1/27 下午6:51
			                   * @Description: 演示Request对象获取请求行数据
			                   */
			                  @WebServlet("/requestDemo1")
			                  public class RequestDemo1 extends HttpServlet {
			                      protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
			
			                      }
			
			                      protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
			                          /**
			                           * 1. 获取请求方式: GET
			                           * 		* String getMethod()
			                           * 2. (重点)获取虚拟目录: /tomcat
			                           *      * String getContextPath()
			                           * 3. 获取Servlet路径: /requestDemo1
			                           *      * String getServletPath()
			                           * 4. 获取get方式请求参数: name=zhangsan
			                           *      * String getQueryString()
			                           * 5. (重点)获取请求URI: /tomcat/requestDemo1
			                           *      * String getRequestURI():				/tomcat/requestDemo1
			                           *      * StringBuffer getRequestURL():			http://localhost/tomcat/requestDemo1
			                           * 6. 获取协议及版本: HTTP/1.1
			                           *      * String getProtocol()
			                           * 7. 获取客户机的IP地址:
			                           * 		* String getRemoteAddr()
			                           *
			                           *  浏览器访问路径: http://localhost:8080/tomcat/requestDemo1?name=zhangsan
			                           */
			
			                          // 1. 获取请求方式: GET
			                          String method = request.getMethod();
			                          System.out.println(method); // GET
			
			                          // 2. (重点)获取虚拟目录: /tomcat
			                          String contextPath = request.getContextPath();
			                          System.out.println(contextPath); // /tomcat
			
			                          // 3. 获取Servlet路径: /requestDemo1
			                          String servletPath = request.getServletPath();
			                          System.out.println(servletPath); // /requestDemo1
			
			                          // 4. 获取get方式请求参数: name=zhangsan
			                          String queryString = request.getQueryString();
			                          System.out.println(queryString); // name=zhangsan
			
			                          // 5. (重点)获取请求URI: /tomcat/requestDemo1
			                          String requestURI = request.getRequestURI();
			                          System.out.println(requestURI); // /tomcat/requestDemo1
			
			                          StringBuffer requestURL = request.getRequestURL();
			                          System.out.println(requestURL); // http://localhost:8080/tomcat/requestDemo1
			
			                          // 6. 获取协议及版本: HTTP/1.1
			                          String protocol = request.getProtocol();
			                          System.out.println(protocol); //  HTTP/1.1
			
			                          // 7. 获取客户机的IP地址:
			                          String remoteAddr = request.getRemoteAddr();
			                          System.out.println(remoteAddr); // 0:0:0:0:0:0:0:1 (ipv6, 这是自己访问自己)
			
			                      }
			                  }


				2. 获取请求头数据
						* 方法:
							* (重点)String getHeader(String name): 通过请求头的名臣获取请求头的值
							* Enumeration getHeaderNames(): 获取所偶遇的请求头名称
						* 代码:
							  package cn.xiaoge.web.request;

			                  import javax.servlet.ServletException;
			                  import javax.servlet.annotation.WebServlet;
			                  import javax.servlet.http.HttpServlet;
			                  import javax.servlet.http.HttpServletRequest;
			                  import javax.servlet.http.HttpServletResponse;
			                  import java.io.IOException;
			                  import java.util.Enumeration;
			
			                  /**
			                   * @Author: HWB
			                   * @DateTime: 2020/1/27 下午6:51
			                   * @Description: 演示Request对象获取请求头数据
			                   */
			                  @WebServlet("/requestDemo2")
			                  public class RequestDemo2 extends HttpServlet {
			                      protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
			
			                      }
			
			                      protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
			                          // 演示获取请求头数据
			                          Enumeration<String> headerNames = request.getHeaderNames();
			                        	// 遍历			Enumeration<String>就是个迭代器
			                          while(headerNames.hasMoreElements()) {
			                              // 键
			                              String name = headerNames.nextElement();
			                              // 值
			                              String value = request.getHeader(name);
			                              System.out.println(name + "----" + value);
			                          }
			
			                      }
			                  }


							  // 运行结果
							  host----localhost:8080
			                  connection----keep-alive
			                  cache-control----max-age=0
			                  upgrade-insecure-requests----1
			                  user-agent----Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36
			                  sec-fetch-user----?1
			                  accept----text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/;q=0.8,application/signed-exchange;v=b3;q=0.9
			                  sec-fetch-site----none
			                  sec-fetch-mode----navigate
			                  accept-encoding----gzip, deflate, br
			                  accept-language----zh-CN,zh;q=0.9
			                  cookie----JSESSIONID=7D78A3C4F80F9FF29948AB674BCFFFDF; Pycharm-abaea751=c588d849-c872-49ed-b318-b3fef725eeed; Idea-6310fadd=bf2d1837-2817-4f2e-8e3f-888e375ac004; JSESSIONID=C01EE10B142A1B9ACBE745C0EF7B8594




							  package cn.xiaoge.web.request;

			                  import javax.servlet.ServletException;
			                  import javax.servlet.annotation.WebServlet;
			                  import javax.servlet.http.HttpServlet;
			                  import javax.servlet.http.HttpServletRequest;
			                  import javax.servlet.http.HttpServletResponse;
			                  import java.io.IOException;
			                  import java.util.Enumeration;
			
			                  /**
			                   * @Author: HWB
			                   * @DateTime: 2020/1/27 下午6:51
			                   * @Description: 演示Request对象获取请求头数据
			                   */
			                  @WebServlet("/requestDemo3")
			                  public class RequestDemo3 extends HttpServlet {
			                      protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
			
			                      }
			
			                      protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
			                          // 演示获取请求头数据
			                          String agent = request.getHeader("user-agent");
			                          // 获取该字符串是否包含Chrome
			                          if (agent.contains("Chrome")) {
			                              System.out.println("谷歌来了...");  // 执行他, 因为我使用谷歌浏览器访问的该资源
			                          } else if(agent.contains("Firefox")) {
			                              System.out.println("火狐来了..");
			                          }
			
			
			                      }
			                  }

							  // 结果
							  谷歌来了...

				3. 获取请求提数据
					* 请求体: 只有POST请求方式, 才有请求体, 在请求体中封装了POST请求的请求参数
					* 步骤:
						1. 获取流对象
							* BufferedReader getReader(): 获取字符输入流, 只能操作字符数据
								* 代码:
									  package cn.xiaoge.web.request;

		                              import javax.servlet.ServletException;
		                              import javax.servlet.annotation.WebServlet;
		                              import javax.servlet.http.HttpServlet;
		                              import javax.servlet.http.HttpServletRequest;
		                              import javax.servlet.http.HttpServletResponse;
		                              import java.io.BufferedReader;
		                              import java.io.IOException;
		
		                              /**
		                               * @Author: HWB
		                               * @DateTime: 2020/1/27 下午6:51
		                               * @Description: 演示Request对象获取请求体数据
		                               */
		                              @WebServlet("/requestDemo5")
		                              public class RequestDemo5 extends HttpServlet {
		                                  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		                                      // 获取请求消息体--请求参数, 发送过来的数据username=zhangsan  password=123456
		
		                                      // 1. 获取字符流
		                                      BufferedReader br = request.getReader();
		
		                                      // 2. 读取数据
		                                      String line = null;
		                                      // 每次遍历获取一行数据
		                                      while((line = br.readLine()) != null){
		                                          System.out.println(line); // username=zhangsan&password=123456
		                                      }
		
		                                      // 3. 这个流不用关闭, 因为是通过request获取到的
		
		                                  }
		
		                                  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		                                  }
		                              }

							* ServletInputStream getInputStream(): 获取字节输入流, 可以操作所有类型数据
									
						2. 在从流对象中拿数据
									
									
		2. 其他功能:
				1. 获取请求参数通用方式: 不论get还是post请求方式都可以使用下列方法来获取请求参数
							1. String getParameter(String name): 根据参数名称获取参数值
							2. String[] getParameterValues(String name): 根据参数名称获取参数值的数组 
							3. Enumeration<String> getParameterNames(): 获取所有请求的参数名称
							4. Map<String, String[]> getParameterMap(): 获取所有参数的map集合
							
							* 中文乱码问题:
								* get方式: tomcat 8 已经将get方式乱码问题解决了
								* post方式: 会乱码
										* 解决: 在获取参数前, 设置request的编码request.setCharacterEncoding("utf-8");
						
							* 代码:
								package cn.xiaoge.web.request;

			                    import javax.servlet.ServletException;
			                    import javax.servlet.annotation.WebServlet;
			                    import javax.servlet.http.HttpServlet;
			                    import javax.servlet.http.HttpServletRequest;
			                    import javax.servlet.http.HttpServletResponse;
			                    import java.io.BufferedReader;
			                    import java.io.IOException;
			                    import java.util.Enumeration;
			                    import java.util.Map;
			                    import java.util.Set;
			
			                    /**
			                     * @Author: HWB
			                     * @DateTime: 2020/1/27 下午6:51
			                     * @Description: 演示Request对象获取请求体数据
			                     */
			                    @WebServlet("/requestDemo6")
			                    public class RequestDemo6 extends HttpServlet {
			                        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
			                            // post获取请求参数
			
			                            // 设置流的编码
			                            request.setCharacterEncoding("utf-8");
			
			                            // 根据参数名臣获取值
			                            String username = request.getParameter("username");
			                            String password = request.getParameter("password");
			                            System.out.println(username+ ": " +password);
			                            /*
			                                传递参数: username=zhangsan password=123456
			                                运行结果
			                                zhangsan: 123456
			                             */
			
			
			                            // 根据参数名臣获取参数值的数组
			                            String[] hobby = request.getParameterValues("hobby");
			                            for (String s : hobby) {
			                                System.out.println(s);
			                                /*
			                                    传递参数: hobby="游戏" hobby=学习
			                                    运行结果
			                                    游戏
			                                    学习
			                                 */
			                            }
			
			                            // 获取所偶遇请求的参数名称
			                            Enumeration<String> parameterNames = request.getParameterNames();
			                            // 遍历
			                            while(parameterNames.hasMoreElements()) {
			                                // 获取传递键值对的键
			                                String key = parameterNames.nextElement();
			                                // 获取键值对的值
			                                String value = request.getParameter(key);
			                                System.out.println(key+ ": " +value);
			                                 /*
			                                    传递参数: username=zhangsan password=123456 hobby="游戏" hobby=学习
			                                    运行结果
			                                    username: zhangsan
			                                    password: 123456
			                                    hobby: 游戏 --> hobby的学习没遍历 因为这里用的getParameter用getParameterValues就好了
			                                  */
			
			                            }
			
			                            System.out.println("----------------");
			                            Map<String, String[]> parameterMap = request.getParameterMap();
			                            Set<String> keys = parameterMap.keySet();
			                            for (String name : keys) {
			                                String[] values = parameterMap.get(name);
			                                for (String value1 : values) {
			                                    System.out.println(name + ": " + value1);
			                                }
			                            }
			                            /*
			                                传递参数: username=zhangsan password=123456 hobby="游戏" hobby=学习
			                                运行结果
			                                username: zhangsan
			                                password: 123456
			                                hobby: 游戏
			                                hobby: 学习
			                             */
			
			                        }
			
			                        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
			                            // get获取请求参数
			                            this.doPost(request, response);
			                        }
			                    }


				2. 请求转发: 一种在服务器内部的资源跳转方式
						1. 步骤:
								1. 通过request对象获取请求转发器对象: RequestDispatcher getRequestDispatcher(String path)
                				2. 使用RequestDispatcher对象来进行转发: forward(ServletRequest request, ServletResponse response)
                  
           				2. 特点:
								1. 浏览器地址栏路径不发生变化
								2. 只能转发到当前服务器内部资源中.
                				3. 转发是一次请求
            
            			3. 代码:
								package cn.xiaoge.web.request;

				                import javax.servlet.RequestDispatcher;
				                import javax.servlet.ServletException;
				                import javax.servlet.annotation.WebServlet;
				                import javax.servlet.http.HttpServlet;
				                import javax.servlet.http.HttpServletRequest;
				                import javax.servlet.http.HttpServletResponse;
				                import java.io.IOException;
				                import java.util.Enumeration;
				                import java.util.Map;
				                import java.util.Set;
				
				                /**
				                 * @Author: HWB
				                 * @DateTime: 2020/1/27 下午6:51
				                 * @Description: 演示Request对象请求转发
				                 */
				                @WebServlet("/requestDemo7")
				                public class RequestDemo7 extends HttpServlet {
				                    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
				                        System.out.println("demo77777被访问了....");
				
				
				                        // 转发到requestDemo8资源
				                        /*
				                            RequestDispatcher requestDispatcher = request.getRequestDispatcher("/requestDemo8");
				                            requestDispatcher.forward(request, response);
				                        */
				
				                        request.getRequestDispatcher("/requestDemo8").forward(request, response);
				
				                    }
				
				                    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
				                        // get获取请求参数
				                        this.doPost(request, response);
				                    }
				                }

                
				3. 共享数据:
						* 域对象: 一个有作用范围的对象, 可以在范围内共享数据
						* request域: 代表一次请求的范围, 一般用于请求转发的多个资源中共享数据
						* 方法:
								1. void setAttribute(String name, Object obj): 存储数据
								2. Object getAttribute(String name): 通过键获取值
								3. void removeAttribute(String name): 通过键移除键值对
									
						* RequestDemo7:
								package cn.xiaoge.web.request;

			                    import javax.servlet.RequestDispatcher;
			                    import javax.servlet.ServletException;
			                    import javax.servlet.annotation.WebServlet;
			                    import javax.servlet.http.HttpServlet;
			                    import javax.servlet.http.HttpServletRequest;
			                    import javax.servlet.http.HttpServletResponse;
			                    import java.io.IOException;
			                    import java.util.Enumeration;
			                    import java.util.Map;
			                    import java.util.Set;
			
			                    /**
			                     * @Author: HWB
			                     * @DateTime: 2020/1/27 下午6:51
			                     * @Description: 演示Request对象请求转发
			                     */
			                    @WebServlet("/requestDemo7")
			                    public class RequestDemo7 extends HttpServlet {
			                        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
			                            System.out.println("demo77777被访问了....");
			
			
			                            // 转发到requestDemo8资源
			                            /*
			                                RequestDispatcher requestDispatcher = request.getRequestDispatcher("/requestDemo8");
			                                requestDispatcher.forward(request, response);
			                            */
			
			                            // 存储数据到request域中
			                            request.setAttribute("msg", "hello");
			
			                            request.getRequestDispatcher("/requestDemo8").forward(request, response);
			
			                        }
			
			                        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
			                            // get获取请求参数
			                            this.doPost(request, response);
			                        }
			                    }
			

						* RequestDemo8:
								package cn.xiaoge.web.request;

			                    import javax.servlet.ServletException;
			                    import javax.servlet.annotation.WebServlet;
			                    import javax.servlet.http.HttpServlet;
			                    import javax.servlet.http.HttpServletRequest;
			                    import javax.servlet.http.HttpServletResponse;
			                    import java.io.IOException;
			                    import java.util.Enumeration;
			                    import java.util.Map;
			                    import java.util.Set;
			
			                    /**
			                     * @Author: HWB
			                     * @DateTime: 2020/1/27 下午6:51
			                     * @Description: 演示Request对象请求转发
			                     */
			                    @WebServlet("/requestDemo8")
			                    public class RequestDemo8 extends HttpServlet {
			                        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
			                            // 获取数据
			                            Object msg = request.getAttribute("msg");
			                            System.out.println(msg);
			                            // 移除数据
			                            request.removeAttribute("msg");
			                            System.out.println("demo888888被访问了....");
			                        }
			
			                        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
			                            // get获取请求参数
			                            this.doPost(request, response);
			                        }
			                    }
			
			
						* 运行结果
							  demo77777被访问了....
			                  hello
			                  demo888888被访问了....

                
				4. 获取ServletContext:
							* ServletContext getServletContext();
							* 介绍: ServletContext对象在博客中https://blog.csdn.net/zsx1314lovezyf/article/details/104110544
发布了323 篇原创文章 · 获赞 104 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/zsx1314lovezyf/article/details/104109665