Servlet

来源:互联网 发布:nginx 目录重定向域名 编辑:程序博客网 时间:2024/06/04 18:31

------------------------------动态网页-----------------------------

什么是动态网页

如果浏览器在不同时刻或不同条件下访问web服务器上的某个页面,浏览器所获得的页面内容可以发生变化,那么这个页面就称之为动态网页

要想让浏览器访问某一个web页面时,能够查询出一些动态变化的实时信息,例如:某日某次列车的车票剩余状况,浏览器在不同时刻所得到的web页面的内容随着车票的剩余状况进行变化,这就必须采用动态网页来实现

 

浏览器只关心如何显示和处理web服务器所返回的内容,浏览器处理动态网页的方式与它处理静态网页的方式完全相同,并无差异

Web服务器发送的静态内容直接来自于文本或数据文件,而动态内容需要依靠一个程序来临时产生

 

动态网页与动态HTML页面的区别

动态网页是指web服务器端所创建的内容动态变化的网页

动态HTML页面是指使用客户端脚本程序所实现的具有动态视觉效果的网页

虽然动态HTML页面也可以在浏览器中显示出动态的动态效果,并能与用户进行交互,但是这种动态效果是与浏览器程序执行的结果,并不是网页源文件内容改变以后的结果

 

使用一个html页面,用javascript来输出时间,对比,

使用一个jsp页面,用new Date()方式来输出时间

通过用浏览器查看页面的源代码的不同,可以比较出来功能的差异

 

动态网页内容的创建过程

首先使用某种编程语言写出相应的动态网页程序

然后由一个专门的web服务器程序模块来解释执行该动态网页程序

 

动态网页程序需要有一个专门的web服务器程序模块来解释执行,专门解释执行某种动态网页程序的web服务器程序模块习惯上被称为引擎,譬如ASP引擎,Servlet引擎,JSP引擎等等

 

动态网页程序与引擎所提供的API进行信息交换,由引擎提供的API将浏览器的信息传递给动态网页程序,再由API将动态网页生成的结果回送给浏览器

 

客户端向web服务器请求的url资源路径,不仅可以指向服务器端的一个静态HTML文件,还可以指向服务器端的某种可被解释运行的程序文件

 

浏览器,引擎,API和动态网页程序之间的关系

浏览器---引擎---从引擎获取访问信息的API---动态网页程序---将结果返回给引擎的API---引擎---浏览器

 

 

 

 

----------------------------Servlet技术简介---------------------------

Servlet技术是Sun公司提供的一种实现动态网页的解决方案,它是基于Java编程语言的web服务器端编程技术

JSP是一种动态网页的开发技术,而Servlet技术是JSP技术的基础

 

一个Servlet程序就是一个实现了特殊接口的Java类,它由具有Servlet引擎的web服务器来调用和启动运行,一个Servlet程序负责处理它所对应的一个或一组URL地址的访问请求,并接受客户端发出的访问请求信息和产生响应内容

 

Servlet程序可以完成普通Java程序所能完成的大多数任务

 

Servlet基于web的功能

获取客户端通过HTMLform表单递交的数据和URL后面的参数信息

创建对客户端的响应消息内容

访问服务器端的文件系统

链接数据库并开发基于数据库的应用

调用其他的Java

 

B/S系统架构与C/S系统架构

企业信息管理软件系统的一个重要特点就是:要使用多台计算机作为操作终端,而系统的数据信息集中存放在网络上的数据库服务器中

在开发企业信息管理软件时,需要在两种系统架构之间进行选择,即C/S架构和B/S架构

 

C/S架构,Client/Server,客户机/服务器架构,是早期出现的一种分布式架构

缺点:

数据库系统支持的并发连接数有限,限制了同时运行的客户端程序的数目

业务逻辑处理和界面显示都由客户端程序负责处理,一旦业务逻辑或者显示界面要发生变化,则需要对整个客户端程序进行修改,不利于软件的维护和功能扩展

     每个客户机上都需要安装客户端程序,对于大一点的企业来说,如果客户端程序发生了修改,则需要系统管理人员到几百甚至上千台客户机上去重新安装客户端程序

