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为例,

  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.37\work\Catalina\localhost\myapp\org\apache\jsp目录下找到如下文件:indexd.java和index.class。这两个文件都是Tomcat生成的,Tomcat根据JSP页面生成对应Servlet的Java文件及class文件。

index.java

  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. try {
  48. //设置输出的页面格式
  49. response.setContentType("text/html");
  50. pageContext = _jspxFactory.getPageContext(this, request, response,
  51. null, true, 8192, true);
  52. _jspx_page_context = pageContext;
  53. application = pageContext.getServletContext();
  54. config = pageContext.getServletConfig();
  55. session = pageContext.getSession();
  56. //页面输出流
  57. out = pageContext.getOut();
  58. _jspx_out = out;
  59.  
  60. //输出流,开始输出页面文档
  61. out.write("<html>\r\n");
  62. out.write("<body>\r\n");
  63. out.write("<center> \r\n");
  64. out.write("Now time is: ");
  65. out.print(new java.util.Date());
  66. out.write(" \r\n");
  67. out.write("</center>\r\n");
  68. out.write("</body>\r\n");
  69. out.write("</html>");
  70. } catch (java.lang.Throwable t) {
  71. if (!(t instanceof javax.servlet.jsp.SkipPageException)){
  72. out = _jspx_out;
  73. if (out != null && out.getBufferSize() != 0)
  74. try { out.clearBuffer(); } catch (java.io.IOException e) {}
  75. if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
  76. else throw new ServletException(t);
  77. }
  78. } finally {
  79. _jspxFactory.releasePageContext(_jspx_page_context);
  80. }
  81. }
  82. }

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页打开时在本地运行。们可以直接嵌入到网页或者其他特定的容器中,并能够产生特殊的效果。

目前,Servlet引擎一般是第三方的插件,它通过一定的方法连接到Web服务器,Servlet引擎把它识别为Servlet请求的那些HTTP请求截获下来处理,而其他的HTTP请求由Web服务器按照通常的方式来处理,Servlet引擎会装载合适的Servlet到内存中,如果Servlet还没有运行的话,会分配一个可以使用的线程来处理请求,再把Servlet的输出返回到发出请求的Web客户机。

Java Applet正好是相对应的两种程序类型,Applet运行在客户端,在浏览器内执行,而Servlet在服务器内部运行,通过客户端提交的请求启动运行。

同样的Servlet完全可以在Apache,IIS等不同Web服务器上执行,不管底层的操作系统是Windows,Solaris,Mac,Linux

Java Servlet有着十分广泛的应用。使用Servlet还可以实现大量的服务器端的管理维护功能,以及各种特殊的任务,比如,并发处理多个请求,转送请求,代理等。

