什么是Servlet
Servlet是java开发的基石,与平台无关的服务器组件,他是运行在Servlet容器/Web应用服务器/Tomcat,负责与客户端进行通信
Servlet功能
- 创建并返回基于客户请求的动态HTML页面
- 与数据库进行通信
如何使用Servlet
Servlet本身是一组接口,自定义一个类,并且实现Servlet接口,这个类就具备了接收客户端请求并做出响应的功能
实现Servlet接口:
package com.bijing.servlet;
import javax.servlet.*;
import java.io.IOException;
import java.io.PrintWriter;
/**
* @author 毕晶
* @date 2022/9/15 14:24
*/
public class MyServlet 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 {
String id = servletRequest.getParameter("id");
System.out.println("我是Servlet,我已经接收到了客户端发来的请求!id="+id);
PrintWriter printWriter = servletResponse.getWriter();
//不同的ContentType 会影响客户端所看到的效果.默认的ContentType为 text/html 也就是网页格式
servletResponse.setContentType("text/html;charset=utf-8");
printWriter.write("hello client!");
printWriter.flush();
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
浏览器不能直接访问Servlet文件,只能通过映射的方式来间接访问Servlet,映射需要开发者手动配置,有两种配置
- 基于xml文件的配置方式
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>
<servlet-name>MyServlet</servlet-name>
<!-- 全类名,tomcat内部会利用反射机制调用无参构造器实例化对象-->
<servlet-class>com.bijing.servlet.MyServlet</servlet-class>
</servlet>
<!-- servlet-name标签中的名字相同才能进行映射-->
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<!-- 地址-->
<url-pattern>/myServlet</url-pattern>
</servlet-mapping>
</web-app>
- 基于注解方式
//注解方式映射Servlet,括号里面是浏览器中的路径,不要漏了'/'
@WebServlet("/myServlet")
public class MyServlet implements Servlet {
注解中完整写法
@WebServlet(asyncSupported = true, name = "myServlet", description = "name描述", loadOnStartup = 1, urlPatterns = {
"/myServlet", "/*" }, initParams = {
@WebInitParam(name = "编程帮", value = "www.biancheng.net", description = "init参数1"),
@WebInitParam(name = "京东", value = "www.jd.com", description = "init参数2") })
public class MyServlet implements Servlet {
Servlet的生命周期
- 当浏览器访问Servlet时,Tomcat会查询当前Servlet的实例化对象是否存在,如果不存在则通过反射机制动态创建对象,如果存在直接执行第三步
- 调用init方法完成初始化操作
- 调用service方法完成业务逻辑操作
- 关闭Tomcat时会调用destroy方法,释放当前对象所占用的资源
Servlet的生命周期方法:无参构造器、init、service、destroy方法
- 无参构造函数只调用一次,用来实例化对象
- init只调用一次,初始化对象
- service调用n次,用来执行业务方法
- destroy只调用一次,卸载对象.
ServletConfig
该接口是用来描述Servlet的基本信息的
getServletName() — 返回Servlet的名称,全类名形式
getInitParameter(String key) — 获取init参数的值(可以在web.xml中初始化,也可以在注解中初始化)
getInitParameterNames() — 返回所有的initParameter的name值,一般用做遍历初始化参数
getServletContext() — 返回ServletContext对象,它是Servlet的上下文,整个Servlet的管理者
ServletConfig和ServletContext的区别:
ServletConfig作用于某个Servlet实例,每个Servlet都有对应的ServletConfig
ServletContext作用于整个web应用,一个web应用对应一个ServletContext,过个Servlet实例对应一个ServletContext
Servlet的层次结构
Servlet ->GenericServlet ->HttpServlet
HTTP请求有很多中类型,常用的有四种
GET —读取
POST —保存
PUT —修改
DELETE —删除
抽象类GenericServlet实现了Servlet接口,同时为它的子类屏蔽了一些不常用的方法,子类只需重写service方法即可
HttpServlet继承GenericServlet,根据请求类型进行分发处理,Get进入doGet方法,post进入doPost方法
开发者自定义的Servlet类只需继承HttpServlet即可