Servlet是什么
官方解说: Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。
通俗的讲,servlet是运行在web服务器如tomcat,jetty这样应用服务器上的一段程序,他可以响应http协议的请求,并且实现用户自己的逻辑,最终将结果返回到用户的客户端(浏览器)
如何实现一个Servlet
我们先来看看如何实现一个Servlet,通常实现一个servlet需要如下几步,
创建项目
这里我们以IDEA(专业版)为例
- File -> new -> Project
- 左侧栏选择Java,右侧Project SDK 选择自己的jdk,没有的话需要自己new添加以下, 框中需要勾选 Web Application ,表示我们创建的是一个Servlet项目
- next 填写 Project name , Project location , 然后 finish
至此项目已经创建完毕,默认创建完毕的目录有 src,用来存放我们的java代码,web用来存放关于web的一些资源,web下面有WEB-INF和默认生成的index.jsp,WEB-INF目录下面有一个web.xml
下载Tomcat
访问 tomcat.apache.org/download-90… ,下载tomcat9,根据自己的系统下载对应的文件
下载下来后解压,等待下面配置使用IDEA中配置Tomcat
点击 Add Configuration
依次选择 + -> Tomcat Server - > Local
- ① 配置本地tomcat,配置下上面下载的tomcat
- ② 默认启动后打开浏览器
- ③ 默认启动后打开浏览器的地址
- ④ 设置启动VM参数
- ⑤ 设置Tomcat所用的JDK
- ⑥ 设置Tomcat显示的名称
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规范,我们需要引入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
上面编写一个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注解主要有以下几个重要属性
- name 表示当前servlet的名称,与之前wem.xml中的servlet-name相对应
- urlPatterns 表示当前servlet处理的请求路径映射
- initParams 表示servlet初始化配置
Servlet中重要的几个对象
HttpServletRequest
每当有一个http请求过来,就会将当前http请求的信息封装为一个HttpServletRequest对象,并且通过doGet,doPost等方法当作入参传入,HttpServletRequest有如下几个常用方法
- getHeader 获取请求头的头部信息
- getCookies 获取当前请求的cookie信息
- getMethod 获取当前请求方法类别 Get Post
- getQueryString 获取当前请求参数的kv串 k1=v1=&k2=v2
- getRequestURI 获取当前请求路径 /servlet/a
- getRequestURL 获取当前请求的总路径,包含域名协议 http://localhost:8080/servlet/a
- getSession 获取当前请求的session信息
- getParameter 获取请求参数中对应key的value
HttpServletResponse
每当有一个http请求过来,就会将当前http返回的信息封装为一个HttpServletResponse对象,我们可以通过设置resonse的属性来返回相对应的数据,HttpServletRequest有如下几个常用方法
- addCookie 添加cookie,可以向当前http请求设置cookie,在下次请求的时候会携带回来
- sendRedirect 重定向到指定请求地址,code会被设置为302
- addHeader 设置返回的头部数据
- setStatus 设置相应的状态码,常见的状态码包含200 302 405 500等等
- setContentType 设置相应数据的格式,比如常见的有text/html,text/javascript , text/css , application/json 等等,浏览器会根据contentType来渲染对应的数据
- getWriter 重要方法,获取输出流对象,可以通过write方法来向页面输出内容,比如上面写到的 this is servlet html
ServletConfig
ServletConfig是servlet级别的,每个servlet都有一些自己的属性,包括名称,初始化参数等等,这些属性在每个servlet之间是独有,这些属性的集合就是用ServletConfig对象来表示的
- getServletName 获取当前servlet名称
- getServletContext 获取ServletContext对象,每个web应用都有且仅有一个ServletContext对象,
- getInitParameter 获取servlet初始化配置的参数信息
- getInitParameterNames 获取servlet所有初始化配置信息的名称集合
ServletContext
一个web应用在启动时会创建一个ServletContext对象,表示web应用的上下文,可以用来配置读取当前应用的全局配置,servlet之间通过servletContext对象来进行通信,servletContext对象可以通过servletConfig对象来获取
- get/set Attribute 设置获取servlet全局属性
- getAttributeNames 获取所有属性的名称集合
- addServlet 添加Servlet
- addFilter 添加过滤器
- addListener 添加监听器
Servlet的生命周期
Servlet的生命周期设计到servlet从创建到被销毁,主要包括如下过程
- 调用init方法进行初始化操作
- 调用service方法处理请求,根据请求方法调用对应的doGet doPost doPut等方法
- 调用destroy方法销毁
Init
Init方法在servlet的生命周期中只在创建时被调用且只被调用一次,一般用于一些初始化操作,如初始化连接池,连接数据库等等
Service
service方法是在处理http请求时的重要方法,每当新来一个http请求时,服务端就会产生一个新的线程来处理这个请求,然后经过service方法来进行处理,service会根据当前请求的方法类型来调用doGet,doPost等方法,这些方法又会被我们重写,所以每个请求真正被处理的其实还是我们重写的逻辑
destroy
destroy方法只会在Servlet生命周期结束时被调用,主要用来做一些结尾性的操作,比如关闭数据库的连接池,清空内存写入等等