Smart Tomcat + Servlet API的应用

news2024/11/29 22:51:35

文章目录

  • 前言
  • 一、Smart Tomcat
  • 二、Servlet API
    • 1.HttpServlet
      • (1)方法
      • (2)描述servlet的生命周期
      • (3)案例
    • 2.HttpServletRequest
      • (1)方法
      • (2)代码示例
        • 打印请求信息
        • 获取get请求的参数
        • 获取post请求的参数
          • 方法一:body采用form表单格式
          • 方法二:body采用JSON格式
          • postman下载安装及构造数据
          • 方法三:引入Jackson库,进行JSON解析
    • 3.HttpServletResponse
      • (1)方法
      • (2)代码示例
        • 设置状态码
        • 自动重刷线
        • 重定向


前言

每一个项目都进行打包用起来过于的繁琐,为了更加便捷的使用,将Tomcat嵌入到idea中进行使用更加的方便,本篇文章记录了将Tomcat嵌入到idea中的方法以及为了更好的使用servlet介绍了servlet的API。


一、Smart Tomcat

上一篇文章讲述了安装Tomcat的过程,由于我使用的idea的社区版不能直接使用Tomcat,为了把Tomcat嵌入到idea中使用,于是通过在idea中下载插件Smart Tomcat,如下过程。
(1)打开idea,在左上角的File->Settings->Plugings->Marketplace中搜索Smart Tomcat进行安装。
在这里插入图片描述
在这里插入图片描述
(2)使用的时候就不需要再像上一篇文章介绍的手动打包项目到webapps下进行使用了,这里的Tomcat是针对当前.java进行使用的,所以所要在运行环境那个配置content-path,相当于你当时打包的包名。
在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述

二、Servlet API

为了更好的了解以及使用servlet,这里详细记录了servlet的api。

1.HttpServlet

(1)方法

方法描述
init在HttpServlet实例化后被调用一次
destroy在HttpServlet实例不再使用的时候调用一次
service收到HTTP请求的时候调用
doGet收到get请求的时候调用(service方法调用)
doPost收到post请求的时候调用(service方法调用)
doPut/doDelete…收到对应请求的时候调用(service方法调用)

(2)描述servlet的生命周期

第一步:当一个请求从HTTP服务器转发给servlet容器时,容器检查对应的servlet是否创建,没有创建就实例化该servlet,并调用init()方法,init()方法只调用一次,之后的请求都从第二步开始执行。
第二步:请求进入service()方法,根据请求类型转发给对应的方法处理,如doPost、doGet等等。
第三步:容器停止前,调用destroy()方法,进行清理操作,该方法只调用一次,随后JVM回收资源。

(3)案例

编写servlet代码,用来处理get、post、delete请求。
(1)使用ajax构造get、post、delete请求
代码如下(示例):

<body>
    <button onclick="sendGet()">发送get请求</button><br>
    <button onclick="sendPost()">发送post请求</button><br>
    <button onclick="sendDelete()">发送delete请求</button>
    <script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
    <script>
        function sendGet() {
            $.ajax({
                type: 'get',
                url: 'method',
                //请求成功后,将响应的内容打印在浏览器的控制台
                success: function(body) {
                    console.log(body);
                }
            });
        }
        function sendPost() {
            $.ajax({
                type: 'post',
                url: 'method',
                success: function(body) {
                    console.log(body);
                }
            });
        }
        function sendDelete() {
            $.ajax({
                type: 'delete',
                url: 'method',
                success: function(body) {
                    console.log(body);
                }
            });
        }
    </script>
</body>
</html>

(2)继承HttpServlet方法,直接重写doGet、doPost、doDelete方法。
代码如下(示例):

@WebServlet("/method")
public class ServletTest extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    	//idea控制台打印
        System.out.println("get");
        //设置响应的字符类型,不设置可能会出现乱码
        resp.setContentType("text/html; charset=utf-8");
        //根据请求计算响应
        resp.getWriter().write("get 响应");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("post");
        resp.setContentType("text/html; charset=utf-8");
        resp.getWriter().write("post 响应");
    }

    @Override
    protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("delete");
        resp.setContentType("text/html; charset=utf-8");
        resp.getWriter().write("delete 响应");
    }
}

2.HttpServletRequest

(1)方法

