[TOC]
## 问题01:Servlet的概念及体系结构。
* 继承了HttpServlet的Java类(实现了Servlet接口)
* 功能强大(Java API、Servlet API)
* 性能高效(采用线程而非进程)
> servlet在处理请求采用的是线程,而不是一个进程。web服务器会为每一个客户端的访问请求创建一个线程,并在这个线程上调用Servlet的service方法。
> 但是如果访问了同一个资源的话,就有可能引发线程安全问题。
> 采用synchronized关键字解决
![](https://img.kancloud.cn/81/14/8114fb8ec0fff6ca4e7aa39ee3c0a81d_622x398.png)
* [ ] serializable是java.io包中的序列化接口;
* [ ] servlet接口、servletConfig接口定义了servlet的基本方法(用于接收和响应用户的请求)并封装了servlet的相关配置信息;
* [ ] GenericServlet对象是一个抽象类,实现了上述的3个接口,并为servlet接口及ServletConfig接口提供了部分实现;
* [ ] httpServlet子类继承了GenericServlet,并对其中http请求处理进行了实现。
## 问题02:Servlet的生命周期。
![](https://img.kancloud.cn/51/d1/51d1bb4bca19a061e2caaf86ff3fc686_512x416.png)
* [ ] **constructor**创建实例
> 由服务器容器自动完成—— 当客户端向Servlet容器**首次**发出HTTP请求访问Servlet时——**只调用一次**
* [ ] **init**初始化
> 由服务器容器自动完成—— 当客户端向Servlet容器**首次**发出HTTP请求访问Servlet时——**只调用一次**
```
public void init(ServletConfig config) throws ServletException {
String code = config.getInitParameter("code");
System.out.println("Servlet初始化编码为:"+code);
}
```
* [ ] **service**运行
> 根据用户请求进行执行—— 当客户端向Servlet容器发出HTTP请求访问Servlet时——**每次请求都会调用**
```
public void service(ServletRequest req, ServletResponse res)
```
> Dispatches client requests to the protected service method. There's no need to override this method.
```
protected void service(HttpServletRequest req, HttpServletResponse resp)
```
> Receives standard HTTP requests from the public service method and **dispatches** them to the **doMethod** methods defined in this class. This method is an HTTP-specific version of the javax.servlet.Servlet.service method. **There's no need to override this method**.
* [ ] **destroy**销毁
> 由服务器容器自动完成—— 当服务器**关闭**或web应用**被移除出容器**时——**只调用一次**
![](https://img.kancloud.cn/08/ec/08ec6ed56d56224429e82b54570e0534_862x430.png)
## 问题03:Servlet的创建与配置。
### Servlet的创建
![](https://img.kancloud.cn/4d/53/4d53bb4562c570fd865d71d4ad22c06c_1144x870.png)
### Servlet的注解配置
![](https://img.kancloud.cn/8b/c1/8bc15cf1a0ace2756048895e245fc2f0_1045x225.png)
### Servlet的XML配置
![](https://img.kancloud.cn/77/fe/77fe9fbca9563f27a1369797759f9961_999x386.png)
## 问题04:如何控制Servlet的加载
* [ ] 注解方式
```
loadOnStartup=number
```
![](https://img.kancloud.cn/ed/f8/edf843e49ed3025bb4874a4063ad2c33_165x75.png)
* [ ] 配置文件
```
<load-on-startup>number<load-on-startup>
```
![](https://img.kancloud.cn/e6/92/e692b720b621da578e2d360951baa966_400x53.png)
load-on-startup 是 web.xml 中的一个节点,是 servlet 元素的子元素,用来标记 Servlet 容器启动时是否初始化当前 Servlet,以及当前 Servlet 的初始化顺序。
load-on-startup 元素取值规则如下:
1. 它的取值必须是一个整数;
2. 当值小于 0 或者没有指定时,则表示容器在该 Servlet 被首次请求时才会被加载;
3. 当值大于 0 或等于 0 时,表示容器在启动时就加载并初始化该 Servlet,取值越小,优先级越高;
4. 当取值相同时,容器就会自行选择顺序进行加载。
> @WebServlet 注解的 loadOnStartup 属性与 web.xml 中的 load-on-startup 元素相对应,取值的规则和含义相同。
## 问题05:Servlet编码初始化(读取编码)
### 配置默认值
![](https://img.kancloud.cn/96/57/965792afc5ef55b9434b14d8d242b513_906x214.png)
### ServletConfig读取配置
![](https://img.kancloud.cn/9f/3d/9f3d923b6e60961dc80b21e6683832f8_824x188.png)
```
response.setContentType("text/html;charset="+code);
response.getWriter().print("编码已经设置为:"+code);
```
![](https://img.kancloud.cn/6c/15/6c159fb60bdb25a81d9bcc5ac7f8f07a_377x120.png)
## 问题06:ServletContext的获取
```
ServletContext application = request.getServletContext();
```
> 可以通过上述方法,来获得Servlet的一些基本信息,或者是将部分数据存储在该对象中。
## 问题07:Servlet开发步骤
1. 处理编码
2. 接收视图层传递的参数
3. 进行必要的数据验证和类型转换,若验证失败跳转到步骤9
4. 对数据进行封装
5. 初始化模型层对象,并调用模型层方法
6. 初始化结果变量保存模型层方法处理结果
7. 对必要的信息或者是标识进行保存
8. 根据处理结果,如果符合预期,请求转发或者重定向到**正确**页面
9. 如果不符合预期,请求转发或者重定向到**错误**页面
- 1课程概述
- 2环境配置
- 3MVC
- 3.1View
- 3.1.1前端基础
- 3.1.2JSP语法
- 3.1.3JSP内置对象1
- 3.1.4JSP内置对象2
- 3.2Bean
- 3.3Controller
- 3.3.1Servlet
- 3.3.2Filter
- 3.3.3Listener
- 3.4EL&JSTL
- 4三层架构
- 4.1数据库操作
- 4.1.1JDBC
- 4.1.2JDBC优化
- 4.2三层架构设计
- 4.3程序优化
- 4.3.1数据库连接优化
- 4.3.2数据库操作优化
- 4.4安全专题
- 4.4.1Ajax异步查询
- 4.4.2CAPTCHA
- 4.4.3MD5&SHA
- 4.4.4Cookie
- 4.4.5分页显示
- 4.4.6文件上传
- 4.4.7发送邮件
- 5企业级框架
- 5.0Maven
- 5.1MyBatis
- 5.2Spring
- 5.3SpringMVC
- 6实践项目
- 6.1实验1-用户登录(MVC)
- 6.2实验2-访问统计(Servlet高级)
- 6.3实验3-三层架构
- 6.4实验4-安全信息系统