Servlet 开发

Servlet的生命周期
Servlet对象在用户第一次访问时创建,此时init方法被调用,完成对象初始化。(Servlet对象创建后,后面所有对该Servlet资源的访问,服务器都是调用同一个Servlet对象)
Servlet对象被摧毁时后destory方法会被调用(Servlet对象在应用服务器关闭时或者该web应用在服务器中被删除的时候摧毁)

Servlet调用过程
1.客户端首先确认本机系统是否知道请求访问的主机
2.若host文件中没有查询到该主机,发送请求到dns服务器获得主机名对应的ip
3.用ip地址连上服务器
4.发送http请求
5.服务器从请求中获取客户端想访问的主机名,该主机的哪个web应用,该web应用的哪个web资源
6.第一次访问时创建Servlet对象,调用Servlet对象的init方法完成Servlet对象的初始化
7.服务器创建代表请求的request和代表响应的response对象,作为参数调用Servlet的service方法响应客户端的请求,
向代表客户端响应的response对象中写入向客户端传输的数据
8:Service方法执行完,response对象中已有数据,服务器从response对象中取出数据构建HTTP响应回写给客户端
9.浏览器接收到http响应,解析出资源数据

Servlet调用的一些小细节
1:Servlet是一个供其他Java程序(Servlet引擎)调用的Java类,它不能独立运行,它的运行完全由Servlet引擎来控制和调度。
2:在整个Servlet的生命周期内,init方法只会被调用一次,而对Servlet的每次访问请求都导致Servlet引擎调用一次Servlet的service()方法,对于每次访问请求,Servlet引擎都会创建一个新的HttpServletRequest请求对象和HttpServletresponse响应对象,然后将这两个对象作为参数传给它调用的Servlet的service()方法,service()方法再根据请求方式调用doXXX方法。
3:load-on-startup 标签使servlet对象当服务器启动时即创建,其中的内容数字越小,优先级越高。
4:更改WEB应用的web.xml文件不需要重启服务器,因为在全局的context.xml文件中配置了WEB应用的web.xml文件由服务器监控,如有更改自动更新。
5:缺省servlet映射为/,凡是在web.xml文件中找不到匹配的servlet-mapping元素的url,它的访问请求都交给缺省servlet处理。
6:客户端不管是访问服务器某一个WEB应用的静态资源或者是动态资源,服务器都会通过web.xml寻找映射到该请求地址的Servlet,如果服务器找不到相匹配的Servlet,则会去找缺省的Servlet,这个缺省的Servlet会去WEB-INF目录下找有没有请求对应的静态资源,如果找不到,服务器回送404错误。这个缺省的Servlet在web.xml配置为default,且用load-on-startup标签设置为服务器启动时即创建,并且具备最高创建优先级。(前后端分离的项目中,应用服务器不接收静态资源请求)
在这里插入图片描述
在这里插入图片描述

Servlet的线程安全问题
当有多个客户端同时访问同一个web资源时,可能会引起线程安全问题。如果一个Servlet实现了SingleThreadModel接口,Servlet引擎将为每个新的请求创建一个单独的Servlet实例,这将引起大量的系统开销。SingleThreadModel在Servlet2.4中已不再提倡使用。同样,如果在程序中使用synchronized来保护共享的数据,也会使系统的性能大大下降,因为被同步的代码块在同一时刻只能有一个线程执行它,使得其同时处理客户请求的吞吐量降低,导致很多请求处于阻塞状态。另外为保证主存内容和线程的工作内存中的数据的一致性,要频繁地刷新缓存,这也会大大地影响系统的性能。所以在实际的开发中也应避免或最小化 Servlet 中的同步代码。在Servlet中避免使用实例变量是保证Servlet线程安全的最佳选择。从Java 内存模型也可以知道,方法中的局部变量是在栈上分配空间,而且每个线程都有自己私有的栈空间,所以它们不会影响线程的安全。
  Servlet的线程安全问题只有在大量的并发访问时才会显现出来,并且很难发现,因此在编写Servlet程序时要特别注意。如果应用程序设计无法避免使用实例变量,那应使用synchronized来保护要使用的实例变量,但为保证系统的最佳性能,应该同步可用性最小的代码路径。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值