获取参数
protected void doPost(HttpServletRequest req, HttpServletResponse resp) {
req.getgetParameter("key"); // 可获取请求传过来的参数
}
处理参数乱码问题
protected void doPost(HttpServletRequest req, HttpServletResponse resp) {
req.setCharacterEncoding("UTF-8"); // 必须放在获取参数之前
// tomcat10默认时UTF-8
}
继承关系和Servlet的方法
- 继承关系:
**HttpServlet**
->**GenericServlet**
->**Servlet**
**Servlet**
中核心方法:**inti() 初始化**``**service() 服务方法**``**destroy() 销毁**
- 服务方法:当有请求过来时,
**service**
放会自动响应(其实时tomca容器调用),在**HttpServlet**
中会去分析请求方式,到底是**get**
,**post**
,**head**
, 还是**delect**
然后在决定调用的是哪个**do**
开头的方法,那么在**HttpServlet**
中这**do**
方法默认是405的实现风格,我们要去重写这些方法 因此在新建
**Servlet**
时,我们才会去考虑请求方法,从而去决定重写哪个**do**
方法// service方法
// 每一个do方法都是405
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String method = req.getMethod();
long lastModified;
if (method.equals("GET")) {
lastModified = this.getLastModified(req);
if (lastModified == -1L) {
this.doGet(req, resp);
} else {
long ifModifiedSince;
try {
ifModifiedSince = req.getDateHeader("If-Modified-Since");
} catch (IllegalArgumentException var9) {
ifModifiedSince = -1L;
}
if (ifModifiedSince < lastModified / 1000L * 1000L) {
this.maybeSetLastModified(resp, lastModified);
this.doGet(req, resp);
} else {
resp.setStatus(304);
}
}
} else if (method.equals("HEAD")) {
lastModified = this.getLastModified(req);
this.maybeSetLastModified(resp, lastModified);
this.doHead(req, resp);
} else if (method.equals("POST")) {
this.doPost(req, resp);
} else if (method.equals("PUT")) {
this.doPut(req, resp);
} else if (method.equals("DELETE")) {
this.doDelete(req, resp);
} else if (method.equals("OPTIONS")) {
this.doOptions(req, resp);
} else if (method.equals("TRACE")) {
this.doTrace(req, resp);
} else {
String errMsg = lStrings.getString("http.method_not_implemented");
Object[] errArgs = new Object[]{method};
errMsg = MessageFormat.format(errMsg, errArgs);
resp.sendError(501, errMsg);
}
}
Servlet生命周期
生命周期:从出生到死亡的过程叫做生命周期,对应servlet中的三个方法:
**init()**
,**service()**
,**destroy()**
- 默认情况下:第一次接受请求时,这个
**Servlet**
会进行实例化(调用构造方法),初始化(**init()**
),然后服务(**service()**
)。第二次请求开始,每一个次都是服务(**service**
),当容器关闭时,其中的所有**servlet**
实例会被销毁,调用销毁方法(**destroy()**
)。
**Servlet**
实例**Tomcat**
只会创建一个,所有的请求都是这个实例去响应。默认情况下,第一次请求时,**tomcat**
才会去实例化,初始化,
**Servlet**
初始化的时机- 默认是第一次请求时:初始化
- 可以通过
**<load-on-startup>1</load-on-startup>**
来设置**servlet**
启动的先后顺序,数字越小,启动越靠前,最小值0
-
Http协议
Http 称为超文本传输协议
- Http是无状态的
- Http请求包含两个部分:请求和响应
- 请求
- 请求包含:1. 请求行 2. 请求头 3. 请求体
- 响应
- 响应包含:1. 响应行 2. 响应头 3. 响应体
- 请求
会话
- 会话跟踪技术
- 客户端第一个发请求给服务器,服务器获取session获取不到,则创建新的,然后响应给客户端,
- 下一次客户端给服务器发请求,会把session带给服务器,服务器就知道你的信息 ```java request.getSession(); // 获取当前会话,没有则创建一个新的会话 request.getSession(true); // 获取当前会话,跟不带参数的效果相同 request.getSession(false); // 获取当前会话,没有则返回null,不会创建新的
HttpSession session = request.getSession(); session.getId(); // 获取sessionId session.isNew(); // 当前session是否是新的 session.getMaxInactiveInterval();// session的非激活间隔时长,默认1800秒,就是不操作的时间 session.setMaxInactiveInterval(); session.invalidate(); // session立即失效 session.getAttribute(); // 获取键值对 session.setAttribute(); // 设置键值对 ….
2. **Session保存作用域**
1. **可以往session中添加键值对,一个session可以在多个组件中访问,但得是同一个session会话**

---
<a name="t1A6n"></a>
# 服务器内部转发和客户端重定向
```java
req.getRequestDispatcher("Servlet07").forward(req,resp); // 服务器内部转发
resp.sendRedirect("Servlet07"); // 客户端重定向
保存作用域
- request 一次请求的范围
- session 一次会话的范围
- application 一次应用程序范围
Filter过滤器
- Filter也是Servlet规范
- Filter开发步骤:新建Filter接口,然后实现其中的三个方法:init doFilter destroy,配置Filter,可以用注解,也可以使用xml文件
- Filter配置时,可servlet一样,也可以使用通配符
- 过滤器链
- 如果采用的时注解的方式进行配置,那么过滤器的拦截顺序时安装全类名的先后顺序排序的
- 如果采用的是xml的方式进行配置,那么按照配置的先后顺序*