日期:2014-05-16  浏览次数:20398 次

jsp-----servlet程序设计
*.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/>就是封装了这段代码