程序员初级秘籍之servlet快速入门

servlet

知识索引

  • servlet介绍

  • servlet入门

  • servlet进阶

  • servlet案例

1 servlet简介

Servlet 运行在服务端(tomcat)的Java小程序,是sun公司提供一套规范. Servlet可以和其他资源(文件、数据库、Applet、Java应用程序等)交互,以生成返回给客户端的响应内容。

1.1 servlet的作用

servlet接口就是处理网络请求的一套规范,他负责连接web服务器(如tomcat服务器),交互式的生成动态的web内容,用来接收客户端请求信息、处理客户端请求、响应给浏览器的动态资源。它的实质就是java代码,通过java的API动态的向客户端输出内容

2 servlet入门案例

2.1 案例说明

在IDEA编写Servlet,发布到Tomcat. 在浏览器输入路径请求, 控制台打印Hello servlet

2.2 工程搭建

我们先创建一个maven工程,不知道maven是什么的可以看一下我文章的maven篇,进行一个快速入门学习

1)工程创建
创建maven工程,坐标如下:

<groupId>com.itmentu</groupId>
<artifactId>servlet-01</artifactId>
<version>1.0-SNAPSHOT</version>

2)pom.xml

<dependencies>
    <!--单元测试-->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    <!--servlety依赖-->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
      <scope>provided</scope>
    </dependency>
    <!--jsp依赖-->
    <dependency>
    <groupId>javax.servlet.jsp</groupId>
    <artifactId>jsp-api</artifactId>
    <version>2.1</version>
    <scope>provided</scope>
  </dependency>
  </dependencies>

3)web.xml配置(该文件在web/WEB-INF 文件夹下)

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
		  http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
           version="2.5">

    <!--配置Servlet-->
    <servlet>
        <!--servlet-name: 名字 随便取; 一般就是类名-->
        <servlet-name>ServletDemo01</servlet-name>
        <!--servlet-class:Servlet这个类的全限定名-->
        <servlet-class>com.itmentu.web.ServletDemo01</servlet-class>
    </servlet>
    <servlet-mapping>
        <!--servlet-name: 必须和servlet标签里面的servlet-name一样-->
        <servlet-name>ServletDemo01</servlet-name>
        <!--url-pattern: 配置访问的路径-->
        <url-pattern>/demo01</url-pattern>
    </servlet-mapping>

</web-app>

2.3 案例实现

com.itmentu.web包下创建一个类实现Servlet接口

package com.itmentu.web;

import javax.servlet.*;
import java.io.IOException;

/**
 * Servlet配置文件方式使用:
 *  1.创建一个java类实现Servlet接口
 *  2.在web.xml中配置Servlet  【Servlet作为一个动态资源 配置Servlet的请求地址】
 */
public class ServletDemo01 implements Servlet {

    //初始化
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }

    //获取ServletConfig对象
    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    //服务
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("ServletDemo01...");
    }

    //获取Servlet信息
    @Override
    public String getServletInfo() {
        return null;
    }

    //销毁
    @Override
    public void destroy() {

    }
}

2.4 测试

我们按照我们第二章的方式进行发布即可,我们输入http://localhost:8080/可以看到如下页面证明启动成功

image-20211226121517358

访问servlet http://localhost:8080/demo01,控制台打印,即为成功

2.5 注解方式实现

com.itmentu.web包下创建一个类实现Servlet接口, 添加注解@WebServlet

@WebServlet("/demo02")
public class ServletDemo02 implements Servlet {
    /**
     * 服务
     * @param servletRequest
     * @param servletResponse
     * @throws ServletException
     * @throws IOException
     */
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("hello...");
    }
}

访问http://localhost:8080/demo02控制台打印,即为成功

3 Servlet的生命周期

所谓生命周期就是一个对象从创建销毁的过程,Servlet的生命周期就是servlet出现到销毁的全过程

3.1 Servlet生命周期方法

Servlet接口

public interface Servlet {
    void init(ServletConfig var1) throws ServletException;

    ServletConfig getServletConfig();

    void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;

    String getServletInfo();

    void destroy();
}

重要方法解析

Servlet 通过调用 init ()方法进行初始化。

Servlet 调用 service()方法来处理客户端的请求。

Servlet 通过调用 destroy()方法终止(结束)。

