web服务器作用:将本地资源共享给外部访问。
DNS解析:用户在浏览器输入域名,首先回去本地host文件(本地DNS解析),如果找不到再去运行商哪里进行DNS解析。
servlet是线程不安全的
Servlet的多线程并发问题
注意: servlet对象在tomcat服务器是单实例多线程的。
因为servlet是多线程的,所以当多个servlet的线程同时访问了servlet的共享数据,如成员变量,可能会引发线程安全问题。
解决办法:
1)把使用到共享数据的代码块进行同步(使用synchronized关键字进行同步)
2)建议在servlet类中尽量不要使用成员变量。如果确实要使用成员,必须同步。而且尽量缩小同步代码块的范围。(哪里使用到了成员变量,就同步哪里!!),以避免因为同步而导致并发效率降低。
Servlet学习:
HttpServletRequest 请求对象:获取请求信息
HttpServletResponse响应对象:设置响应对象
ServletConfig对象 servlet配置对象
ServletContext对象;servlet的上下文对象
servlet生命周期
得到用户请求地址,解析web.xml中对应的地址,通过地址的到对应的servlet类地址,通过反射实例化该servlet,创建完servlet对象后会调用intit()方法,然后进去service(),service()用来判断用户的请求类型,并执行请求类型对应的方法(doGet()、doPost()....),销毁servlet对象时调用destory(),一般是停止服务器或者重新部署服务器的时候销毁servlet对象。只调用一次。
servlet类是单例的,所以只实例化一次。
Servlet重要的四个生命周期方法
构造方法: 创建servlet对象的时候调用。默认情况下,第一次访问servlet的时候创建servlet对象只调用1次。证明servlet对象在tomcat是单实例的。
init方法: 创建完servlet对象的时候调用。只调用1次。
service方法: 每次发出请求时调用。调用n次。
destroy方法: 销毁servlet对象的时候调用。停止服务器或者重新部署web应用时销毁servlet对象。只调用1次。
伪代码演示servlet的生命周期
Tomtcat内部代码运行:
1)通过映射找到到servlet-class的内容,字符串:com.itmayiedu.a_servlet.FirstServlet
2)通过反射构造FirstServlet对象
2.1得到字节码对象
Classclazz = class.forName("com.itmayiedu.a_servlet.FirstServlet");
2.2调用无参数的构造方法来构造对象
Objectobj = clazz.newInstance(); ---1.servlet的构造方法被调用
3)创建ServletConfig对象,通过反射调用init方法
3.1得到方法对象
Methodm = clazz.getDeclareMethod("init",ServletConfig.class);
3.2调用方法
m.invoke(obj,config); --2.servlet的init方法被调用
4)创建request,response对象,通过反射调用service方法
4.1得到方法对象
Methodmm=clazz.getDeclareMethod("service",HttpServletRequest.class,HttpServletResponse.class);
4.2调用方法
m.invoke(obj,request,response); --3.servlet的service方法被调用
5)当tomcat服务器停止或web应用重新部署,通过反射调用destroy方法
5.1得到方法对象
Methodm = clazz.getDeclareMethod("destroy",null);
5.2调用方法
m.invoke(obj,null); --4.servlet的destroy方法被调用