Web 三大组件
Servlet 程序
Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。
一个 Servlet 只会有一个对象,服务所有的请求。一次创建,到处服务。
Servlet 的生命周期
即 从 Servlet 被创建 到 Servlet 被销毁的过程:实例化、初始化、服务、销毁
- 执行 Servlet 构造方法创建对象,即实例化
- 执行 init() 初始化 (在第一次访问的时候,创建 Servlet 程序才会调用,只执行一次)
- 执行 service() (每次访问都会调用)
- 执行 destroy() 销毁 (在 web 工程停止的时候才会调用,即停止 Tomcat时调用)
也可以指定 Servlet 在服务器第一次启动时被加载 执行 init() 初始化 init() 简单地创建或加载一些数据 service() 由 Servlet 容器 (即 Web 服务器 )调用 service() 来处理来自客户端(浏览器)的请求,并把格式化的响应写回给客户端。 每次服务器接收到一个 Servlet 请求时,服务器会产生一个新的线程并调用服务 destroy() 可以让您的 Servlet 关闭数据库连接、停止后台线程、把 Cookie 列表或点击计数器写入到磁盘,并执行其他类似的清理活动。 在调用 destroy() 之后,servlet 对象被标记为垃圾回收
实现 Servlet 的方式
方式1:实现 Servlet 接口
public class HelloServlet implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
方式2:继承 HttpServlet
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
方式3:继承 GenericServlet 类 (极少用)
public class HelloServlet extends GenericServlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
}
}
其他知识点
ServletConfig 实现类 它是 Servlet 程序的配置信息类,他的作用
@Override
public void init(ServletConfig servletConfig) throws ServletException {
// 获取初始化参数 init-param (web.xml 中指定)
servletConfig.getInitParameter();
// 获取所有的初始化参数
servletConfig.getInitParameterNames();
// 获取 ServletContext 对象
servletConfig.getServletContext();
// 获取 Servlet 程序的别名 servlet-name 的值(在 web.xml 中自己写的)
servletConfig.getServletName();
}
ServletContext 实现类 它表示 Servlet 上下文对象
- 在 web 工程部署启动的时候创建。 在 web 工程停止的时候销毁
- 一个 web 工程, 只有一个 ServletContext 对象实例
- 域指的是存取数据的操作范围, 整个 web 工程
ServletContext 实现类 的作用
- 像 Map 一样存取数据
|
| 存数据 | 取数据 | 删除数据 | | —- | —- | —- | —- | | Map | put() | get() | remove() | | 域对象 | setAttribute() | getAttribute() | removeAttribute() |
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取上下文参数 context-param (web.xml 中配置的)
ServletContext context = getServletConfig().getServletContext();
String username = context.getInitParameter("username");
// 获取当前的工程路径, 格式: /工程路径
String contextPath = context.getContextPath();
// 获取工程部署后在服务器硬盘上的绝对路径
// 斜杠被服务器解析地址为:http://ip:port/工程名/ 映射到 IDEA 代码的 web 目录
System.out.println("工程部署的路径:" + context.getRealPath("/"));
System.out.println("工程下 css 目录的绝对路径是:" + context.getRealPath("/css"));
}
}
context-param & init-param 的区别
- context-param 是 application 范围内的参数,存放在 servletcontext 中
- init-param 是 servlet 范围内的参数,只能在 servlet 的 init() 中取得
```xml
name value
<a name="CKMBE"></a>
## Filter 过滤器
**Filter 的生命周期**:实例化、init() 初始化、doFilter() 执行、destroy() 销毁<br />Filter 过滤器可以实现以下目的:(**拦截请求,过滤响应**)
- 在客户端的请求访问后端资源之前,拦截这些请求。
- 在服务器的响应发送回客户端之前,处理这些响应。
Filter 的执行顺序与在 web.xml 配置文件中的配置顺序一致,一般把 Filter 配置在所有的 Servlet 之前<br />**FilterConfig 类的作用**
```java
public void init(FilterConfig filterConfig) throws ServletException {
// 获取 Filter 的名称 filter-name 的内容
filterConfig.getFilterName();
// 获取在 web.xml 中配置的 init-param 初始化参数
filterConfig.getInitParameter("username");
// 获取 ServletContext 对象
filterConfig.getServletContext();
}
Listener 监听器
Listener 监听器的作用:监听某种事物的变化,然后通过回调函数,反馈给客户(程序)去做一些相应的处理
ServletContextListener 监听器
- ServletContextListener 可以监听 ServletContext 对象的创建 和 销毁
监听到 ServletContext 对象创建 和 销毁之后都会分别调用 ServletserContextListener 监听器的方法反馈
public interface ServletContextListener extends EventListener {
//在 ServletContext 对象创建之后马上调用,做初始化
public void contextInitialized(ServletContextEvent sce);
//在 ServletContext 对象销毁之后调用
public void contextDestroyed(ServletContextEvent sce);
}
使用步骤:编写一个类去实现 ServletContextListener、实现其两个回调方法、到 web.xml 中去配置监听器
Cookie & Session
Cookie
Cookie 是服务器发送到浏览器,并保存在浏览器端的一小块数据,用于在客户端记录用户的数据。
- 浏览器下次访问该服务器时,会自动携带该块数据,将其发送给服务器。
Session
- Session 是 JavaEE 的标准,用于在服务器端记录客户端信息
- 数据存放在服务器端更安全,但是会增加服务器端的内存压力