一个简单的servlet容器

 HttpServer

Java代码  

  1. package com.whatsmars.tomcat.servlet;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.InputStream;  
  5. import java.io.OutputStream;  
  6. import java.net.InetAddress;  
  7. import java.net.ServerSocket;  
  8. import java.net.Socket;  
  9.   
  10. /** 
  11.  * Created by shenhongxi on 16/3/21. 
  12.  */  
  13. public class HttpServer {  
  14.   
  15.     private static final String SHUTDOWN_COMMAND = "/SHUTDOWN";  
  16.   
  17.     private boolean shutdown = false;  
  18.   
  19.     public static void main(String[] args) {  
  20.         HttpServer server = new HttpServer();  
  21.         server.await();  
  22.     }  
  23.   
  24.     private void await() {  
  25.         ServerSocket serverSocket = null;  
  26.         int port = 8080;  
  27.         try {  
  28.             serverSocket = new ServerSocket(port, 1, InetAddress.getByName("127.0.0.1"));  
  29.             System.out.println("Server started!");  
  30.         } catch (IOException e) {  
  31.             e.printStackTrace();  
  32.             System.exit(1);  
  33.         }  
  34.   
  35.         while (!shutdown) {  
  36.             Socket socket = null;  
  37.             InputStream input = null;  
  38.             OutputStream output = null;  
  39.   
  40.             try {  
  41.                 socket = serverSocket.accept();  
  42.                 input = socket.getInputStream();  
  43.                 output = socket.getOutputStream();  
  44.                 Request request = new Request(input);  
  45.                 request.parse();  
  46.   
  47.                 Response response = new Response(output);  
  48.                 response.setRequest(request);  
  49.   
  50.                 // check if this is a request for a servlet or a static resource  
  51.                 if (request.getUri().startsWith("/servlet/")) {  
  52.                     ServletProcessor processor = new ServletProcessor();  
  53.                     processor.process(request, response);  
  54.                 } else {  
  55.                     StaticResourceProcessor processor = new StaticResourceProcessor();  
  56.                     processor.process(request, response);  
  57.                 }  
  58.   
  59.                 socket.close();  
  60.   
  61.                 shutdown = request.getUri().equals(SHUTDOWN_COMMAND);  
  62.             } catch (Exception e) {  
  63.                 e.printStackTrace();  
  64.                 continue;  
  65.             }  
  66.         }  
  67.     }  
  68. }  

  Request

Java代码  

  1. package com.whatsmars.tomcat.servlet;  
  2.   
  3. import javax.servlet.*;  
  4. import java.io.BufferedReader;  
  5. import java.io.IOException;  
  6. import java.io.InputStream;  
  7. import java.io.UnsupportedEncodingException;  
  8. import java.util.Enumeration;  
  9. import java.util.Locale;  
  10. import java.util.Map;  
  11.   
  12. /** 
  13.  * Created by shenhongxi on 16/3/21. 
  14.  */  
  15. public class Request implements ServletRequest {  
  16.   
  17.     private InputStream input;  
  18.   
  19.     private String uri; // 性能考虑,用byte[]  
  20.   
  21.     public Request(InputStream input) {  
  22.         this.input = input;  
  23.     }  
  24.   
  25.     public void parse() {  
  26.         StringBuffer request = new StringBuffer(2048);  
  27.         int i;  
  28.         byte[] buffer = new byte[2048];  
  29.         try {  
  30.             i = input.read(buffer);  
  31.         } catch (IOException e) {  
  32.             e.printStackTrace();  
  33.             i = -1;  
  34.         }  
  35.         for (int j = 0; j < i; j++) {  
  36.             request.append((char) buffer[j]);  
  37.         }  
  38.         System.out.println(request.toString());  
  39.         uri = parseUri(request.toString());  
  40.     }  
  41.   
  42.     private String parseUri(String requestStr) {  
  43.         // GET /index.html HTTP/1.1  
  44.         // Accept: text/plain; text/html  
  45.         // ...  
  46.         int index1 = requestStr.indexOf(' ');  
  47.         int index2;  
  48.         if (index1 != -1) {  
  49.             index2 = requestStr.indexOf(' ', index1 + 1);  
  50.             if (index2 > index1) {  
  51.                 return requestStr.substring(index1 + 1, index2);  
  52.             }  
  53.         }  
  54.         return null;  
  55.     }  
  56.   
  57.     public String getUri() {  
  58.         return uri;  
  59.     }  
  60.   
  61.     public Object getAttribute(String name) {  
  62.         return null;  
  63.     }  
  64.   
  65.     public Enumeration<String> getAttributeNames() {  
  66.         return null;  
  67.     }  
  68.   
  69.     public String getCharacterEncoding() {  
  70.         return null;  
  71.     }  
  72.   
  73.     public void setCharacterEncoding(String env) throws UnsupportedEncodingException {  
  74.   
  75.     }  
  76.   
  77.     public int getContentLength() {  
  78.         return 0;  
  79.     }  
  80.   
  81. }  

 Response

