zoukankan      html  css  js  c++  java
  • 03-【request对象获取请求的数据 & request对象存取值】

    request概述(封装了客户端所有的请求数据)
     
     request是Servlet.service()方法的一个参数,类型为javax.servlet.http.HttpServletRequest。在客户端发出每个请求时,服务器都会创建一个request对象,并把请求数据封装到request中,然后在调用Servlet.service()方法时传递给service()方法,这说明在service()方法中可以通过request对象来获取请求数据。

    request对象的创建:
    request是由tomcat服务器创建的。request对象是在发出请求的时候创建的,一次请求会伴着request对象的创建和失效
    1、获取网络信息【HttpServletReuest对象】

    >获取客户端IP:request.getRemoteAddr()
    >获取客户端口号:request.getRemotePort()
    >获取服务端IP:request.getLocalAddr()
    >获取服务端口号:request.getLocalPort();
    >请求方式,request.getMethod(),可能是POST也可能是GET
    通过User-Agent识别用户浏览器类型

     1     public void getNetInfo(HttpServletRequest request,
     2             HttpServletResponse response){
     3         //获取客户端的ip
     4         String remoteAddr = request.getRemoteAddr();
     5         //获取客户端的端口号
     6         int remotePort = request.getRemotePort();
     7         //获取服务器的ip 
     8         String localAddr = request.getLocalAddr();
     9         //获取服务器的端口号
    10         int localPort = request.getLocalPort();
    11         System.out.println("客户端ip和端口号:"+remoteAddr +"---"+remotePort);
    12         System.out.println("服务器的ip和端口号:"+localAddr +"---"+localPort);
    13         // 获取请求方法
    14         String method = request.getMethod();
    15         System.out.println("获取请求方式:"+method);
    16         // 获取请求头信息
    17         String userAgent = request.getHeader("User-Agent");
    18         System.out.println(userAgent);// 获取名为User-Agent请求头
    19         // 判断浏览器的类型
    20         if(userAgent.toLowerCase().contains("chrome")){
    21             System.out.println("注意:"+remoteAddr+"正在使用Google浏览器访问您的服务器");
    22         }else if(userAgent.toLowerCase().contains("firefox")){
    23             System.out.println("注意:"+remoteAddr+"正在使用火狐浏览器访问您的服务器");
    24         }else if(userAgent.toLowerCase().contains("msie")){
    25             System.out.println("注意:"+remoteAddr+"正在使用Internet Explorer浏览器访问您的服务器");
    26         }else{
    27             System.out.println("不知名的浏览器正在访问您的服务器");
    28         }
    View Code


    测试访问:当别人输入你的网络地址就可以获取到是谁的IP访问的:http://192.168.58.82:8080/servlet02/login.html
    2、获取请求行信息   请求的url
    http://127.0.0.1:8080/servlet02/request01?uname=zhangsan&pwd=123456
    >String getScheme():返回请求协议:http
    >String getServerName():返回主机名:127.0.0.1
    >int getServerPort():返回服务器端口号:8080
    >String getContextPath():返回上下文路径(获取项目名):/servlet02
    >String getServletPath():返回Servlet路径(对应的是url-pattern):/request01
    >String getQueryString():返回请求URL中的参数:uname=zhangsan&pwd=123456
    >String getRequestURI():返回请求URI路径(等于项目名+Servlet路径):/servlet02/request01
    >StringBuffer getRequestURL():返回请求URL路径(除了参数以外的路径信息):http://127.0.0.1:8080/servlet02/request01
    >String getMethod():返回请求方式:GET
    代码:

     1 private void getRequestLine(HttpServletRequest request,
     2             HttpServletResponse response) {
     3         //request获取URL的相关信息
     4         // 获取请求协议
     5         String scheme = request.getScheme();
     6         System.out.println("返回请求协议:"+scheme);
     7         // 获取主机名
     8         String serverName = request.getServerName();
     9         System.out.println("返回请求协议:"+serverName);
    10         // 获取服务器端口号
    11         int serverPort = request.getServerPort();
    12         System.out.println("返回获取端口号:"+serverPort);
    13         // 获取上下文路径
    14         String contextPath = request.getContextPath();
    15         System.out.println("返回上下文路径(获取项目名):"+contextPath);
    16         // 获取servlet路径
    17         String servletPath = request.getServletPath();
    18         System.out.println("返回Servlet路径(对应的是url-pattern):"+servletPath);
    19         // 获取URL中的参数
    20         String queryString = request.getQueryString();
    21         System.out.println("参数信息(?后面的参数):"+queryString);
    22         // 获取URI的路径
    23         String requestURI = request.getRequestURI();
    24         System.out.println("URI路径(等于项目名+Servlet路径):"+requestURI);
    25         // 获取URL路径
    26         StringBuffer requestURL = request.getRequestURL();
    27         System.out.println("URL路径(除了参数以外的路径信息):"+requestURL);
    28         // 获取请求方法
    29         String method = request.getMethod();
    30         System.out.println("获取请求方式:"+method);
    31     }
    View Code

    截图

    3、request获取请求参数
      请求参数是由客户端发送给服务器的!有可能是在请求体中(POST),也可能是在URL之后(GET)请求参数:有一个参数一个值的,还有一个参数多个值!
    >String getParameter(String name):获取指定名称的请求参数值,适用于单值请求参数

    1 String uname = request.getParameter("uname");
    2 String pwd = request.getParameter("pwd");
    3 // 会出现乱码的现象,设置请求编码:必须在获取数据之前,login.html改成post请求
    4 System.out.println("用户名:" + uname + "--->" + "密码:" + pwd);

    获取所得的结果信息:用户名:小云云--->密码:123456
    >String[] getParameterValues(String name):获取指定名称的请求参数值【当多个参数名称相同时】
    eg:获取复选框的value值,前端提交的参数【name相同,值不同的一组参数】

    1 // 获取复选框的value值   ;  前端提交的参数【name相同 值不同 的一组参数】
    2 String[] checkbox = request.getParameterValues("fav");
    3 for(String fav : checkbox){
    4     System.out.println("获取爱好的值:"+fav);
    5 }
    6         

    获得所得的结果信息

    >Enumeration<String> getParameterNames():获取所有请求参数名称【表单的name值】

    1 Enumeration<String> names = request.getParameterNames();
    2 while(names.hasMoreElements()){
    3     System.out.println(names.nextElement());
    4 }

    获得所得的结果信息

    >Map<String,String[]> getParameterMap():获取所有参数封装到Map中,其中key为参数名,value为参数值,因为一个参数名称可能有多个值,所以参数值是String[],而不是String

    1 Map<String, String[]> map = request.getParameterMap();
    2 for(String value:map.keySet()){
    3     String[] strings = map.get(value);
    4     System.out.println(value+":"+Arrays.toString(strings));
    5 }
    View Code


    汇总代码【1、获取网络信喜、2、获取请求行信息、3、request获取请求参数】

    login.html

     1 <!DOCTYPE html>
     2 <html>
     3   <head>
     4     <title>login.html</title>
     5    <!--  设置编码集 -->
     6     <meta charset="utf-8">
     7     <meta name="keywords" content="keyword1,keyword2,keyword3">
     8     <meta name="description" content="this is my page">
     9     <meta name="content-type" content="text/html; charset=UTF-8">
    10     
    11     <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
    12 
    13   </head>
    14   
    15   <body>
    16     This is my HTML page. <br><hr>
    17    <!--  提交服务器URL-->
    18     <form action="request01" method="post">
    19         用户名:<input type="text" id="uname" name="uname" /> <br />
    20         密码:<input type="password" id="pwd" name="pwd" />  <br />
    21         爱好:
    22         <input type="checkbox" name="fav" value="001">看电影
    23         <input type="checkbox" name="fav" value="002">听小曲
    24         <input type="checkbox" name="fav" value="003">打游戏
    25         <input type="checkbox" name="fav" value="004" checked="checked">抽烟、喝酒、烫头
    26         <br>
    27         <input type="submit" value="登录" /> <br />
    28     </form>
    29   </body>
    30 </html>
    View Code

    request01.java

      1 package boom.request;
      2 
      3 import java.io.IOException;
      4 import java.io.UnsupportedEncodingException;
      5 import java.util.Arrays;
      6 import java.util.Map;
      7 
      8 import javax.servlet.ServletException;
      9 import javax.servlet.http.HttpServlet;
     10 import javax.servlet.http.HttpServletRequest;
     11 import javax.servlet.http.HttpServletResponse;
     12 /**
     13  * 测试  request对象
     14  * @author Administrator
     15  *
     16  */
     17 public class request01 extends HttpServlet {
     18     @Override
     19     protected void service(HttpServletRequest request, HttpServletResponse response)
     20             throws ServletException, IOException {
     21         // 设置编码集
     22         request.setCharacterEncoding("utf-8");
     23         // 1 获取网络连接信息
     24         //getNetInfo(request, response);
     25         
     26         // 2获取请求行的信息
     27         getRequestLine(request,response);
     28         
     29         // 3获取请求参数
     30         //getRequestData(request, response);
     31         
     32         // service方法会调用  父类的doGet方法  
     33         response.getWriter().println("test request.....");
     34     }
     35     
     36     /**
     37      * 3,获取请求参数    例如  form表单提交的内容
     38      * @param request
     39      * @param response
     40      * @throws UnsupportedEncodingException 
     41      */
     42     private void getRequestData(HttpServletRequest request,
     43             HttpServletResponse response) throws UnsupportedEncodingException {
     44         
     45         //获取请求参数  前端页面发送的请求参数
     46         //form表单提交的参数    用户名:name="uname"   密码  :name="pwd"
     47         //注意: form表单域 用户名和密码 必须有name属性
     48         
     49         //1、获取指定名称的请求参数值,适用于单值请求参数
     50         /*String uname = request.getParameter("uname");
     51         String pwd = request.getParameter("pwd");
     52         // 会出现乱码的现象,设置请求编码:必须在获取数据之前,login.html改成post请求
     53         System.out.println("用户名:" + uname + "--->" + "密码:" + pwd);*/
     54         
     55         
     56         //2、获取指定名称的请求参数值
     57         // 获取复选框的value值   ;  前端提交的参数【name相同 值不同 的一组参数】
     58         /*String[] checkbox = request.getParameterValues("fav");
     59         for(String fav : checkbox){
     60             System.out.println("获取爱好的值:"+fav);
     61         }*/
     62         
     63         //3、获取所有请求参数名称
     64         /*Enumeration<String> names = request.getParameterNames();
     65         while(names.hasMoreElements()){
     66             System.out.println(names.nextElement());
     67         }*/
     68         //4、获取所有参数封装到Map中
     69         Map<String, String[]> map = request.getParameterMap();
     70         for(String value:map.keySet()){
     71             String[] strings = map.get(value);
     72             System.out.println(value+":"+Arrays.toString(strings));
     73         }
     74         //获取父页面的url 
     75         String Referer = request.getHeader("Referer");
     76         System.out.println("防止别人盗链我们的网址:"+Referer);
     77     }
     78 
     79     /**
     80      * 2,请求行信息   请求的url
     81      */
     82     
     83     private void getRequestLine(HttpServletRequest request,
     84             HttpServletResponse response) {
     85         //request获取URL的相关信息
     86         // 获取请求协议
     87         String scheme = request.getScheme();
     88         System.out.println("返回请求协议:"+scheme);
     89         // 获取主机名
     90         String serverName = request.getServerName();
     91         System.out.println("返回请求协议:"+serverName);
     92         // 获取服务器端口号
     93         int serverPort = request.getServerPort();
     94         System.out.println("返回获取端口号:"+serverPort);
     95         // 获取上下文路径
     96         String contextPath = request.getContextPath();
     97         System.out.println("返回上下文路径(获取项目名):"+contextPath);
     98         // 获取servlet路径
     99         String servletPath = request.getServletPath();
    100         System.out.println("返回Servlet路径(对应的是url-pattern):"+servletPath);
    101         // 获取URL中的参数
    102         String queryString = request.getQueryString();
    103         System.out.println("参数信息(?后面的参数):"+queryString);
    104         // 获取URI的路径
    105         String requestURI = request.getRequestURI();
    106         System.out.println("URI路径(等于项目名+Servlet路径):"+requestURI);
    107         // 获取URL路径
    108         StringBuffer requestURL = request.getRequestURL();
    109         System.out.println("URL路径(除了参数以外的路径信息):"+requestURL);
    110     }
    111 
    112     /**
    113      * 1,获取网络信息【当别人输入你的网络地址就可以获取到是谁的IP访问的】
    114      * http://192.168.58.82:8080/servlet02/login.html
    115      * 
    116      */
    117     public void getNetInfo(HttpServletRequest request,
    118             HttpServletResponse response){
    119         //获取客户端的ip
    120         String remoteAddr = request.getRemoteAddr();
    121         //获取客户端的端口号
    122         int remotePort = request.getRemotePort();
    123         //获取服务器的ip 
    124         String localAddr = request.getLocalAddr();
    125         //获取服务器的端口号
    126         int localPort = request.getLocalPort();
    127         System.out.println("客户端ip和端口号:"+remoteAddr +"---"+remotePort);
    128         System.out.println("服务器的ip和端口号:"+localAddr +"---"+localPort);
    129         // 获取请求方法
    130         String method = request.getMethod();
    131         System.out.println("获取请求方式:"+method);
    132         // 获取请求头信息
    133         String userAgent = request.getHeader("User-Agent");
    134         System.out.println(userAgent);// 获取名为User-Agent请求头
    135         // 判断浏览器的类型
    136         if(userAgent.toLowerCase().contains("chrome")){
    137             System.out.println("注意:"+remoteAddr+"正在使用Google浏览器访问您的服务器");
    138         }else if(userAgent.toLowerCase().contains("firefox")){
    139             System.out.println("注意:"+remoteAddr+"正在使用火狐浏览器访问您的服务器");
    140         }else if(userAgent.toLowerCase().contains("msie")){
    141             System.out.println("注意:"+remoteAddr+"正在使用Internet Explorer浏览器访问您的服务器");
    142         }else{
    143             System.out.println("不知名的浏览器正在访问您的服务器");
    144         }
    145     }
    146 }
    View Code

    4、request域【request对象存取数据】
    Servlet中三大域对象:request、session、application
    request的域方法:
    >void setAttribute(String name, Object value):用来存储一个对象,也可以称之为存储一个域属性
    >object getAttribute(String name):用来获取request中的数据,当前在获取之前需要先去存储。
    >void removeAttribute(String name):用来移除request中的域属性,如果参数name指定的域属性不存在,那么本方法什么都不做
    >Enumeration getAttributeNames():获取所有域属性的名称;
    注:同一请求范围内使用request.setAttribute()、request.getAttribute()来传值!前一个Servlet调用setAttribute()保存值,后一个Servlet调用getAttribute()获取值。

     1 //request对象  进行存取值   
     2 //request对象   对应的一次请求和响应  ,对象也可以存取数据
     3         
     4 // 存对象
     5 request.setAttribute("name", "zhangsan");
     6 // 取对象【获取参数取值】
     7 Object name = request.getAttribute("name");
     8 System.out.println("删除属性前name:"+name);
     9         
    10 //移除属性值  ,是 在request对象中存取 
    11 request.removeAttribute("name");
    12         
    13 Object removeName = request.getAttribute("name");
    14 System.out.println("删除属性后name:"+removeName);


    测试request对象存取值
    requset.html

     1 <!DOCTYPE html>
     2 <html>
     3   <head>
     4     <title>request.html</title>
     5     <meta charset="utf-8">
     6     <meta name="keywords" content="keyword1,keyword2,keyword3">
     7     <meta name="description" content="this is my page">
     8     <meta name="content-type" content="text/html; charset=UTF-8">
     9     
    10     <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
    11 
    12   </head>
    13   
    14   <body>
    15       <div>
    16           <a href="request02">测试request对象存取值</a>
    17           <hr>
    18       </div>
    19   </body>
    20 </html>
    View Code

    request02.java

     1 package boom.request;
     2 
     3 import java.io.IOException;
     4 
     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 public class request02 extends HttpServlet {
    11     @Override
    12     protected void service(HttpServletRequest request, HttpServletResponse response)
    13             throws ServletException, IOException {
    14         
    15         // 设置响应编码
    16         response.setContentType("text/html;charset=utf-8");
    17         //request对象  进行存取值   
    18         //request对象   对应的一次请求和响应  ,对象也可以存取数据
    19         
    20         // 存对象
    21         request.setAttribute("name", "zhangsan");
    22         // 取对象【获取参数取值】
    23         Object name = request.getAttribute("name");
    24         System.out.println("删除属性前name:"+name);
    25         
    26         //移除属性值  ,是 在request对象中存取 
    27         request.removeAttribute("name");
    28         
    29         Object removeName = request.getAttribute("name");
    30         System.out.println("删除属性后name:"+removeName);
    31         
    32         response.getWriter().println("这是乱码的。。。。。haha。。。。已解决");
    33         //3 秒后跳转到index.jsp页面
    34         response.addHeader("refresh","3;http://www.baidu.com");
    35     }
    36     
    37 }
    View Code

    5、编码集的设置注意点:
    客户端发送给服务器端的数据【设定 分为 get/post】
    1、post请求 代码中添加编码设置
    req.setCharacterEncoding("utf-8");
    2、get请求 req.setCharacterEncoding("utf-8");
    tomcat ----conf -----server.xml 文件 端口号后 + 设置 URIEncoding="utf-8" useBodyEncodingForURI="true" 
    <Connector connectionTimeout="20000" port="8080" URIEncoding="utf-8" useBodyEncodingForURI="true" protocol="HTTP/1.1" redirectPort="8443" />
    提交的服务器地址 url 
    get请求 url 后边的参数 会被 form表单的参数值覆盖 ,但是直接在地址栏 添加 url?cmd=add 在后端servlet是可以获取到的
    <a href ="url?cmd=add">地址栏直接输入url</a> 超链接是get请求
    post请求:url后边的参数会提交,form表单的参数会在请求体中也会提交 。一般form表单提交用post请求
    服务器端响应给客户端的数据:
    设定浏览器打开文件的方式 text/html 
    设定编码集 charset=utf-8
    // 设置响应编码
    response.setContentType("text/html;charset=utf-8");
    注:所有的请求编码设置必须在获取数据之前
    补充:定时刷新:

    1 //3 秒后跳转到index.jsp页面
    2 response.addHeader("refresh","3;http://www.baidu.com");
  • 相关阅读:
    Pick-up sticks
    The Doors
    Intersecting Lines
    Segments
    TOYS
    Palindrome
    Distinct Substrings
    Milk Patterns
    Musical Theme
    JavaScript基于时间的动画算法
  • 原文地址:https://www.cnblogs.com/cao-yin/p/9872807.html
Copyright © 2011-2022 走看看