简易版Tomcat服务器

1.Tomcat 服务器

1.1Tomcat 简介 Tomcat 是在 SUN 公司的 JSWDK(JavaServer WebDevelopmentKit ,是 SUN 公司推出的小型 Servlet/JSP 调试工 具)的基础上发展起来的一个优秀的 Servlet 容器,
Tomcat本身完全用 Java 语言编写。
1.2Tomcat 使用
(1) 配置 Tomcat a) JAVA_HOME Java JDK 的根目录
 
b) CATALINA_HOME Tomcat根目录
(2) 启动和关闭 Tomcat 启动 Tomcat 服务器:startup.bat
关闭 Tomcat 服务器:shutdown.bat
(3) 部署项目到服务器 在 webapps 目录下新建目录存放.html 面页 访问页面
1.3Tomcat目录简介
bin目录:存放了Tomcat执行的脚本目录,存放运行tomcat服务器相关的命令。 conf目录:存放tomcat服务器相关的配置文件 例如:在tomcat服务器启动的时候,会绑定一些端口号,这些端口号就可以在配置文件server.xml文件中进行修改。 lib目录:存放tomcat服务器自带的jar包,我们也可以把其他的一些jar 包也存放到这里在tomcat中同时可以部署多个项目,这个多个项目可共享lib目录中 的jar包。 logs目录:存放tomcat服务器在运行过程中,所产生的日志文件。 temp目录:存放tomcat服务器在运行过程中,所产生的临时文件。 webapps目录:存放部署到tomcat服务器中的web项目,把项目部署服务器里面, 其实就是放到这个目录下。 work目录:这个目录和是jsp页面相关的。


2.Tomcat 服务器运行原理

2.1Tomcat 的运行原理
客户浏览器发出要求访问特定的 Servlet 的请求。
  • (1) Tomcat服务器接收到客户请求并解析。
  • (2) Tomcat服务器创建一个 ServletRequest对象,在ServletRequest 对象中包含了客户请求信息及其他关于客 户的信息,如请求头,请求正文,以及客户机的 IP 地址 等。
  • (3) Tomcat服务器创建一个ServletResponse对象
  • (4) Tomcat服务器调用客户所请求的Servlet的service服务方 法,并且把 ServletRequst 对象和 ServletResponse 对象做为参数传给该服务方法。
  • (5) Servlet从ServletRequest对象中可获取客户的请求信息。
  • (6) Servlet利用ServletResponse对象来生成响应结果。
  • (7) Tomcat服务器把Servlet生成的响应结果发送给客户。
Tomcat服务器是servlet的一个容器。
 

3.手写服务器

当我们知道了Tomcat服务器及其运行原理后,我们尝试着自己手写一个服务器。

3.1 搭建项目框架

  • Request:请求
  • Response:响应
  • Server:用于服务器的启动和关闭。
  • WebApp:
  • IOUtils:用于关闭所有流。
  • Servlet:是所有的servlet(用于请求),的父类。
  • web.xml:配置文件。
 
当你在地址栏输入这个/log这个URL时,它所对应的servlet—name是login,而login所对应的Servlet-class,是com.servlet.LoginServlet,所以,此时,它会创建LoginServelet类的对象。
当你在地址栏写/login这个url时,……
这叫不同路径,访问共享资源。
 

 

4.DOM4J 解析 XML 配置文件

4.1Entity 实体类的编写

4.2Mapping 实体类的编写

