Sevelet基础

一、Servlet程序的编写

Servlet就是实现了javax.servlet.Servlet接口java类, Servlet接口定义了Servlet引擎与Servlet程序之间通信的协议约定。由于GenericServlet、HttpServlet类实现了Servlet接口,所以通常情况下编写Servlet是都继承用于处理Http请求的HttpServlet类。

 

二、Servlet的注册与运行

       Servlet程序必须通过Servlet引擎启动运行,并且储存目录有特殊的要求,通常需要存储在\WEB-INF\classes\目录中。

 

1、注册

       Servlet程序必须在WEB应用程序的web.xml文件中进行注册和映射其访问路径,才可以被Servlet引擎加载和被外界访问。具体注册方式为:在web.xml文件中添加标签。

 

实例:

       ......

      

              AnyName                  //Servlet别名

              HelloServlet                //Servlet文件的完整路径

      

       ......

      

              AnyName                  //Servlet别名

              /demo/hello.html               //映射地址

      

       ......

注意:

(1)同一个Servlet可以被映射到多个URL上,即多个元素的子元素的设置值可以是同一个Servlet的注册名。

(2)在Servlet映射到的URL中也可以使用*通配符,但是只能有两种固定的格式:一种格式是“*.扩展名”,另一种格式是以正斜杠(/)开头并以“/*”结尾。

 

对于如下的一些映射关系:

l  /abc/*  映射到 Servlet1

l  /*      映射到 Servlet2

l  /abc    映射到 Servlet3

l  *.do    映射到 Servlet4

将发生如下一些行为:

l  当请求URL为“/abc/a.html”,“/abc/*”和“/*”都可以匹配这个URL,

       Servlet引擎将调用Servlet1。

l  当请求URL为“/abc”时,“/abc/*”和“/abc” 都可以匹配这个URL,

       Servlet引擎将调用Servlet3。

l  当请求URL为“/abc/a.do”时,“/abc/*”和“*.do”都可以匹配这个URL,

       Servlet引擎将调用Servlet1

l  当请求URL为“/a.do”时,“/*”和“*.do”都可以匹配这个URL,

       Servlet引擎将调用Servlet2。

l  当请求URL为“/xxx/yyy/a.do”时,“/*”和“*.do”都可以匹配这个URL,

       Servlet引擎将调用Servlet2。

特别提醒:1. 映射URL不能设置为“/action/*.xx”

 

(3)缺省的Servlet

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

 

凡是在web.xml文件中找不到匹配的元素的URL,它们的访问请求都将交给缺省Servlet处理,也就是说,缺省Servlet用于处理所有其他Servlet都不处理的访问请求。

 

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

 

三、    Servlet的特点

1、Servlet是一个供其他Java程序(Servlet引擎)调用的Java类,它不能独立运行,它的运行完全由Servlet引擎来控制和调度。

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

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

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

5、Servlet程序的运行过程就是它与Servlet引擎的交互过程,Servlet程序只与Servlet引擎打交道,它并不与Web服务器和客户端进行任何直接的交互。 

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

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

 

四、    Servlet的运行过程

1、 Servlet引擎检查是否已经装载并创建了该Servlet的实例对象。如果是,则直接执行第④步,否则,执行第②步。

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

3、  调用Servlet实例对象的init()方法。

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

5、  WEB应用程序被停止或重新启动之前,Servlet引擎将卸载Servlet,并在卸载之前调用Servlet的destroy()方法。

 

 

五、    Servlet如何处理请求

Servlet被初始化后,就处于能响应请求的就绪状态,每个Servlet都有一个请求的Servlet Request对象和响应的ServletResponse对象。

 

六、    请求重定向和请求分派

1、重定向

a)        HttpServletRequest接口提供的sendRedirect()方法用于生成302响应码和Location响应头,从而通知客户端去重新访问Location响应头中指定的URL,其完整的定义语法如下:

                        (1)             public void sendRedirect(Stringlocation) throws IOException;

b)       其中的location参数指定了重定向的URL,它可以使用绝对URL和相对URL,Servlet容器会自动将相对URL转换成绝对URL后,再生成location头字段。

 

示例:重定向的应用--客户端发出URL为“http://localhost:8080/jsp_04_servlet/servlet1?name=test”的请求,服务器用“Servlet1”来处理这个请求,在处理方法中通过sendRedirect重定向到第二个Servlet,即“Servlet2”上。

 

 

2、请求分派

a)  Servlet API中定义了一个RequestDispatcher接口,俗称请求分派器。它定义了如下两个方法:

                                                    (1)           public voidforward(ServletRequest request, ServletResponse response)

throws ServletException,IOException;

                                                    (2)           public voidinclude(ServletRequest request, ServletResponse response)

throws ServletException,IOException;

 

 

 

3、重定向和请求分派的比较
HttpServletResponse的sendRedirect()方法实现的重定向和RequestDispatcher的forward()方法实现的请求转发的比较:

a)  请求分派只能将请求转发给同一个Web应用中的其他组件;而重定向不仅可以定向到当前应用程序中的其他资源,也可以重定向到其他站点的资源上。

b)  重定向的访问过程结束后,浏览器地址栏中显示的URL会发生改变,由初始的URL地址变成重定向的目标URL;而请求转发过程结束后,浏览器地址栏保持初始的URL地址不变。

c)  请求分派的发起者和被调用者之间共享相同的request实例和response实例,它们属于同一个“请求/响应”过程;而重定向的发起者和被调用者使用各自的request实例和response实例,它们各自属于独立的“请求/响应”过程。

 

 

你可能感兴趣的:(Sevelet基础)