实现servlet接口
package servlet;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
@WebServlet("/demo")
public class ServletDemo1 implements Servlet {
//Servlet被创建时执行一次(访问特定url时)
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
//servlet配置对象
@Override
public ServletConfig getServletConfig() {
return null;
}
//servlet被访问时执行,多次(刷新会执行service而不会执行init)
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("hello");
}
//获取servlet相关信息,不重要
@Override
public String getServletInfo() {
return null;
}
//servlet服务器关闭执行,一次
@Override
public void destroy() {
}
}
这里路由使用的是注解的方式。
可也是使用xml配置文件进行配置。在“web/WEB-INF/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>demo</servlet-name> <!-- 给类在xml中取个名字 -->
<servlet-class>servlet.ServletDemo1</servlet-class> <!-- 指明类文件class -->
<!--执行servlet的创建时机,负数第一次访问被创建(默认),正数服务器启动时被创建-->
<load-on-startup>5</load-on-startup>
</servlet>
<servlet-mapping><!-- 这里是配置路由 -->
<servlet-name>demo</servlet-name>
<url-pattern>/demo</url-pattern>
</servlet-mapping>
</web-app>
这个和直接写注解的方式是等价的。
生命周期
一个页面对应了一个servlet
对象,所以多用户访问可能存在线程安全的问题,所以不要再servlet
对象中定义属性,而是在service
方法中进行处理,因为service
方法是每次访问被调取一次,结束后被销毁。而servlet
则是一直存在。
Servlet相关类
Servlet接口->GenericServlet抽象类 ->HttpServlet抽象类
Servlet接口,需要实现所有的抽象方法
GenericServlet抽象类,只需要实现service方法,其他方法已经被空实现
HttpServlet抽象类,对http协议进行了封装,方便我们处理doGet/doPost方法