Servlet现在自己的理解是一个控制器,简单的可以理解为不同的JSP页面由用户发送过来的请求可以由Servlet控制器来控制其向下调用的方向(结合三层好理解),但它比较特殊,因为它通常会从外界接收数据,然后对数据进行处理,完了之后会跳到JSP页面去。其实说白了揉碎了,它就是一段处理数据和逻辑的JAVA代码。

官方解释:

       Servlet(Server Applet),全称Java Servlet。是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。



       Servlet运行于支持Java的应用服务器中。从实现上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。



Servlet和CGI

在更深入的理解Servlet概念之前,先来看看CGI,有助于理解Servlet,CGI(Common Gateway Interface),通用网关接口。

通用网关接口是一种根据请求信息动态产生回应内容的技术。通过CGI,Web服务器可以将根据不同的请求启动不同的外部程序,并将请求内容转发给该程序,在程序执行结束后,将执行结果作为回应返回给客户端。也就是说,对于每个请求,都要产生一个新的进程进行处理。因为每个进程都会占有很多服务器的资源和时间,这就导致服务器无法同时处理很多的并发请求。另外CGI程序都是与操作系统平台相关的,虽然在互联网爆发的初期,CGI为开发互联网应用做出了很大的贡献,但是随着技术的发展,开始逐渐衰落。

后来随着Web应用复杂度的提升,并要求提供更高的并发处理能力,Servlet在Java平台上得到实现,现在提起Servlet,指的都是Java Servlet。JavaServlet要求必须运行在Web服务器当中,与Web服务器之间属于分工和互补关系。确切的说,在实际运行的时候JavaServlet与Web服务器会融为一体,如同一个程序一样运行在同一个Java虚拟机(JVM)当中。

与CGI不同的是,Servlet对每个请求都是单独启动一个线程,而不是进程。这种处理方式大幅度地降低了系统里的进程数量,提高了系统的并发处理能力。另外因为JavaServlet是运行在虚拟机之上的,也就解决了跨平台问题。如果没有Servlet的出现,也就没有互联网的今天。

Servlet的执行过程?

首先,客户端发送请求到服务器端;

其次,服务器端根据web.xml文件中的Servlet相关配置信息,将客户端请求转发到相应的Servlet;

之后,Servlet会根据request对象中封装的用户请求与数据库进行交互,返回数据之后,Servlet会将返回的数据封装到response对象中;

此时,控制权从Servlet重新回到服务器端,最后,服务器端将响应信息返回给客户端,并且跳转到相应的页面。

Servlet的生命周期?

1)  加载和实例化;在第一次请求Servlet时,Servlet容器将会创建Servlet实例;

2)  初始化;Servlet容器加载完成Servlet之后,必须进行初始化,此时,init方法将被调用;

3)  Servlet初始化之后,就处于响应请求的就绪状态,此时如有客户端请求发送,就会调用Servlet实例的service方法,并且根据用户的请求方式,调用doPost或者doGet方法;

4)  最后,Servlet容器负责将Servlet实例进行销毁,调用destroy方法实现;

优点

Servlet同时处理多个请求?

Servlet采用多线程来处理多个请求的同时访问。Servlet容器通过线程池来管理维护服务请求。所谓线程池,相当于数据库连接池,实际上是等待执行代码的一组线程,叫做工作者线程。Servlet容器通过一个调度线程来管理工作者线程。

· 当容器收到一个Servlet的访问请求,调度者线程就从线程池中选出一个工作者线程,将用户请求传递给该线程,然后由该线程处理Servlet的service()方法;

· 当这个线程在执行的时候,容器收到一个新的请求,调度者线程再次从线程池中选出一个新的工作者线程;

· 当容器同时收到对同一个Servlet的多个请求时,那么Servlet的service方法将在多线程中并发执行。

注:1.Servlet容器默认采用单实例多线程的方式来处理请求。这样减少了产生Sevlet实例的开销,提升了对请求的响应时间;

2.对于Tomcat容器来讲,可以在其server.xml中通过<Connector>中设置线程池中的线程数目。

如何开发线程安全的Servlet?