Java代码  

  1. package com.whatsmars.tomcat.servlet;  
  2.   
  3. import javax.servlet.ServletOutputStream;  
  4. import javax.servlet.ServletResponse;  
  5. import java.io.*;  
  6. import java.util.Locale;  
  7.   
  8. /** 
  9.  * Created by shenhongxi on 16/3/21. 
  10.  */  
  11. public class Response implements ServletResponse {  
  12.   
  13.     private static final int BUFFER_SIZE = 1024;  
  14.   
  15.     Request request;  
  16.   
  17.     OutputStream output;  
  18.   
  19.     PrintWriter writer;  
  20.   
  21.     public void sendStaticResource() throws IOException {  
  22.         byte[] bytes = new byte[BUFFER_SIZE];  
  23.         FileInputStream fis = null;  
  24.         try {  
  25.             File file = new File(Constants.WEB_ROOT, request.getUri());  
  26.             if (file.exists()) {  
  27.                 fis = new FileInputStream(file);  
  28.                 int ch = fis.read(bytes, 0, BUFFER_SIZE);  
  29.                 while (ch != -1) {  
  30.                     output.write(bytes, 0, ch);  
  31.                     ch = fis.read(bytes, 0, BUFFER_SIZE);  
  32.                 }  
  33.             } else {  
  34.                 String errorMsg = "HTTP/1.1 404 File Not Found\r\n" +  
  35.                         "Content-Type: text/html\r\n" +  
  36.                         "Content-Length: 23\r\n" +  
  37.                         "\r\n" +  
  38.                         "<h1>File Not Found</h1>";  
  39.                 output.write(errorMsg.getBytes());  
  40.             }  
  41.         } catch (Exception e) {  
  42.             e.printStackTrace();  
  43.         } finally {  
  44.             if (fis != null) {  
  45.                 fis.close();  
  46.             }  
  47.         }  
  48.     }  
  49.   
  50.     public Response(OutputStream output) {  
  51.         this.output = output;  
  52.     }  
  53.   
  54.     public void setRequest(Request request) {  
  55.         this.request = request;  
  56.     }  
  57.   
  58.     public String getCharacterEncoding() {  
  59.         return null;  
  60.     }  
  61.   
  62.     public String getContentType() {  
  63.         return null;  
  64.     }  
  65.   
  66.     public ServletOutputStream getOutputStream() throws IOException {  
  67.         return null;  
  68.     }  
  69.   
  70.     public PrintWriter getWriter() throws IOException {  
  71.         // autoflush is true, println() will flush, but print() will not  
  72.         writer = new PrintWriter(output, true);  
  73.         return writer;  
  74.     }  
  75.   
  76. }  

 RequestFacade

Java代码  

  1. package com.whatsmars.tomcat.servlet;  
  2.   
  3. import javax.servlet.*;  
  4. import java.io.BufferedReader;  
  5. import java.io.IOException;  
  6. import java.io.UnsupportedEncodingException;  
  7. import java.util.Enumeration;  
  8. import java.util.Locale;  
  9. import java.util.Map;  
  10.   
  11. /** 
  12.  * Created by shenhongxi on 2016/4/12. 
  13.  */  
  14. public class RequestFacade implements ServletRequest {  
  15.   
  16.     private ServletRequest request;  
  17.   
  18.     public RequestFacade(Request request) {  
  19.         this.request = request;  
  20.     }  
  21.   
  22.     public Object getAttribute(String name) {  
  23.         return request.getAttribute(name);  
  24.     }  
  25.   
  26.     public Enumeration<String> getAttributeNames() {  
  27.         return request.getAttributeNames();  
  28.     }  
  29.   
  30. }  

 ResponseFacade

Java代码  

  1. package com.whatsmars.tomcat.servlet;  
  2.   
  3. import javax.servlet.ServletOutputStream;  
  4. import javax.servlet.ServletResponse;  
  5. import java.io.IOException;  
  6. import java.io.PrintWriter;  
  7. import java.util.Locale;  
  8.   
  9. /** 
  10.  * Created by shenhongxi on 2016/4/12. 
  11.  */  
  12. public class ResponseFacade implements ServletResponse {  
  13.   
  14.     private ServletResponse response;  
  15.   
  16.     public ResponseFacade(Response response) {  
  17.         this.response = response;  
  18.     }  
  19.   
  20.     public String getCharacterEncoding() {  
  21.         return response.getCharacterEncoding();  
  22.     }  
  23.   
  24.     public String getContentType() {  
  25.         return null;  
  26.     }  
  27.   
  28.     public ServletOutputStream getOutputStream() throws IOException {  
  29.         return null;  
  30.     }  
  31.   
  32.     public PrintWriter getWriter() throws IOException {  
  33.         return response.getWriter();  
  34.     }  
  35.   
  36. }  

 ServletProcessor

