首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

容易的servlet容器实现【转载别人的,觉得很有用~】

2012-09-24 
简单的servlet容器实现【转载别人的,觉得很有用~】1. HttpServer1 package ex02.pyrmontimport java.net.So

简单的servlet容器实现【转载别人的,觉得很有用~】
1. HttpServer1 

package ex02.pyrmont;         
        
import java.net.Socket;         
import java.net.ServerSocket;         
import java.net.InetAddress;         
import java.io.InputStream;         
import java.io.OutputStream;         
import java.io.IOException;         
        
public class HttpServer1 {         
        
    /** WEB_ROOT is the directory where our HTML and other files reside.        
     *    For this package, WEB_ROOT is the "webroot" directory under the working        
     *    directory.        
     *    The working directory is the location in the file system        
     *    from where the java command was invoked.        
     */        
    // shutdown command         
    private static final String SHUTDOWN_COMMAND = "/SHUTDOWN";         
        
    // the shutdown command received         
    private boolean shutdown = false;         
        
    public static void main(String[] args) {         
        HttpServer1 server = new HttpServer1();         
        server.await();         
    }         
        
    public void await() {         
        ServerSocket serverSocket = null;         
        int port = 8080;         
        try {         
            serverSocket =    new ServerSocket(port, 1, InetAddress.getByName("127.0.0.1"));         
        }         
        catch (IOException e) {         
            e.printStackTrace();         
            System.exit(1);         
        }         
        
        // Loop waiting for a request         
        while (!shutdown) {         
            Socket socket = null;         
            InputStream input = null;         
            OutputStream output = null;         
            try {         
                socket = serverSocket.accept();         
                input = socket.getInputStream();         
                output = socket.getOutputStream();         
        
                // create Request object and parse         
                Request request = new Request(input);         
                request.parse();         
        
                // create Response object         
                Response response = new Response(output);         
                response.setRequest(request);         
        
                // check if this is a request for a servlet or a static resource         
                // a request for a servlet begins with "/servlet/"         
                if (request.getUri().startsWith("/servlet/")) {         
                    ServletProcessor1 processor = new ServletProcessor1();         
                    processor.process(request, response);         
                }         
                else {         
                    StaticResourceProcessor processor = new StaticResourceProcessor();         
                    processor.process(request, response);         
                }         
        
                // Close the socket         
                socket.close();         
                //check if the previous URI is a shutdown command         
                shutdown = request.getUri().equals(SHUTDOWN_COMMAND);         
            }         
            catch (Exception e) {         
                e.printStackTrace();         
                System.exit(1);         
            }         
        }         
    }         
}         

2. Request    
java 代码 
package ex02.pyrmont;         
        
import java.io.InputStream;         
import java.io.IOException;         
import java.io.BufferedReader;         
import java.io.UnsupportedEncodingException;         
import java.util.Enumeration;         
import java.util.Locale;         
import java.util.Map;         
import javax.servlet.RequestDispatcher;         
import javax.servlet.ServletInputStream;         
import javax.servlet.ServletRequest;         
        
        
public class Request implements ServletRequest {         
        
    private InputStream input;         
    private String uri;         
        
    public Request(InputStream input) {         
        this.input = input;         
    }         
        
    public String getUri() {         
        return uri;         
    }         
        
    private String parseUri(String requestString) {         
        int index1, index2;         
        index1 = requestString.indexOf(' ');         
        if (index1 != -1) {         
            index2 = requestString.indexOf(' ', index1 + 1);         
            if (index2 > index1)         
                return requestString.substring(index1 + 1, index2);         
        }         
        return null;         
    }         
        
    public void parse() {         
        // Read a set of characters from the socket         
        StringBuffer request = new StringBuffer(2048);         
        int i;         
        byte[] buffer = new byte[2048];         
        try {         
            i = input.read(buffer);         
        }         
        catch (IOException e) {         
            e.printStackTrace();         
            i = -1;         
        }         
        for (int j=0; j    
            request.append((char) buffer[j]);         
        }         
        System.out.print(request.toString());         
        uri = parseUri(request.toString());         
    }         
        
