简单的Servlet容器_根据请求决定具体servlet

来源:互联网 发布:csgo和cf知乎 编辑:程序博客网 时间:2024/05/17 19:21

Servlet容器中放着我们所有要访问的Servlet,根据我们具体的请求来访问不同的Servlet。下面是一个简单的Servlet容器的实现。request和response的封装以及连接器的实现代码这里就不再重复写了,请看上一篇博客。

servlet

[java] view plain copy
  1. package com.hcserver.servlet;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import javax.servlet.ServletException;  
  6. import javax.servlet.http.HttpServlet;  
  7. import javax.servlet.http.HttpServletRequest;  
  8. import javax.servlet.http.HttpServletResponse;  
  9.   
  10. public class MyServlet extends  HttpServlet{  
  11.   
  12.     private static final long serialVersionUID = 1L;  
  13.   
  14.       
  15.     @Override  
  16.     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {  
  17.         this.doPost(req, resp);  
  18.     }  
  19.   
  20.     @Override  
  21.     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {  
  22.           
  23.         String aa = req.getParameter("aa");  
  24.         String bb = req.getParameter("bb");  
  25.         System.out.println("param aa = "+aa);  
  26.         System.out.println("param bb = "+bb);  
  27.           
  28.         resp.getWriter().print("hello world...");  
  29.     }  
  30.   
  31.       
  32.       
  33. }  


servlet容器

[java] view plain copy
  1. package com.hcserver.container;  
  2.   
  3. import java.io.File;  
  4. import java.util.HashMap;  
  5. import java.util.Map;  
  6.   
  7. import javax.servlet.http.HttpServlet;  
  8.   
  9. public class Container {  
  10.     public final static String WEB_ROOT = Container.class.getResource("/webapps").getPath();  
  11.       
  12.     private Map<String,Map<String,HttpServlet>> projectMap  = new HashMap<>();  
  13.       
  14.     private static Container container = new Container();  
  15.       
  16.     private Container(){}  
  17.     public static Container getInstance(){  
  18.         return container;  
  19.     }  
  20.       
  21.     public void init(){  
  22.         try{  
  23.             //模拟解析web.xml,利用反射得到servlet实例  
  24.             Map<String,HttpServlet> map = new HashMap<>();  
  25.             Class<?> servletClass = Class.forName("com.hcserver.servlet.MyServlet");  
  26.             HttpServlet newInstance = (HttpServlet)servletClass.getConstructor(new Class[]{}).newInstance(new Object[]{});  
  27.             map.put("myServlet", newInstance);  
  28.             projectMap.put("hello",map);  
  29.               
  30.         }catch(Exception e){  
  31.               
  32.         }  
  33.     }  
  34.       
  35.     public Map<String,HttpServlet> getProject(String projectName){  
  36.         return projectMap.get(projectName);  
  37.           
  38.     }  
  39.       
  40.     public static void main(String[] args) {  
  41.         container.init();  
  42.           
  43.     }  
  44.       
  45.       
  46. }  


处理器修改

[java] view plain copy
  1. package com.hcserver.process;  
  2.   
  3. import java.util.Map;  
  4.   
  5. import javax.servlet.http.HttpServlet;  
  6. import javax.servlet.http.HttpServletRequest;  
  7. import javax.servlet.http.HttpServletResponse;  
  8.   
  9. import com.hcserver.container.Container;  
  10.   
  11. public class Process {  
  12.       
  13.     public void service(HttpServletRequest request,HttpServletResponse response){  
  14.         String project = request.getContextPath();  
  15.         String servletPath = request.getServletPath();  
  16.           
  17.         //得到容器类  
  18.         Container container = Container.getInstance();  
  19.         Map<String, HttpServlet> servletMap = container.getProject(project);  
  20.         HttpServlet servlet = servletMap.get(servletPath);  
  21.         try {  
  22.             //返回页面  
  23.             servlet.service(request, response);  
  24.         } catch (Exception e) {  
  25.               
  26.             e.printStackTrace();  
  27.         }   
  28.     }  
  29.       
  30. }  


最后启动服务,浏览器,输入:http://localhost:8084/hello/MySevlet?aa=1&bb=3回车后浏览器显示 hello world..

后台输出

param aa = 1

param bb = 3