Java代码  

  1. package com.whatsmars.tomcat.servlet;  
  2.   
  3. import javax.servlet.Servlet;  
  4. import javax.servlet.ServletRequest;  
  5. import javax.servlet.ServletResponse;  
  6. import java.io.File;  
  7. import java.io.IOException;  
  8. import java.net.URL;  
  9. import java.net.URLClassLoader;  
  10. import java.net.URLStreamHandler;  
  11.   
  12. /** 
  13.  * Created by shenhongxi on 2016/4/12. 
  14.  */  
  15. public class ServletProcessor {  
  16.   
  17.     public void process(Request request, Response response) {  
  18.         String uri = request.getUri();  
  19.         String servletName = uri.substring(uri.lastIndexOf("/") + 1);  
  20.         URLClassLoader loader = null;  
  21.         try {  
  22.             URL[] urls = new URL[1];  
  23.             URLStreamHandler streamHandler = null;  
  24.             File classPath = new File(Constants.WEB_ROOT);  
  25.             String repository = (new URL("file", null, classPath.getCanonicalPath()  
  26.             + File.separator)).toString();  
  27.             urls[0] = new URL(null, repository, streamHandler);  
  28.             loader = new URLClassLoader(urls);  
  29.         } catch (IOException E) {  
  30.             E.printStackTrace();  
  31.         }  
  32.   
  33.         Class myClass = null;  
  34.         try {  
  35.             myClass = loader.loadClass(servletName);  
  36.         } catch (ClassNotFoundException e) {  
  37.             e.printStackTrace();  
  38.         }  
  39.   
  40.         Servlet servlet = null;  
  41.         try {  
  42.             servlet = (Servlet) myClass.newInstance();  
  43.             RequestFacade requestFacade = new RequestFacade(request);  
  44.             ResponseFacade responseFacade = new ResponseFacade(response);  
  45.             // 为了安全考虑,除了实现ServletRequest/ServletResponse的方法,  
  46.             // Request/Response中的其他公共方法需对servlet隐藏,所以用外观类  
  47.             servlet.service((ServletRequest) requestFacade, (ServletResponse) responseFacade);  
  48.         } catch (Exception e) {  
  49.             e.printStackTrace();  
  50.         } catch (Throwable e) {  
  51.             e.printStackTrace();  
  52.         }  
  53.     }  
  54. }  

 StaticResourceProcessor

Java代码  

  1. package com.whatsmars.tomcat.servlet;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. /** 
  6.  * Created by shenhongxi on 2016/4/12. 
  7.  */  
  8. public class StaticResourceProcessor {  
  9.   
  10.     public void process(Request request, Response response) {  
  11.         try {  
  12.             response.sendStaticResource();  
  13.         } catch (IOException e) {  
  14.             e.printStackTrace();  
  15.         }  
  16.     }  
  17. }  

  PrimitiveServlet

Java代码  

  1. package com.whatsmars.tomcat.servlet;  
  2.   
  3. import javax.servlet.*;  
  4. import java.io.IOException;  
  5. import java.io.PrintWriter;  
  6.   
  7. /** 
  8.  * Created by shenhongxi on 2016/4/12. 
  9.  */  
  10. public class PrimitiveServlet implements Servlet {  
  11.     public void init(ServletConfig config) throws ServletException {  
  12.         System.out.println("init");  
  13.     }  
  14.   
  15.     public ServletConfig getServletConfig() {  
  16.         return null;  
  17.     }  
  18.   
  19.     public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {  
  20.         System.out.println("from service");  
  21.         PrintWriter out = res.getWriter();  
  22.         out.println("Hello. Roses are red.");  
  23.         out.print("Violets are blue");  
  24.     }  
  25.   
  26.     public String getServletInfo() {  
  27.         return null;  
  28.     }  
  29.   
  30.     public void destroy() {  
  31.         System.out.println("destroy");  
  32.     }  
  33. }  

  Constants

Java代码  

  1. package com.whatsmars.tomcat.servlet;  
  2.   
  3. import java.io.File;  
  4.   
  5. /** 
  6.  * Created by shenhongxi on 2016/4/12. 
  7.  */  
  8. public class Constants {  
  9.   
  10.     public static final String WEB_ROOT = System.getProperty("user.dir") + File.separator + "whatsmars-tomcat/src/main/webapp"; // 资源文件,class文件等  
  11. }  

 

