Servlet生命周期
1. init() Servlet初始化方法
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("Servlet正在初始化");
}
当服务器启动时,Servlet容器就会开始调用这个方法来初始化一个Servlet对象出来,但是这个方法在后续请求中不会在被Servlet容器调用,就像人只能“出生”一次一样,init方法在一个Servlet实例中也只能被调用一次。
我们可以利用init()方法来执行相应的初始化工作。调用这个方法时,Servlet容器会传入一个ServletConfig对象进来从而对Servlet对象进行初始化。
2. service() Servlet服务方法
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//专门向客服端提供响应的方法
System.out.println("Servlet正在提供服务");
}
service() 方法是用来处理客户端请求的核心方法。当有请求到达时,Servlet容器会调用service() 方法来处理请求。
service() 方法接收两个参数:ServletRequest一个对象和ServletResponse一个对象。通过这两个对象,Servlet可以获取请求的信息并生成响应。
在service() 方法中,你可以根据请求的类型(GET、POST等)来执行相应的逻辑处理。例如,你可以读取请求参数、处理业务逻辑、生成响应内容等。
需要注意的是,每个请求都会创建一个新的线程来处理,因此方法应该是线程安全的,所以我们不能在Servlet实例里创建非状态型成员变量。
3. destory() Servlet销毁方法
public void destroy() {
System.out.println("Servlet正在销毁");
}
当要销毁Servlet时,Servlet容器就会调用这个方法,就如人一样,到时期了就得死亡。在卸载应用程序或者关闭Servlet容器时,就会发生这种情况。
destory()方法只会在Servlet实例被销毁时调用一次,而不是每次请求都会调用。所以我们在这个方法中释放所有的资源,以确保不会出现内存泄漏或资源泄漏的问题。
4.Servlet 的其它两个方法
getServletInfo( ),这个方法会返回Servlet的一段描述,可以返回一段字符串。
getServletConfig( ),这个方法会返回由Servlet容器传给init( )方法的ServletConfig对象。
Servlet实现方法
1. 实现Servlet接口
public class Test 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 {
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
Servlet接口中最重要的方法是service()方法。当客户端发送一个HTTP请求时,Servlet容器会调用Servlet的service()方法,并将请求和响应对象作为参数传递给该方法。在service()方法中,你可以根据请求的类型(GET、POST等)来执行相应的逻辑,并生成对应的HTTP响应。
除了方法,Servlet接口还定义了一些其他的方法,例如init()方法用于初始化Servlet,在Servlet被第一次加载时调用;destroy()方法用于销毁Servlet,在Servlet被卸载时调用。
2. 继承GenericServlet类
public class GServlet extends GenericServlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
}
}
GenericServlet类提供了Servlet接口的默认实现,并且还提供了一些其他的方法,用于处理Servlet的生命周期和初始化操作。
通过继承GenericServlet类,可以更方便地实现Servlet接口,并且可以重写其中的方法来实现自定义的逻辑。同时,由于GenericServlet类已经实现了Servlet接口的方法,所以在使用GenericServlet类时,只需要关注自定义的逻辑即可,而不需要再实现Servlet接口中的所有方法。
3. 继承HttpServlet类
public class HServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doGet(req, resp);
}
}
HttpServlet类是继承自GenericServlet类的一个子类。HttpServlet类专门用于处理基于HTTP协议的请求和响应。
HttpServlet类在GenericServlet类的基础上进行了扩展,添加了一些针对HTTP协议的特定方法和功能。例如,HttpServlet类提供了doGet()和doPost()等方法,用于处理GET和POST请求,并生成相应的HTTP响应。
通过继承HttpServlet类,我们可以更方便地实现基于HTTP协议的Servlet,并且可以重写其中的方法来实现自定义的逻辑。同时,由于HttpServlet类继承自GenericServlet类,所以也继承了GenericServlet类中的一些通用方法和功能。
4. Servlet请求映射的配置
映射配置在web.xml文件中
注意:在 <url-pattern>中的类名前要加/
<servlet>
<!--Servlet名称-->
<servlet-name>HelloServlet</servlet-name>
<!--类的全限定名-->
<servlet-class>com.jack.controller.HelloServlet</servlet-class>
</servlet>
<!--配置Servlet请求映射-->
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<!--Servlet请求映射-->
<url-pattern>/HelloServlet</url-pattern>
</servlet-mapping>
</servlet>
5. Servlet接口,GenericServlet类和HttpServlet类的继承体系