zoukankan      html  css  js  c++  java
  • JSP入门 生命周期

    我们之前使用的都是javax.servlet.http.HttpServlet,这个类实现了javax.servlet.Servlet接口,而这个接口中定义的三个方法是所有servlet都必须实现的。

    package javax.servlet;  
    public interface Servlet {  
        void init(ServletConfig config);  
        void service(ServletRequest request, ServletResponse response);  
        void destroy();  }

    如图所示,tomcat之类的服务器首先根据web.xml中的定义实例化servlet,然后调用它的init()方法进行初始化,init()方法的ServletConfig参数是服务器传递进servlet的,其中包含web.xml配置的初始化信息和ServletContext对象等共享内容。

    初始化后的servlet实例便进入等待请求的状态,当有与servlet-mapping匹配的请求进入时,服务器会调用servlet实例的service方法,传入ServletRequest与ServletResponse两个参数等待servlet处理完毕。

    注意一点,对于每个web应用,内存中只存在一个servlet实例,所有请求都是调用这个servlet实例,所以我们说servlet不是线程安全的,所有操作都要限制在service()方法中进行,不要在servlet中定义类变量。(doGet()和doPost()是HttpServlet覆盖service()方法后分支出来的辅助方法,实际上服务器调用的还是service()。)

    当web应用卸载时,服务器会调用每个已经初始化的servlet的destroy(),然后销毁这些servlet实例,如果你需要在servlet销毁时释放什么资源的话,可以写在destory()方法中。

    1.初始化

    那么servlet是在什么时候进行初始化的呢?我们可以通过web.xml中的load-on-startup标签。

    load-on-startup的值是一个整数,当它大于等于零的时候服务器会在web发布的时候初始化servlet。当它小于零或者我们没有设置load-on-startup的时候,服务器会在用户第一次访问servlet的时候才去初始化servlet。

    <servlet> 
        <servlet-name>TestServlet</servlet-name>
         <servlet-class>anni.TestServlet</servlet-class>
         <load-on-startup>1</load-on-startup> 
    </servlet>

    或许你对load-on-startup为什么是一个整数存有疑问,为什么不是true和false呢?这是因为如果我们在web.xml中设置了多个servlet的时候,可以使用load-on-startup来指定servlet的加载顺序,服务器会根据load-on-startup的大小依次对servlet进行初始化。不过即使我们将load-on-startup设置重复也不会出现异常,服务器会自己决定初始化顺序。

    2.servlet线程不安全

    3.在jsp中定义类变量 

    写在<%%>之间的代码,在转换成servlet之后都会service()方法内运行

     但是我们可以用<%!%>(注意多出来的感叹号)定义类变量或类方法,<%!%>已经脱离了service()方法,这就导致不能在它里边使用request,response这些默认变量了

    4.jsp九大默认对象 
    分别是request, response, out, pageContext, session, application, page, config, exception。

    如何在service()方法中获得这些对象:

     1.request

    public void service(ServletRequest req, ServletResponse res) {
          HttpServletRequest request  = (HttpServletRequest) req; 
    }

    jsp中的request就是service()中传入的req参数,因为service中定义的是ServletRequest类型,我们还需要转换成HttpServletRequest类型

    2.response

    与上例相同,response也是service()中传入的res参数。

    3.out

    Writer out = response.getWriter()

    out对应着从response中取出的writer对象,负责向响应中输出数据。不过jsp和servlet中的out还是有一点区别,虽然它们都实现了java.io.Writer接口,但servlet中实际类型是java.io.PrintWriter,而jsp中实际类型是javax.servlet.jsp.JspWriter。

    4.session

    HttpSession session = request.getSession();

    5.application

    ServletConext application = getServletConfig().getServletContext(); 

    6.config

    ServletConfig config = getServletConfig()

    这是在servlet初始化时由服务器传入的对象,可以通过它获得web.xml中定义的初始化参数。

    7.exception

    JSP中设置错误页:<%@ page contentType="text/html; charset=gb2312" errorPage="error.jsp"%>

    error.jsp <%@ page contentType="text/html; charset=gb2312" isErrorPage="true"%> 

    最主要的是在jsp指令(directive)中设置isErrorPage="true",这样我们就可以在jsp中使用exception对象了,实际上这个异常是从request中取出来的。

  • 相关阅读:
    mac下如何全量删除短信内容
    git log --oneline --graph的读法
    nginx bind() to 0.0.0.0:**** failed (13: Permission denied)
    nginx安装和配置
    pycharm的插件pylint报错:java.lang.Throwable: Write-unsafe context! Model changes are allowed from write-safe contexts only. Please ensure you're using invokeLater/invokeAndWait with a correct modality stat
    python编码规范、js编码规范及IDE的检查插件pylint/eslint等
    Flask 在 Debug 模式下初始化2次
    python的globals()使用
    删除整张表数据但是空间没有减少
    DBCC DBREINDEX重建索引提高SQL Server性能
  • 原文地址:https://www.cnblogs.com/Dhouse/p/3397405.html
Copyright © 2011-2022 走看看