(2) Servlet - 生命周期,工作方式

来源:互联网 发布:linux 设置ftp 编辑:程序博客网 时间:2024/05/20 15:59

HttpServlet:
① SUN 公司定义了两个默认实现 Servlet 的类:
GenericServlet、HttpServlt
② HttpServlet 能够处理 HTTP 请求的 servlet ,它在原有 Servlet接口上添加了一些 HTTP 协议处理的方法,它比 Servlet 接口的功能更加强大。开发人员在编写 Servlet 时,通常应该继承这个类,而避免直接取实现Servlet接口。
③ HttpServlet 在实现 Servlet 接口时,复写了 service 方法,该方法体内的代码会自动判断用户的请求方式,如 GET 请求,则调用 doGet开发人员在编写 Servlet 时,通常只需要复写 doGet 或 doPost而不是复写 service 方法。

运行原理:
Servlet 程序是由 Web 服务器调用,Web 服务器收到客户端的 Servlet 访问请求后 ↓
① Web 服务器 首先检查是否已经存在内存并且创建了该 Servlet 实例对象。如果有,跳到 ④ ,否则执行 ② 。
② 通过 反射机制 利用 web.xml 找到对应的 Servlet 位置,装载并创建 Servlet 的一个实例对象。
③ 执行 Servlet 中的 init 方法,进行初始化。
④ 创建一个用于封装 HTTP 请求消息的 HttpServletRequest 对象 和一个代表相应的 HttpServletResponse 对象,然后调用 service 方法,把请求和相应对象作为参数传进去。

 protected void service(HttpServletRequest req, HttpServletResponse resp){    ...HttpServlet源码,省略...    doGet() // 执行被覆盖的方法    doPost() // 执行被覆盖的方法    ...HttpServlet源码,省略...}

⑤ Web 应用程序被停止或者重新启动之前,servlet 执行 destroy 方法 销毁。

工作方式:
① 当浏览器发出请求,先查找本地的 HOSTS 文件,如果没有对应的 IP 再去 DNS 服务器查找。
② WEB 服务器 根据 URL 的地址查询 web.xml 对应 的资源文件
③ WEB 服务器利用 反射机制 ,创建实例对象(每个 Servlet 只有一个对象),执行 init 方法 进行初始化,将实例装载进内存
④ WEB 服务器 根据接收到的 HTTP 请求,生成 Request、Response 对象,作为参数传递进 service 方法中。因为每次的请求都不一样,所以每发出一次请求,都会封装一次 Request、Response 对象,再执行一次 service 方法
⑤ WEB 服务器把获得到的 Response 对象拆分成 HTTP ,返回给浏览器

WEB 服务器 在以下三种情况会销毁 Servlet:
① Tomcat 重启
② 重新部署 WEB 应用
③ 重启主机

在 WEB 应用启动时,自动加载 Servlet:
在 web.xml 文件中,添加标签

<servlet>    .........    // 永远要放在 最有一行 ↓    <load-on-startup>1</load-on-startup></setvlet>

因为支持多个 Servlet,应该有个顺序。标签中的数字代表优先级。
数字越小优先级越高:1 > 2 > 3 > 4 > 5 ……

使用场景:每分钟定期检查发送邮件

class   servlet {    init(){        new SendEmail().start();    }}class  SendEmail extends Thread{    run(){        while(true){            // 相隔 1分钟 检查一次表            sleep(60*1000);            // 查邮件表,时间与当前时间相同时发送邮件            //    id    contant    sendTime                   1     "hello"    2015-5-6 10:03                   2     "word"     2015-5-6 10:05            //使用 Java 中的发送邮件技术发送邮件        }    }}

Servlet 的多线程安全问题:
Servlet 本身就是支持多线程的,但是因为单例的原因,只有一个实例对象,当多个线程访问 Servlet 公有数据时,就会可能出现安全问题。
如果非要访问公有数据,就把公有数据放到同步代码块中。

表单提交 GET 和 POST 的区别:
① 从安全性看 GET < POST ,GET 提交的数据会在浏览器的地址栏显示
② 从提交的内容大小看 GET < POST,GET 提交的数据不大于 2K。而 POST 提交的数据理论上不受限制,但一般不超过 64K
③ 从响应速度来看:GET > POST ,GET 要求服务器立即处理请求。而 POST 请求可能形成一个队列请求。

ServletConfig 对象:
该对象主要用于读取 Servlet 的配置信息

<servlet> 标签中,配置值。但是只有自己的 Servlet 可以读取外部其他的 Servlet 不可使用。<servlet>    <init-param>        <param-name>参数名</param-name>        <param-value>参数值</param-value>    </init-param></servlet>class Servlet{    String value = this.getInitParameter("参数名");}

编码:

// 告诉浏览器以 utf-8 形式解析response.setContentType("text/html;charset=utf-8");// 字符编码方式response.setCharacterEncoding("utf-8");
0 0
原创粉丝点击