3.1.1 init() 方法

在来了第一次请求时, 会调用init()方法进行初始化,它只调用一次。它在第一次创建 Servlet 时被调用,在后续每次用户请求时不再调用。因此,它是用于一次性初始化。

Servlet 创建于用户第一次调用对应于该 Servlet 的 URL 时,但是您也可以指定 Servlet 在服务器第一次启动时被加载。

当用户调用一个 Servlet 时,就会创建一个 Servlet 实例,每一个用户请求都会产生一个新的线程,适当的时候移交给 doGet 或 doPost 方法。init() 方法简单地创建或加载一些数据,这些数据将被用于 Servlet 的整个生命周期。

init 方法的定义如下:

public void init() throws ServletException {
  // 初始化代码...
}

3.1.2 service() 方法

每次请求 都会调用service()方法处理这个请求,即每次服务器接收到一个 Servlet 请求时,服务器会产生一个新的线程并调用服务。service() 方法检查 HTTP 请求类型(GET、POST、PUT、DELETE 等),并在适当的时候调用 doGet、doPost、doPut,doDelete 等方法。

init 方法的定义如下:

public void service(ServletRequest request, ServletResponse
response) throws ServletException, IOException{
}

3.1.3 destroy() 方法

destroy() 方法只会被调用一次,在 Servlet 生命周期结束时被调用。在调用 destroy() 方法之后,servlet 对象被标记为垃圾回收。

destroy()方法的定义如下:

public void destroy() {
}

4 Servlet体系结构

image-20210417154121516

我们创建一个类实现sevlet接口,必须实现接口的所有方法,但是,在servlet中,真正执行程序逻辑的是service,对于servlet的初始化和销毁,由服务器调用执行,开发者本身不需要关心,官方推荐使用继承的方式,继承GenericServlet 或者HttpServlet来实现接口。

4.1 GenericServlet 类

我们来使用GenericServlet 创建servlet:

步骤

1. 创建一个类
2. 继承GenericServlet
3. 重写service方法

创建一个类,去继承GenericServlet,重写Service方法

@WebServlet("/demo03")
public class ServletDemo03 extends GenericServlet {
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("ServletDemo03...");
    }
}

GenericServlet已经简化了servlet开发,但是我们平时开发程序需要按照一种互联网传输数据的协议来开发程序——http协议,所以推荐使用HttpServle

4.2 HttpServlet接口

继承HttpServlet,我们需要重写doGet、doPost等方法中一个即可,根据Http不同的请求,我们需要实现相应的方法。

我们来使用HttpServlet创建servlet:

1. 创建一个类
2. 继承HttpServlet
3. 重写doGet、doPost方法

由于目前web通信都基于Http 所以今后创建Servlet类 都会继承HttpServlet

@WebServlet("/demo04")
public class ServletDemo04 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //只处理get方式请求
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //只处理post方式请求
        System.out.println("ServletDemo04...");
    }
}

HttpServlet是GenericServlet的子类,它增强了GenericServlet一些功能,所以我们推荐使用HttpServlet

5 ServletContext

5.1 ServletContext介绍

