Servlet与JSP的关系

Servlet是Java提供的用于开发Web服务器应用程序的一个组件,运行在服务器端,由Servlet容器所管理,用于生成动态的内容。Servlet是平台独立的Java类,编写一个Servlet,实际上就是按照Servlet规范编写一个Java类。

如图所示,Java提供一系列接口类(所谓接口类就是类中所有方法只提供方法声明,不提供任何的方法实现,这些类的实现就留给后继者去做。):Servlet、ServletConfig、Serializable,然后通过多重继承产生一个最通用的Servlet实现类(图中Gerneric Servlet类),接下来,通过一个多重继承与实现,产生一个新的实现类HttpServlet,用户在开发Servlet程序时只需继承这个类,从而产生一个自己的类(图中Hello_Servlet类),然后根据实际开发功能与信息处理需要,去实现该类中的相关方法即可。这就是前面提到的按照Servlet规范编写一个Java类,从而编写一个Servlet。

至于JSP(JavaServlet Page)从图中可以看出,实际上它也是从Servlet继承而来。只不过它在Servlet当中又添加/修改了一些方法,作了新的封装。具体到Tomcat Web应用服务器中,它通过一个多重继承,分别从Java的HttpJspPage和HttpServlet两个类那里继承和实现一些方法,然后封装一个叫做HttpJspBase的类从而实现了一个通用化的JSP类,用户在开发自己的JSP时,只需要从HttpJspBase继承一个自己的类(如图中Hello_jsp类),然后根据需要去实现相应的方法即可。

因此这也是为什么JSP的代码中总是闪现Servlet代码框架影子的原因,其实它们只是为实现同样的功能而进行了不同封装的组件而已,血脉里留着的是一样的血。

“既生瑜何生亮?”呵呵,因为JSP确实比Servlet要更胜一筹,所谓“青出于蓝胜于蓝”,既然Sun公司要在Servlet基础上推出JSP技术,那肯定是因为JSP有它更高明的地方。

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

JSP是Servlet的扩展,在没有JSP之前,就已经出现了Servlet技术。Servlet是利用输出流动态生成HTML页面,包括每一个HTML标签和每个在HTML页面中出现的内容。

JSP通过在标准的HTML页面中插入Java代码,其静态的部分无须Java程序控制,只有那些需要从数据库读取并根据程序动态生成信息时,才使用Java脚本控制。

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

以apache-tomcat-7.0.37webappsmyappindex.jsp为例,

[html] view plain copy
 
  1. <html>  
  2. <body>  
  3. <center>   
  4. Now time is: <%=new java.util.Date()%>   
  5. </center>  
  6. </body>  
  7. </html>  

当启动Tomcat之后,可以在Tomcat的apache-tomcat-7.0.37workCatalinalocalhostmyapporgapachejsp目录下找到如下文件:indexd.java和index.class。这两个文件都是Tomcat生成的,Tomcat根据JSP页面生成对应Servlet的Java文件及class文件

index.java

[html] view plain copy
 
  1. //JSP页面经过Tomcat编译后默认的包  
  2. package org.apache.jsp;  
  3.   
  4. import javax.servlet.*;  
  5. import javax.servlet.http.*;  
  6. import javax.servlet.jsp.*;  
  7.   
  8. //继承HttpJspBase类,该类其实是个Servlet的子类  
  9. public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase  
  10.     implements org.apache.jasper.runtime.JspSourceDependent {  
  11.   
  12.   private static final javax.servlet.jsp.JspFactory _jspxFactory =  
  13.           javax.servlet.jsp.JspFactory.getDefaultFactory();  
  14.   
  15.   private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants;  
  16.   
  17.   private javax.el.ExpressionFactory _el_expressionfactory;  
  18.   private org.apache.tomcat.InstanceManager _jsp_instancemanager;  
  19.   
  20.   public java.util.Map<java.lang.String,java.lang.Long> getDependants() {  
  21.     return _jspx_dependants;  
  22.   }  
  23.   
  24.   public void _jspInit() {  
  25.     _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();  
  26.     _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());  
  27.   }  
  28.   
  29.   public void _jspDestroy() {  
  30.   }  
  31.   
  32.   //用于响应用户的方法  
  33.   public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)  
  34.         throws java.io.IOException, javax.servlet.ServletException {  
  35.   
  36.     final javax.servlet.jsp.PageContext pageContext;  
  37.     javax.servlet.http.HttpSession session = null;  
  38.     final javax.servlet.ServletContext application;  
  39.     final javax.servlet.ServletConfig config;  
  40.     //获得页面输出流  
  41.     javax.servlet.jsp.JspWriter out = null;  
  42.     final java.lang.Object page = this;  
  43.     javax.servlet.jsp.JspWriter _jspx_out = null;  
  44.     javax.servlet.jsp.PageContext _jspx_page_context = null;  
  45.   
  46.   
  47.     //开始生成响应  
  48.     try {  
  49.       //设置输出的页面格式  
  50.       response.setContentType("text/html");  
  51.       pageContext = _jspxFactory.getPageContext(this, request, response,  
  52.                 null, true, 8192, true);  
  53.       _jspx_page_context = pageContext;  
  54.       application = pageContext.getServletContext();  
  55.       config = pageContext.getServletConfig();  
  56.       session = pageContext.getSession();  
  57.       //页面输出流  
  58.       out = pageContext.getOut();  
  59.       _jspx_out = out;  
  60.   
  61.       //输出流,开始输出页面文档  
  62.       out.write("<html> ");  
  63.       out.write("<body> ");  
  64.       out.write("<center>  ");  
  65.       out.write("Now time is: ");  
  66.       out.print(new java.util.Date());  
  67.       out.write("  ");  
  68.       out.write("</center> ");  
  69.       out.write("</body> ");  
  70.       out.write("</html>");  
  71.     } catch (java.lang.Throwable t) {  
  72.       if (!(t instanceof javax.servlet.jsp.SkipPageException)){  
  73.         out = _jspx_out;  
  74.         if (out != null && out.getBufferSize() != 0)  
  75.           try { out.clearBuffer(); } catch (java.io.IOException e) {}  
  76.         if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);  
  77.         else throw new ServletException(t);  
  78.       }  
  79.     } finally {  
  80.       _jspxFactory.releasePageContext(_jspx_page_context);  
  81.     }  
  82.   }  
  83. }  

JSP页面中内置了几个对象,如pageContext、application、config、page、session、out等_jspService()方法,这几个内置对象就是在这里定义的。

根据上面的JSP页面工作原理图,可以得到如下结论: 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侧重控制逻辑。
MVC模式:Jsp + Servlet + JavaBean。M-JavaBean V-Jsp C-Servlet
小应用程序(Applet)是指采用Java创建的基于HTML的程序。浏览器将其暂时下载到用户的硬盘上,并在Web页打开时在本地运行。们可以直接嵌入到网页或者其他特定的容器中,并能够产生特殊的效果。

完整版:

http://blog.csdn.net/kaixinbingju/article/details/9409927

原文地址:https://www.cnblogs.com/zedosu/p/6515126.html