典型的Servlet运行环境有JSWDK,Tomcat,Resin等,。它们都自带一个简单的HTTP
Server,只需简单配置即可投入使用,你也可以把它们绑定到常用的Web服务器上,如Apache,IIS等,提供小规模的Web服务,如JRun,Web Sphere,Web Logic等等,配置比较复杂,并不适合初学者。但是功能较为强大,有条件的读者可以一试。

  1. import java.io.*;
  2.  import java.util.*;
  3.  import javax.servlet.http.*;
  4.  import javax.servlet.*;
  5.  //导入必要的包
  6.  public class HelloServlet extends HttpServlet {
  7.    //所有Servlet必须从HttpServlet派生
  8.    public void doGet (HttpServletRequest req, HttpServletResponse res)
  9.    throws ServletException, IOException
  10.    //doGet()是这个Servlet的核心,真正处理请求的地方
  11.  {
  12.  res.setContentType("text/html");
  13.    //设置相应的类型为text/html
  14.  PrintWriter pw = res.getWriter();
  15.    //从HttpServletResponse得到输出流   
  16.  pw.println("<!DOCTYPE HTML PUBLIC ""-//W3C//DTD HTML 4.0 Transitional//EN"">");
  17.  pw.println("<head>");
  18.  pw.println("<meta http-equiv=""Content-Type"" content=""text/html; charset=ISO-8859-1"">");
  19.  pw.println("<!-- The Servlet expression tags interpolate script variables into the HTML -->");
  20.  pw.println("<title>Hello, world!</title>");
  21.  pw.println("</head>");
  22.  pw.println("<body bgcolor=#cc99dd>");
  23.  pw.println("<h1>Hello, world!</h1>");
  24.  pw.println("</body>");
  25.  //上面的语句都是向客户端打印HTML文本
  26.  pw.close();
  27.  //关闭HttpServletResponse,使Web服务器知道相应结束
  28. }
  29. public HelloServlet() {} //构造函数,可以不要

Servlet使用HttpServlet类中的方法与表单进行交互。在HttpServlet类中有几个未完全实现的方法,你可以自己定义方法的内容,但是必须正确使用方法名称以使HTTP Server把客户请求正确的映射到相应的函数上。
  doHeader 用于处理HEADER请求
  doGet 用于处理GET请求,也可以自动的支持HEADER请求
  doPost 用于处理POST请求
  doPut 用于处理PUT请求
  doDelete 用于处理DELETE请求

不管何种HTTP方式,都可以用getParameterValues方法返回特定名称的参数值。

在进行HTTP网络传输的时候,统一采用的编码方式是ISO-8859-1

字符编码转换常用的方法是
  String native_encoded = "中文字符串"; 
//得到本地编码的字节数组
  String net_encoded = new String(native_encoded, "ISO-8859-1"); 例:out.println(new
String(new String("<td>你的姓名:</td>").getBytes(),"ISO-8859-1"));

会话状态的维持是开发Web应用所必须面对的问题,有多种方法可以来解决这个问题,如使用Cookies,或直接把状态信息加到URL中等,还有Servlet本身提供了一个HttpSession接口来支持会话状态的维持

从服务器这端来看,每一个请求都是独立的,因此HTTP协议被认为是无状态协议,当用户在多个主页间切换时,服务器无法知道他的身份。Session的出现就是为了弥补这个局限。利用Session,您就可以当一个用户在多个主页间切换的时候也能保存他的信息。这样很多以前根本无法去做的事情就变得简单多了。
    在访问者从到达某个特定的主页到离开为止的那段时间,每个访问者都会单独获得一个Session

Java
Servlet定义了一个HttpSession接口,实现的Session的功能,在Servlet中使用Session的过程如下:
  (1) 使用HttpServletRequest的getSession方法得到当前存在的session,如果当前没有定义session,则创建一个新的session,还可以使用方法getSession(true)
  (2) 写session变量。可以使用方法HttpSession.setAttribute(name,value)来向Session中存储一个信息。
  (3)
读Session变量。可以使用方法HttpSession.getAttribute(name)来读取Session中的一个变量值,如果name是一个没有定义的变量,那么返回的是null。需要注意的是,从getAttribute读出的变量类型是Object,必须使用强制类型转换,比如:String
uid = (String) session.getAttribute("uid");
  (4) 关闭session,当时用完session后,可以使用session.invalidate()方法关闭session。但是这并不是严格要求的。因为,Servlet引擎在一段时间之后,自动关闭seesion。
      HttpSession session = request.getSession(true); //参数true是指在没有session时创建一个新的
   Date created = new Date(session.getCreationTime()); //得到session对象创建的时间
   out.println("ID " + session.getId()+"<br>"); //得到该session的id,并打印
   out.println("Created: " + created+"<br>");//打印session创建时间
   session.setAttribute("UID","12345678"); //在session中添加变量UID=12345678
   session.setAttribute("Name","Tom"); //在session中添加变量Name=Tom  10.2.4 Servlet的生命周期

跟客户端的Applet相似,Servlet也遵循严格的生命周期。在每个Servlet实例的生命中有三种类型的事件,这三种事件分别对应于由Servlet引擎所唤醒的三个方法:
  1.init()。当Servlet第一次被装载时,Servlet引擎调用这个Servlet的init()方法,只调用一次。系统保证,在init方法成功完成以前,是不会调用Servlet去处理任何请求的。
  2.service()。这是Servlet最重要的方法,是真正处理请求的地方。对于每个请求,Servlet引擎将调用Servlet的service方法,并把Servlet请求对象和Servlet响应对象作为参数传递给它。
  3.destroy()。这是相对于init的可选方法,当Servlet即将被卸载时由Servlet引擎来调用,这个方法用来清除并释放在init方法中所分配的资源。 
Servlet的生命周期可以被归纳为以下几步:
  (1) 装载Servlet,这一项操作一般是动态执行的。然而,Servlet通常会提供一个管理的选项,用于在Servlet启动时强制装载和初始化特定的Servlet
  (2) Server创建一个Servlet实例
  (3) Server调用Servlet的init方法
  (4) 一个客户端请求到达Server
  (5) Server创建一个请求对象
  (6) Server创建一个响应对象
  (7) Server激活Servlet的service方法,传递请求和响应对象作为参数
  (8) service方法获得关于请求对象的信息,处理请求,访问其他资源,获得需要的信息
  (9) service方法使用响应对象的方法。将响应传回Server,最终到达客户端。Service方法可能激活其他方法以处理请求。如doGet,doPost或其他程序员自己开发的方法
  (10) 对于更多的客户端请求,Server创建新的请求和响应对象,仍然激活此servlet的service方法,将这两个对象作为参数传递给它,如此重复以上的循环,但无需再次调用init方法,Servlet一般只初始化一次
  (11) 当Server不再需要Servlet时,比如当Server要关闭时,Server调用Servlet的destroy

采用JSP来表现页面,采用Servlet来完成大量的处理,Servlet扮演一个控制者的角色,并负责响应客户请求。Servlet创建JSP需要的Bean和对象,根据用户的行为,决定将哪个JSP页面发送给用户。特别要注意的是,JSP页面中没有任何商业处理逻辑,它只是简单的检索Servlet先前创建的Beans或者对象,再将动态内容插入预定义的模板。

  1. <pre name="code" class="html"></pre>
  2. <pre></pre>
  3. <pre name="code" class="html"><pre></pre>
  4. <pre></pre>
  5. <pre></pre>
  6. <pre></pre>
  7. <pre></pre>
  8. <pre></pre>
  9.  
  10. </pre>

图解 servlet 与jsp的关系的更多相关文章

  1. Servlet与JSP的关系

    Servlet与JSP的异同点: 相似点: 都可以生成动态网页 不同点: JSP擅长网页制作,生成页面直观,但不易追踪与排错 Servlet是纯Java,擅长处理流程与业务逻辑,缺点是页面不直观

  2. 书摘及理解:Servlet与JSP的关系

    “Servlet是服务器端程序,它把应用逻辑嵌入到HTTP请求,在应答过程中可以直接通过PrinteWriter 输出经过逻辑处理后的动态HTML.JSP则是一种特殊的Servlet,它将Java代码 ...

  3. 浅谈servlet与jsp的关系

    servlet是用java语言编写的,是一个java类.主要功能是用来接受.处理客户端的请求,并把处理结果返回到客户端显示.Jsp是servlet发展后期的产物.在没有jsp之前,servlet利用输 ...

  4. 讲一讲Servlet和JSP的关系

    Test.jsp在运行时首先被解析成一个java类Test_jsp.java,该类继承于org.apache.jasper.runtime.HtppJspBase类,而Http又是继承HttpServ ...

  5. Servlet和JSP知识总结

    1.Servlet接口有哪些方法及Servlet生命周期 Servlet接口定义了5个方法,前三个方法与Servlet生命周期有关: void init() void service() void d ...

  6. JSP 和Servlet 有有什么关系?

    Servlet是一个特殊的Java程序,它运行于服务器的JVM中,能够依靠服务器的支持向浏览器提供显示内容. JSP本质上是Servlet的一种简易形式, JSP会被服务器处理成一个类似于Servle ...

  7. Servlet与JSP版本历史以及Tomcat支持的版本

    查询这个的关键字:Java EE的版本历史. JavaServer Pages (JSP) Java Servlet 参考: https://en.wikipedia.org/wiki/Java_EE ...

  8. java web中servlet、jsp、html 互相访问的路径问题

    java web中servlet.jsp.html 互相访问的路径问题 在java web种经常出现 404找不到网页的错误,究其原因,一般是访问的路径不对. java web中的路径使用按我的分法可 ...

  9. hibernate 结合servlet及 jsp 的使用

    Hibernate结合JSP使用 前面几章详细的介绍了Hibernate的相关知识,这一章介绍Hibernate结合JSP和Servlet的使用,通过这一章的学习,可以加深对Hibernate的理解. ...

随机推荐

  1. BZOJ 1072 [SCOI2007]排列perm ——状压DP

    [题目分析] 没什么好说的,水题. 代码比较丑,结果需要开long long 时间爆炸 [代码] #include <cstdio> #include <cstring> #i ...

  2. BZOJ2281 [SDOI2011]黑白棋 【dp + 组合数】

    题目 小A和小B又想到了一个新的游戏. 这个游戏是在一个1*n的棋盘上进行的,棋盘上有k个棋子,一半是黑色,一半是白色. 最左边是白色棋子,最右边是黑色棋子,相邻的棋子颜色不同. 小A可以移动白色棋子 ...

  3. Little Bird(BZOJ 3831)

    题目大意: 有一排n棵树,第i棵树的高度是Di. MHY要从第一棵树到第n棵树去找他的妹子玩. 如果MHY在第i棵树,那么他可以跳到第i+1,i+2,...,i+k棵树. 如果MHY跳到一棵不矮于当前 ...

  4. java面

    常被问到的十个 Java 面试题 每周 10 道 Java 面试题 : 面向对象, 类加载器, JDBC, Spring 基础概念 Java 面试题问与答:编译时与运行时 java面试基础1 java ...

  5. T1191 数轴染色 codevs

    http://codevs.cn/problem/1191/  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Descr ...

  6. 洛谷P1061 Jam的计数法

    题目描述 Jam是个喜欢标新立异的科学怪人.他不使用阿拉伯数字计数,而是使用小写英文字母计数,他觉得这样做,会使世界更加丰富多彩.在他的计数法中,每个数字的位数都是相同的(使用相同个数的字母),英文字 ...

  7. 51 NOD 1325 两棵树的问题

    Discription 对于 100% 的数据, N<=50. solution: 发现N比较小,所以我们可以花O(N^2)的代价枚举两颗树的联通块的LCA分别是哪个点,然后现在问题就变成了:选 ...

  8. Spring MVC集成Spring Data Reids和Spring Session实现Session共享出现:No bean named 'springSessionRepositoryFilter' available

    出现这个问题:No bean named 'springSessionRepositoryFilter' available的的原因: 1.Spring MVC加载了多个配置文件导致的,并不是版本问题 ...

  9. LayUI后台管理与综合示例

    一.LayUI介绍 layui(谐音:类UI) 是一款采用自身模块规范编写的前端 UI 框架,遵循原生 HTML/CSS/JS 的书写与组织形式,门槛极低,拿来即用.其外在极简,却又不失饱满的内在,体 ...

  10. UICollectionView 使用 介绍

    1.1. Collection View 全家福: UICollectionView, UITableView, NSCollectionView n   不直接等效于NSCollectionView ...