当WEB服务器启动时,会为每一个WEB应用程序(webapps下的每个目录就是一个应用程序)创建一块共享的存储区域。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K2md3BVt-1649871657530)(https://itmentu.oss-cn-shenzhen.aliyuncs.com/itmentu/1639816273(1)].jpg?Content-Type=image/jpg)

ServletContext是一个全局对象, 服务器会给每一个项目(工程)都创建一个ServletContext对象, 属于整个项目的, 不局限于某个Servlet ServletContext我们就可以将它理解为整个应用application。ServletContext在WEB服务器启动时创建,服务器关闭时销毁。

5.2 ServletContext作用

一般来我们在这些地方会用到它

1.作为域对象存取数据,让Servlet共享
2.获得文件mini类型(文件上传和下载)
3.获得全局初始化参数
4.获取web资源路径 

5.2.1 作为域对象存取值
  1. 域对象:对象有个范围可以存储数据

  2. ServletContext域对象范围:整个应用

  3. API

     getAttribute(String name) ;向ServletContext对象的map取数据
     setAttribute(String name, Object object) ;从ServletContext对象的map中添加数据
     removeAttribute(String name) ;根据name去移除数据
    
  4. 代码

@WebServlet("/demo06")
public class ServletDemo06 extends GenericServlet {
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {

    //使用ServletContext对象存储数据   可以在整个应用中进行共享【在每个Servlet中都能获取到】
        ServletContext servletContext = this.getServletContext();
        servletContext.setAttribute("name","shuaige");

        System.out.println("ServletDemo06...");
    }
}

@WebServlet("/demo08")
public class ServletDemo08 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取ServletContext中共享的数据
        Object name = this.getServletContext().getAttribute("name");
        System.out.println("ServletDemo08-name = " + name);
        //移除ServletContext中共享的数据
        this.getServletContext().removeAttribute("name");

        System.out.println("ServletDemo08...");
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

5.2.2 获得文件mini类型
  1. API :获得文件mini类型

    getMimeType(String file) 
    
  2. 代码

@WebServlet("/demo07")
public class ServletDemo07 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //只处理get方式请求
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.获取文件的MIME类型
        String file1 = "a.mp3";
        String file2 = "b.mp4";

        String mimeType1 = servletContext.getMimeType(file1);
        String mimeType2 = servletContext.getMimeType(file2);
        System.out.println("mimeType1 = " + mimeType1);
        System.out.println("mimeType2 = " + mimeType2);

        System.out.println("ServletDemo07...");
    }
}

5.2.3 获得全局初始化参数
String getInitParameter(String name) ; //根据配置文件中的key得到value; 

在web.xml配置

    <context-param>
        <param-name>aaa</param-name>
        <param-value>bbb</param-value>
    </context-param>

通过ServletContext来获得

 //获取全局初始化参数
 String akey=ServletContext.getInitParameter("aaa");
 System.out.println(akey);

5.2.4 获取web资源路径
  1. API:获取web资源路径

    String  getRealPath(String path);根据资源名称得到资源的绝对路径.
    getResourceAsStream(String path) ;返回指定路径文件的流
    注意: filepath:直接从项目的根目录开始写
    
  2. 代码

@WebServlet("/demo07")
public class ServletDemo07 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //只处理get方式请求
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //3.获取web目录下资源的真实路径
        String realPath = servletContext.getRealPath("a.txt");
        System.out.println("realPath = " + realPath);

        //4.获取web目录下的资源文件输入流  【重要,加载读取文件】 注意:使用ServletContext对象获取输入流的资源文件一定要在web目录下
        InputStream is = servletContext.getResourceAsStream("a.txt");
        BufferedReader br = new BufferedReader(new InputStreamReader(is,"UTF-8"));
        String line = null;
        while((line=br.readLine())!=null){
            System.out.println(line);
        }
        br.close();

        System.out.println("ServletDemo07...");
    }
}

6 统计网站被访问的总次数

6.1 需求

img/

  • 在页面中显示您是第x位访问的用户.

6.2 思路分析

image-20210105143107889

  1. 创建web项目,创建两个Servlet CountServlet和ShowServlet 使用ServletContext存储网站访问的次数

  2. 编写CountServlet

    //计数  记录网站访问人数
    //1.获取当前访问次数 +1 
    
  3. 编写ShowServlet

    //显示  显示你是当前第几位访问用户
    //1.获取当前访问次数  然后显示
    

6.3 代码实现

  • CountServlet
/**
 * 记录用户访问次数
 * 用户访问次数存在ServletContext对象中  实现数据共享
 */
@WebServlet("/count")
public class CountServlet extends HttpServlet {

    @Override
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        //设置第一次访问之前 访问次数为0   
        config.getServletContext().setAttribute("count",0);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.获取之前的访问次数 
        ServletContext servletContext = this.getServletContext();
        Integer count = (Integer) servletContext.getAttribute("count");
        //2.将访问次数+1 
        count++;
        //3.将新的访问次数重新存入到ServletContext对象中
        servletContext.setAttribute("count",count);

        response.getWriter().print("Welcome...");
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}
  • ShowServlet
@WebServlet("/show")
public class ShowServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.获取访问次数 
        Object count = this.getServletContext().getAttribute("count");
        //2.显示  你是第几个访问的用户
        // 解决响应中文乱码问题
        response.setContentType("text/html;charset=UTF-8");
        response.getWriter().print("你是第"+count+"个访问的用户");
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值