Servlet何时被实例化?何时又被销毁?

 ·加载: 默认情况下,如果没有在web.xml中配置自动装入(load-on-startup),那么当客户端第一次请求Servlet时,web服务器      

            才对Servlet类加载到内存并进行实例化,如果配置了自动装入,那么在tomcat启动时就进行加载实例化。(一个周期内  

            只实例化一次,即服务器里只有一个该Servlet类的实例化对象

 ·初始化:Servlet被实例化后接着就会调用从父类继承来的初始化方法init()对Servlet类进行初始化。(初始化一次

 ·服务:初始化之后就是等待被调用    service()方法(能够多次被调用

         |-为什么调用的是service方法,那写doGet doPost有啥用

               可以这么认为:service方法会自动区分调用哪个doXxx方法。所以一般不会覆写service

               方法。 (覆写了没有自己实现区分调用哪个doXxx方法的话,那些doGet这些就没用了

         |-服务器里只有一个对象,那么怎么解决多个请求?排队等待?

               Servlet中采用的是多线程的处理方式,在tomcat内部有一个线程池,提前准备了若干线程,每一个请求分配一个线

               程来处理,但注意每个线程访问的是同一个Servlet对象。

 ·销毁:销毁正常也只有一次,web服务器关闭时会调用destroy()方法自动销毁,如果长时间不使用也会被自动销毁。



为什么修改了Servlet,编译并覆盖了硬盘上的class文件,但是访问还是原来那个?

Tomcat启动后在加载阶段Servlet类加载到内存中,当这个Servlet没有被销毁时一直存在内存的,以后的请求都直接从内存中取得,所以修改完Servlet后,单单覆盖硬盘上的类是不行的,要么重启服务器,要么修改web.xml(如果tomcat发现某一个工程的web.xml有改变,tomcat会将这个工程所有东西重新部署)



Servlet里取得其他常用对象及使用


1.request和 response 在doGet doPost方法中已经自动传进来了,直接使用

|- request response的编码设置

request.setCharacterEncoding("UTF-8");//设定接收请求内容的编码,UTF-8支持中文

response.setCharacterEncoding("UTF-8");//设定返回内容的编码,UTF-8支持中文

response.setContentType("text/html");//指定返回的内容是文本以及html格式

|-页面跳转

   response.sendRedirect("index.html");


2.session(在服务器内存中写入一个变量)

HttpSessionsession=request.getSession();//在服务器内存中为当前浏览器开辟一个空间

//如果浏览器关闭,那么session会被注销

session.setAttribute("username",”surong”);//往服务器内存中写入一个变量

String a=(String)session.getAttribute("username");//在服务器内存中查找username变量

session.removeAttribute("username");//删除内存中的username变量

session.invalidate();//直接将当前浏览器的session销毁

3.out.println输出页面内容


    response.setCharacterEncoding("UTF-8");//设定返回内容的编码,UTF-8支持中文

response.setContentType("text/html");//指定返回的内容是文本以及html格式

PrintWriter out = response.getWriter();    //获取一个输出流

out.println("<HTML>\n"+

           "<HEAD><TITLE>Hello</TITLE></HEAD>\n"+

           "<BODYBGCOLOR=\"#FDF5E6\">\n" +

           "<H1>Hello,"+username+",你的密码是: "+password+"</H1>\n" +

           "</BODY></HTML>");