优点:

客户端程序是计算机上的一个桌面程序,功能可以做的非常强大,若不连接数据库仍然可以独立运行,可以将事务记录保存在本地桌面数据库中后在集中向数据库服务器提交,易于对数据库中的数据进行实时监控和实现报警功能

 

B/S架构,Browser/Server,浏览器/服务器架构,它是随着Internet技术的兴起,对C/S架构的一种变化和改进,它将软件系统的用户操作界面以网页的形式在客户机的web浏览器中展现给用户

B/S架构将程序中的界面显示和业务逻辑处理都移动到了web服务器中来实现,其应用全部集中到了web服务器端,客户端只需要具有浏览器就可以作为B/S架构的操作终端,而不用安装和部署任何程序,用户操作及面是由web服务器创建的,当要修改系统提供的用户操作界面时,只需要在web服务器修改相应的网页文档,整个系统的更新部署不需要在客户机上进行操作和设置,客户端不直接与数据库建立连接,而是只有web服务器端的程序与数据库建立连接,所以数据库并发连接数量有限的问题也得到了解决

-----------------------------Servlet--------------------------------

Servlet API

ServletAPI(Servlet Application Programming Interface)SUN公司定义的一套专门用于开发Servlet程序的Java类和接口

 

Servlet程序就是一个在Web服务器端运行的调用了Servlet APIJava类,也可以说是是一个实现了javax.servlet.Servlet接口的java类,Servlet接口定义了Servlet容器与Servlet程序之间通信的协议约定

早期包装Servlet APIjar包被称为JSDK,即Java ServeltDevelopment Kit(Java Servlet开发工具包)

 

Javax.servlet.GenericServlet类实现了Servlet接口,它实现了Servlet程序的基本特征和功能,在GenericServlet类中,还提供了一个类专门用于HTTP协议。

javax.servlet.http.HttpServlet类是GenericServlet的子类,它在GenericServlet类的基础上进行了一些针对HTTP特点的补充

 

客户端每次访问一个支持HTTPServlet程序时,Servlet引擎都将调用Servletservice方法来进行处理。Service方法接受两个参数,一个是用于封装HTTP请求信息的对象,其类型为HttpServletRequest,另一个是代表HTTP响应消息的对象,其类型为HttpServletResponse

调用HttpServletResponse对象的getWritter方法可以获得一个文本输出流对象,向这个流对象中写入的数据将作为HTTP响应消息的实体内容部分发送给客户端

 

Servlet的注册与运行

1. Servlet程序必须通过Servlet引擎来启动运行,并且存储目录有特殊要求,通常需要存储在<WEB应用程序目录>/WEB-INF/classes/目录中

2. Servlet程序必须在web应用程序的web.xml文件中进行注册和映射其访问路径,才可以被Servlet引擎加载和被外界访问

3. 配置web.xml文件

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

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

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

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

<servlet-name>,用于指定Servlet的注册名称

<url-pattern>,用于指定Servlet的对外访问路径

3) 同一个Servlet可以被映射到多个URL上,即多个<servleet-mapping>元素的<servlet-name>子元素的设置值可以是同一个Servlet的注册名

4) Servlet映射到的URL中也可以使用*通配符,但是只能有两种固定的格式

一种格式是:*.扩展名,例如:*.do

