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

