请问老师再处理中文节码的时候,为什么获取到的值为空啊,不处理中文的时候就可以获取到
代码
package 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 is; //输入流
private String requsetInfo;//请求字符串,请求方式,请求的路径,协议,参数,协议的版本
private String method;//请求的方式
private String url; //请求的路径
/**
* 输入框的name为key,值为value
*
* key:username value :sff
* key:pwd value:123
* key:hobby value:read,sleep,study
*
*/
private Map<String, List<String>> parametermapValues;//参数
private static final String CRLF ="\r\n";//换行
private static final String BLANK = " "; //空格
//构造方法,初始化属性
public Request() {
parametermapValues = new HashMap<String, List<String>>();
requsetInfo="";
method="";
url="";
}
public Request(InputStream is) {
this();//调用本类的无参构造方法
this.is = is;
try {
byte[] buf = new byte[20480];
int len=is.read(buf);
requsetInfo = new String (buf,0,len);
} catch (IOException e) {
return;
}
//调用本类中的分解请求信息的方法
this.parseRequestInfo();
}
/**
* 分解请求信息的方法
* 请求方式
* 请求参数
* 请求路径
*/
public void parseRequestInfo() {
String paraString="";//请求参数
//获取请求参数的第一行
String FirstLine = requsetInfo.substring(0,requsetInfo.indexOf(CRLF)).trim();//从0开始,知道换行的结尾
//分解出请求方式
int index = FirstLine.indexOf("/");
this.method = FirstLine.substring(0, index).trim();
//分解出url,get可能包含参数,post也可能不包含参数
String urlString = FirstLine.substring(index, FirstLine.indexOf("HTTP/")).trim();
//判断请求方式是get还是post
if("get".equalsIgnoreCase(this.method)) {//包含请求参数
if(urlString.contains("?")) {
String []strArray = urlString.split("//?");
this.url = strArray[0];
paraString=strArray[1];
}else {
this.url=urlString;
}
}else {//post不包含请求参数
this.url = urlString;
paraString =requsetInfo.substring(requsetInfo.lastIndexOf(CRLF)).trim();
}
if(paraString.equals("")) {
return;
}
//输出请求参数
//System.out.println(paraString);
//调用本类中请求参数的方法
//this.parseParam(parString);
}
/*
//用于测试
public void show() {
System.out.println(this.url);
System.out.println(this.method);
}
*/
/**
* username=sff&pwd=123&hobby=read&hobby=sleep
* username=sff
* pwd=123
* hobby=read
* hobby=sleep
* @param parString
*/
//请求参数的方法
public void parseParam(String parString) {
String [] token = parString.split("&");//根据&符号分割参数
for(int i=0;i<token.length;i++) {
String keyValues = token[i];
String[] keyValue = keyValues.split("="); // username sff pwd 123
if(keyValue.length==1) {
keyValue = Arrays.copyOf(keyValue, 2);
keyValue[1]=null;
}
//将表单元素的name与name对应的值存储到Map集合中
String key = keyValue[0].trim(); //0对应的是值
String value =keyValue[1]==null?null :decode(keyValue[1].trim(), "utf-8");
//放到集合中存储
if(!parametermapValues.containsKey(key)) { //键不存在
parametermapValues.put(key, new ArrayList<String>());
}
List<String> values = parametermapValues.get(key);//根据键获取值
values.add(value);
}
}
//根据表单元素获取name的多个值
private String[] getParamterValue(String name){
//根据key去获取value
List<String> values = parametermapValues.get(name);
if(values==null) {
return null;
}else {
return values.toArray(new String[0]);
}
}
private String getParamer(String name) {
//调用本类中获取多个值的方法
String[] value = this.getParamterValue(name);
if(value==null) { //判断是否获取到
return null;
}else {
return value[0];
}
}
//处理中文,解码
private String decode(String value,String code) { //请求处理的值和编码
try {
URLDecoder.decode(value, code);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
//测试
public static void main(String[] args) {
Request re = new Request();
//调用分解参数的方法
re.parseParam("username=%E5%8C%97%E4%BA%AC%E5%B0%9A%E5%AD%A6%E5%A0%82&pwd=123&hobby=read&hobby=sleep");
System.out.println(re.parametermapValues);
//获取多个值的方法
String [] str = re.getParamterValue("hobby");
for (String string : str) {
System.out.println(string);
}
//获取单个值的方法
System.out.println(re.getParamer("username"));
}
}
