初窥Servlet

版权声明:尊重博主原创文章,转载请注明出处哦~http://blog.csdn.net/eson_15/article/details/51245629

目录(?)[+]

1. Servlet简介

        Servlet是sun公司提供的一门用于开发动态web资源的技术。sun公司在其API中提供了一个servlet接口,用户若想要发一个动态web资源,只需要完成以下两步即可:

           1)编写一个servlet,即实现servlet接口的Java类;

           2) 把开发好的servlet部署到web服务器中。

        Servlet接口定义了所有servlet必须实现的方法。一个servlet是运行在web服务器中的一个小java程序,servlet通过HTTP协议接收并响应web客户端发来的请求。这个接口中定义的方法包括初始化servlet,服务请求,以及remove servlet,这些方法即servlet的生命周期方法,调用顺序如下:

           1)某个创建servlet对象的时候,调用初始化方法: void init(ServletConfig config)

           2)客户端发送请求的时候,service方法被执行:void service(ServletRequest req, ServletResponse res)

           3)某个servlet对象被摧毁的时候,调用destroy方法: void destroy()

        除了这些与生命周期有关的方法外,Servlet接口还提供了getServletConfig方法和getServletInfo方法,getServletConfig方法可以获得servlet的一些启动信息,getServletInfo方法可以返回servlet本身的一些信息。

        sun公司定义了Servlet接口的两个默认实现类,分别为javax.servlet.GenericServlet和javax.servlet.http.HttpServlet。

        HttpServlet指能够处理HTTP请求的servlet,它再原有的Servlet接口上添加了一些与HTTP协议处理方法,它比Servlet接口的功能更为强大,因此开发人员在编写Servlet时,通常应继承这个类,而避免直接去实现Servlet接口。HttpServlet在实现Servlet接口时,覆写了service方法,该方法体内的代码会自动判断用户的请求方式,如为GET请求,则调用HttpServlet的doGet方法,如为Post请求,则调用doPost方法。因此,开发人员在编写Servlet时,通常只需要覆写doGet或doPost方法,而不要去覆写service方法。

2. Servlet的运行过程

        Servlet程序是由web服务器调用,web服务器接收到客户端的Servlet访问请求后:
           1)web服务器首先检查是否已经装载并创建了该Servlet的实例对象,如果是,则直接执行第4步,否则执行第2步。
           2)装载并创建该Servlet的一个实例对象。
           3)调用Servlet实例对象的init()方法。
           4)创建一个用于封装HTTP请求消息的HttpServletRequest对象和一个代表HTTP相应消息的HttpServletResponse对象,然后调用Servlet的service()方法并将请求和响应对象作为参数传递进去。
           5)web应用程序被停止或重新启动前,Servlet引擎将卸载Servlet,并在卸载之前调用Servlet的destroy()方法。

3. Servlet的几个细节

1. Servlet细节1

        由于客户端是通过URL地址访问文本服务器中的资源,所以servlet程序若想被外界访问,必须把servlet程序映射到一个URL地址上,这个工作在web.xml文件中使用<servlet>元素和<servlet-mapping>元素完成。

       1) <servlet>元素用于注册Servlet,它包含两个主要的子元素:

              <servlet-name>:用于设置Servlet的注册名称

              <servlet-class>:用于设置Servlet的完整类名

        2)<servlet-mapping>元素用于映射一个已注册的Servlet的一个对外访问路径,它包含两个子元素:

              <servlet-name>:用于设置Servlet的注册名称

              <url-pattern>:用于指定Servlet的对外访问路径(可以随便指定)

        例如:

[html] view plain copy

 

  1. <web-app>  
  2.     <servlet>  
  3.     <servlet-name>AnyName</servlet-name>  
  4.     <servlet-class>HelloServlet</servlet-class>  
  5.     </servlet>  
  6.     <servlet-mapping>  
  7.     <servlet-name>AnyName</servlet-name>  
  8.     <url-pattern>/demo/hello.html</url-pattern>  
  9.     </servlet-mapping>  
  10. </web-app>  

