Servlet技术
什么是Servlet?
- Servlet 是 JavaEE 规范之一。规范就是接口
- Servlet 就 JavaWeb 三大组件之一。三大组件分别是:Servlet 程序、Filter 过滤器、Listener 监听器。
- Servlet 是运行在服务器上的一个 java 小程序,它可以接收客户端发送过来的请求,并响应数据给客户端。
实现 Servlet 程序
- 创建web工程
- 创建一个类实现Servlet接口
- 配置路径
web.xml配置(该文件在web/WEB-INF 文件夹下):
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<!-- servlet 标签给Tomcat 配置Servlet 程序 -->
<servlet>
<!--servlet-name 标签 Servlet 程序起一个别名(一般是类名) -->
<servlet-name>HelloServlet</servlet-name>
<!--servlet-class 是Servlet 程序的全类名-->
<servlet-class>com.atguigu.servlet.HelloServlet</servlet-class>
</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/工程路径/hello <br/>
-->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
注解方式实现
@WebServlet("/demo")
public class Demo implements Servlet{
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("hello world...");
}
.....省略
Servlet 的生命周期
1、执行 Servlet 构造器方法
2、执行 init 初始化方法
3、执行 service 方法
4、执行 destroy 销毁方法
注意:
第一、二步,是在第一次访问的时候创建 Servlet 程序会调用init()方法进行初始化。
第三步,每次访问都会调用,任何一次请求 都会调用service()方法处理这个请求
第四步,在 web 工程停止的时候调用,服务器正常关闭或者项目从服务器移除, 调用destory()方法进行销毁
通过继承 HttpServlet 实现 Servlet
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/Demo")
public class Demo extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
快捷方式:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P18Z9rLD-1606562344566)(C:\Users\Linkin Park\AppData\Roaming\Typora\typora-user-images\image-20201128173616543.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c2h6svJl-1606562344568)(C:\Users\Linkin Park\AppData\Roaming\Typora\typora-user-images\image-20201128173852517.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RvKpOMzy-1606562344569)(C:\Users\Linkin Park\AppData\Roaming\Typora\typora-user-images\image-20201128174045417.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qMw73HlZ-1606562344571)(C:\Users\Linkin Park\AppData\Roaming\Typora\typora-user-images\image-20201128174400407.png)]
ServletConfig 类
Servlet 程序和 ServletConfig 对象都是由 Tomcat 负责创建,我们负责使用。
ServletConfig 类从类名上来看,就知道是 Servlet 程序的配置信息类,可以使用ServletConfig来获得Servlet的初始化参数。
Servlet 程序默认是第一次访问的时候创建,ServletConfig 是每个 Servlet 程序创建时,就创建一个对应的 ServletConfig 对象。
ServletConfig 类的三大作用
- 可以获取 Servlet 程序的别名 servlet-name 的值
- 获取初始化参数 init-param
- 获取 ServletContext 对象
ServletContext 类
什么是 ServletContext?
- ServletContext 是一个接口,它表示 Servlet 上下文对象
- 一个 web 工程,只有一个 ServletContext 对象实例。
- ServletContext 对象是一个域对象。
- ServletContext 是在 web 工程部署启动的时候创建。在 web 工程停止的时候销毁。
域对象,是可以像 Map 一样存取数据的对象,叫域对象。这里的域指的是存取数据的操作范围,整个 web 工程。
ServletContext 类的四个作用
- 获取 web.xml 中配置的上下文参数 context-param
- 获取当前的工程路径,格式: /工程路径
- 获取工程部署后在服务器硬盘上的绝对路径
- 像 Map集合一样存取数据
API
- getAttribute(String name) ;向ServletContext对象的map取数据
- setAttribute(String name, Object object) ;从ServletContext对象的map中添加数据
- removeAttribute(String name) ;根据"键"name去移除数据
- String getInitParameter(String name) ; //根据配置文件中的key得到value;
- String getRealPath(String path);根据资源名称得到资源的绝对路径.
- getResourceAsStream(String path) ;返回制定路径文件的流
@WebServlet("/demo")
public class Demo01 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取ServletContext对象
ServletContext servletContext = getServletContext();
String username = "帅哥";
//将username存储到ServletCOntext中
servletContext.setAttribute("username",username);
}
}
//在另外一个Servlet中获取当前Servlet中的一个数据
ServletContext servletContext = getServletContext();
//从ServletContext对象中获取username
String username = (String)servletContext.getAttribute("username");
//从ServletContext对象中移除数据
servletContext.removeAttribute("username")
String getInitParameter(String name) ; //根据配置文件中的key得到value;
<!--全局的参数初始化-->
<context-param>
<param-name>name</param-name>
<param-value>陈冠希</param-value>
</context-param>
//获取全局初始化参数
//获取ServletContext对象
ServletContext servletContext = getServletContext();
//根据key得到值
String value = servletContext.getInitParameter("name");
- String getRealPath(String path);根据资源名称得到资源的绝对路径.
- getResourceAsStream(String path) ;返回制定路径文件的流
@WebServlet("/demo02")
public class Demo02 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//使用String getRealPath(String path);得到资源的绝对路径
ServletContext servletContext = getServletContext();
String realPath = servletContext.getRealPath("资源文件名");
System.out.println(realPath);
FileInputStream is = new FileInputStream(realPath);
System.out.println(is);
//直接使用ServletContext的getResourceAsStream()方法,可以直接将web文件夹中的资源转成字节输入流
ServletContext servletContext = getServletContext();
InputStream is = servletContext.getResourceAsStream("资源文件名");
System.out.println(is);
}
}
//直接使用ServletContext的getResourceAsStream()方法,可以直接将web文件夹中的资源转成字节输入流
ServletContext servletContext = getServletContext();
InputStream is = servletContext.getResourceAsStream(“资源文件名”);
System.out.println(is);
}
}