老师好,
请看一下,这个细节问题,找了很久,请看一下,结果不一样,多了点东西,找不到
package com.bjsxt.server;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Request {//请求
private InputStream in;//输入流
private String requestInfo;//请求字符串,请求方式,请求请求路径 请求参数,请求正文 请求协议。。。。
private String method;//情趣方式
private String url;//请求的url路径
/*输入框的name为key,值为:value
* String list集合
* key: name value: bjsxt
* key: pwd value: 123
* key: hobby value: read,ball 对应多个值的情况
*/
private Map<String, List<String>> parameterMapValues;//请求参数
private static final String CRLF="\r\n";//换行
private static final String BLANK=" ";//空格
public Request() {
super();
// TODO Auto-generated constructor stub
method = "";
url = "";
requestInfo = "";
parameterMapValues = new HashMap<String, List<String>>();
}
public Request(InputStream in) {
this();//调用本类中的无参构造法方法
this.in = in;
byte[] buf = new byte[20480];//一次性读过来
try {
int len = this.in.read(buf);
requestInfo = new String(buf,0,len);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return;
}
//调用分解请求信息的方法
parseRequestInfo();
}
//分解请求信息的方法
private void parseRequestInfo() {
/*
* 请求方式
* 请求路径
* 请求参数
*/
//获取请求参数的第一行
String firstLine = requestInfo.substring(0,requestInfo.indexOf(CRLF)).trim();
//分解出请求方式
int index = firstLine.indexOf("/");
this.method = firstLine.substring(0,index).trim();
String paraString = "";//用于存储请求参数
//分解url 可能包含参数get 也可能不包含参数post
String urlString = firstLine.substring(index,firstLine.indexOf("HTTP/")).trim();
//判断请求方式是GET还是POST
if ("get".equalsIgnoreCase(this.method)) {//包含请求参数
if (urlString.contains("?")) {
String[] urlArray = urlString.split("\\?");
this.url = urlArray[0];
paraString = urlArray[1];
}else {
this.url = urlString;
}
}else {//不包含请求参数
this.url = urlString;
paraString = requestInfo.substring(requestInfo.lastIndexOf(CRLF)).trim();
if (paraString.equals("")) {
return;
}
}
//调用解析参数的方法
parsePara(paraString);
}
//分解请求参数,封装入map中
public void parsePara(String paraString) {
String[] token = paraString.split("&");
for (String keyValues : token) {
String[] keyValue = keyValues.split("=");
if (keyValue.length==1) {
keyValue = Arrays.copyOf(keyValue, 2);
keyValue[1] = null;
}
//将表单元素的name和name对应的值存储到map集合中
String key = keyValue[0].trim();
String value = keyValue[1]==null?null:decode(keyValue[1], "gbk").trim();
//关联key value
if (!parameterMapValues.containsKey(key)) {
parameterMapValues.put(key, new ArrayList<String>());
}
parameterMapValues.get(key).add(value);
}
}
//浏览器发送请求时,会将中文编码,服务器接收请求信息时候进行解码
public String decode(String value,String code) {
try {
return URLDecoder.decode(value, code);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
public static void main(String[] args) {
Request req = new Request();
req.parsePara("http://localhost:8888/?username=efe&password=fef&hobby=ball&hobby=paint");
System.out.println(req.parameterMapValues);
}
}
效果截图:
