天天看點

一個簡單的servlet容器

 httpserver

一個簡單的servlet容器

package com.whatsmars.tomcat.servlet;  

import java.io.ioexception;  

import java.io.inputstream;  

import java.io.outputstream;  

import java.net.inetaddress;  

import java.net.serversocket;  

import java.net.socket;  

/** 

 * created by shenhongxi on 16/3/21. 

 */  

public class httpserver {  

    private static final string shutdown_command = "/shutdown";  

    private boolean shutdown = false;  

    public static void main(string[] args) {  

        httpserver server = new httpserver();  

        server.await();  

    }  

    private void await() {  

        serversocket serversocket = null;  

        int port = 8080;  

        try {  

            serversocket = new serversocket(port, 1, inetaddress.getbyname("127.0.0.1"));  

            system.out.println("server started!");  

        } catch (ioexception e) {  

            e.printstacktrace();  

            system.exit(1);  

        }  

        while (!shutdown) {  

            socket socket = null;  

            inputstream input = null;  

            outputstream output = null;  

            try {  

                socket = serversocket.accept();  

                input = socket.getinputstream();  

                output = socket.getoutputstream();  

                request request = new request(input);  

                request.parse();  

                response response = new response(output);  

                response.setrequest(request);  

                // check if this is a request for a servlet or a static resource  

                if (request.geturi().startswith("/servlet/")) {  

                    servletprocessor processor = new servletprocessor();  

                    processor.process(request, response);  

                } else {  

                    staticresourceprocessor processor = new staticresourceprocessor();  

                }  

                socket.close();  

                shutdown = request.geturi().equals(shutdown_command);  

            } catch (exception e) {  

                e.printstacktrace();  

                continue;  

            }  

}  

  request

一個簡單的servlet容器

import javax.servlet.*;  

import java.io.bufferedreader;  

import java.io.unsupportedencodingexception;  

import java.util.enumeration;  

import java.util.locale;  

import java.util.map;  

public class request implements servletrequest {  

    private inputstream input;  

    private string uri; // 性能考慮,用byte[]  

    public request(inputstream input) {  

        this.input = input;  

    public void parse() {  

        stringbuffer request = new stringbuffer(2048);  

        int i;  

        byte[] buffer = new byte[2048];  

            i = input.read(buffer);  

            i = -1;  

        for (int j = 0; j < i; j++) {  

            request.append((char) buffer[j]);  

        system.out.println(request.tostring());  

        uri = parseuri(request.tostring());  

    private string parseuri(string requeststr) {  

        // get /index.html http/1.1  

        // accept: text/plain; text/html  

        // ...  

        int index1 = requeststr.indexof(' ');  

        int index2;  

        if (index1 != -1) {  

            index2 = requeststr.indexof(' ', index1 + 1);  

            if (index2 > index1) {  

                return requeststr.substring(index1 + 1, index2);  

        return null;  

    public string geturi() {  

        return uri;  

    public object getattribute(string name) {  

    public enumeration<string> getattributenames() {  

    public string getcharacterencoding() {  

    public void setcharacterencoding(string env) throws unsupportedencodingexception {  

    public int getcontentlength() {  

        return 0;  

 response

一個簡單的servlet容器

import javax.servlet.servletoutputstream;  

import javax.servlet.servletresponse;  

import java.io.*;  

public class response implements servletresponse {  

    private static final int buffer_size = 1024;  

    request request;  

    outputstream output;  

    printwriter writer;  

    public void sendstaticresource() throws ioexception {  

        byte[] bytes = new byte[buffer_size];  

        fileinputstream fis = null;  

            file file = new file(constants.web_root, request.geturi());  

            if (file.exists()) {  

                fis = new fileinputstream(file);  

                int ch = fis.read(bytes, 0, buffer_size);  

                while (ch != -1) {  

                    output.write(bytes, 0, ch);  

                    ch = fis.read(bytes, 0, buffer_size);  

            } else {  

                string errormsg = "http/1.1 404 file not found\r\n" +  

                        "content-type: text/html\r\n" +  

                        "content-length: 23\r\n" +  

                        "\r\n" +  

                        "<h1>file not found</h1>";  

                output.write(errormsg.getbytes());  

        } catch (exception e) {  

        } finally {  

            if (fis != null) {  

                fis.close();  

    public response(outputstream output) {  

        this.output = output;  

    public void setrequest(request request) {  

        this.request = request;  

    public string getcontenttype() {  

    public servletoutputstream getoutputstream() throws ioexception {  

    public printwriter getwriter() throws ioexception {  

        // autoflush is true, println() will flush, but print() will not  

        writer = new printwriter(output, true);  

        return writer;  

 requestfacade

一個簡單的servlet容器

 * created by shenhongxi on 2016/4/12. 

public class requestfacade implements servletrequest {  

    private servletrequest request;  

    public requestfacade(request request) {  

        return request.getattribute(name);  

        return request.getattributenames();  

 responsefacade

一個簡單的servlet容器

import java.io.printwriter;  

public class responsefacade implements servletresponse {  

    private servletresponse response;  

    public responsefacade(response response) {  

        this.response = response;  

        return response.getcharacterencoding();  

        return response.getwriter();  

 servletprocessor

一個簡單的servlet容器

import javax.servlet.servlet;  

import javax.servlet.servletrequest;  

import java.io.file;  

import java.net.url;  

import java.net.urlclassloader;  

import java.net.urlstreamhandler;  

public class servletprocessor {  

    public void process(request request, response response) {  

        string uri = request.geturi();  

        string servletname = uri.substring(uri.lastindexof("/") + 1);  

        urlclassloader loader = null;  

            url[] urls = new url[1];  

            urlstreamhandler streamhandler = null;  

            file classpath = new file(constants.web_root);  

            string repository = (new url("file", null, classpath.getcanonicalpath()  

            + file.separator)).tostring();  

            urls[0] = new url(null, repository, streamhandler);  

            loader = new urlclassloader(urls);  

        class myclass = null;  

            myclass = loader.loadclass(servletname);  

        } catch (classnotfoundexception e) {  

        servlet servlet = null;  

            servlet = (servlet) myclass.newinstance();  

            requestfacade requestfacade = new requestfacade(request);  

            responsefacade responsefacade = new responsefacade(response);  

            // 為了安全考慮,除了實作servletrequest/servletresponse的方法,  

            // request/response中的其他公共方法需對servlet隐藏,是以用外觀類  

            servlet.service((servletrequest) requestfacade, (servletresponse) responsefacade);  

        } catch (throwable e) {  

 staticresourceprocessor

一個簡單的servlet容器

public class staticresourceprocessor {  

            response.sendstaticresource();  

  primitiveservlet

一個簡單的servlet容器

public class primitiveservlet implements servlet {  

    public void init(servletconfig config) throws servletexception {  

        system.out.println("init");  

    public servletconfig getservletconfig() {  

    public void service(servletrequest req, servletresponse res) throws servletexception, ioexception {  

        system.out.println("from service");  

        printwriter out = res.getwriter();  

        out.println("hello. roses are red.");  

        out.print("violets are blue");  

    public string getservletinfo() {  

    public void destroy() {  

        system.out.println("destroy");  

  constants

一個簡單的servlet容器

public class constants {  

    public static final string web_root = system.getproperty("user.dir") + file.separator + "whatsmars-tomcat/src/main/webapp"; // 資源檔案,class檔案等  

原文連結:[http://wely.iteye.com/blog/2290575]