4.3 解析 XML 文件

 
public class WebDom4j {//用于解析XML private List<Entity> entityList;//用于存储是N多Entity,而每一个Entity都是servlet-name与servlet-class private List<Mapping> mappingList;//用于存储N多Mapping,而每一个Mapping都是一个servlet-name与N多个url-pattern public List<Entity> getEntityList() { return entityList; } public void setEntityList(List<Entity> entityList) { this.entityList = entityList; } public List<Mapping> getMappingList() { return mappingList; } public void setMappingList(List<Mapping> mappingList) { this.mappingList = mappingList; } //构造方法 public WebDom4j() { entityList=new ArrayList<Entity>(); mappingList=new ArrayList<Mapping>(); } //获取Document对象的方法 private Document getDocument(){ try { //(1)创建SAXReader对象 SAXReader reader=new SAXReader(); //(2)调用read方法 return reader.read(new File("src/WEB_INFO/web.xml")); } catch (DocumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } //------------------------------------------------------------------- public void parse(Document doc){ //(1)获取根元素 Element root=doc.getRootElement(); //web-app //(2)获取servlet子元素 for(Iterator<Element> ite=root.elementIterator("servlet");ite.hasNext();){ Element subElement=ite.next();//得到每一个servlet //创建一个实体类 Entity ent=new Entity(); //用于存储servlet-name与servlet-class for(Iterator<Element> subIte=subElement.elementIterator();subIte.hasNext();){ Element ele=subIte.next(); //可能是servlet-name,也可能是servlet-class if("servlet-name".equals(ele.getName())){ ent.setName(ele.getText()); //给实体类中的name赋值 }else if("serlvet-class".equals(ele.getName())){ ent.setClazz(ele.getText()); } } //将Entity添加到集合中 entityList.add(ent); } //测试 /**for (Entity entity : entityList) { System.out.println(entity.getName()+"\t"+entity.getClazz()); }*/ //解析servlet-mapping for(Iterator<Element> ite=root.elementIterator("servlet-mapping");ite.hasNext();){ Element subEle=ite.next();//得到每一个servlet-mapping //创建一个Mapping类的对象 Mapping map=new Mapping(); //解析servlet-mapping下的子元素 for(Iterator<Element> subIte=subEle.elementIterator();subIte.hasNext();){ Element ele=subIte.next();//servlet-name,也有可能是url-patternif("serlvet-name".equals(ele.getName())){ map.setName(ele.getText());}elseif("url-pattern".equals(ele.getName())){//获取集合对象,调用集合对象的添加方法,添加元素素 map.getUrlPattern().add(ele.getText());}}//Mapping添加到集合中 mappingList.add(map);}//测试for(Mapping m : mappingList){ System.out.println(m.getName());for(String s:m.getUrlPattern()){ System.out.println(s);}}}//------------------------------------------------------------//用于测试publicstaticvoidmain(String[] args){ WebDom4j web=newWebDom4j(); web.parse(web.getDocument());}}
 

5.反射创建 Servlet 对象

9.1 编写 ServletContext 类 Servlet 上下文,就是一个容器,用于存储entity与mapping的映射关系。
9.2 编写 WebApp 类
WebAppClass的作用有两个,分别是: (1) 初始化程序运行的数据。 (2) 根据不同的 url 创建所请求的 Servlet 对象。
public class WebApp {//App的意思是应用程序 private static ServletContext contxt; static{ contxt=new ServletContext(); //分别获取对应关系的Map集合 Map<String,String> servlet=contxt.getServlet(); Map<String,String> mapping=contxt.getMapping(); //创建解析XML文件对象 WebDom4j web=new WebDom4j(); web.parse(web.getDocument());//解析xml //获取解析XML之后的List集合 List<Entity> entityList=web.getEntityList(); List<Mapping> mappingList=web.getMappingList(); //将List集合中的数据存储到Map集合 for (Entity entity : entityList) { servlet.put(entity.getName(), entity.getClazz()); } // System.out.println(servlet); for( Mapping map:mappingList){ //遍历url-pattern的集合 List<String> urlPattern=map.getUrlPattern(); for(String s:urlPattern){ mapping.put(s, map.getName()); } } //System.out.println(mapping); } /** * 根据url创建不同的Servlet对象 * @param url * @return */ public static Servlet getServlet(String url){ if (url==null||url.trim().equals("")) { return null; } //调用无参构造方法创建Servlet对象 try { //如果url正确 //根据url的key获取servlet-name的值 /log=login, /reg=register String servletName=contxt.getMapping().get(url); //根据servletName得到对应的servlet-class String servletClass=contxt.getServlet().get(servletName); //得到的是一个完整个的包名+类的字符串 //使用反射创建 Servlet对象 Class<?> clazz=Class.forName(servletClass); Servlet servlet = (Servlet) clazz.newInstance(); return servlet; } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } //测试 public static void main(String[] args) { System.out.println(getServlet("/log")); System.out.println(getServlet("/login")); } }
 
 
 
 

 

posted @ 2019-07-06 17:48  Eric-Shen  阅读(361)  评论(0编辑  收藏  举报