servlet课堂笔记

引用


1、servlet的生命周期与核心类及接口
(1)核心类与接口
A.Servlet接口
init(ServletConfig);
service(ServletRequest,ServletResponse);
destroy();
B. GenericServlet抽象类
对Servlet接口作了部分实现。主要是实现了
init()方法。
C. HttpServlet
继承了GenericServlet,对http协议作了封装。
实现了service()方法:
service(HttpServletRequest,HttpServletResponse) ;
doGet(HttpServletRequest,HttpServletResponse) ;
doPost(HttpServletRequest,HttpServletResponse) ;
service()方法,其默认的实现是:依据请求是
get还是post方式,来调用doGet()与doPost()方法。
(2)servlet的生命周期
含义:
所谓生命周期,指的是,servlet容器如何去
管理servlet对象的创建、调用、销毁以及其资源
的获取与释放。
因为开发人员不能够直接调用servlet,也就是说,
servlet对象的创建及销毁等管理工作全部由servlet
容器来负责。如果开发人员想干涉容器对servlet
的管理工作,就需要对Servlet接口中的几个方法进行回调。


过程:
实例化 --》初始化--》就绪与调用--》资源释放--》销毁

实例化:
第一种情况:当服务器启动时,会对配置有
load-on-startup参数的servlet进行实例化。
第二种情况:当请求到达服务器,并且该请求
要访问的servlet没有实例化。
实例化就是调用servlet公开的不带参的构造器。

初始化:
就是容器会调用servlet的init(ServletConfig)
方法。
具体细节是:容器先会构造一个ServletConfig
对象(该对象可以方便地访问servlet初始化配置
参数等)。然后,再将该对象传给servlet实例。
初始化的目的:一般用于获取资源。比如
,加载资源文件。
初始化方法只会执行一次。
如何override init()方法?

A.如果override init(ServletConfig config)

super(config);

....初始化代码

B.也可以 override init(); //更好

....初始化代码

就绪与调用:

经过实例化与初始化,servlet就可以接受调用。

在默认情况下,多个请求会共享同一个servlet

实例。

也就是说:在同一个服务器里,某个

servlet,只有唯一一个实例。

while(true){

Socket s = ServerSocket.accept();

new WorkThread(s).start();

}



WorkThread extends Thread{

Socket s;

Servlet servlet;

public void run(){

servlet.service();

}

}



每当一个请求到达服务器,会启动一个线程来

处理请求。而多个线程有可能会共享同一个实例(

比如多个请求访问的是同一个servlet)。

资源释放与销毁:

容器会依据自己的算法决定是否销毁某个

servlet实例,在销毁之前,会调用destroy()。

用于释放在初始化方法中获得的资源。

(3)线程安全问题

A.原因:

多个线程可能会共享同一个servlet实例

如果多个线程对servlet实例进行写操作。

B.解决方式:

方式一:使用synchronized

方式二:不建议使用

让servlet实现SingleThreadModel(标识接口,

里面没有任何方法)

此时,每一个线程都会使用一个自己的servlet实例。

方式三:在servlet类当中,尽量不要对

属性进行写操作。



练习:

计价

产品的最终价格(totalPrice) =

产品的原始价格(price) * (1 + 税率(taxRate));



写一个PricingServlet,在初始化方法中,加载

一个配置文件 tax.properties。

tax.properties:

beijing=0.08

....



也就是说,税率是多少,要依据城市名查找

配置文件。



2、url-pattern:

servlet容器如何去分析请求路径。

比如 http://ip:port/appName/abc

step1: 除掉应用名之前的字符串。

得到/abc.html

step2: 去web.xml中,查找url-pattern,

进行匹配:

首先,做精确匹配:即step1中获得的字符串

必须与url-pattern中定义的字符串完全一致。

如果匹配不上,模糊匹配:使用通配符。

例如:

/* :表示/下任意的字符串。

/abc/*:

后缀方式的匹配:

例如:

*.do:匹配任意以.do结尾的字符串。

*.action:

最后,如果仍然匹配不上,会查找静态资源

,如果找到,则返回,找不到,则404

3、一个servlet处理多个请求。





























你可能感兴趣的:(应用服务器,算法,servlet,socket,配置管理)