`
zc985552943
  • 浏览: 291053 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
Babe4ca6-5e6f-33aa-9078-762ee3ccfb7e
云计算--hadoop
浏览量:11870
5e98c2c1-2a82-3388-bc80-7fca0170bb12
redis解说
浏览量:27150
088014c7-4d3f-39ce-b72e-4ebe7046a134
MongoDB读书笔记
浏览量:16012
D2b74847-c860-3e26-96fe-3fa4498d6348
Maven读书笔记
浏览量:27240
688db20f-402d-3a1d-8188-d6153d6c7465
Java通信
浏览量:13679
社区版块
存档分类
最新评论

浅析Tomcat(一)

阅读更多
想必大家都知道Tomcat其实就是servlet容器。负责servlet前期的准备工作。在这里简单用代码模拟一下Tomcat的工作。
首先牵涉到网络,那么网络编程是少不了的。
1.这个类就是一个servlet服务的工具,程序从这里开始
package com.arz.server;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class ServletServer {
	
	private ServerSocket serverSocket;
	private int port;
	private boolean shutDown;
	
	public ServletServer (int port){
		this.port = port;
	}
	
	public void startServer(){
		try{
			serverSocket = new ServerSocket(port);
		}catch(IOException e){
			System.out.println("监听"+port+"失败!");
			System.exit(0);
		}
		while(!shutDown){
			try{
				//监听着8080端口
				Socket socket = serverSocket.accept();
				
				//实例一个Runnable接口类,在这里面运行全部的核心工作
				DispatchSocket dispatchSocket = new DispatchSocket(socket);
				
				//启动Runnable中的run()方法
				new Thread(dispatchSocket).start();
			}catch(IOException e){
				System.out.println("客户端出了问题");
				e.printStackTrace();
			}
		}
	}
	
	public static void main(String[] args){
		ServletServer server = new ServletServer(8080);
		server.startServer();
	}
	
	public boolean isShutDown(){
		return shutDown;
	}
	
	public void setShutDown(boolean shutDown){
		this.shutDown = shutDown;
	}
}


2.创建DispatchSocket这个类是为了满足Tomcat的多线程而产生的。有了这个类“Tomcat”就可以同时被多个访问了
package com.arz.server;

import java.io.IOException;
import java.net.Socket;

import com.arz.servlet.Servlet;
import com.arz.servlet.ServletMapping;
import com.arz.servlet.TestServlet;
import com.arz.servlet.WebApp;

public class DispatchSocket implements Runnable {
	
	private Socket socket;
	
	public DispatchSocket(Socket socket){
		this.socket = socket;
	}
	@Override
	public void run() {
		try{
			System.out.println("客户端是:"+socket.getRemoteSocketAddress());
			
			//实例request,可以跟踪查看Request类,将socket类的输入流交给request。可以看做是HttpServletRequest
			Request request = new Request(socket.getInputStream(),8080);
			
			//实例response,可以跟踪查看Response类,将socket类的输出流交给response。结果将会输出到网页。可以看做是HttpServletResponse
			Response response = new Response(socket.getOutputStream());
			
			//*****************这里是直接运行Servlet类的service方法*****************
			//将这个类看做是HttpServlet
			Servlet servlet = new TestServlet();
			//调用我们写的service()方法
			servlet.service(request, response);
			
			//*****************这里是我们解析web.xml得到的servlet对象,和上面是并行的*****************
			//解析web.xml的类,并且将对象的对应关系包装好
			WebApp webApp = WebApp.getWebApp();
			
			String urlPattern = request.getUrlPattern();
			
			ServletMapping mapping = webApp.getServletMappings().get(urlPattern);
			
			if(mapping != null){
				String servletName = mapping.getServletName();
				Servlet servlet1 = webApp.getServletContext().getServlet(servletName);
				if(servlet1 != null){
					servlet1.service(request, response);
				}else{
					response.println("没有获得Servlet");
				}
			}else{
				response.print("你请求的url错误,该url不正确。没有找到相应的页面!");
			}
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			closeSocket(socket);
		}
		
	}
	
	public void closeSocket(Socket socket){
		if(socket != null){
			try{
				socket.getOutputStream().flush();
				socket.close();
			}catch(IOException e){
				e.printStackTrace();
			}
		}
	}
}


3.大家应该知道java在servlet编程中只是提供了类的接口,具体的实现是交给服务商完成的。作为比较优秀的服务器Tomcat自然也要实现java定义的servlet类例如HttpServletRequest,下面是HttpServletRequest的模拟代码。当然真正的HttpServletRequest要复杂的多的多
package com.arz.server;

import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;

public class Request {
    
    private int port;
    private String host;
    private String urlPattern;
    private Map<String,String> map = new HashMap<String,String>();
    private String method;
    
    private String headInfo;
    private InputStream inStream;
    protected Request(InputStream inStream,int port) {
        this.inStream = inStream;
        this.port = port;
        parseRequestHead();
    }
    
    private void parseRequestHead(){
        byte[] buf = new byte[1024];
        try{
            inStream.read(buf);
            headInfo = new String(buf);
            System.out.println(headInfo);
            method = headInfo.substring(0,headInfo.indexOf("/")).trim();
            System.out.println("请求方式:"+method);
            host = headInfo.substring(headInfo.indexOf("Host:")+5,headInfo.indexOf(":"+port)).trim();
            System.out.println("请求地址:"+host);
            //??
            if(method.equalsIgnoreCase("get")){
                parseGetString();
            }else if (method.equalsIgnoreCase("post")){
                parsePostString();
            }
        }catch(IOException e){
            e.printStackTrace();
        }
    }
    
    private void parsePostString(){
        urlPattern = headInfo.substring(5, headInfo.indexOf("HTTP/")).trim();
        String dataString = headInfo.substring(headInfo.lastIndexOf("\r\n")).trim();
        //??
        StringTokenizer st = new StringTokenizer(dataString,"&");
        
        while(st.hasMoreTokens()){
            String[] ss = st.nextToken().split("=");
            map.put(ss[0], ss[1]);
        }
    }
    
    private void parseGetString(){
        String url = headInfo.substring(4, headInfo.indexOf("HTTP/"));
        if(url.indexOf("?")==-1){
            urlPattern = url.trim();
        }else{
            urlPattern = url.substring(0, url.indexOf("?")).trim();
            String dataString = url.substring(url.indexOf("?")+1).trim();
            StringTokenizer st = new StringTokenizer(dataString,"&");
            while(st.hasMoreTokens()){
                String[] ss = st.nextToken().split("=");
                map.put(ss[0], ss[1]);
            }
        }
    }
    public int getPort() {
        return port;
    }
    public void setPort(int port) {
        this.port = port;
    }
    public String getHost() {
        return host;
    }
    public void setHost(String host) {
        this.host = host;
    }
    public String getUrlPattern() {
        return urlPattern;
    }
    public void setUrlPattern(String urlPattern) {
        this.urlPattern = urlPattern;
    }
    public String getMethod() {
        return method;
    }
    public void setMethod(String method) {
        this.method = method;
    }
    public String getHeadInfo() {
        return headInfo;
    }
    public void setHeadInfo(String headInfo) {
        this.headInfo = headInfo;
    }
    
    public String getParameter(String name){
        if(map != null && map.size() > 0){
            return (String)map.get(name);
        }
        return null;
    }
    
}
分享到:
评论

相关推荐

    深入浅析TomCat Session管理分析

    【深入浅析TomCat Session管理分析】 Session在Java Web开发中扮演着至关重要的角色,它允许服务器跟踪用户的交互,存储用户的状态信息。Tomcat作为广泛使用的开源Servlet容器,其内部的Session管理机制对于理解Web...

    Tomcat怎样防止跨站请求伪造(CSRF) 1

    Tomcat 防止跨站请求伪造(CSRF)机制浅析 在 Web 应用开发中,跨站请求伪造(CSRF)是一种常见的安全威胁。跨站请求伪造攻击是指攻击者诱骗受信任用户访问恶意网站,从而使得恶意网站能以用户身份对受信任网站执行...

    深入浅析Centos 7系统的Tomcat服务器

    【深入浅析Centos 7系统的Tomcat服务器】 Tomcat,这款由Sun的软件架构师詹姆斯·邓肯·戴维森发起的开源项目,如今已成为Apache软件基金会的一部分,是Java Web应用程序的重要载体。Tomcat服务器以其轻量级、高效...

    浅析idea生成war包放入tomcat的路径访问问题

    浅析 Idea 生成 war 包放入 Tomcat 的路径访问问题 Idea 是一个功能强大且流行的集成开发环境(IDE),它可以帮助开发者快速创建、编译和部署 Java 应用程序。然而,在将 war 包部署到 Tomcat 服务器时,开发者...

    浅析JDK和Tomcat的安装与配置方法

    "JDK和Tomcat的安装与配置方法" JDK安装与配置方法是Java开发环境的基础,正确地安装和配置JDK是保证Java程序正常运行的前提。下面将详细介绍JDK的安装和配置方法。 首先,需要下载JDK的安装包,下载地址为...

    浅析Java Web开发环境的搭建.pdf

    Tomcat是最常用的Web服务器之一,它可以运行在Windows、Linux、Unix等多种操作系统上。 在Java Web开发环境中,数据库是必不可少的组件,它用于存储和管理数据。常见的数据库有MySQL、Oracle、DB2等。 IDE工具是...

    基于Java的Web开发技术浅析.pdf

    Java Web应用通常被打包为WAR(Web ARchive)或EAR(Enterprise ARchive)文件,然后部署到应用服务器上,如Tomcat、Jetty、GlassFish或WebLogic。应用服务器负责管理和运行这些应用,处理HTTP请求,管理Servlet、...

    JFinal技术架构浅析.doc

    - **空间架构**:从物理部署的角度看,JFinal 是一个标准的Servlet容器应用,可以运行在任何支持Servlet的Web服务器上,如Tomcat、Jetty等。它不需要额外的中间件或服务层,使得部署简单且快速。 - **逻辑架构**...

    基于Java的Web开发技术浅析 (1).zip

    在本压缩包中的"基于Java的Web开发技术浅析 (1).pdf"可能就包含了关于WAR文件的详细解析,以及如何在Web容器中部署和运行WAR文件的方法。 总的来说,Java Web开发技术是一个庞大的领域,涵盖了从服务器端编程、...

    mondrian体系结构浅析.doc

    在实际分析前,需要搭建合适的环境,如 Windows 2003、Tomcat、MySQL、Java 1.6 和特定版本的 Mondrian 源码。通过配置 Eclipse 工程,导入源码并运行 Ant 脚本准备编译和测试环境。 在深入研究 Mondrian 时,通常...

    基于Java的Web开发技术浅析.zip

    至于服务器端的部署,Tomcat是一个广泛使用的开源Java Web应用服务器,它支持Servlet和JSP。对于生产环境,Apache Tomcat或JBoss、WebLogic等更强大的应用服务器可能更适合。 在Web开发中,前端技术也非常重要。...

    数据库连接池浅析Java开发Java经验技巧共5页.pdf

    在Java中,常见的数据库连接池实现有Apache的DBCP、C3P0、HikariCP、Tomcat JDBC Connection Pool等。这些连接池库提供了一套完善的管理和监控机制,包括连接的生命周期管理、事务支持、自动回收过期连接等功能,...

    基于SpringBoot微服务架构下前后端分离的MVVM模型浅析.docx

    SpringBoot是Spring框架的一个简化版本,它提供了快速构建独立运行的Spring应用程序的能力,简化了配置,并内置了许多常用功能,如嵌入式Tomcat服务器、自动配置、健康检查等。这使得开发者可以专注于业务逻辑,而...

    Java中文乱码浅析及解决方案

    Java 中文乱码问题是一个常见的编程困扰,尤其对于处理中文字符的Java程序而言。这个问题通常源于字符编码的不一致,即不同环节采用的字符编码标准不统一。本文将深入探讨这一问题,并提供相应的解决方案。 首先,...

    基于OBPM构建企业办公管理系统原理浅析

    【基于OBPM构建企业办公管理系统原理浅析】 随着信息技术的发展,企业越来越重视信息化在办公管理中的应用,以提升效率和管理水平。OBPM(Open Business Process Management,开源业务流程管理)作为一种开源、轻量...

    浅析Spring配置中的classpath:与classpath*:的区别

    3. 程序部署到 Tomcat 后,src 目录下的配置文件会和 class 文件一样,自动 copy 到应用的 WEB-INF/classes 目录下;classpath: 与 classpath*: 的区别在于,前者只会从第一个 classpath 中加载,而后者会从所有的 ...

    浅析Jenkins在java项目开发中的应用.zip

    安装过程包括下载Jenkins WAR文件,将其部署在Tomcat或Jetty等Web服务器上,然后通过浏览器访问Jenkins初始化设置,配置系统环境和安装必要的插件。 ### 3. 构建工作流 在Java项目中,Jenkins可以通过监听Git或SVN...

Global site tag (gtag.js) - Google Analytics