servlet生命周期
1.init(ServletConfig) 初始化方法,一生执行一次,在执行service之前执行,如果配置优先级load-start-up为1,那么会随着服务器的启动而初始化
2.service(HttpRequest,HttpResponse) 执行方法,访问一次执行一次
3.Destory()用于释放资源,在服务器正常关闭时执行,一生执行一次
servlet线程安全问题
Servlet是单例多线程的,线程不安全,所以当多用户访问时,会引发并发问题
解决线程安全问题方式有三种:
1.实现singleThreadModel接口
2.用synchronized对共享数据上锁
3.避免使用实例变量,都改为局部变量实现功能,因为局部变量随着方法消失而消失
servlet接口相关类型:
1.GenericServlet实现类(抽象类),没有实现service方法,与协议无关
在初始化方法中会调用“没有参数”的初始化init()
结论:servlet实现类中,如果要完成初始化功能,建议不要复写init(ServletConfig)方法,而是复写init()方法
原因:如果子类复写init(ServletConfig),父类的方法就不执行
父类中this.config没有赋值,之后再使用getServletconfig不能获得数据,将抛空指针(但是可以解决:复写init(ServletConfig)第一行代码super.init(config)手动执行父类方法)
2.HttpServlet实现类:HttpServlet与Http协议有关的实现
1).先执行,在service(ServletRequest,ServletResponse)方法中进行强转,并调用service(Http...)
2).service内部根据请求方式执行对应方法
用String method = req.getMethod() 获取请求方式
if(method.equals(METHOD_POST)){
doPost(req,resp);//如果是post,调用doPost();
}
Request和Response用途:
Request处理请求 携带客户端访问服务器所有的信息
Response响应 服务器返回客户端的信息
ServletContext对象的功能:
ServletContext是上下文对象,是servlet管理者
(1)web项目内部共享数据 例如共享getAttribute() 设置 移除
(2)管理资源getRealpath(path) 获取tomcat下真实路径,有盘符;
getResourceAsStream() 获取流
(3)获取系统初始化参数getinitParameter()
ServletConfig对象 用于servlet存放web.xml中的配置信息
编码以及路径问题
servlet路径<url-pattern>
(1)完全匹配路径: 必须/开头
例如:/hello /a/b/c/hello
访问路径和web.xml配置路径一致,servlet将被调用
(2)不完全匹配(通配符匹配)/开头,以*结尾
例如:/* 、 /a/b/*
/a/b/* a目录下的b目录下的所有内容
/* 当前项目下所有内容
(3)扩展名匹配 *开头
例如:*.do 、 *.action 、*.jsp
只处理某一类文件
(4)缺省路径 /
以上都没有匹配,将执行缺省
优先级:1>2>3>4
1.init(ServletConfig) 初始化方法,一生执行一次,在执行service之前执行,如果配置优先级load-start-up为1,那么会随着服务器的启动而初始化
2.service(HttpRequest,HttpResponse) 执行方法,访问一次执行一次
3.Destory()用于释放资源,在服务器正常关闭时执行,一生执行一次
servlet线程安全问题
Servlet是单例多线程的,线程不安全,所以当多用户访问时,会引发并发问题
解决线程安全问题方式有三种:
1.实现singleThreadModel接口
2.用synchronized对共享数据上锁
3.避免使用实例变量,都改为局部变量实现功能,因为局部变量随着方法消失而消失
servlet接口相关类型:
1.GenericServlet实现类(抽象类),没有实现service方法,与协议无关
在初始化方法中会调用“没有参数”的初始化init()
结论:servlet实现类中,如果要完成初始化功能,建议不要复写init(ServletConfig)方法,而是复写init()方法
原因:如果子类复写init(ServletConfig),父类的方法就不执行
父类中this.config没有赋值,之后再使用getServletconfig不能获得数据,将抛空指针(但是可以解决:复写init(ServletConfig)第一行代码super.init(config)手动执行父类方法)
2.HttpServlet实现类:HttpServlet与Http协议有关的实现
1).先执行,在service(ServletRequest,ServletResponse)方法中进行强转,并调用service(Http...)
2).service内部根据请求方式执行对应方法
用String method = req.getMethod() 获取请求方式
if(method.equals(METHOD_POST)){
doPost(req,resp);//如果是post,调用doPost();
}
Request和Response用途:
Request处理请求 携带客户端访问服务器所有的信息
Response响应 服务器返回客户端的信息
ServletContext对象的功能:
ServletContext是上下文对象,是servlet管理者
(1)web项目内部共享数据 例如共享getAttribute() 设置 移除
(2)管理资源getRealpath(path) 获取tomcat下真实路径,有盘符;
getResourceAsStream() 获取流
(3)获取系统初始化参数getinitParameter()
ServletConfig对象 用于servlet存放web.xml中的配置信息
编码以及路径问题
servlet路径<url-pattern>
(1)完全匹配路径: 必须/开头
例如:/hello /a/b/c/hello
访问路径和web.xml配置路径一致,servlet将被调用
(2)不完全匹配(通配符匹配)/开头,以*结尾
例如:/* 、 /a/b/*
/a/b/* a目录下的b目录下的所有内容
/* 当前项目下所有内容
(3)扩展名匹配 *开头
例如:*.do 、 *.action 、*.jsp
只处理某一类文件
(4)缺省路径 /
以上都没有匹配,将执行缺省
优先级:1>2>3>4