会员可以在此提问,百战程序员老师有问必答
对大家有帮助的问答会被标记为“推荐”
看完课程过来浏览一下别人提的问题,会帮你学得更全面
截止目前,同学们一共提了 132413个问题
JAVA 全系列/第二阶段:JAVA 基础深化和提高/IO 流技术(旧) 3106楼

老师你好,在测试的时候出现了错误,请您帮忙看一下

错误截图

image.png

image.png


源码

package server;

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.Charset;

import IOCloseUtil.IOCloseUtil;
import Servlet.Servlet;

public class Server {//用于服务器的启动与停止
	private ServerSocket server; 
	public static void main(String[] args)  {
		Server server = new Server();
		server.start();
	}
	public void start()  {
		this.start(8888);
	}
	public void start(int port)  {
		try {
			server = new ServerSocket(port);
			this.receive();
		} catch (IOException e) {
			
			e.printStackTrace();
		}
	}
	private void receive()  {
		try {
			//监听
			Socket client = server.accept();
			
			/**封装请求信息*/
			Request req = new Request(client.getInputStream());
			/**做出响应*/
			/*
			StringBuilder sb = new StringBuilder();
			sb.append("HTTP/1.1").append(" ").append(200).append(" ").append("ok").append("\r\n");
			sb.append("Content-type:text/html;charset=utf-8").append("\r\n");
			//内容
			String str="<html><head><title>响应结果</title></head><body>成功<body></html>";
			sb.append("Content-Length:"+str.getBytes("utf-8").length).append("\r\n");
			sb.append("\r\n");
			sb.append(str);
			
			//通过输出流发送出去
			BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(client.getOutputStream(),"utf-8"));
			bw.write(sb.toString());
			bw.flush();
			bw.close();
			*/
			Response rep = new Response(client.getOutputStream());
			Servlet servlet = WebApps.getServlet(req.getUrl());
			int code =200;
			if(servlet==null) { //servlet未创建成功
				code = 404;
			}
			//调用Servlet中服务的方法
			try {
				servlet.service(req, rep);
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			rep.PushToClient(code);
			IOCloseUtil.closeAll(client);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

}


JAVA 全系列/第二阶段:JAVA 基础深化和提高/手写服务器项目(旧) 3109楼

请问老师再处理中文节码的时候,为什么获取到的值为空啊,不处理中文的时候就可以获取到

代码

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"));
		
	}



}

image.png

JAVA 全系列/第二阶段:JAVA 基础深化和提高/手写服务器项目(旧) 3115楼
JAVA 全系列/第二阶段:JAVA 基础深化和提高/手写服务器项目(旧) 3116楼
JAVA 全系列/第二阶段:JAVA 基础深化和提高/容器(旧) 3118楼

照着代码打的,不知道哪错了

package cn.lsq.server;

import java.util.List;
import java.util.Map;

import cn.lsq.servlet.Servlet;

public class WebApp {
	private static ServletContext contxt;
	static {
		contxt = new ServletContext();
		//分别获取对应关系的Map集合
	    Map<String, String> servlet = contxt.getServlet();
	    Map<String, String> mapping = contxt.getMapping();
	    //创建解析XML文件对象
	    WebDom4j web = new WebDom4j();
	    web.parse(web.getDocument());//解析XML
	    //获取解析XML之后的List集合
	    List<Entity> entityList = web.getEntityList();
	    List<Mapping> mappingList = web.getMappingList();
	    //将List集合的数据存储到Map集合
	    for(Entity entity : entityList) {
	    	servlet.put(entity.getName(), entity.getClazz());
	    }
	    for(Mapping map:mappingList) {
	    	List<String> urlPattern=map.getUrlPattern();
	    	for(String s:urlPattern) {
	    		mapping.put(s,map.getName());
	    	}
	    }
	}
	public static Servlet getServlet(String url) {
		if ((url == null) || (url.trim().equals(""))) {
		      return null;
		}
	      try {
	    	  String servletName = contxt.getMapping().get(url);
			  String servletClass = contxt.getServlet().get(servletName);
			  Class<?> clazz=Class.forName(servletClass);
			  Servlet servlet = (Servlet)clazz.newInstance();
			  return servlet;
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	      return null;
	}
	    
	public static void main(String[] args) {
		System.out.println(getServlet("/log"));
	}
}

image.png

JAVA 全系列/第二阶段:JAVA 基础深化和提高/手写服务器项目(旧) 3120楼

课程分类

百战程序员微信公众号

百战程序员微信小程序

©2014-2025百战汇智(北京)科技有限公司 All Rights Reserved 北京亦庄经济开发区科创十四街 赛蒂国际工业园
网站维护:百战汇智(北京)科技有限公司
京公网安备 11011402011233号    京ICP备18060230号-3    营业执照    经营许可证:京B2-20212637