Servlet的三种创建方式
什么是Servlet
Servlet是JavaWeb的三大组件之一,它属于动态资源。Servlet的作用是处理请求,服务器会把接收到的请求交给Servlet来处理,在Servlet中通常需要:
- 接收请求数据;
- 处理请求;
- 完成响应。
例如客户端发出登录请求,或者输出注册请求,这些请求都应该由Servlet来完成处理!Servlet需要我们自己来编写,每个Servlet必须实现javax.servlet.Servlet接口。
Servlet的生命周期
所谓xxx的生命周期,就是说xxx的出生、服务,以及死亡。Servlet生命周期也是如此!与Servlet的生命周期相关的方法有:
- void init(ServletConfig);
- void service(ServletRequest,ServletResponse);
- void destroy();
Servlet在第一次请求的时候,由Tomcat来创建, 马上调用init()方法, 用户每请求一次,都会调用一次service(),
当服务器关闭之前, 先销毁Servlet, 在销毁Servlet之前,调用destroy()方法.
实现Servlet有三种方式:
- 实现javax.servlet.Servlet接口;
- 继承javax.servlet.GenericServlet类;
- 继承javax.servlet.http.HttpServlet类;(推荐)
第一种方式: 实现javax.servlet.Servlet接口
1) 编写一个类实现Servlet接口
2) 在web.xml文件中,对Servlet进行配置, 绑定url
3) 访问:http://服务器ip:服务器端口/项目名/servlet的url
访问这个servlet的url:http://localhost:8888/les02/hello
Servlet是一个线程不安全的, Tomcat会为每一次请求创建一个线程, 我们web项目是一个多线程的项目
默认情况: Servlet的创建是在第一次请求这个Servlet的时候,创建, 为了Tomcat启动快, 从用户角度来看: 第一个访问的用户耗时多一点, 耗费创建Servlet的时间, 第一次惩罚
Tomcat:第一步判断这个Servlet类有没有创建对象如果对象。
直接通过这个类的对象调用service0方法处理用户请求
如果没有: Tomcat先创建这个类的对象,然后通过对象调用service()
第二种方式: 继承GenericServlet类
GenericServlet这个类是Servlet的一个实现类, 它是一个抽象类, service()没有重写
第三种方式: 继承HttpServlet类 (推荐)
HttpServlet是GenericServlet的子类, 也是一个抽象类
1) 编写一个类继承HttpServlet, 重写doGet()以及doPost()
doGet() 处理Get请求
doPost() 处理Post请求
2) 在web.xml中配置Servlet
Servlet接口相关类型
在Servlet接口中还存在三个我们不熟悉的类型:
- ServletRequest:service() 方法的参数,它表示请求对象,它封装了所有与请求相关的数据,它是由服务器创建的;
- ServletResponse:service()方法的参数,它表示响应对象,在service()方法中完成对客户端的响应需要使用这个对象;
- ServletConfig:init()方法的参数,它表示Servlet配置对象,它对应Servlet的配置信息,那对应web.xml文件中的<servlet>元素。
ServletRequest对象常用的方法: getParamenter(String name) 获取请求参数, 通过请求参数名获取请求参数的值
ServletResponse对象常用的方法: getWriter() / getOutputStream() 响应对象方法: 后台把数据响应给前端, 使用输出流 (两个流只能选一个)
ServletConfig对象常用的方法: 获取指定的Servlet的配置信息,每一个Servlet都有自己的配置信息,
@Override public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { //获取请求参数 String name = req.getParameter("name"); System.out.println("前端传递的参数name的值:"+name); //给客户端响应: 响应到客户端浏览器上 类似于js, document.write() //得到响应输出流 res.getWriter().write("<h1>hello client</h1>"); //获取Servlet初始化参数 String servletName = config.getServletName(); String encoding = config.getInitParameter("encoding"); String age = config.getInitParameter("age"); res.getWriter().print("<h1>"+servletName+","+encoding+","+age+"</h1>"); }
- getServletContext() :获取ServletContext对象
- getServletName() : 获取Servlet的name
- getInitParament(String name) : 获取Servlet的初始化参数(在<servlet>中配置的参数)
- getInitParaments() : 获取Servlet请求参数所有的name的值,返回的是一个集合,
HttpServlet调用源码分析
三种创建方式的关系可用下图表示: