说说Javaweb 服务器与Tomcat源代码解析

Tomcat 源代码(GitHub)


Javaweb 服务器机制:


servlet 是javaweb的请求和响应的出入口,所以javaweb开发必定基于支持servlet,或者有servlet容器,如jetty,tomcat,weblogic服务器。


servlet运行起来就是web applicaiton,其在容器中就是一个个对象,当然web 服务器中的servlet容器在创建一个个servlet对象的时候,也会创建相应的其他对象,这些对象就是servlet环境对象(如上图所示)。如同你创建一个window,那么系统也会创建服务于这个window的事件监听的对象,绘制对象等。这对象里面的数据包含servlet上下文,状态,请求参数等。

servlet启动过程总创建这些对象,一个请求过来首先从web.xml中依据反射创建servlet对象,先是init() 创建 application对象,context对象,request,response对象,然后就是init(Config config)创建config对象和。接着就是创建session,out对象等。请求具体调用对象的get()或者post方法。

请求参数可以存储在request对象中,或者servlet执行的数据结果也可以放入在request对象中,当然也可以放入在config对象中。然后在页面中可以通过<%request.get(key,value)%>拿到处理后的数据。

jsp与servlet的关系:

使用Servlet产生动态网页,需要在代码中打印输出很多HTML的标签,此外,在Servlet中,我们不得不将静态现实的内容和动态产生内容的代码混合在一起。使用Servlet开发动态网页,程序员和网页编辑人员将无法一起工作,因为网页编辑人员不了解Java语言,无法修改Servlet代码,而Java程序员可能也不是很了解网页编辑人员的意图,以至于无法修改和实现网页功能。为了解决这些问题,Sun公司就推出了JSP技术。

如:

//用于响应用户的方法  
  public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)  
        throws java.io.IOException, javax.servlet.ServletException {  
  
    final javax.servlet.jsp.PageContext pageContext;  
    javax.servlet.http.HttpSession session = null;  
    final javax.servlet.ServletContext application;  
    final javax.servlet.ServletConfig config;  
    //获得页面输出流  
    javax.servlet.jsp.JspWriter out = null;  
    final java.lang.Object page = this;  
    javax.servlet.jsp.JspWriter _jspx_out = null;  
    javax.servlet.jsp.PageContext _jspx_page_context = null;  
  
  
    //开始生成响应  
    try {  
      //设置输出的页面格式  
      response.setContentType("text/html");  
      pageContext = _jspxFactory.getPageContext(this, request, response,  
                null, true, 8192, true);  
      _jspx_page_context = pageContext;  
      application = pageContext.getServletContext();  
      config = pageContext.getServletConfig();  
      session = pageContext.getSession();  
      //页面输出流  
      out = pageContext.getOut();  
      _jspx_out = out;  
  
      //输出流,开始输出页面文档  
      out.write("<html>\r\n");  
      out.write("<body>\r\n");  
      out.write("<center> \r\n");  
      out.write("Now time is: ");  
      out.print(new java.util.Date());  
      out.write(" \r\n");  
      out.write("</center>\r\n");  
      out.write("</body>\r\n");  
      out.write("</html>");  
    } catch (java.lang.Throwable t) {  
      if (!(t instanceof javax.servlet.jsp.SkipPageException)){  
        out = _jspx_out;  
        if (out != null && out.getBufferSize() != 0)  
          try { out.clearBuffer(); } catch (java.io.IOException e) {}  
        if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);  
        else throw new ServletException(t);  
      }  
    } finally {  
      _jspxFactory.releasePageContext(_jspx_page_context);  
    }  
  }  

JSP文件必须在JSP服务器内运行。JSP文件必须生成Servlet才能执行。每个JSP页面的第一个访问者速度很慢,因为必须等待JSP编译成Servlet。JSP页面的访问者无须安装任何客户端,甚至不需要可以运行Java的运行环境,因为JSP页面输送到客户端的是标准HTML页面。index.jsp页面中的每个字符都由index.java文件的输出流生成。servlet是在web服务器上的java程序,它提供服务,由它来传递给你html的格式。Servlet API为Servlet提供了统一的编程接口,Servlet必须部署在Servlet容器,才能响应客户端的请求  对外提供服务。要对外统一接口,由容器来调用。jsp侧重显示,servlet侧重控制逻辑。

事实上,JSP是Servlet的一种特殊形式,每个JSP页面就是一个Servlet实例——JSP页面由系统编译成Servlet,Servlet再负责响应用户请求。JSP其实也是Servlet的一种简化,使用JSP时,其实还是使用Servlet,因为Web应用中的每个JSP页面都会由Servlet容器生成对应的Servlet。对于Tomcat而言,JSP页面生成的Servlet放在work路径对应的Web应用下。


Tomcat 代码框架:






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值