    /* implementation of the ServletRequest*/        
    public Object getAttribute(String attribute) {         
        return null;         
    }         
        
    public Enumeration getAttributeNames() {         
        return null;         
    }         
        
    public String getRealPath(String path) {         
        return null;         
    }         
        
    public RequestDispatcher getRequestDispatcher(String path) {         
        return null;         
    }         
        
    public boolean isSecure() {         
        return false;         
    }         
        
    public String getCharacterEncoding() {         
        return null;         
    }         
        
    public int getContentLength() {         
        return 0;         
    }         
        
    public String getContentType() {         
        return null;         
    }         
        
    public ServletInputStream getInputStream() throws IOException {         
        return null;         
    }         
        
    public Locale getLocale() {         
        return null;         
    }         
        
    public Enumeration getLocales() {         
        return null;         
    }         
        
    public String getParameter(String name) {         
        return null;         
    }         
        
    public Map getParameterMap() {         
        return null;         
    }         
        
    public Enumeration getParameterNames() {         
        return null;         
    }         
        
    public String[] getParameterValues(String parameter) {         
        return null;         
    }         
        
    public String getProtocol() {         
        return null;         
    }         
        
    public BufferedReader getReader() throws IOException {         
        return null;         
    }         
        
    public String getRemoteAddr() {         
        return null;         
    }         
        
    public String getRemoteHost() {         
        return null;         
    }         
        
    public String getScheme() {         
     return null;         
    }         
        
    public String getServerName() {         
        return null;         
    }         
        
    public int getServerPort() {         
        return 0;         
    }         
        
    public void removeAttribute(String attribute) {         
    }         
        
    public void setAttribute(String key, Object value) {         
    }         
        
    public void setCharacterEncoding(String encoding)         
        throws UnsupportedEncodingException {         
    }         
        
}        

3. response 

java 代码 
package ex02.pyrmont;         
        
import java.io.OutputStream;         
import java.io.IOException;         
import java.io.FileInputStream;         
import java.io.FileNotFoundException;         
import java.io.File;         
import java.io.PrintWriter;         
import java.util.Locale;         
import javax.servlet.ServletResponse;         
import javax.servlet.ServletOutputStream;         
        
public class Response implements ServletResponse {         
        
    private static final int BUFFER_SIZE = 1024;         
    Request request;         
    OutputStream output;         
    PrintWriter writer;         
        
    public Response(OutputStream output) {         
        this.output = output;         
    }         
        
    public void setRequest(Request request) {         
        this.request = request;         
    }         
        
    /* This method is used to serve a static page */        
    public void sendStaticResource() throws IOException {         
        byte[] bytes = new byte[BUFFER_SIZE];         
        FileInputStream fis = null;         
        try {         
            /* request.getUri has been replaced by request.getRequestURI */        
            File file = new File(Constants.WEB_ROOT, request.getUri());         
            fis = new FileInputStream(file);         
            /*        
                 HTTP Response = Status-Line        
                     *(( general-header | response-header | entity-header ) CRLF)        
                     CRLF        
                     [ message-body ]        
                 Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF        
            */        
            int ch = fis.read(bytes, 0, BUFFER_SIZE);         
            while (ch!=-1) {         
                output.write(bytes, 0, ch);         
                ch = fis.read(bytes, 0, BUFFER_SIZE);         
            }         
        }         
        catch (FileNotFoundException e) {         
            String errorMessage = "HTTP/1.1 404 File Not Found\r\n" +         
                "Content-Type: text/html\r\n" +         
                "Content-Length: 23\r\n" +         
                "\r\n" +         
                "    
File Not Found 
";         
            output.write(errorMessage.getBytes());         
        }         
        finally {         
            if (fis!=null)         
                fis.close();         
        }         
    }         
        
        
    /** implementation of ServletResponse    */        
    public void flushBuffer() throws IOException {         
    }         
        
    public int getBufferSize() {         
        return 0;         
    }         
        
    public String getCharacterEncoding() {         
        return null;         
    }         
        
    public Locale getLocale() {         
        return null;         
    }         
        
    public ServletOutputStream getOutputStream() throws IOException {         
        return null;         
    }         
        
