什么是servlet?
Servlet是JavaWeb开发的基石,与平台无关的服务器组件,它是运行在Servlet容器/web应用服务器/Tomcat,负责与客户端进行通信。
Servlet的功能:
1.创建并返回基于客户端请求的动态HTML页面。
2.与数据库进行通信。
如何使用Servlet?
Servlet本身是一组接口,自定义一个类,并且实现servlet接口,这个类就具备了接收客户端请求以及做出响应的功能。
public class MyServlet implements Servlet {
//做一些初始化操作
@Override
public void init(ServletConfig config) throws ServletException {
}
//用来获取一些Servlet的一些信息
@Override
public ServletConfig getServletConfig() {
return null;
}
//操作
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
String id = req.getParameter("id");//接收前端传来的参数
System.out.println("我是Servlet,我已经接收到客户端发来的请求,参数是:" + id);
// res.setCharacterEncoding("UTF-8");
res.setContentType("text/html;charset=UTF-8");//处理返回给前端数据乱码的问题
res.getWriter().write("客户端你好,我已接收到你的请求");
}
@Override
public String getServletInfo() {
return null;
}
//销毁
@Override
public void destroy() {
}
}
浏览器不能直接访问Servlet文件,只能通过映射的方式来间接访问Servlet,映射需要开发者手动配置,有两种配置方式。
1. 基于XML文件配置方式
MyServlet com.atxu.servlet.MyServlet MyServlet /myservlet
2.基于注解的方式配置
@WebServlet("/demo1")
public class MyServlet implements Servlet {
}
Servlet的生命周期
1.当浏览器访问Servlet的时候,Tomcat会查询当前Servlet的实例对象是否存在,如果不存在,则通过反射机制动态创建对象,如果出存在,直接执行第3步。
2.调用init方法完成初始化操作。
3.调用Service完成业务逻辑操作
4.关闭Tomcat时,会调用destory方法,释放当前对象所占用的资源。
Servlet的生命周期方法:无参构造函数、init、service、destory
1.无参构造函数只调用一次,创建对象
2.init 只调用一次,初始化对象。
3.service 调用N次,执行业务方法。
4.destory 值调用一次,卸载对象。
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。
config是局部对象,context是全局对象
Servlet的层次结构(Servlet是一组接口)
Servlet-----> GenericServlet-------> HtppServlet
Http请求有很多种,常用的有四种: GET(读取) POST(保存) PUT(修改) DELETE (删除)
GenericServlet实现了Servlet接口,同时为它的子类屏蔽了不常用的方法,子类只需要重写service方法即可。
HttpServlet继承GenericServlet,根据请求类型进行分发处理,GET进入doGET方法,POST进入doPOST方法。
开发者自定义的Servlet类只需要继承HttpServlet即可,重新doGET和doPOST。
package com.atxu.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("/demo2")
public class TestServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("GET");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("POST");
}
}



