官方解说: Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。
通俗的讲,servlet是运行在web服务器如tomcat,jetty这样应用服务器上的一段程序,他可以响应http协议的请求,并且实现用户自己的逻辑,最终将结果返回到用户的客户端(浏览器)
我们先来看看如何实现一个Servlet,通常实现一个servlet需要如下几步,
这里我们以IDEA(专业版)为例
至此项目已经创建完毕,默认创建完毕的目录有 src,用来存放我们的java代码,web用来存放关于web的一些资源,web下面有WEB-INF和默认生成的index.jsp,WEB-INF目录下面有一个web.xml
访问 tomcat.apache.org/download-90… ,下载tomcat9,根据自己的系统下载对应的文件
下载下来后解压,等待下面配置使用
点击 Add Configuration
依次选择 + -> Tomcat Server - > Local
Tomcat基础信息配置完成之后,需要将当前项目配置到Tomcat中,切换到Deployment配置
切换到Deployment后,点击 右边的 + 号,选择 Artifact 添加当前项目的war包,或者点击下方的Fix添加war包
添加war包后,下方会有一个 Application context
路径配置,用来配置当前项目的路径名,也就是之前讲Tomcat时候webapps目录下的项目名称,所有这个项目下的servlet请求都需要在这个路径下来进行,比如我上面的配置,后续的请求就是 localhost:8080/servlet_demo_war_exploded/*
,必须加上/servlet_demo_war_exploded才能访问到当前项目
终于来到我们的正题了,编写一个servlet程序,按照Servlet规范,我们需要引入servlet-api这个jar包,然后继承HttpServlet这个类,并且重写对应的doGet和doPost方法。
servlet-api包在我们下载的解压tomcat的lib目录里面
在 web 目录下新建lib目录,将servlet-api.jar复制到新建的lib目录,右键servlet-api.jar ,点击 Add as Library... , OK即可
在src目录下新建DemoServlet,继承javax.servlet.http.HttpServlet,并且重写doGet,doPost方法
PrintWriter writer = resp.getWriter(); PrintWriter writer = resp.getWriter(); writer.print("this is servlet html"); writer.flush(); writer.close(); 复制代码
修改web/WEB-INF/web.xml文件,添加Servlet配置项
<servlet> <servlet-name>demoServlet</servlet-name> //定义servletname <servlet-class >com.muku.servlet.DemoServlet</servlet-class> //上面继承HttpServlet的class </servlet> <servlet-mapping> <servlet-name>demoServlet</servlet-name> //上面servlet-name <url-pattern>/*</url-pattern> //表示拦截所有请求 </servlet-mapping> 复制代码
servlet 定义一个Servlet servlet-name 为servlet命名 servlet-class 我们自己实现的servletclass类 servlet-mapping 定义servlet与请求的映射关系 url-pattern 配置拦截的请求路径,比如 /html/1 /html/2 ,/*表示拦截所有请求 servlet-name url-pattern中定义的拦截请求路径,由哪个servlet来处理 复制代码
总体的修改截图如下
启动我们配置好的tomcat,启动成功后会IDEA会自动打开浏览器,并且访问我们设置好的路径,不出意外的话就可以看到 , this is servlet html
至此,一个Servlet已经编写成功,并且可以成功访问了
上面编写一个Servlet我们需要修改web.xml,并且继承HttpServlet类才能实现一个Servlet,在Servlet3.0后提供了基于注解的方式来实现Servlet开发,话不多说,直接上代码
@WebServlet(name = "annotation",urlPatterns = "/*") public class AnnotationServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { PrintWriter writer = resp.getWriter(); writer.print("this is servlet html"); writer.flush(); writer.close(); } } 复制代码
直接在我们实现类的上面加入WebServlet这个注解即可
WebServlet注解主要有以下几个重要属性
每当有一个http请求过来,就会将当前http请求的信息封装为一个HttpServletRequest对象,并且通过doGet,doPost等方法当作入参传入,HttpServletRequest有如下几个常用方法
每当有一个http请求过来,就会将当前http返回的信息封装为一个HttpServletResponse对象,我们可以通过设置resonse的属性来返回相对应的数据,HttpServletRequest有如下几个常用方法
ServletConfig是servlet级别的,每个servlet都有一些自己的属性,包括名称,初始化参数等等,这些属性在每个servlet之间是独有,这些属性的集合就是用ServletConfig对象来表示的
一个web应用在启动时会创建一个ServletContext对象,表示web应用的上下文,可以用来配置读取当前应用的全局配置,servlet之间通过servletContext对象来进行通信,servletContext对象可以通过servletConfig对象来获取
Servlet的生命周期设计到servlet从创建到被销毁,主要包括如下过程
Init方法在servlet的生命周期中只在创建时被调用且只被调用一次,一般用于一些初始化操作,如初始化连接池,连接数据库等等
service方法是在处理http请求时的重要方法,每当新来一个http请求时,服务端就会产生一个新的线程来处理这个请求,然后经过service方法来进行处理,service会根据当前请求的方法类型来调用doGet,doPost等方法,这些方法又会被我们重写,所以每个请求真正被处理的其实还是我们重写的逻辑
destroy方法只会在Servlet生命周期结束时被调用,主要用来做一些结尾性的操作,比如关闭数据库的连接池,清空内存写入等等