Java自己实现的一个简单的tomcat通过XML配置读取并返回相应Servlet对象

其基础是要了解http协议请求的报文格式和响应的报文格式,这里就不做详细介绍了。

首先是XML工具类
``
public class XMLUtil {
static Stack stack=new Stack<>();
private String result=null;
private String servletClass=null;
public void addServlet(){
SAXReader reader=new SAXReader();
try {
Document document=reader.read(new FileInputStream(“source/web1.xml”));
Element root=document.getRootElement();

		Element element=root.addElement("servlet");
		element.addElement("servlet-name").setText("servlet1");;
		element.addElement("servlet-class").setText("com.yc.test");;
		FileOutputStream out =new FileOutputStream("source/web1.xml");
        
        // 指定文本的写出的格式:
        OutputFormat format=OutputFormat.createPrettyPrint();   //漂亮格式:有空格换行
        format.setEncoding("UTF-8");
        
        //1.创建写出对象
        XMLWriter writer=new XMLWriter(out,format);
           
        //2.写出Document对象
        writer.write(root);
        
        //3.关闭流
        writer.close();

		System.out.println(element);
		
		
	} catch (Exception e) {
		// TODO Auto-generated catch block
		//e.printStackTrace();
	}
	
}
//获取servlet的权限定类名
public void getServlet(String servletName){
	System.out.println("servletName===================="+servletName);
	SAXReader reader=new SAXReader();
	try {
		Document document=reader.read(new FileInputStream("source/web1.xml"));
		Element rootElement=document.getRootElement();
		List<Element> list=rootElement.elements("servlet");
		for(int i=0;i<list.size();i++){
			String name=list.get(i).element("servlet-name").getText();
			System.out.println("name======"+name);
			if(servletName.equals(name)){
				servletClass=list.get(i).element("servlet-class").getText();
				break;
			}
		}
	} catch (FileNotFoundException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} catch (DocumentException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
}



//获取response的contentType
public  void   getContentType(String uri){

	SAXReader reader=new SAXReader();
	try {
		Document document=reader.read(new FileInputStream("source/web.xml"));
		Element rootElement=document.getRootElement();
		printChild(rootElement, uri);
		
	} catch (FileNotFoundException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} catch (DocumentException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	
}

private  void printChild(Element rootElement,String choose) {
	
	for(Iterator it=rootElement.elementIterator();it.hasNext();){
		Element e=(Element) it.next();
		
		Pattern p=Pattern.compile("\\w+");
		Matcher m=p.matcher(e.getText());
		boolean flag=m.find();
		if(stack!=null && (!stack.empty()) && choose.equals(stack.pop()) && flag){
			result=e.getText();
			return ;
		}
		if(choose.equals(e.getText())){
			stack.push(e.getText());
		}
		for(Iterator i=e.attributeIterator();i.hasNext();){
			
			Attribute attr=(Attribute) i.next();
			String name=attr.getName();
			/**
			 * <extension>js</extension>
    			<mime-type>application/javascript</mime-type>
			 */
			String value=attr.getText();
			
		}
		printChild(e,choose);
	}
	/*return stack.pop();*/
	
	
}

public static Stack<String> getStack() {
	return stack;
}

public String getResult() {
	if(result==null){
		return "text/html";
	}
	return result;
}
//通过反射返回相应的servlet对象
public HttpServlet getServlet(){
	System.out.println("serletClass=================="+servletClass+"=======");
	if(servletClass==null)
		return null;
	try {
		System.out.println("serletClass=================="+(HttpServlet) Class.forName(servletClass).newInstance());
		return (HttpServlet) Class.forName(servletClass).newInstance();
	} catch (InstantiationException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} catch (IllegalAccessException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} catch (ClassNotFoundException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	return null;
}

}

Process类

public class Process implements Runnable {

	private Socket socket;
	private Server server;
	

	public Process(Socket socket, Server server) {
		this.socket = socket;
		this.server = server;
	}

	@Override
	public void run() {
		try {
			HttpServletRequest request = new HttpServletRequest(socket.getInputStream());
			System.out.println(request);
			String uri = request.getRquestURI();
			String diskPath = server.getRootPath() + uri;
			System.out.println(diskPath);
			File f = new File(diskPath);
			File f1 = new File(server.getRootPath() + uri.split("[?]")[0]);
			HttpServletResponse response = null;
			if ((f.exists() && f.isFile()) || (f1.exists() && f1.isFile())) {
				/*
				 * new HttpServletResponse(socket.getOutputStream(),
				 * server.getRootPath(), uri).response();
				 */
				if (f.exists() && f.isFile()) {
					response = new HttpServletResponse(socket.getOutputStream(), server.getRootPath(), uri);
					response.response();
				} else {
					response = new HttpServletResponse(socket.getOutputStream(), server.getRootPath(),
							uri.split("[?]")[0]);
					response.response();
				}
			} else {
				System.out.println("==="+uri);
				HttpServlet servlet = server.getServlet(uri);
				System.out.println("=====" + servlet);
				if (servlet == null) {
					response = new HttpServletResponse(socket.getOutputStream(), server.getRootPath(),
							"/photo/404.html");
					response.responseMessage(404, "Not Found");
				} else {
					if(servlet instanceof ForwardServlet){
						servlet.service(request, response);
						response = new HttpServletResponse(socket.getOutputStream(), server.getRootPath(), request.getRquestURI());
					}else if(servlet instanceof RedirectServlet || servlet instanceof LoginServlet){
						response = new HttpServletResponse(socket.getOutputStream(), server.getRootPath(), request.getRquestURI());
						servlet.service(request, response);
					}
					else{
						response = new HttpServletResponse(socket.getOutputStream(), server.getRootPath(), request.getRquestURI());
						servlet.service(request, response);
					}
				
					response.response();
				}

			}

			/*
			 * String uri=request.getRquestURI(); if("/".equals(uri)){
			 * uri="/index.html"; }
			 * getContentType(uri.substring(uri.lastIndexOf('.')+1) ); String
			 * contentType=result;
			 */
		} catch (Exception e) {
			/* e.printStackTrace();*/
		} finally {
			try {
				socket.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值