Servlet容器采用多线程来处理请求,提高性能的同时也造成了线程安全问题。要开发线程安全的Servlet应该从一下几个方面进行:

1.  变量的线程安全; 多线程并不共享局部变量,所以我们要尽可能的在Servlet中使用局部变量;

2.  代码块的线程安全;使用同步块Synchronized,防止可能调用的代码块;但是要注意的是,要尽可能得缩小同步代码的方范围,不要在service方法和响应方法上直接使用同步,这会严重影响性能。

3. 属性的线程安全; ServletContext,HttpSession,ServletRequest对象中属性;

4.  使用同步集合; 使用Vector代替ArrayList,使用HashTable代替HashMap;

5.  不要在Servlet中创建自己的线程来完成某个功能;Servlet本身就是多线程的,如果再创建新的线程,将会导致线程执行复杂化,出现线程安全问题;

6.  在多个Servlet中,对外部对象,比如:文件;进行修改操作一定要加锁,做到互斥访问;

弊端

在Servlet出现之后,随着使用范围的扩大,人们发现了它的一个很大的一个弊端。那就是为了能够输出HTML格式内容,需要编写大量重复代码,造成不必要的重复劳动。为了解决这个问题,基于Servlet技术产JavaServetPages技术,也就是JSP

实例解析

1	// ==================== Program Description ==========================
2 // 程序名称:经典的Hello World程序 ---李社河
3 // 程序目的:编写最简单的Servlet程序,熟悉其过程
4 // ==============================================================
5 package examples.servlets;
6 import javax.servlet.*;
7 import javax.servlet.http.*;
8 import java.io.*;
9 public class HelloWorldServlet extends HttpServlet {
10
11 public void service(HttpServletRequest req,
HttpServletResponse res) throws IOException
12 {
13 res.setContentType("text/html");
14 PrintWriter out = res.getWriter();
15 out.println("<html><head><title>Hello World!</title></head>");
16 out.println("<body>");
17 out.println("<p><img src=images/build_bea_web.gif align=right>");
18 out.println("<h1>Hello World!</h1></body></html>");
19 }
20 }

配置文件的一部分代码:

