首页 > 代码库 > Servlet与JSP的关系
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.37\webapps\myapp\index.jsp为例,
- <html>
- <body>
- <center>
- Now time is: <%=new java.util.Date()%>
- </center>
- </body>
- </html>
当启动Tomcat之后,可以在Tomcat的apache-tomcat-7.0.37\work\Catalina\localhost\myapp\org\apache\jsp目录下找到如下文件:indexd.java和index.class。这两个文件都是Tomcat生成的,Tomcat根据JSP页面生成对应Servlet的Java文件及class文件。
index.java
- //JSP页面经过Tomcat编译后默认的包
- package org.apache.jsp;
- import javax.servlet.*;
- import javax.servlet.http.*;
- import javax.servlet.jsp.*;
- //继承HttpJspBase类,该类其实是个Servlet的子类
- public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
- implements org.apache.jasper.runtime.JspSourceDependent {
- private static final javax.servlet.jsp.JspFactory _jspxFactory =
- javax.servlet.jsp.JspFactory.getDefaultFactory();
- private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants;
- private javax.el.ExpressionFactory _el_expressionfactory;
- private org.apache.tomcat.InstanceManager _jsp_instancemanager;
- public java.util.Map<java.lang.String,java.lang.Long> getDependants() {
- return _jspx_dependants;
- }
- public void _jspInit() {
- _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
- _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
- }
- public void _jspDestroy() {
- }
- //用于响应用户的方法
- 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页面中内置了几个对象,如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
Servlet与JSP的关系