Servlet入门看这一篇就够了

Servlet是什么

官方解说: Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。

通俗的讲,servlet是运行在web服务器如tomcat,jetty这样应用服务器上的一段程序,他可以响应http协议的请求,并且实现用户自己的逻辑,最终将结果返回到用户的客户端(浏览器)

如何实现一个Servlet

我们先来看看如何实现一个Servlet,通常实现一个servlet需要如下几步,

创建项目

这里我们以IDEA(专业版)为例

  1. File -> new -> Project

在这里插入图片描述

  1. 左侧栏选择Java,右侧Project SDK 选择自己的jdk,没有的话需要自己new添加以下, 框中需要勾选 Web Application ,表示我们创建的是一个Servlet项目

在这里插入图片描述

  1. 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 我们自己实现的servletclassservlet-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生命周期结束时被调用,主要用来做一些结尾性的操作,比如关闭数据库的连接池,清空内存写入等等

猜你喜欢

转载自juejin.im/post/5e9a8e9c6fb9a03c6f670a38