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 代码框架: