Servlet创建的时机
默认情况下是当第一次访问servlet(在浏览器中访问)的时候去创建servlet
当init()的内容比较多时,在初始化时希望访问数据库来加载一些数据,但过程比较耗时,就一直在执行init()方法,所以在第一次访问时创建就不太合适了,所以,此时希望servlet在服务器启动时就创建来节省时间:
在配置文件web.xml中:设置当服务器启动时就加载:(创建servlet)
<load-on-startup>2</load-on-startup>从2开始起,1已经被默认的servlet占用了
数字的含义:启动的顺序
servlet创建的方式
创建一个servlet有3种方式:
1) 采用实现servlet接口, (不推荐)
2) 采用继承GenericServlet类(不推荐)
抽象类
处理所有的协议
默认调用带参的init()方法,当没写带参的时候,会调用无参的:
因为是继承,把父类中的带参的init()方法继承过来了,而父类的init()中又调用了无参的init()
即父类中带参的init方法调用了无参的方法init(),调用的这个无参的方法是自己写的,不是父类中的(父类的无参什么都没做)。子类(即自己写的)重写了父类中的无参的
所以在创建时可以写带参的,也可以写无参的,当需要用到ServletConfig对象时(init方法中的参数),就写带参的,不需要时就写无参的。
import java.io.IOException;
import javax.servlet.GenericServlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
//演示如何创建servet对象
public class ServletDemo4 extends GenericServlet {
@Override
public void init() throws ServletException {
System.out.println("我是无参的init方法");
}
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("我是带参的init方法");
}
@Override
public void service(ServletRequest arg0, ServletResponse arg1)
throws ServletException, IOException {
// TODO Auto-generated method stub
}
}
3) 采用继承HttpServlet(推荐)
继承于HttpServlet(为GenericServlet的子类)
HttpServlet里面的service方法做了一个转发的动作
通常在类里写doGet方法来处理页面上的get请求
实际上是service方法把这个请求转发过来,所以在访问servlet的时候,其实调用的是service方法:
service方法起了转发的作用,把请求分别转发到doGet和doPost,根据请求的方式。
所以在继承HttpServlet时,doGet和doPost两个方法都会写上。
通常只在doGet方法中写,再在doPost方法中调用doGet方法就可以了。
此种方式不能重写service方法,重写了的话,就不会执行doGet和doPost方法,就不会有转发的这个动作了
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//创建servlet的第三种办法(继承httpServlet) : 此类中的service方法是做了一个转发的动作。
public class ServletDemo5 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doGet(req, resp) ;
}
}