• (四)——Request


      1 package my.tomcat2;
      2 
      3 import java.io.BufferedReader;
      4 import java.io.IOException;
      5 import java.io.InputStreamReader;
      6 import java.io.UnsupportedEncodingException;
      7 import java.net.Socket;
      8 import java.net.URLDecoder;
      9 import java.util.ArrayList;
     10 import java.util.HashMap;
     11 import java.util.List;
     12 import java.util.Map;
     13 
     14 /**
     15  * 用来接收客户端发来的头信息,并且解析头信息的第一句,也就是 method 是 Get 还是 POST, URL, param(参数)
     16  */
     17 public class Request {
     18     private static final String CRLF = "
    ";
     19     //将参数存入 Map 中去,因为有可能会有要读取 CheckBox 复选框的参数值,他们属于同一个 name,所以要将他们存入到一个 List 中去
     20     private Map<String, List<String>> paramMap;
     21     //读取客户端的 头信息
     22     private BufferedReader bw;
     23     //将读取到的头信息append到一个StringBuilder中
     24     private StringBuilder requestInfo;
     25     //URL
     26     private String url;
     27     //Get 或者 POST
     28     private String method;
     29     //参数
     30     private String param = "";
     31     
     32     //初始化 字段
     33     public Request() {
     34         paramMap = new HashMap<>();
     35     }
     36 
     37     public Request(Socket client) {
     38         try {
     39             paramMap = new HashMap<>();
     40             bw = new BufferedReader(new InputStreamReader(client.getInputStream()));
     41             requestInfo = new StringBuilder();
     42             String msg;
     43             //这里有两个问题,线程是会循环的,所以会读到什么还请自己动手 BUG 一番,第一次循环最后会读到“”,第二次会首先读到 null
     44             String hi = bw.readLine();
     45             while (hi != null && !((msg = hi).equals(""))) {
     46                 hi = bw.readLine();
     47                 requestInfo.append(msg).append(CRLF);
     48             }
     49         } catch (IOException e) {
     50             CloseUtil.closeSocket(client);
     51         }
     52         //将读到的 头信息 解析
     53         if(!(requestInfo.toString().equals(""))) {
     54             parseRequestInfo(requestInfo.toString());
     55         }
     56     }
     57     
     58     //将所有 substring()获得的字符串调用 trim(),去掉空白字符,不然会出问题
     59     public void parseRequestInfo(String info) {
     60         String firstInfo = info.substring(0, info.indexOf(CRLF)).trim();
     61         method = firstInfo.substring(0, firstInfo.indexOf("/")).trim();
     62         String shortInfo = firstInfo.substring(firstInfo.indexOf("/"), firstInfo.indexOf("HTTP/")).trim();
     63 
     64         if (method.equalsIgnoreCase("get")) {
     65             if (shortInfo.contains("?")) {
     66                 String[] str = shortInfo.split("[?]");
     67                 this.url = str[0];
     68                 this.param = str[1];
     69             } else {
     70                 this.url = shortInfo;
     71             }
     72         } else if (method.equalsIgnoreCase("post")) {
     73             this.url = shortInfo;
     74             this.param = info.substring(info.lastIndexOf(CRLF)).trim();
     75         }
     76 
     77         if (param.equals("")) {
     78             return;
     79         }
     80         parseParam(param);
     81     }
     82     
     83     //解析 参数
     84     public void parseParam(String param) {
     85         String[] values = param.split("&");
     86         String[][] pair = new String[values.length][2];
     87 
     88         for (int i = 0; i < pair.length; i++) {
     89             String[] str = values[i].split("=");
     90             for (int j = 0; j < 2; j++) {
     91                 if (1 == str.length) {
     92                     pair[i][j] = str[j];
     93                     pair[i][j + 1] = null;
     94                     break;
     95                 } else {
     96                     pair[i][j] = str[j];
     97                 }
     98             }
     99         }
    100 
    101         storeParam(pair);
    102     }
    103     
    104     //将解析完的参数,存入到 Map 中去
    105     public void storeParam(String[][] pair) {
    106         for (int i = 0; i < pair.length; i++) {
    107             if (paramMap.containsKey(pair[i][0])) {
    108                 paramMap.get(pair[i][0]).add(decode(pair[i][1], "utf8"));
    109             }else{
    110                 paramMap.put(pair[i][0], new ArrayList<>());
    111                 paramMap.get(pair[i][0]).add(decode(pair[i][1], "utf8"));
    112             }
    113         }
    114     }
    115     
    116     //获取多个参数,例如复选框之类的
    117     public String[] getParams(String key){
    118         if(paramMap.containsKey(key)){
    119             return paramMap.get(key).toArray(new String[0]);
    120         }else {
    121             return null;
    122         }
    123     }
    124     
    125     //这个是我用来在页面上显示复选框的多个属性值的,暂且搁浅
    126     public String splitParams(String key){
    127         String[] str = getParams(key);
    128         StringBuilder sb = new StringBuilder();
    129         for(String temp : str){
    130             sb.append(temp);
    131         }
    132         return sb.toString();
    133     }
    134     //这里如果是没有get参数的话,是会返回null, getParams(key)[0] 也就是 null[0],当然会报错。应该是getParams(key),这个问题缠绕了我一些时间。。。
    135     public String getParam(String key){
    136 //        return getParams(key)[0] == null ? "null" : getParams(key)[0];
    137         return getParams(key) == null ? "null" : getParams(key)[0];
    138     }
    139 
    140     //解决中文参数,如果没有这个方法的话,你的参数值为中文的话,在页面上显示的是乱码
    141     public String decode(String value, String code) {
    142         try {
    143             return URLDecoder.decode(value, code);
    144         } catch (UnsupportedEncodingException e) {
    145             e.printStackTrace();
    146         }
    147         return null;
    148     }
    149     
    150     //获取URL
    151     public String getUrl(){
    152         return this.url;
    153     }
    154 }
  • 相关阅读:
    Linux:grep 命令
    Linux:sort
    Java中路径相关的获取方式
    Spring boot 配置 Tomcat 临时文件缓存目录
    zabbix :web 界面显示的监控项值为0或者空
    Maven:禁止编码指定类型的资源文件
    Maven:element '******' cannot have character [children]
    MySQL:数据库名或者数据表名包含-
    Linux:sed
    Lucene 6.0下使用IK分词器
  • 原文地址:https://www.cnblogs.com/AI-Cobe/p/9606809.html
Copyright © 2020-2023  润新知