<servlet>
<servlet-name>HelloWorldServlet</servlet-name>
<servlet-class>examples.servlets.HelloWorldServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloWorldServlet</servlet-name>
<url-pattern>/HelloWorldServlet/*</url-pattern>
</servlet-mapping>

运行结果

总结:Servlet和JSP

有许多相似之处,都可以生成动态网页。

Servlet和JSP两者分工协作,Servlet是纯Java语言,侧重于解决运算和业务逻辑问题,缺点是生成动态网页不直观,JSP则侧重于解决展示问题,擅长于网页制作,生成动态页面比较直观,缺点是不容易跟踪与排错。。Servlet与JSP一起为Web应用开发带来了巨大的贡献,后来出现的众多Java Web应用开发框架都是基于这两种技术的,更确切的说,都是基于Servlet技术的。

接下来给大家一起学习JSP,敬请期待!

J2EE学习从菜鸟变大鸟之七 Servlet的更多相关文章

  1. J2EE学习从菜鸟变大鸟之九 深入浅出理解 Servlet-----实例解析

    关于Servlet的基础内容在前面已经和大家分享过了,参考J2EE学习从菜鸟变大鸟之七 Servlet,现在结合到DRP中学习,深刻的体会Servlet起到了枢纽中转的作用,控制逻辑(到MVC中更像是 ...

  2. J2EE学习从菜鸟变大鸟之六 EJB(Enterprise JavaBean)企业级Java组件

    EJB (EnterpriseJavaBean)是J2EE的一部分,定义了一个用于开发基于组件的企业多重应用程序的标准.其特点包括网络服务支持和核心开发工具(SDK).其称为Java 企业Bean,是 ...

  3. J2EE学习从菜鸟变大鸟之八 企业级项目开发的思考

    什么是企业级项目开发 "企业级项目".企业级项目开发,Java也是企业级项目开发,这个我们到处说.听,每天被我们挂在嘴边,可是到底什么项目才算是"企业级"?自己 ...

  4. J2EE学习从菜鸟变大鸟之四 JNDI(Java Naming and Directory Interface)

    掌握 J2EE 是件不是很轻松的事哈,但是很有意思,抽象抽象哈哈,因为它包含的技术和缩略语在不断地增长.Java 命名和目录接口(Java Naming and Directory Interface ...

  5. J2EE学习从菜鸟变大鸟之五 JDBC(Java Data Base Connectivity)

    JDBC刚开始学习这个的时候看到了,以为是ODBC呢,很是相似啊,总的来说还是基本上一类的东东,但是还有一些细微的区别,下面和大家一起分享学习. JDBC(Java Data Base Connect ...

  6. Java学习从菜鸟变大鸟之一 hashCode()和equals()的本质区别和联系

    在学习java,根据视频做实例的过程中,对equals和hashcode两个方法理解稍微深刻一点,主要是它们两个很容易混淆,容易出错,自己又通过网上的资料学习,和大家分享 equals()方法 equ ...

  7. Java学习从菜鸟变大鸟之三 多线程中Thread 和Runnable的区别与运用

    多线程机制是java中的一个特点,掌握它对后面的知识的理解至关重要,是java工程师的必备知识,多线程指在单个程序中可以运行多个不同的线程执行的不同的任务,线程是一个程序内部的顺序控制流.进程是静态的 ...

  8. Java学习从菜鸟变大鸟之二 输入输出流(IO)

    在软件开发中,数据流和数据库操作占据了一个很重要的位置,所以,熟悉操作数据流和数据库,对于每一个开发者来说都是很重要的,今天就来总结一下JavaI/O. 流 流是一个很形象的概念,当程序需要读取数据的 ...

  9. 3、J2EE学习推荐书籍

    3.J2EE学习推荐书籍       J2EE的学习应该循序渐进,一本好书会很快上手和深入.在学习J2EE之前,应该学好SQL,基本上,程序设计都会跟数据库打交道.如果SQL没学好,就如同房子没有基脚 ...

随机推荐

  1. VC++6.0的使用方法

    VC++6.0的最基本使用方法,创建一个c++项目工程可参考:https://jingyan.baidu.com/article/8ebacdf0cbdb5749f75cd54a.html 这里面的操 ...

  2. 异步 JavaScript 之 macrotask、microtask

    1.异步任务运行机制 先运行下面的一段代码: console.log('script start'); setTimeout(function() { console.log('setTimeout' ...

  3. 【博弈】【HDU】取石子游戏

    取石子游戏 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  4. jQuery 学习笔记一

  5. 深度解读GoogleNet之Inception V1

    GoogleNet设计的目的 GoogleNet设计的初衷是为了提高在网络里面的计算资源的利用率. Motivation 网络越大,意味着网络的参数较多,尤其当数据集很小的时候,网络更容易发生过拟合. ...

  6. [Gradle系列]Gradle打包apk多版本,多渠道,多环境,多功能,多模块随心所欲

    Tamic: http://blog.csdn.net/sk719887916/article/details/53411771 开始 上篇Gradle发布Module(Maven)到jcenter, ...

  7. Web Worker Best Practices

    使用Web Worker可以把一些比较计算量相对大的阻塞浏览器响应的计算放在单独的线程里计算. 请求优化 构造Worker的时候需要给定js的链接URL,worker内部请求js运行代码.假如work ...

  8. 好用的SQLAlchemy

    准备 安装SQLAlchemy框架 测试代码 知识点剖析 引入库支持 基类和引擎 实体类 声明类 数据库自动完成 CRUD 总结 这里简单的记录一下本人第一次使用SQLAlchemy这个ORM框架的过 ...

  9. Dynamics CRM2016 Web API之更新记录

    本篇继续探索web api,介绍如何通过web api更新记录. 下面是一段简单的更新代码,更新了几个不同类型的字段,entity的赋值和前篇创建时候的一样的. var entity = {}; en ...

  10. FORM开发之说明性弹性域开发

    1.注册使用弹性域的表,字段 注册表语法:ad_dd.register_table('所有者','表名','T自动扩展/S非自动扩展','下一区','自由','已使用') AD_DD.REGISTER ...