<servlet>
<servlet-name>HelloServletservlet-name>
<servlet-class>com.gem.servlet.HelloServletservlet-class>
<load-on-startup>1load-on-startup>
servlet>
<servlet-mapping>
<servlet-name>HelloServletservlet-name>
<url-pattern>/hellourl-pattern>
servlet-mapping>
@WebServlet(name = "HelloServlet",urlPatterns = "/hello") //1.第一种
@WebServlet(name = "HelloServlet", urlPatterns = "/Hello", loadOnStartup = 1, initParams = {
@WebInitParam(name = "username", value = "root"), @WebInitParam(name = "password", value = "123456") }) //2.第二种
@WebServlet("/hello") //3.第三种
1.创建对象,调用构造方法 (多线程安全)
默认情况下,当第一次访问到达服务器时,将调用构造方法创建对象,且只创建一次(单例)。
可以通过配置 load-on-startup 来调节 Servlet 的创建时机,loadOnStartup 表示 Servlet 的创建时间,正数表示服务器启动时就创建对象,值越小,越优先创建,0表示不在乎创建顺序,负数表示默认情况,表示当第一次访问到达时创建。
public class HelloServlet extends HttpServlet {
private static final long serialVersionUID = 5421250232115386554L;
public HelloServlet() {
}
2.初始化 (多线程安全)
当调用完构造方法创建 Servlet 对象后,紧接着调用 init 初始化方法,init 方法一般用于初始化数据,执行费时费力的重量级代码,还可以通过 xml 或者注解方式配置初始化参数,然后通过 ServletConfig 对象来获取初始化参数。
注意:
Servlet 顶级接口中的 init(ServletConfig config) 是带参数的。
但是在 HttpServlet 中,重写了 init(ServletConfig config),并且追加了一个 init() 空参方法,这样我们在重写时就可以简单的重写 init() 方法即可。
@Override
public void init() throws ServletException {
//Servlet初始化参数对象
ServletConfig config = getServletConfig();
//在XML或者注解中配置初始化参数,在此处进行提取
String username = config.getInitParameter("username");
System.out.println(username);
String password = config.getInitParameter("password");
System.out.println(password);
}
3.服务方法 (多线程非安全)
如果有必要的话,需要进行线程同步,保证多线程并发安全。
注意:
HttpServlet 对 service() 方法进行大量的细化,分成了各种服务方法。
例如:doGet() , doPost() , doDelete() , doPut() …
如果访问时,方式选择错误,则抛出错误码 405,请求方式错误。
doGet —— 浏览器地址栏敲回车,超链接页面跳转,form 表单提交 method=get
doPost —— form 表单提交 method=post
如果不清楚到底用哪种方式访问,那么可以:
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
4.销毁 (多线程安全)
当卸载应用或服务器关闭时,服务器会调用 destory() 方法销毁当前Servlet的实例,一般用于释放资源,只执行一次。
注意:
如果当前 Servlet 实例没有提供任何服务,则可以被销毁。
如果当前 Servlet 实例正在提供服务,则调用 destory() 方法时,会等待一段时间,超时后再销毁。
@Override
public void destroy() {
}
}