日期:2014-05-16 浏览次数:20398 次
*.jsp--->*.java--->*.class文件 servlet生命周期: 装载---->创建----> ----->初始化----->服务----->销毁---> 卸载 1.servlet本身只关心 初始化,服务,销毁三个操作 1。初始化:正常情况下只有一次初始化,但是如果一个servlet长时间不使用之后再使用,则会重新初始化 2。服务:一个servlet肯定会服务多次,如果一个servlet长时间不服务,则认为没用了,等待销毁。 3。正常情况下也只有一次,容器关闭时销毁,当然,如果一个servlet长时间不使用,则也会被自动销毁。 和人的生命周期一致:孕育生命----出生---成长,工作---死亡----销毁资料 如果一个人长时间消失,则认为死亡,重新再人间复活( 黑户) 初始化: public void init(); public void init(ServletConfig config); 服务: public abstract void service(ServletRequest req,ServletResponse); 一般情况下不会直接复写此方法,而复写 public void doGet(HttpServletRequest req,HttpServletResponse resp); public void doPost(HttpServletRequest req,HttpServletResponse resp); 销毁: public void destroy(); 2.写程序看servlet生命周期 public class LifeCycleServlet extends HttpServlet{ public void init(){ System.out.println("************初始化**************") } public void doGet(HttpServletRequest req,HttpServletResponse resp){ System.out.println("***********服务***************") } public void doPost(HttpServletRequest req,HttpServletResponse resp){ this.doGet(req,resp); } public void destroy(){ System.out.println("************销毁***************"); try{ Thread.sleep(5000); //为了看到销毁的效果 }catch(Exception e){ } } } <servlet> <servlet-name>life</servlet-name> <servlet-class>com.zhe.LifeServlet</servlet-class> <init-param> <param-name>driver</param-name> <param-value>oracle.jdbc.driver.OracleDriver</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>life</servlet-name> <url-pattern>/life</url-pattern> </servlet-mapping> 如果servlet中存在init和init(ServletConfig config) 那么会调用init(ServletConfig config);//因为他干的事情多些 如果我们复写了service(HttpServletRequest,HttpServletResponse); 那么doGet和doPost将不会被执行了,因为所有的doXXX()方法都是在父类中(HttpServlet)使用service方法进行区分的. 容器----->services----->各个子类的doXXX()------这是一个典型的模板操作 3.默认情况下servlet只在第一次运行的时候初始化,也可以经过配置,让其在容器启动的时候就可以进行初始化,修改web.xml文件即可。 <servlet> <servlet-name>life</servlet-name> <servlet-class>com.zhe.LifeServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> 4.使用Servlet取得其他的常用对象 4.1取得Session对象 HttpServletRequest中有两个方法 1。 public HttpSession getSession();//表示直接取得当前的session 2.public HttpSession getSession(boolean create);//取得session,如果session不存在则创建 create = true 4.2取得application对象 就是和在jsp中一样的,使用 getServletContext() ServletContext app = super.getServletContext(); System.out.println(app.getRealPath("/")); 5.Servlet跳转 客户端跳转与属性传递 req.getSession().setAttribute("name","zwz"); resp.sendRedirect("aa.jsp"); 但是如果name只传递一次,那么使用session太浪费空间了。。。。 这时我们应该使用request来设置属性,但是使用request来设置属性的话,必须使用服务器端跳转才行,因为要保证是同一个request RequestDispatcher接口可以完成 RequestDispathcer rd = req.getRequestDispatcher("aa.jsp"); rd.forward(req,resp); //<jsp:forward/>就是封装了这段代码