方法描述
String getProtocol()返回请求协议的名称和版本
String getMethod()返回HTTP方法的名称
String getRequestURL()返回该请求的一部分(从协议名称一直到HTTP请求中的第一行的查询字符串)
String getContextPath()返回指示请求上下文的请求URI部分(即URL中 IP:端口号 后面的一级目录部分)
String getQueryString()返回URL中的查询字符串(querystring)
Enumeration getHeaderNames()返回一个枚举,包含在该请求中包含的所有的头名
String getHeader(String name)以字符串形式返回指定的请求头的值
Enumeration getParameterNames()返回一个String类型的枚举,请求中包含的参数的名称
String getParameter(String name)以字符串的形式返回请求参数的值,如果参数不存在则返回null
String[] getParameterValues(String name)返回一个包含所有参数的值的字符串数组
String getCotentType()返回请求主体的类型,不知道类型则返回null
int getCotentLength()以字节为单位返回请求主体的长度,并提供输入流或长度未知时返回-1
InputStream getInputStream()用于读取请求body内容,返回一个InputStream对象

(2)代码示例

打印请求信息

代码如下(示例):

@WebServlet("/showRequest")
public class ShowRequest extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置在浏览器中响应的格式,以防乱码
        resp.setContentType("text/html; charset=utf-8");
        //使用一个字符桶接收在req中得到的数据
        StringBuilder reqBody = new StringBuilder();

        //获取req的协议格式
        System.out.println(req.getProtocol());
        reqBody.append(req.getProtocol());
        reqBody.append("<br>");

        //获取req的请求方法
        System.out.println(req.getMethod());
        reqBody.append(req.getMethod());
        reqBody.append("<br>");

        //获取req的URI
        System.out.println(req.getRequestURI());
        reqBody.append(req.getRequestURI());
        reqBody.append("<br>");

        //获取req的content-path
        System.out.println(req.getContextPath());
        reqBody.append(req.getContextPath());
        reqBody.append("<br>");

        //获取req的queryString,没有则返回null
        System.out.println(req.getQueryString());
        reqBody.append(req.getQueryString());
        reqBody.append("<br>");

        reqBody.append("<h3>headers: </h3>");
        //获取req中的所有请求头名,是一个String对象的枚举类型
        Enumeration<String> enumeration =req.getHeaderNames();
        while (enumeration.hasMoreElements()) {
            //遍历枚举中的每个请求头名
            String headerName = enumeration.nextElement();
            reqBody.append(headerName + ": ");

            //根据请求头名得到请求头的值
            reqBody.append(req.getHeader(headerName));
            reqBody.append("<br>");
        }

        //将获取的信息写回响应
        resp.getWriter().write(reqBody.toString());
    }
}

获取get请求的参数

代码如下(示例):

@WebServlet("/getParameter")
public class GetParameter extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html; charset=utf-8");
        String userId = req.getParameter("userId");
        String userName = req.getParameter("userName");
        resp.getWriter().write("userId= "+userId+"; "+"userName= "+userName);
    }
}

在这里插入图片描述

获取post请求的参数

方法一:body采用form表单格式

代码如下(示例):

构造form表单

<body>
    <form action="postParameter" method="post">
        <input type="text" name="userId">
        <input type="text" name="userName">
        <input type="submit" value="提交">
    </form>
</body>

服务器端代码

@WebServlet("/postParameter")
public class PostParameter extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置请求解析时的编码类型
        req.setCharacterEncoding("utf-8");
        //设置响应时的编码格式和类型
        resp.setContentType("text/html; charset=utf-8");
        //根据参数名获取参数值
        String userId = req.getParameter("userId");
        String userName = req.getParameter("userName");
        System.out.println("userId= "+userId+"; "+"userName= "+userName);
        resp.getWriter().write("userId= "+userId+", "+"userName= "+userName);

        resp.getWriter().write("<br>"+"values:"+"<br>");
        //获取所有参数名
        Enumeration<String> enumeration = req.getParameterNames();
        while (enumeration.hasMoreElements()) {
            String names = enumeration.nextElement();
            //根据参数名获取参数值
            resp.getWriter().write(req.getParameter(names)+"<br>");
        }
    }
方法二:body采用JSON格式

代码如下(示例):
构造json.html页面

