Servlet 技术
servlet技术中的三个重要接口:
Servlet 接口、
ServletConfig 接口、
ServletContext 接口
1.Servelt 接口
1.1.什么是 Servlet?
- Servlet 是 JavaEE 规范之一。 规范就是接口
- Servlet 就 JavaWeb 三大组件之一。 三大组件分别是: Servlet 程序、 Filter 过滤器、 Listener
监听器 - Servlet 是运行在服务器上的一个 java 小程序, 它可以接收客户端发送过来的请求, 并响应数据给客户端
1.2.手动实现 Servlet 程序
- 编写一个类去实现 Servlet 接口
- 实现 service 方法, 处理请求, 并响应数据
- 到 web.xml 中去配置 servlet 程序的访问地址
①HelloServlet 实现类实现 Servlet 接口
import javax.servlet.*;
import java.io.IOException;
/**
* @Author: Ron
* @Create: 2021 13:49
*/
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 {
System.out.println("Hello Servlet!!!");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
②web.xml 配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--访问HelloServlet程序-->
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.servlet.test.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/helloServlet</url-pattern>
</servlet-mapping>
</web-app>
③项目访问路径:http://localhost:8080/servlet_test/helloServlet
控制台结果:
1.3.解析url到servlet访问细节
浏览器地址栏中输入:http://localhost:8080/servlet_test/helloServlet
1.4.Servlet 的生命周期
- 执行 Servlet 构造器方法
- 执行 init 初始化方法
第一、 二步, 是在第一次访问 servlet路径 的时候创建 Servlet 程序会调用。
- 执行 service 方法
第三步, 每次访问都会调用。
- 执行 destroy 销毁方法
第四步, 在 web 工程停止的时候调用。
修改 HelloServlet 类中代码:
import javax.servlet.*;
import java.io.IOException;
/**
* @Author: Ron
* @Create: 2021 13:49
*/
public class HelloServlet implements Servlet {
public HelloServlet() {
System.out.println("1 构造器方法");
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("2 init初始化方法");
// 3、获取ServletContext对象
// System.out.println(servletConfig.getServletContext());
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("3 service === Hello Servlet!!!");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
System.out.println("4 destroy销毁方法");
}
}
访问 http://localhost:8080/servlet_test/helloServlet ,之后关闭项目,结果如下:
2.ServletConfig 接口
2.1.什么是 ServletConfig?
ServletConfig 接口从名称上来看, 就知道是 Servlet 程序的配置信息类。
Servlet 程序和 ServletConfig 对象都是由 Tomcat 负责创建, 我们负责使用。
Servlet 程序默认是第一次访问的时候创建, ServletConfig 是每个 Servlet 程序创建时, 就创建一个对应的 ServletConfig 对象。
2.2.ServletConfig 类的三大作用
- 可以获取 Servlet 程序的别名 servlet-name 的值
- 获取初始化参数 init-param
- 获取 ServletContext 对象
//1 可以获取Servlet程序的别名servlet-name的值
String servletName = servletConfig.getServletName();
//2 获取初始化参数init-param
String username = servletConfig.getInitParameter("username");
//3 获取ServletContext对象
ServletContext servletContext = servletConfig.getServletContext();
web.xml 配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!-- servlet 标签给 Tomcat 配置 Servlet 程序 -->
<servlet>
<!--servlet-name 标签 Servlet 程序起一个别名(一般是类名) -->
<servlet-name>HelloServlet</servlet-name>
<!--servlet-class 是 Servlet 程序的全类名-->
<servlet-class>com.servlet.test.HelloServlet</servlet-class>
<!--init-param 是初始化参数-->
<init-param>
<!--是参数名-->
<param-name>username</param-name>
<!--是参数值-->
<param-value>root</param-value>
</init-param>
</servlet>
<!--servlet-mapping 标签给 servlet 程序配置访问地址-->
<servlet-mapping>
<!--servlet-name 标签的作用是告诉服务器, 我当前配置的地址给哪个 Servlet 程序使用-->
<servlet-name>HelloServlet</servlet-name>
<!--
url-pattern 标签配置访问地址 <br/>
/ 斜杠在服务器解析的时候, 表示地址为: http://ip:port/工程路径 <br/>
/hello 表示地址为: http://ip:port/工程路径/helloServlet <br/>
-->
<url-pattern>/helloServlet</url-pattern>
</servlet-mapping>
</web-app>
3.ServletContext 接口
3.1.什么是 ServletContext?
1、 ServletContext 是一个接口, 它表示 Servlet 上下文对象
2、 一个 web 工程, 只有一个 ServletContext 对象实例。
3、 ServletContext 对象是一个域对象。
4、 ServletContext 是在 web 工程部署启动的时候创建。 在 web 工程停止的时候销毁。
什么是域对象?
域对象, 是可以像 Map 一样存取数据的对象, 叫域对象.
这里的域指的是存取数据的操作范围, 整个 web 工程
存数据 | 取数据 | 删除 | 数据 |
---|---|---|---|
Map | put() | get() | remove() |
域对象 | setAttribute() | getAttribute() | removeAttribute() |
3.2.ServletContext 类的四个作用
- 获取 web.xml 中配置的上下文参数 context-param
- 获取当前的工程路径, 格式: /工程路径
- 获取工程部署后在服务器硬盘上的绝对路径
- 像 Map 一样存取数据
// 获取 ServletContext 对象
ServletContext servletContext = servletConfig.getServletContext();
System.out.println(context);
// 向域中存数据(jsp中的application域)
context.setAttribute("key1", "value1");
// 取出域中的数据
System.out.println("Context1 中获取域数据 key1 的值是:"+ context.getAttribute("key1"));