💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
[toc] ## Servlet 简介 Java Servlet是和平台无关的服务器端组件,**它运行在Servlet容器中。Servlet容器负责Servlet和客户的通信以及调用Servlet的方法,Servlet和客户的通信采用“请求/响应”的模式**。 ![](https://box.kancloud.cn/5ff9c18c15e248758a9bf66a76150dd9_999x332.png) Servlet本质上就是一个运行在Servlet容器中的java类,现在充当容器的就是Tomcat ### 第一个Servlet——HelloWorld 1.创建一个Java类实现Servlet接口,用response给客户端一个hello world的响应 ~~~ public class FirstServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { PrintWriter pw = resp.getWriter(); //向客户端发送信息 pw.println("hello world"); pw.close(); } } ~~~ 2.配置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>first</servlet-name> <servlet-class>Servlet.FirstServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>first</servlet-name> <url-pattern>/first</url-pattern> </servlet-mapping> </web-app> ~~~ 其中 ~~~ <servlet> <servlet-name>first</servlet-name> <servlet-class>Servlet.FirstServlet</servlet-class> </servlet> ~~~ servlet-name的值可以随便起,但是Servlet-class必须严格按照类的位置写 ~~~ <servlet-mapping> <servlet-name>first</servlet-name> <url-pattern>/first</url-pattern> </servlet-mapping> ~~~ Servlet-mapping里的Servlet-name要和上面的保持一致,url-pattern表示的是为first映射一个访问路径/first(类似于提供一个能够访问到游戏角色的方式,其中/代表我们web应用的根目录) ### Servlet的生命周期 1.创建Servlet对象(注意:只创建一个对象并且只初始化一次) 2.Servlet完成初始化 3.对外提供服务 4.在关闭服务器或者服务器重启时销毁 ### load-on-startup 可以指定Servlet被创建的时机 ~~~ <servlet> <servlet-name>helloServlet</servlet-name> <servlet-class>com.neusoft.javaweb.HelloServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> ~~~ 在加载完Servlet后直接就创建了Servlet实例,并进行了初始化,在此期间我们并没有提出请求。 如果配置了多个Servlet, load-on-startup的值越小越先启动(包括0,负数不会被启动,还是需要发出请求才创建实例并初始化); ### Servlet可能面临的问题 1.创建多少个对象的问题:只会创建一个对象和初始化一次 2.由于是创建了一个对象 由于一个资源(Servlet)会同时被多个客户端访问就会出现多个线程访问同一个资源的情况, 这个时候就要考虑线程安全问题 **如何避免**:不要在Servlet使用全局变量来作为下一步操作的判断依据。如果非得这么做,需要加锁。