<body>
    <button onclick="sendJson()">以Json格式发送POST请求</button>
    <script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
    <script>
        function sendJson() {
            $.ajax({
                url: 'postParameterJson',
                type: 'post',
                contentType: 'application/json; charset=utf-8',
                success: function(body) {
                    console.log(body);
                }
            });
        }
    </script>
</body>

服务器端(PostParameterJson())

@WebServlet("/postParameterJson")
public class PostParameterJson extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置请求解析时的字符类型
        req.setCharacterEncoding("utf-8");
        //设置响应格式和字符类型
        resp.setContentType("application/json; charset=utf-8");

        //获取req的body长度
        int contentLength = req.getContentLength();
        //构造长度为contentLength的字节数组
        //由于getContentLength是以字节为单位返回的请求长度,并提供输入流
        byte[] buffer = new byte[contentLength];
        InputStream inputStream = req.getInputStream();
        inputStream.read(buffer);

        System.out.println(new String(buffer));
        resp.getWriter().write(new String(buffer));
    }
}
postman下载安装及构造数据

其中JSON的数据可以通过postman构造:点击可到postman官网下载
下载注册后,按照以下形式选择构造:
在这里插入图片描述

方法三:引入Jackson库,进行JSON解析

(1)在MVN中获取Jackson的依赖。
在这里插入图片描述
选择其中一个版本的,这里是用的2.12.3
在这里插入图片描述
在这里插入图片描述
(2)引入依赖到pom.xml中
将如下图中的内容粘贴到pom.xml中,点击maven的刷新按钮,引入成功后不会报红。(可以根据上方在mvn中找到想要的版本进行引入,也可以直接粘贴如下代码)

        <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.12.3</version>
        </dependency>

在这里插入图片描述
(3)调用ObjectMapper中的方法

代码如下(示例):

class Course {
    public ArrayList<String> courses;
}
class Student {
    public String studentId;
    public String studentName;
    public Course course;
}
@WebServlet("/postParameterJackson")
public class PostParameterJackson extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //创建ObjectMapper对象,它是Jackson中的核心类
        ObjectMapper objectMapper = new ObjectMapper();
        //1.调用ObjectMapper中的方法
        //readValue方法 将字符串转为对象;
        //writeValueAsString方法 将对象转为JSON格式字符串

        //读取输入流,获取到要解析的字符串
        //把字符串按照JSON格式解析,得到一组键值对(Map)
        //根据类对象,创建一个是咧
        //遍历类对象中的属性的名字,根据名字在Map中查询到value赋值到对应对象的属性中
        Student student = objectMapper.readValue(req.getInputStream(),Student.class);

        System.out.println("id: "+student.studentId+", name:"+student.studentName+", "+student.course.courses);
//        resp.setContentType("text/html; charset=utf-8");
//        resp.getWriter().write(student.studentId+", "+student.studentName);
        resp.setContentType("application/json; charset=utf-8");
        resp.getWriter().write(objectMapper.writeValueAsString(student));
    }
}

3.HttpServletResponse

如下是servlet中响应(response)的一些主要方法。

(1)方法

方法描述
void setStatus(int sc)为该响应设置状态码
void setHeader(String name,String value)设置一个给定名称和值的header,如果name已经存在,则覆盖
void setHeaders(String name,String value)设置一个给定名称和值的header,如果name已经存在,不覆盖旧值,并添加新的键值对
void setContentType(String type)设置被发送到客户端的响应的内容类型
void setCharacterEncoding(String charset)设置发送到客户端的响应字符编码
void sendRedirect(String location)使用指定的URL,发送临时重定向(302)到响应客户端
PrintWriter getWriter()用于往body中写入文本格式数据
OutputStream getOutputStream()用于往body中写入二进制格式数据

(2)代码示例

设置状态码

代码如下(示例):

@WebServlet("/status")
public class StatusServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        String status = req.getParameter("status");
//        if(status!=null) {
//            resp.setStatus(Integer.parseInt(status));
//        }
//        resp.getWriter().write("status: "+status);

        String type = req.getParameter("type");
        if(type.equals("1")) {
            resp.setStatus(200);
        }else if(type.equals("2")) {
            resp.setStatus(404);//浏览器自定义格式的404页面
            //resp.sendError(404);//sendError为Tomcat定义的404页面
        }else if(type.equals("3")){
            resp.setStatus(500);
        }else {
            resp.setStatus(502);
        }
    }
}

自动重刷线

代码如下(示例):