    public PrintWriter getWriter() throws IOException {         
        // autoflush is true, println() will flush,         
        // but print() will not.         
        writer = new PrintWriter(output, true);         
        return writer;         
    }         
        
    public boolean isCommitted() {         
        return false;         
    }         
        
    public void reset() {         
    }         
        
    public void resetBuffer() {         
    }         
        
    public void setBufferSize(int size) {         
    }         
        
    public void setContentLength(int length) {         
    }         
        
    public void setContentType(String type) {         
    }         
        
    public void setLocale(Locale locale) {         
    }         
}        

4. 用于处理servlet的类ServletProcessor1 

java 代码 
package ex02.pyrmont;         
        
import java.net.URL;         
import java.net.URLClassLoader;         
import java.net.URLStreamHandler;         
import java.io.File;         
import java.io.IOException;         
import javax.servlet.Servlet;         
import javax.servlet.ServletRequest;         
import javax.servlet.ServletResponse;         
        
public class ServletProcessor1 {         
        
    public void process(Request request, Response response) {         
        
        String uri = request.getUri();         
        String servletName = uri.substring(uri.lastIndexOf("/") + 1);         
        URLClassLoader loader = null;         
        
        try {         
            // create a URLClassLoader         
            URL[] urls = new URL[1];         
            URLStreamHandler streamHandler = null;         
            File classPath = new File(Constants.WEB_ROOT);         
            // the forming of repository is taken from the createClassLoader method in         
            // org.apache.catalina.startup.ClassLoaderFactory         
            String repository = (new URL("file", null, classPath.getCanonicalPath() + File.separator)).toString() ;         
            // the code for forming the URL is taken from the addRepository method in         
            // org.apache.catalina.loader.StandardClassLoader class.         
            urls[0] = new URL(null, repository, streamHandler);         
            loader = new URLClassLoader(urls);         
        }         
        catch (IOException e) {         
            System.out.println(e.toString() );         
        }         
        Class myClass = null;         
        try {         
            myClass = loader.loadClass(servletName);         
        }         
        catch (ClassNotFoundException e) {         
            System.out.println(e.toString());         
        }         
        
        Servlet servlet = null;         
        
        try {         
            servlet = (Servlet) myClass.newInstance();         
            servlet.service((ServletRequest) request, (ServletResponse) response);         
        }         
        catch (Exception e) {         
            System.out.println(e.toString());         
        }         
        catch (Throwable e) {         
            System.out.println(e.toString());         
        }         
        
    }         
}        

5.处理静态资源的类 


java 代码 
package ex02.pyrmont;         
        
import java.io.IOException;         
        
public class StaticResourceProcessor {         
        
    public void process(Request request, Response response) {         
        try {         
            response.sendStaticResource();         
        }         
        catch (IOException e) {         
            e.printStackTrace();         
        }         
    }         
}        

6. 用于测试的servlet 


java 代码 
import javax.servlet.*;         
import java.io.IOException;         
import java.io.PrintWriter;         
        
public class PrimitiveServlet implements Servlet {         
        
    public void init(ServletConfig config) throws ServletException {         
        System.out.println("init");         
    }         
        
    public void service(ServletRequest request, ServletResponse response)         
        throws ServletException, IOException {         
        System.out.println("from service");         
        PrintWriter out = response.getWriter();         
        out.println("Hello. Roses are red.");         
        out.print("Violets are blue.");         
    }         
        
    public void destroy() {         
        System.out.println("destroy");         
    }         
        
    public String getServletInfo() {         
        return null;         
    }         
    public ServletConfig getServletConfig() {         
        return null;         
    }         
        
}         

这个servlet服务器是一个很简单的实现,只能处理很简单的功能,比如将字符创输出到网页上。。 

ServletProcessor1类实现了利用自建的ClassLoader加载自己的servlet,然后实例化这个servlet实现他的service方法。。 

2楼haichun_542101502昨天 16:20
哈哈哈
1楼a_xiaozhen昨天 14:26
我也来看看!谢谢,上次我也用上这个了!
Re: liumeiqqzj昨天 15:40
^_^回复a_xiaozhen

热点排行