2. Servlet细节2

        同一个Servlet可以被映射到多个URL上,即多个<servlet-mapping>元素的<servlet-name>子元素的设置值可以是同一个Servlet的注册名。在Servlet映射到的URL中也可以使用*通配符,但是只能有两种固定的格式:一种格式是:“*.扩展名”;另一种格式是:以“/”开头,并以“/*”结尾。例如:

[html] view plain copy

 

  1. <servlet-mapping>  
  2.     <servlet-name>AnyName</servlet-name>  
  3.     <url-pattern>*do</url-pattern>  
  4. </servlet-mapping>  

        也可以映射到另一个url:

[html] view plain copy

 

  1. <servlet-mapping>  
  2.     <servlet-name>AnyName</servlet-name>  
  3.     <url-pattern>/action/*</url-pattern>  
  4. </servlet-mapping>  

3. servlet细节3

        Servlet是一个供其他java程序(Servlet引擎)调用的java类,它不能独立运行,它的运行完全由Servlet引擎来控制和调度。针对客户端的多次Servlet请求,通常情况下,服务器只会创建一个Servlet实例对象,也就是说Servlet实例对象一旦创建,它就会驻留在内存中,为后续的其它请求服务,直至web容器退出,servlet实例对象才销毁。
        在Servlet的整个生命周期中,Servlet的init方法只被调用一次,而对一个Servlet的每次访问请求都导致Servlet引擎调用一次servlet的service方法。对于每次访问请求,Servlet引擎都会创建一个新的HttpServletRequest请求对象和一个新的HttpServletResponse响应对象,然后将这两个对象作为参数传递给它调用的Servlet的service()方法,service方法再根据请求方式分别调用doGet或doPost方法。

4. servlet细节4

        如果再<servlet>元素中配置了一个<load-on-startup>元素,那么web应用程序在启动时,就会装载并创建Servlet的实例对象,以及调用Servlet实例对象的init()方法。该技术可以用来为web写一个initServlet,这个servlet配置为启动时装载,为整个web应用床架必要的数据库表和数据。如:

[html] view plain copy

 

  1. <servlet>  
  2.     <servlet-name>...</servlet-name>  
  3.     <servlet-class>...</servlet-class>  
  4.     <load-on-startup>1<load-on-startiup>  
  5. </servlet>  

5. servlet细节5

        如果某个Servlet的映射路径仅仅为一个正斜杠(/),那么这个Servlet就成为当前Web应用程序的缺省Servlet。凡是在web.xml文件中找不到匹配的<servlet-mapping>元素的url,它们的访问请求都将交给缺省Servlet处理,也就是说,缺省Servlet用于处理所有其他Servlet都不处理的访问请求。
        在<tomcat安装目录>\conf\web.xml文件中,注册了一个名称为org.apache.catalina.servlets.DefaulServlet的Servlet,并将这个Servlet设置为了缺省Servlet。当访问Tomcat服务器中的某个静态HTML文件和图片时,实际上是在访问这个缺省Servlet。
        假设现在在工程名为test的WebRoot目录下新建一个1.html,在web.xml文件中并没有配置<servlet-mapping>,即在工程中没有Servlet映射成1.html,然后访问:http://localhost:8080/test/1.html时,这时候这个请求就交给缺省的Servlet,缺省的Servlet收到请求后,会首先看一下web应用下面有没有这个1.html,如果有则读取并返回到浏览器,如果没有则返回一个错误页面。

6. servlet细节6

        当多个客户端并发访问同一个Servlet时,web服务器会为每一个客户端的访问请求创建一个线程,并在这个线程上调用Servlet的service方法,因为Servlet只有一个实例化对象,因此service方法内如果访问了同一个资源的话,就有可能引发线程安全问题。那么如何解决Servlet中的线程安全问题呢?
       1) 如果某个Servlet实现了SingleThreadModel接口,那么Servlet引擎将以单线程模式来调用其service方法。该接口没有任何方法,它起到了一个标志的作用。对于实现了SingleThreadModel接口的Servlet,Servlet引擎仍然支持对该Servlet的多线成并发访问,其采用的方式是产生多个Servlet实例对象,并发的每个线程分别调用一个独立Servlet实例对象。

       2)使用synchronized 关键字,synchronized能保证一次只有一个线程可以访问被保护的区段,从而可以通过同步块操作来保证线程的安全。

       3)尽量避免在Servlet里使用实例变量,只要在Servlet里面的任何方法里面都不使用共有的实例变量,那么该Servlet就是线程安全的。

       以上三种方式中,实现SingleThreadModel接口可以解决问题,但是并不是真正解决Servlet的线程安全问题,因为Servlet引擎会创建多个Servlet实例对象,而真正意义上解决多线程安全问题是指一个Servlet实例对象被多个线程同时调用的问题。另外,创建多个Servlet实例对象也会引起大量的开销。事实上,在Servlet API 2.4中,已经将SingleThreadModel标记为过时的了。

        同样,如果在程序中使用同步来保护要使用的共享的数据,也会使系统的性能大大下降。这是因为被同步的代码块在同一时刻只能有一个线程执行它,使得其同时处理客户请求的吞吐量降低,而且很多客户处于阻塞状态。所以在实际的开发中也应避免或最小化 Servlet 中的同步代码。

        所以,在Serlet中避免使用实例变量是保证Servlet线程安全的最佳选择。

3. Servlet的Hello Word

        最后写一个再简单不过的Hello Word吧……

[java] view plain copy

 

  1. public class ServletDemo extends HttpServlet {  
  2.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  3.             throws ServletException, IOException {  
  4.         System.out.println("Hello word!");  
  5.     }  
  6.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
  7.             throws ServletException, IOException {  
  8.         doGet(request, response);  
  9.     }  
  10. }  

        web.xml:

[html] view plain copy

 

  1. <servlet>  
  2.     <servlet-name>ServletDemo</servlet-name>  
  3.     <servlet-class>servlet.ServletDemo</servlet-class>  
  4.     <load-on-startup>1</load-on-startup>  
  5. </servlet>  
  6. <servlet-mapping>  
  7.     <servlet-name>ServletDemo</servlet-name>  
  8.     <url-pattern>/ServletDemo</url-pattern>  
  9. </servlet-mapping>  

        入门就这么多吧,如有错误之处,欢迎留言指正~

        相关阅读:http://blog.csdn.net/column/details/servletandjsp.html

_____________________________________________________________________________________________________________________________________________________

-----乐于分享,共同进步!

-----更多文章请看:http://blog.csdn.net/eson_15

http://blog.csdn.net/eson_15/article/details/51245629

时间: 2024-11-02 08:48:04

初窥Servlet的相关文章

百度竞价初窥端倪篇

  前情提要:要想花低于竞争对手的钱,取得比竞争对手好的排名,并要最大化得提升转化率,必须做到比对手更细心.更耐心.更勤快,每天不求多,只求质,每天要养成分析数据的习惯! 百度竞价--初窥端倪篇 1,百度竞价--关键词选择漫谈 指数高不一定转化率高,指数低未必转化率低;流量与成交量并不是正比关系,必须要一分为二的去分析;防止恶意点击和无效点击取决于你对关键词的筛选,选词之前要搞清楚你打算把用这个词引进来的人怎么处置!是让他看一眼就走,还是让他哭着淘一些钱给你,这是一个技巧! 比如:我现在需要做竞

iOS Animation初窥

引言 一款App是否足够吸引人一方面是需要丰富的内容,另一方面就是要足够人性化的交互,还有一些锦上添花的动画效果,在这里我们讨论一下关于Animation的基本实现,推荐大家试用FaceBook Paper,里面包含了大量的非原生动画效果,Paper团队甚至封装了相应的开源库Pop,让开发者接入自定义动画动画也十分简便.动画的接入要适当,否则用户面对眼花缭乱的动画效果,都会无从下手.这里有个基于Pop的Demo 当然导入一个复杂的第三方库可能有些小题大做,所以我们开始从最基本的创作Animati

初窥Spark

​ 11月26日,IBM资深软件工程师朱志辉老师,在DBA+社群DB2用户群进行了一次主题为"初窥Spark"的线上分享.小编特别整理出其中精华内容,供大家学习交流.同时,也非常感谢朱志辉老师对DBA+社群给予的大力支持.  嘉宾简介   IBM中国开发中心高级软件工程师 具有多年的数据库软件开发设计经验,擅长解决复杂的数据库应用系统问题及性能优化,拥有DB2多项认证和Oracle OCP证书 合作出版了<DB2设计,管理与性能优化艺术><DB2性能管理与实战>

【初窥javascript奥秘之事件冒泡】那些年我们一起冒的泡

原文http://www.cnblogs.com/yexiaochai/archive/2013/04/23/3037064.html [初窥javascript奥秘之事件冒泡]那些年我们一起冒的泡 前言 若是我说会有此文又是因为一次面试的话,我自己都不知道该怎么形容我的心情了,好似我的所有动力皆来自于面试似的. 其实不是这样的,我原来一个项目经理对我说,隔一两个月出去面试下,一来你会知道自己的不足知道怎么提高,二来你就知道自己涨价没. 现在回想起来他说的是很对的,面对这次的团队解散,我反而不那

【初窥javascript奥秘之Ajax】简述下你所知道的Ajax?

原文 http://www.cnblogs.com/yexiaochai/archive/2013/04/24/3037069.html [初窥javascript奥秘之Ajax]简述下你所知道的Ajax? 前言 ajax已经流行很多年了,现在来说它是否已经晚了呢???特别是有这样框架那样框架后,还有几个人认识原生ajax呢?我们每天都会用到的东西你到底对他了解吗? 在最近一次面试上不幸被问到了,原以为很熟悉的东西你会发现你对他根本不熟悉!要说熟悉AJAX的话你需要毫不犹豫回答以下问题: 1 不

[转]Silverlight 2 快报 和 Silverlight 3 初窥

[原文地址]Update on Silverlight 2 - and a glimpse of Silverlight 3 [原文发表日期] Sunday, November 16, 2008 11:01 PM 我们上个月发布了Silverlight 2. 在过去的4个星期里,Silverlight 2的最终版被下载和安装到了超过1亿台用户机器之上.最近还通过微软SMS和微软更新程序发布到了企业管理员手中,允许他们在企业内做自动部署. Internet上超过四分之一的计算机现在安装了某个版本的

交互设计师:初窥交互设计

加入CDC的这段日子里,工作中积累的小心得都密密麻麻的收在册子里.恰逢近期的校园招聘正如火如荼的展开着,借此机会,我把这一些不太成熟的小想法和大家分享一下.下图是CDC招聘交互设计师的工作描述,我将选择其中三点分析.   1.参与产品规划构思 刚开始的时候,我认为交互设计师的任务就是按照产品同事提交的需求绘制原型稿件,其间,我们去和产品同事讨论布局的合理性,操作的易用性,流程的通畅性. 其实不然.一个成功的产品需要团队里的产品经理,设计师,以及开发同事对产品的潜在特性和市场能力有统一的认识并一起

WPF入门之XAML初窥

Overview: 很早就想写些文章来总结一下自己学习一些新知识的经历,一来可以在日后查找,其到一个索引的作用:二来可以和爱好技术的朋友们共同交流,鉴于工作缘故始终无法抽身写.最近源于对WPF和Silverlight的浓厚兴趣和项目中要用的缘故,特此和大家分享一些学习WPF/Silverlight的过程.这个系列会简单回顾一些WPF中基本的概念和入门知识,以此来构成创建WPF程序(甚至于Silverlight程序,其在很大程度上有些依赖于WPF)的基础.本人不曾写过很多blog,再者WPF本身对

NetBeans 6 Web Services设计器初窥

请大家事先安装 NetBeans 6 M9 和 GlassFish V2 b49 或使用NetBeans 6 M9 自带的 SUN Java System Application Server 9 新建一个 Web 项目: File > New Project > Web Category > Web Application > WebApplication1 在新建的 WebApplication1 上点右键, 选择 New > Web Services - 建立 Hell