什么是servlet?
Servlet是java web 开发的基石,与平台无关的服务器组件,它是运行在Servlet 容器/Web 应用服务器/Tomcat ,负责和客户端通信。
servlet的功能?
<1> 创建并返回基于客户请求的动态HTML页面
<2>与数据库进行交互
如何使用?
package com.lunan.servlet;
import javax.servlet.*;
import java.io.IOException;
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("servletRequest = " + servletRequest);
servletResponse.setContentType("text/html;charset=UTF-8");
servletResponse.getWriter().write("我是服务端"+id);
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
浏览器不能直接返回servlet 文件,只有通过映射方式间接的访问,映射需要开发者手动来配置,有两种配置方式:
方式一:基于XML 文件配置
MyServlet com.lunan.servlet.MyServlet MyServlet /myservlet
方式二:基于注解的方式
@WebServlet("/myservlet")
public class MyServlet implements Servlet {
}
以上两种方式完全一致,将MyServlet 和 myservlet进行映射,在浏览器中访问 myservlet 直接可以映射到MyServlet 文件中。
servlet 生命周期?
<1> 当浏览器访问servlet的时候,Tomcat 会查询当前Servlet的实例化对象是否存在,如果不存在的话,会通过反射机制动态创建对象,如果存在,直接执行第三步。
<2> 调用init方法完成初始化操作
<3> 调用service方法完成业务逻辑操作
<4> 关闭tomcat时,会调用destroy方法,释放当前对象所占用的资源
servlet 生命周期方法: 无参构造方法, init ,service, destory
<1> 无参构造方法只调用一次,创建对象
<2> init只调用一次,用来初始化对象
<3> service调用N次,用来执行业务
<4> destory只调用一次,用来卸载对象
servletConfig
该接口用来描述servlet 基本信息的
<1> getServletName 方法,返回当前servlet对象全路径
<2> getInitParameter 获取web.xml 文件中初始化参数
public class MyServlet implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println(servletConfig.getInitParameter("username"));//该值为admin
}
}
MyServlet com.lunan.servlet.MyServlet username admin MyServlet /myservlet
<3> getInitParameterNames 返回所有InitParameter的name 值,一般用作遍历初始化参数
public class MyServlet implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
Enumeration enumeration = servletConfig.getInitParameterNames();
while (enumeration.hasMoreElements()){
String element = enumeration.nextElement();
System.out.println(servletConfig.getInitParameter(element));
}
}
}
MyServlet com.lunan.servlet.MyServlet username admin password 123456 realname admin MyServlet /myservlet
<4> getServletContext. 返回ServletContext对象,它是Servlet上下文,整个Servlet 的管理者
public class MyServlet implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
ServletContext servletContext = servletConfig.getServletContext();
//路径 /lunan001
System.out.println(servletContext.getContextPath());
//Apache Tomcat/8.5.77
System.out.println(servletContext.getServerInfo());
}
<5> ServletConfig 和 ServletContext的区别
ServletConfig作用于某个Servlet实例,每个Servlet实例都有对应的ServletConfig;而ServletContext作用于整个web 应用,一个web 应用对应一个ServletContext,多个Servlet实例对应一个ServletContext。
public class MyServlet implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
ServletContext servletContext = servletConfig.getServletContext();
//admin
System.out.println(servletContext.getInitParameter("username"));
//123456
System.out.println(servletConfig.getInitParameter("username"));
}
}
username 123456 MyServlet com.lunan.servlet.MyServlet username admin
- Servlet 层次结构
Servlet => GenericServlet => HttpServlet
GET 获取
POST 保存
PUT 修改
DELETE 删除
GenericServlet 实现了Servlet 方法,同时为它的子类屏蔽了不常用的方法,子类只需要重写service 方法即可。
HttpServlet 继承了GenericServlet,根据请求类型进行分发处理。
开发自定义的Servlet 只需要继承HttpServlet 即可。然后重写 doGet ,doPost 等方法。



