环境:
开发环境:IDEA 2023
Tomcat: tomcat9.0.75
pom依赖:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
servlet处理逻辑,可以验证一下servlet的生命周期
实例化对象:调用无参构造方法
初始化: 调用init方法
提供服务: 调用service,在service内部去根据请求类型走doGet还是doPost
销毁: 调用destroy方法
public class HelloWorldServlet extends HttpServlet {
public HelloWorldServlet() {
System.out.println("new Servlet obj");
}
@Override
public void init() throws ServletException {
System.out.println("init Servlet");
}
@Override
public void destroy() {
System.out.println("destroy Servlet");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("This is doGet.");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("This is doPost.");
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String method = req.getMethod();
if (method.equalsIgnoreCase("GET"))
doGet(req, resp);
else
doPost(req, resp);
}
}
因为是单独写的一个Servlet,要部署在tomcat里,就需要编译成class文件
将servlet-api.jar拷贝在HelloWorldServlet.java所在的目录下,如图所示:
然后在该路径下执行命令,会将java文件编译成class文件
javac -classpath .\javax.servlet-api-4.0.1.jar .\HelloWorldServlet.java
如果代码中还引入了其他包的代码,编译出现找不到文件的错误,可以参考
https://blog.youkuaiyun.com/gao_zhennan/article/details/118612051
编译完之后会生成class文件。
部署服务器tomcat
tomcat部署web项目是在tomcat安装目录下 apache-tomcat-9.0.75\webapps\ROOT\WEB-INF下,需要手动创建classes目录,然后依次创建servlet包目录,然后将class文件拷贝过来
编辑apache-tomcat-9.0.75\webapps\ROOT\WEB-INF目录下的web.xml文件
增加servlet映射,要放在<web-app>标签里
<servlet>
<servlet-name>HelloWorld</servlet-name>
<servlet-class>com.pyy.servlet.HelloWorldServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloWorld</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
至此tomcat配置servlet完成
启动tomcat,在apache-tomcat-9.0.75\bin目录下的shell里执行.\startup.bat脚本启动tomcat服务器
postman测试:
查看tomcat日志输出,可以看到在首次调用hello请求发送GET请求时,先调用了无参构造方法进行实例化,然后调用init方法进行初始化,再调用doGet方法打印输出, 然后调用post请求,直接调用doPost方法输出内容。
所以说Servlet初始化一次,然后无数次对外提供service服务。
销毁方法因为调用tomcat的 .\shutdown.bat脚本,会快速关闭tomcat终端输出,看不到destroy方法的输出结果。结果是关闭tomcat服务器会清理servlet,会调用一次servlet的destroy方法。