@WebServlet("/autoRefreshServlet")
public class AutoRefreshServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置响应格式
        resp.setContentType("text/html; charset=utf-8");
        //设置自动刷新时长
        resp.setHeader("refresh","1");
        //响应时间戳
        //resp.getWriter().write(System.currentTimeMillis()+"<br>");

        //获取日期类
        Date date = new Date();
        //将时间戳写入响应
        resp.getWriter().write("timeStamp: "+date.getTime()+"<br>");
        //通过SimpleDateFormat格式化日期
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        //得到格式后的日期
        String time = simpleDateFormat.format(date.getTime());
        //将格式化后的日期写入响应
        resp.getWriter().write("date: "+time);
    }
}

重定向

代码如下(示例):

@WebServlet("/redirect")
public class RedirectServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //方法一
        //resp.setStatus(302);
        //resp.setHeader("Location","https://blog.csdn.net/qq_45283185?spm=1011.2415.3001.5343");
        //方法二
        resp.sendRedirect("https://www.sogou.com");
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/26391.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

若依框架图片上传、富文本框编辑器功能

文章目录一、前言二、效果三、编码过程1.前端&#xff1a;index.vueprojectShow.js富文本框: Editor/index.vue图片上传&#xff1a;ImgUploadCropper/index.vue2.后端&#xff1a;实体ProjectShowProjectShowControllerIProjectShowServiceProjectShowServiceImplProjectShowM…

Linux命令大全

前言 Linux 的学习对于一个程序员的重要性是不言而喻的。前端开发相比后端开发&#xff0c;接触 Linux机会相对较少&#xff0c;因此往往容易忽视它。但是学好它却是程序员必备修养之一。 作者使用的是阿里云服务器 ECS &#xff08;最便宜的那种&#xff09; CentOS 7.7 64位…

指针初阶(C语言)

指针 指针是什么 内存划分是一个字节一个字节来划分的&#xff0c;其中每个字节都有一个编号来标识它&#xff0c;我们将这个编号称为地址&#xff0c;而指针就是地址 注意&#xff1a;编号是不占内存空间的&#xff0c;&#xff08;这些编号在内存中用十六进制表示&#xff0…

正厚软件 | App测试面试题及参考答案

最近整理了一些关于App测试的面试题。 本参照答案是本人在工作实践中总结&#xff0c;仅代表个人观点&#xff0c;如有错误&#xff0c;请谅解。 问&#xff1a;说一些你在测试过程中常用到的adb命名 答&#xff1a;回答本问题时&#xff0c;首先不要想到哪个命名就说哪个命令…

锐捷ISIS基础实验

目录 ISIS理论讲解 配置ISIS邻居建立 配置路由渗透&#xff08;泄露&#xff09; ISIS其它的配置特性 配置ISIS时间属性 配置ISIS认证 ISIS理论讲解 ISIS——基本概念1&#xff08;邻居建立、路由计算、报文封装&#xff09;_静下心来敲木鱼的博客-CSDN博客https://blog…

2022年全球高被引科学家公布

博士后、访问学者及联合培养申请者&#xff0c;都希望去名校及牛导麾下深造。名校有世界几大排名体系做参考&#xff0c;其知名度毋庸置疑。但牛导的概念是什么呢&#xff1f;知识人网小编在此介绍最新推出的“2022年度高被引科学家”&#xff0c;这里云集了全球自然科学和社会…

教你使用 SO_REUSEPORT 套接字选项提升服务性能

前言 Linux 网络栈中有一个相对较新的特性——SO_REUSEPORT 套接字选项&#xff0c;可以使用它来提升你的服务性能。 图 1: 上面的服务是使用并行监听器来避免请求连接瓶颈&#xff0c;而下面的服务只使用一个监听器来接收连接 概要 HAProxy 和 NGINX 是少数几个使用 Linux …

线段树什么的不是简简单单嘛,我教你!:基础篇

线段树什么的不是简简单单嘛&#xff0c;我教你&#xff01;&#xff1a;基础篇 零、序言——万物滴开篇 也许你是苦于笔试的打工人&#xff0c;也许你是步入算法圈不久的小小萌新&#xff08;我也是萌新&#xff09; &#xff0c;也许你是在网上搜索数据结构课设的倒霉学生。…

2049. 统计最高分的节点数目-数组树构造+遍历求解最大值数目

