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>");
相关阅读:
Android通过http传输文件到Servlet
WAS Websphere下新增Servlet无法访问的问题