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");