我们之前使用的都是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中取出来的。

最新文章

  1. Openfire3.9.3源代码导入eclipse中开发配置指南
  2. ubuntu 14.04 compiz的ALT + TAB切换程序
  3. Swift学习笔记十一
  4. ms flexbox 布局 (ko list)
  5. 修改EBS R12 URL连接端口
  6. JVM结构、GC工作机制详解(转)
  7. iOS 如何自定义NavigationBar的高度
  8. Ubuntu里字符编码设置
  9. peoplesoft function PSTREENODE 通过 deptid 获得部门树 一级部门 code
  10. linux服务器解压缩文件的命令
  11. 一个农民工混迹于 IT 行业多年后的泣血总结
  12. C++中的字符串的输入输出函数、空字符与空格的区别、字符变量赋值和字符串初始化
  13. seriviceWorker 小结
  14. transition的属性变化
  15. Powerdesigner数据库建模的浅谈
  16. (推荐)用C++来开发Skyline应用
  17. PAT 1008 数组元素循环右移问题
  18. keepalived基础原理
  19. 小程序中监听textarea或者input输入的值动态改变data中数组的对象的值
  20. nginx 服务器篇

热门文章

  1. HDMI转EDP芯片NCS8803简介
  2. Kosaraju算法详解
  3. Java Spring的简单见解
  4. 【笔记】shellcode相关整理
  5. 第4阶段——制作根文件系统之分析init进程(2)
  6. 小程序脚本语言WXS详解
  7. 命令行利用KVM创建虚拟机
  8. spring在扫描包中的注解类时出现Failed to read candidate component错误
  9. 201521123099 《Java程序设计》第八周学习总结
  10. 201521123092《Java程序设计》第七周学习总结