这一章我们不深究Servlet是什么,我们来讲讲Servlet有什么。首先先新建一个class,继承HttpServlet,然后重写Servlet生命周期的三个重要方法。
package com.hxl.servlet;
import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class FirstServlet extends HttpServlet {
@Override
public void init(ServletConfig config) throws ServletException {
// TODO Auto-generated method stub
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
}
@Override
public void destroy() {
// TODO Auto-generated method stub
}
}
首先说一下init(ServletConfig config)方法,该方法在整个servlet生命周期中只会运行一次,所以通常用来做一些变量的初始化工作,那么,init(ServletConfig)方法到底在什么时候运行呢?方法包含一个ServletConfig对象,那么ServletConfig到底是什么东西呢?
我们不妨看看它有什么方法:
我们不难发现,它包含的方法很少,从红色方框中我们很容易就能猜到,第一个是根据参数名拿到参数值,第二个是拿到全部参数名称,我们来看看第三个,该方法会返回一个ServletContext对象,不仔细看,一眼还以为它和SercletConfig是同名呢。那么,ServletConfig和ServletContext的区别是什么?
首先,它们作用域不同,ServletConfig的作用域是Servlet,ServletContext作用域是整个项目。一个项目可以有多个Servlet,每个Servlet有一个ServletConfig,但是所有的Servlet共享一个ServletContext。
其次,ServletContext有setInitParameter()方法,我们可以在任意能获取到ServletContext的地方()对其进行设置值,但是ServletConfig没有,也就是说ServletConfig不能手动设置值,那么,问题来了,我们怎么对其设置值?
要回答以上的问题,我们先看看web.xml
testWeb
index.jsp
first
com.hxl.servlet.FirstServlet
name
hxl
1
first
/first/*
name
root
这里我们先做一个简单的理解:
问题1:init(ServletConfig)方法什么时候执行?
答:当servlet设置
延伸问题:
答:只要是大于0并且在int最大值范围内的数都可以,数字的大小不影响初始化顺序
问题2:怎么设置ServletConfig和ServletContext的值?
答:ServletConfig:在
ServletContext:在
问题3:ServletConfig和ServletContext有什么用?
答:存放变量。所有的Servlet都能访问ServletContext,只能单独访问各自的ServletConfig,知道这个就能知道什么变量该存放到什么地方。这时候你会想到:我定义一个Constant类,里面的变量都是public static 修饰的,照样能实现ServletContext的作用啊......确实,在开发中,这样也可以
==================分割线=======================
接下来我们看service()方法,我们可以看到两个变量,分别是HttpServletRequest和HttpServletResponse。那么,service方法什么时候会调用?HttpServletRequest和HttpServletResponse又是怎么得到的?
首先,当浏览器发出一个请求时,服务器就会创建一个新的线程,并初始化一个HttpServletRequest和HttpServletResponse对象,并把请求的信息设置到HttpServletRequest对象中,之后会执行service方法,将两个对象传递到service()方法中。所以,每有一次请求,就会调用一次service方法
destroy()方法就更不用说了,当服务器关闭时,会调用destroy()方法。
这一章我们不再过多的讲述HttpServletRequest和HttpServletResponse过多的知识点,后面会结合session和cookie再深入讨论。
后记:如果本文中有什么说得不对的地方,欢迎指正交流,将不胜感激~~~