原文链接:[http://wely.iteye.com/blog/2290575]

时间: 2024-12-11 02:48:35

一个简单的servlet容器的相关文章

深入剖析tomcat之一个简单的servlet容器

上一篇,我们讲解了如果开发一个简单的Http服务器,这一篇,我们扩展一下,让我们的服务器具备servlet的解析功能. 简单介绍下Servlet接口 如果我们想要自定义一个Servlet,那么我们必须继承Servlet,并且实现下面几个重要的方法 public void init(ServletConfig config) throws ServletException public void service(ServletRequest request,ServletResponse resp

一个简单的Servlet注册实例

   我们在利用Servlet进行web开发的时候 ,运行的不是 JSP页面 而实际上是一个  Java类的对象  .这个类的对象从 javax.sevlet.http.HttpServlet ;这个类是基于HTTP的 Servlet类 我们自己写的 Servlet应该从 这个类派生而来 . 通过我们自己编写的类 以及对web.xml的部署  ,进行web的流程控制 ,实现用户与服务器的交互 . 要注意在 编写Servlet进行相应客户端的时候 我们在调用  Response.setConten

学习servlet,写一个简单的Helloword出现404错误

问题描述 学习servlet,写一个简单的Helloword出现404错误 解决方案 不需要 /servlet 解决方案二: 解决方案三: web.xml内容贴下来看看. 可以参考 我写的http://blog.csdn.net/evankaka/article/details/45151569 解决方案四: url里把[/Hello]改成[/HelloServlet] 和你Web.xml里配置的url-pattern一样. 解决方案五: 一个简单的Servlet 解决方案六: 采用servle

Jetty 9.2.22 发布,开源的 Servlet 容器

Jetty 9.2.22 发布了.Jetty 是一个开源的 servlet 容器,它为基于 Java 的 web 内容,例如 JSP 和 servlet 提供运行环境.Jetty 是使用 Java 语言编写的,它的 API 以一组 JAR 包的形式发布.开发人员可以将 Jetty 容器实例化成一个对象,可以迅速为一些独立运行(stand-alone)的 Java 应用提供网络和 web 连接. 更新内容: Â+ 920 no main manifest attribute, in jetty-r

创建一个简单的web服务器

Web服务器也称为超文本传输协议(HTTP)服务器,因为它使用HTTP来跟客户端进行通信的.既然说到通信那就离不了Java里的两个重要的类java.net.Socket和java.net.ServerSocket.这里浏览器一方可以认为是一个客户端,接收HTTP请求的一方可以认为是服务端.在这之前我们先说一下HTTP协议. HTTP协议允许web服务器和浏览器通过网络来进行发送和接收数据.它是一种请求和响应协议.客户端发送一个请求,服务端响应这个请求.HTTP请求由三部分组成,分别是:请求行.消

基于Java web服务器简单实现一个Servlet容器_java

上篇写了一个简单的Java web服务器实现,只能处理一些静态资源的请求,本篇文章实现的Servlet容器基于前面的服务器做了个小改造,增加了Servlet请求的处理.  程序执行步骤 1.创建一个ServerSocket对象:  2.调用ServerSocket对象的accept方法,等待连接,连接成功会返回一个Socket对象,否则一直阻塞等待:  3.从Socket对象中获取InputStream和OutputStream字节流,这两个流分别对应request请求和response响应:

java-jsp+servlet写了一个简单的注册,但是出现找不到页面

问题描述 jsp+servlet写了一个简单的注册,但是出现找不到页面 小菜鸟刚写了一个简单的注册页面,但是配置好servlet以后出现找不到页面,找了好长时 间没有发现问题在哪里,希望有明白的给解释解释 解决方案 你写的是相对路径 ,一般用绝对路径 form 在 项目/page 下找相应页面,你的servlet 是映射在 项目/ 下的 你可以 在form 的action 改为 ../addUser 试试 解决方案二: 看看这个: 路径总结: 路径分为两种情况: 1.客户端路径 ==> 给浏览器

做一个简单的jsp登陆界面servlet报错

问题描述 做一个简单的jsp登陆界面servlet报错 package com.demo; import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import javax.servlet.Serv

checkbox-刚学完JS和servlet,写一个简单的注册登录页面

问题描述 刚学完JS和servlet,写一个简单的注册登录页面 ,想把checkbox选中的的数据和下拉列表选中的的年月日组合成字符串发送给servlet,该怎么做,求大神指教 解决方案 username: password: 表单 action 对应的servlet method 提交方式,对应servlet的doPost和doGet方法 在servlet中写 req.getParameter("username"); req.getParameter("password&