本文用的是idea2019.3.3,maven与tomcat都配置好的情况下完成的这里多提一句,maven是用来管理项目的,可以对项目进行管理和构建,Tomcat就是文中提到的Servlet容器
一,Servlet概述
Servlet是用java编写的运行在服务器的程序。主要用于处理客户端传来的HTTP请求,主要功能在于交互式地动态浏览和生成数据,生成动态的web内容在使用Servlet的时候需要导入javax.servlet的jar包。
Servlet由Servlet容器提供(指Tomcat),Servlet容器是指提供Servlet功能的服务器。
如图所示,客户端先发出请求,然后Http服务器解析静态的HTML页面,对于Servlet的请求就转交给Servlet容器,Servlet容器根据web.xml文件中的映射关系调用响应的Servlet,然后Servlet将调用的返回给Servlet容器,并通过Http响应传给客户端。
二、如何添加依赖
(1)添加Servlet依赖
俩个都要添加在pom.xml中
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
(2)添加jsp依赖
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
</dependency>
三、Servlet入门
(1)Servlet的接口
在Servlet技术开发中,最重要是的javax.servelet.Servlet。在Servlet中定义了5个抽象的办法。
值得一提的是表中的Init(),service(),destroy()可以表示Servlet的生命周期,所以是在特定的时候被调用。
getServletInfo返回的是Servlet的相关信息,getServlet返回的ServletConfig对象包含了Servlet的初始化信息,
(2)实现类
Servlet接口的实现类有俩个,分别为GenericServlet和HttpServlet
平时在开发中用的多为HttpServlet,因为GenericServlet是个抽象类,没有办法实现Http处理请求,HttpServlet是GenericServlet的子类,不仅继承了GenericServlet的所以操作办法还可以为Http请求中的POST和GET提供具体的操作办法。
所以Servlet有三种实现方式:
(1)直接实现
(2)继承GenericServlet
(3)继承HttpServlet
但是直接实现Servlet来编写很不方便,所以需要通过继承来实现
public class hellotest extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter a = resp.getWriter();//创建一个输出流PrinterWriter对象,servlet使用输出流来响应
a.println("hello");
}
}
运行结果如下:
三、Servlet的生命周期
按照功能不同Servlet的生命周期可以分为三个阶段。
(1)初始化阶段
客户端想Servlet容器发出Http请求要求访问Servlet时,Servlet容器首先会解析请求,然后先检查内存中是否有Servlet对象,有就直接调用init()实现Servlet的初始化,没有就创建,记住了init()在整个生命周期内只能调用一次。
(2)运行阶段
这个整个生命周期内最重要的阶段,Servlet容器会为Http请求创建HttpServletRequest对象,会为Http响应创HttpServletResponse对象。然后作为参数传给Service方法。在整个生命周期内对于Servlet的每一次访问请求Servlet容器都会调用一个Service方法,并创建新的HttpServletRequest和HttpServletResponse对象。
也就是Service方法在整个生命周期内会被调用很多次。
(3)销毁阶段
Servlet随着Web应用的销毁而销毁,Servlet容器会先调用destroy方法,与Init()方法一样,destroy()在生命周期中也只被调用一次。
如代码所示:
@WebServlet("/add")
public class tete extends HttpServlet {
@Override
public void init() throws ServletException {
System.out.println("init");
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("hello");
}
@Override
public void destroy() {
System.out.println("destory");
}
}
如图为输入结果
当服务被关闭的时候显示结果如下。
当我们刷新多次浏览器的时候
会重复多次的输出hello,也就证明了每次都要调用一次Service()。