2049. 统计最高分的节点数目-数组树构造遍历求解最大值数目 给你一棵根节点为 0 的 二叉树 &#xff0c;它总共有 n 个节点&#xff0c;节点编号为 0 到 n - 1 。同时给你一个下标从 0 开始的整数数组 parents 表示这棵树&#xff0c;其中 parents[i] 是节点 i 的父节点。由于…

音视频 - 视频编码原理

目录 视频编码主要分为 图像的冗余 熵编码 帧内预测 帧间预测 DCT变换和量化 编码器比较 清晰度和耗时对比 一部电影1080P&#xff0c;帧率25fps&#xff0c;时长2小时&#xff0c;文件大小 1920x1080x1.5x25x2x360 521.4G 数据量非常大&#xff0c;对存储和网络传输都…

GMC Graph-Based Multi-View Clustering

GMC Graph-Based Multi-View Clustering 基于图的多视图聚类 abstract 现有的大多数方法没有充分考虑不同视图的权重&#xff0c;需要额外的聚类步骤来生成最终的聚类。还通常基于所有视图的固定图相似矩阵来优化目标。 本文提出了一种通用的基于图的多视图聚类算法(GMC)来解…

Android程序设计之学生考勤管理系统

基于安卓平台开发的学生考勤管理系统&#xff0c;本系统采用java语言设计&#xff0c;数据存储使用SQLite轻量级数据库实现 SQLite 简介 SQLite是一个软件库&#xff0c;实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite是一个增长最快的数据库引擎&…

JSON 对比工具

文章目录JSON对比工具JSON对比工具 JSON 是 Web 开发领域中最常用的数据传输格式之一&#xff0c;因为 JSON 的可读性较高&#xff0c;对于一些简单的 JSON 数据&#xff0c;我们不需要借助任何工具就可以轻易的读取。但对于复杂的 JSON 数据就需要借助工具才行&#xff0c;本…

公众号文案写作技巧有哪些?教你几招

公众号文案写作是每个公众号运营者心中的痛&#xff1a; 你是否每天纠结写什么&#xff1f; 你是否写着写着就词穷了&#xff1f; 你是否不知道该如何下手&#xff1f; 公众号文案应该怎么写&#xff1f;今天伯乐网络传媒就来给大家分享一份超实用的公众号文案写作技巧&…

增量模型和迭代模型的优点与缺点

增量模型&#xff1a; 举个例子&#xff1a; 用户有一个需求&#xff0c;功能包含A,B,C... ABC 增量模型&#xff1a; 开发完A我就直接上线供给用户去使用 开发完C我就直接上线供给用户去使用 开发完B我就直接上线供给用户去使用 增量模型的特点 增量模型的特点…

度量BGP监测源数量对AS可见性的影响

首先&#xff0c;本文介绍了两个公开的BGP数据源项目情况&#xff1b;其次&#xff0c;从可见AS数量和可见AS边关系数量两个方面来分析度量BGP监测源中对等AS的可见性。 BGP数据源介绍 BGP数据源有2个公开的项目&#xff0c;分别是RIPE RIS和Route Views&#xff0c;它们使用路…

VUE基础编程(三)

案例要求 基于Vue Cli和嵌套路由技术&#xff0c;完成以下功能&#xff1a; 站点打开后会默认显示如图3.1所示的“关于公司”页面&#xff0c;单击图3.1页面上的“公司简介”链接&#xff0c;站点会显示如图3.2所示的“公司简介”页面&#xff0c;单击图3.1页面上的“公司治理…

【JAVA程序设计】基于SSM的学校教务管理系统-有文档

基于SSM的学校教务管理系统-有文档项目获取项目简介开发环境项目技术功能结构文档目录运行截图项目获取 获取方式&#xff08;点击下载&#xff09;&#xff1a;是云猿实战 项目经过多人测试运行&#xff0c;可以确保100%成功运行。 项目简介 本项目是基于SSM的学校教务管理…

[附源码]java毕业设计校园失物招领平台

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

idea反编译

1、问题描述 只有jar包&#xff0c;反编译下&#xff0c;看几个配置&#xff1b; 2、问题说明 用的idea里面的插件&#xff0c;java Decoplier&#xff0c;可以反编译jar包&#xff0c;效果挺好的&#xff0c;反编译出来的.java没乱码&#xff0c;可以直接看&#xff1b; 2…