另一种是:以正斜杠/开头、以/*结尾,例如:/action/*

 

缺省Servlet

1. 如果某个Servlet的缺省路径仅仅为一个正斜杠(/),那么这个Servlet就成为当前Web应用程序的缺省Servlet

2. 凡是在web.xml文件中找不到配置的<servlet-mapping>元素的url,他们的访问请求都将交给缺省Servlet处理,缺省Servlet用于处理所有其他Servlet都不处理的访问请求

3. <tomcat的安装目录>/conf/web.xml文件中,注册一个名称为org.apache.catalina.servlets.DefaultServletServlet,并将这个Servlet设置为了缺省Servlet

 

<servlet>

       <servlet-name>default</servlet-name> <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>

        <init-param>

           <param-name>debug</param-name>

            <param-value>0</param-value>

        </init-param>

        <init-param>

           <param-name>listings</param-name>

           <param-value>false</param-value>

        </init-param>

       <load-on-startup>1</load-on-startup>

</servlet>

4. 当访问Tomcat服务器中的某个静态HTML文件和图片时,实际上是在访问这个缺省Servlet

 

Servlet的编译和运行环境

Servlet运行环境就是Tomcat服务器程序所设置的环境

编译Servlet程序是由编程人员使用javac运行完成的

Servlet的编译环境是某个命令行窗口或者开发工具所设置的环境

 

编写Servlet程序自动编译工具

如果在没有IDE的情况下,编译Servlet源文件时主要有两个繁琐问题:

1)必须将包含有Servlet APIjar文件加入到CLASSPATH环境变量的路径列表中

2)编译生成的.class文件必须放置在web应用程序的WEB-INF/classes目录中,并且要有与包名对应的子目录结构

为了解决这个问题,需要使用批处理文件,例如、创建一个名为compile.bat的批处理文件

jetCLASSPATH=c:/tomcat-4.1.31/common/lib/servlet.jar;%CLASSPATH%

javac–d d:/myweb/WEB-INF/classes %1

pause

注:这里的javac命令中,

%1 表示传递给批处理文件一个参数,该参数就是servlet的路径名,或者有运行时可以将servlet的图标拖拽进批处理文件的图标中

–d d:/myweb/WEB-INF/classes 表示将执行后生成的.class字节码文件放入-d后的目录中

Servlet的特点

1. Servlet是一个供Servlet引擎调用的Java类,它不能独立运行,它的运行完全由Servlet引擎来控制和调度,它的运行过程就是它与Servlet引擎的交互过程,但它并不与web服务器和客户端进行任何直接的交互

2. Servlet引擎是一种容器程序,它负责管理和维护所有Servlet对象的生命周期。Servlet的加载,执行流程,以及如何接受客户端发送的数据和如何将数据传输到客户端等具体的底层事务,都是由Servlet引擎来实现的。Servlet引擎负责将客户端的请求信息转交给ServletServlet生成的响应信息返回给客户端

3. Servlet属于一种插件,它是一个提供了一些约定方法供容器去调用的类。它只负责在自身的方法中接受并处理容器传递进来的数据,以及生成并返回给容器去使用的数据和状态信息。

4. Servlet的最常见应用在于读取web浏览器传递给web服务器的参数和生成web服务器返回给web浏览器的动态网页文档内容。Servlet也能获取web浏览器发送的http请求信息中的各个请求头和请求行信息,以及生成用于web服务器发送的http响应消息中的状态行和响应头信息,Servlet还能获取web服务器和Servlet引擎自身的一些环境和状态信息

5. Servlet本身就是Java语言的一个应用,具有Java语言的所有优势,能完成普通Java程序所能完成的所有功能

6. Web服务器上可以布置多个功能各不相同的Servlet,每个Servlet都应宣称它可以处理何种样式的URL,当符合样式的URL请求到达时,Servlet引擎调用相应的Servlet进行处理

 

Servlet的运行过程

客户端浏览器发出指向ServletURL请求到—web服务器转发请求到—Servlet引擎

1. Servlet引擎检查是否已经装载并创建了该Servlet的实例对象。如果是,则执行第4)步,否则,执行第2)

2. 装载并创建该Servlet的一个实例对象

3. 调用Servlet实例对象的init()方法,进行初始化工作

4. 创建一个用于封装HTTP请求消息的HttpServletRequest对象和一个代表HTTP响应消息的HttpServletResponse对象,然后调用Servletservice()方法并将请求和响应对象作为参数传递进去

5. Web应用程序被停止或重新启动之前,Servlet引擎将调用Servletdestroy()方法来卸载Servlet,该方法将执行释放占用的资源等操作,被卸载的Servlet的实例对象就变成了垃圾,然后等待垃圾回收器将它从内存中彻底清除

 

Servlet的运行过程总结:

1. 浏览器访问web容器(这里的web容器包括了服务器和Servlet引擎)

2. web容器创建Servlet实例对象

3. web容器创建请求和响应对

4. web容器调用Servletservice方法,并将刚才创建的请求和响应对象传递给Servlet

5. Servlet程序从请求对象中读取请求信息,将响应信息写入响应对象当中

6. Servlet方法结束,程序返回到web容器

7. Web容器从响应对象中读取响应信息,将响应信息生成HTTP消息返回给浏览器

 

Servlet小知识点积累

1. <servlet>元素中嵌套一个<load-on-startup>子元素,web应用程序在启动时就可以装载并创建Servlet的实例对象、以及调用Servlet实例对象的init()方法

<servlet>

    <servlet-name>a</servlet-name>

<servlet-class>a</servlet-class>

<load-on-startup>2</load-on-startup>

</servlet>

2. Servlet的整个生命周期内,它的init方法只被调用一次,而对一个Servlet的每次访问请求都导致Servlet引擎调用一次Servletservice方法,并创建一个新的HttpServletRequest请求对象和一个新的HttpServletResponse响应对象,然后将这两个对象作为参数传递给它调用的Servletservice方法

3. Tomcat也提供了是否自动重新装载被修改的Servlet的配置选项。在<Tomcat安装目录>/conf/server.xml文件中,可以将<Context>元素的reloadable属性设置为true,这样,Tomcat将监视该web应用程序的/WEB-INF/classes/WEB-INF/lib目录下的类是否发生了改变,然后自动重新装载那些发生了改变的类

<Contextpath="/test" docBase="C:/test123" debug=”0” reloadable=”true”></Context>

 

ServletServlet容器与Servlet API的关系

虽然Servlet源程序中引用的是Servlet API,但Servlet运行时真正调用的对象是由Servlet容器中的实现类创建的,所以将Servlet APIjar包增加到CLASSPATH环境变量中,只能保证Servlet程序可以被成功编译,但不能让Servlet程序离开Servlet容器运行

 

Servlet的线程安全问题

1. Servlet引擎采用多线程模式运行,它为并发的每个访问请求都使用一个独立的线程来进行响应,但带来了线程安全的问题

2. 如果某个Servlet实现了SingleThreadModel接口,那么Servlet引擎将以单线程模式来调用其service方法,SingleThreadModel接口中没有定义任何方法,只要在Servlet类的定义中增加实现SingleThreadModel接口的声明即可

3. 对于实现了SingleThreadModel接口的ServletServlet引擎仍然支持对该Servlet的多线程并发访问,其采用的方式是产生多个Servlet实例对象,并发的每个线程分别调用一个独立的Servlet实例对象

4. 实现SingleThreadModel接口并不能真正解决Servlet的线程安全问题,因为Servlet引擎会创建多个Servlet实例对象。在Servlet API 2.4中,已经将SingleThreadModel标记为Deprecated(过时的)

 

ServletConfig接口

1. Servlet引擎将代表Servlet容器的对象和Servlet的配置参数信息一并封装到一个称为ServletConfig的对象中,并在初始化Servlet实例对象时传递给该ServletServletConfig接口用于定义ServletConfig对象需要对外提供的方法,以便在Servlet程序中可以调用这些方法来获取有关信息

2. Servlet引擎调用Servlet实例对象的init(ServletConfigconfig)方法将ServletConfig对象传递给Servlet. Servlet.getServletConfig()方法必须返回init(ServletConfigconfig)方法传递进来的ServletConfig对象的引用

3. 主体框架程序负责读取配置文件,也就是web.xml文件中的配置信息,然后根据配置信息生成ServletConfig对象,创建Servlet类的实例对象,调用Servlet实例对象的init方法,将ServletConfig对象传递给Servlet程序

4. GenericServlet类已经实现了getServletConfig接口,并实现了ServletConfig接口中的getServletConfig方法