当前位置: 首页 > news >正文

Severt和tomcat的使用(补充)

打包程序

在pom.xml中添加上述代码之后打包时会生成war包并且包的名称是test

默认情况打的是jar包.jar里量但是tomcat要求的是war包.

war包Tomcat专属的压缩包. war里面不光有.class还有一些tomcat要求的配置文件(web.xml等)还有前端的一些代码(html, css, js)

点击其右边的m

在点击到package就可以进行打包了

上图表示成功打包。

如果打包失败,在控制台中也会显示一些出错原因.
打包操作依赖了一些第三方的jar包可能出错. 
代码里有问题(配置文件, pom.xml)
 

正常顺利执行会在左边出现target目录

部署程序

把war拷贝到webapps目录中后.

启动tomcat

验证程序

通过浏览器,访问tomcat,获取到咱们代码返回的 hello 

此处页面上展示的hello 就是java代码中resp.getWriter().write("hello")返回的代码

如果我们因为某些要求需要对代码进行修改就要重新进行下面几步

1)修改代码

2)重新打包

3)重新部署

上述过程很麻烦

IDEA中有插件对这些过程进行集成了,集成成了一个插件smart  tomact

进入插件中进行下载安装,安装完之后

进入编辑配置中

选择座上角的加号选择smart tomcat

进行配置

名称没有要求可以根据自己喜好来写

Tomcat server选择自己的tomcat的存放位置

context是浏览器访问时的第一级路径的写法如果不写就会使用项目名称,两者名称不一样不影响什么只是在浏览器的访问时写的第一级路径名称不一样

其余保持默认就好

配置好会出现一个小猫

点击运行

此时就运行成功了。

点击下面的网站时是无响应的

tomcat访问到咱们的程序,是通过context path + servlet path 两级目录访问的.

但是此时我只是加了中文就出现了乱码是什么原因???

浏览器默认的解析方式,是跟随系统的. Windows 10简体中文版,使用的字符集是GBK.

IDEA的字符集一般是utf8

构造数据按照utf8,解析数据按照gbk.就出现乱码了.

通过将响应强制设置为utf8resp.setContentType("text/html;charset=utf8");

上述讲述了使用Severt 中hello 的写法下面讲述Severt API中的三个基本每次都会使用的

1.HttpServlet
2.HttpServletRequest

3. HttpServletResponse

Servlet这里的代码,继承和重写HttpServlet就行了.不必写一个main方法

仔细观察前面写的Servlet程序,其中并没写main.
写的这个程序,不是直接运行的.而是放到 tomcat上运行tomcat这个程序里,其里面是有main的。

上图是HttpSevert中的方法

第一个方法来进行初始化操作。

第二个方法释放资源

第三个方法每次收到 http请求,就会其自动执行的方法.处理请求,计算响应(服务器的主逻辑)

并且上述三个方法会被tomcat自动进行调用

最后三个方法

如果不重写service,在父类(HttpServlet中)(???)
自己的 service,就会根据请求的方法,来分别调用下面的doGet, doPost, doPUt..
 

并且上述这些资源都是可以在子类中进行重写的,在子类重写这些方法之后,这些方法也都是不需要咱们手动调用的,都是tomcat在合适的时机自行调用.

开始三个方法基本不用

init只是在如同读取配置文件、建立数据库连接类似的才会被使用
service一般会被doGet/ doPost替代.

destroy非常尴尬,因为一般不会被调用。

一个Servlet不用了,说明Tomcat要关闭了.Tomcat关闭有两种方式:
1.直接关闭Tomcat进程(比如直接在任务管理器中结束任务.或者直接点x)完全来不及调用destroy的.
2.通过8005管理端口,给Tomcat发送一个"停机"指令.这个时候是能够执行destroy 的.

但是一般都是关闭进程的。
 

Servlet的生命周期

就是什么时间段,就做这个时间段应该做的事。

如年轻读书时就好好读书,成年工作了就好好工作。

—定先把最上面@WebServlet("/hello")

这个注解给写上.否则容易忘.并且注解里的参数,务必以/开头
而且确保一个项目中,多个servlet这里指定的路径不能重复

HttpServletRequest的方法
 

上图中的第一个方法是用来返回名称和版本号如HTTP/1.1类似

第二个方法返回请求HTTP方法的名称GET、POST或PUT。

第三个方法中最后写的是URI,其最后返回该请求的URL的一部分。

注:

URI是唯一资源标识符
URL是唯一资源定位/地址符

Enumeration getParameterNames()string getParameter(String name)
string[]   getParametervalues(String name)

上述返回请求中的参数的方法一般只使用返回参数的值,

因为query string本质上是键值对.一般都是要根据key获取value
很少把query string 作为整体来使用.

?a=10&b=20&c=30 query string
更多的是,希望能够知道, a是几, b是几,c是

string[]   getParametervalues(String name)方法可以获取到

key存在重复的情况下key的所有值
 

Enumeration getHeaderNames()string getHeader(String name)
这两个方法因为请求header部分也是键值对.
也需要根据key获取value

 

最后一个方法

通过这个方法,得到一个流对象
读取这个流对象,就能得到整个请求的 body 

(在很多时候,在代码中表示一个"不定长”"的数据的时候,经常就会想到使用"流对象")
使用流对象,就可以不必一次性处理完.一次处理一点,也可以一次全都处理,更好的兼容二进制数据.

上述介绍的方法,都是get系列的方法(都是读方法).没有set系列(没有写方法)
当前拿到的 HttpServletRequest,这里的数据都是来自于客户端发来的.这些数据的内容已经确定下来了,是不应该修改的.

query string中的键值对,都是自己进行自定义的.
实际开发中都会非常广泛的使用到qaery string这样的机制.

并且除了其可以传递参数还可以使用

1.直接通过form表单
(body的格式就是query string的格式)
Content-Type: application/x-www-form-urlencoded

2)直接使用json
(body的格式就是json)
Content-Type: application/json


{
username: "zhangsan",password: "123"
)

json本质上也是键值对规则和form表单截然不同解析方式自然也就变了.由于json支持"嵌套”

某个key的value 也可以是另一个json
{
        key1: {
                key2:2

}
为了针对json格式的数据进行解析和构造,就需要引入json的库

下载jackson库,进入maven

最后加入到pom.xml中即可

使用jackson

一个类,两个方法.

objectMapper

对象映射器
把json字符串,映射成一个Java的对象

把一个java对象,映射成json字符串
网络传输,使用json字付串java代码中各种逻辑, java对象.
站在服务器的角度,收到的请求,就是json字符串.就需要把json字符串,先映射成java对象.
再进行一系列的业务逻辑处理
处理完了之后,可能还需要把得到的java对象,映射回json字符串,并且通过响应来返回.

核心工作,就是把左上方的json字符串,映射成右上方的java对象
参数就是json字符串(json字符串是在 http的 body中的,就需要通过HttpServletRequest中的getInputStream 来获取到)
此处把这个流对象直接传给readValue, readValue 内部就会读取InputStream 中的所有数据(http请求的body,上面的json字符串)
进一步尝试进行解析.
按照json的格式,进行解析,把json字符串,解析成 Map(键值对)
把 Map 转换成java对象,在方法的第二个参数,传入了Request.class
告诉readValue方法内部,要把当前Map转成啥样的Java对象

readValue 内部,就可以通过反射api,创建出 Reqylest.class 实例
并且,根据Request.class提供的属性的名字,来章询上述 Map,把得到的结果,赋值给对应的属性

如上述代码

当前Request.class中知道了,Request里有两个属性
分别叫做username和password

拿着username去刚才的Map里查询

查到的结果叫做zhangsan,于是把zhangsan赋值给username
拿着password去刚才的Map里查询
查到的结果叫做123,于是把123赋值给password属性

最终就得到了一个完整的Request对象, username就是 zhangsan, password就是123
上述过程就是

jackson 从json字符串映射到java对象的过程



 

注:

Request.class的意思就是写的java 代码,要被javac编译成.class 文件(二进制的文件)

这个文件就包含了.java源代码中的核心信息.
这个类叫啥名字,有啥属性,每个属性是啥类型,是public private;有啥方法,每个方法有几个参数,参数是啥类型,是public private;继承了哪个父类,实现了那几个接口,有啥注解......
当java进程启动,就会读取.class文件,把这些二进制内容,读到内存中并进行解析(过程叫做"类加载")类加载完毕之后,就会在内存中得到类对象


这个代码就是readValue的反向操作能把java对象映射成json字符串
1.通过传入的参数,获取到类对象,通过反射拿到都有哪些属性
就有一个属性, ok
2.根据属性的名字拿到属性的值
拿到了值true
3.把上述属性名字和属性值按照json格式构造成字符串就是返回值
如: "{ ok: true }"

 

相关文章:

Severt和tomcat的使用(补充)

打包程序 在pom.xml中添加上述代码之后打包时会生成war包并且包的名称是test 默认情况打的是jar包.jar里量但是tomcat要求的是war包. war包Tomcat专属的压缩包. war里面不光有.class还有一些tomcat要求的配置文件(web.xml等)还有前端的一些代码(html, css, js) 点击其右边的m…...

JavaEE初阶——多线程(一)

T04BF 👋专栏: 算法|JAVA|MySQL|C语言 🫵 小比特 大梦想 此篇文章与大家分享多线程的第一部分:引入线程以及创建多线程的几种方式 此文章是建立在前一篇文章进程的基础上的 如果有不足的或者错误的请您指出! 1.认识线程 我们知道现代的cpu大多都是多核心…...

MongoDB主从复制模式基于银河麒麟V10系统

MongoDB主从复制模式基于银河麒麟V10系统 背景介绍 MongoDB自4.0版本开始已经不再建议使用传统的master/slave复制架构,而是全面采用了复制集(Replica Sets)作为标准的复制和高可用性解决方案。 复制集是MongoDB的一种数据复制和高可用性机制,通过异步同步数据至多个服务…...

Vue使用高德地图

1.在高德平台注册账号 2.我的 > 管理管理中添加Key 3.安装依赖 npm i amap/amap-jsapi-loader --save 或 yarn add amap/amap-jsapi-loader --save 4.导入 AMapLoade import AMapLoader from amap/amap-jsapi-loader; 5.直接上代码,做好了注释(初始化…...

2024-04-07(复盘前端)

---HTML 1.HTMl骨架 html:整个网页 head:网页头部,用来存放给浏览器看的信息,如css body:网页主体,用来存放给用户看的信息,例如图片和文字 2.标题标签中h1标签只能使用一次,其…...

SpringCloud学习(10)-SpringCloudAlibaba-Nacos服务注册、配置中心

Spring Cloud Alibaba 参考文档 Spring Cloud Alibaba 参考文档 nacos下载Nacos 快速开始 直接进入bin包 运行cmd命令:startup.cmd -m standalone 运行成功后通过http://localhost:8848/nacos进入nacos可视化页面,账号密码默认都是nacos Nacos服务注…...

OKCC外呼中心配置的电话系统规则

OKCC外呼中心配置电话系统规则可能涉及多个方面,包括呼叫路由、自动化流程、电话接听策略等。以下是一般步骤及注意事项: 呼叫路由配置: 确定呼叫中心的呼叫路由策略,包括如何分配呼叫给不同的坐席或部门。设置呼叫路由规则&#…...

AI推介-大语言模型LLMs论文速览(arXiv方向):2024.03.31-2024.04.05

文章目录~ 1.AutoWebGLM: Bootstrap And Reinforce A Large Language Model-based Web Navigating Agent2.Training LLMs over Neurally Compressed Text3.Unveiling LLMs: The Evolution of Latent Representations in a Temporal Knowledge Graph4.Visualization-of-Thought …...

性能测试工具 ab(Apache Bench)使用详解

Apache Bench (ab) 是一个由 Apache 提供的非常流行的、简单的性能测试工具,用于对 HTTP 服务器进行压力测试。下面是 ab 工具的一些基本使用方法。 安装 在大多数 Unix 系统中,ab 通常作为 Apache HTTP 服务器的一部分预装在系统中。你可以通过在终端…...

智能网联汽车自动驾驶数据记录系统DSSAD数据元素

目录 第一章 数据元素分级 第二章 数据元素分类 第三章 数据元素基本信息表 表1 车辆及自动驾驶数据记录系统基本信息 表2 车辆状态及动态信息 表3 自动驾驶系统运行信息 表4 行车环境信息 表5 驾驶员操作及状态信息 第一章 数据元素分级 自动驾驶数据记录系统记录的数…...

Ubuntu 20.04.06 PCL C++学习记录(十八)

[TOC]PCL中点云分割模块的学习 学习背景 参考书籍:《点云库PCL从入门到精通》以及官方代码PCL官方代码链接,,PCL版本为1.10.0,CMake版本为3.16 学习内容 PCL中实现欧式聚类提取。在点云处理中,聚类是一种常见的任务,它将点云数据划分为多…...

细雨踏春日,新会公安护平安

春雨起,清明至。又是一年春草绿,又是一年清明时。细雨踏春日,思怀故人时,是哀思,亦是相聚。新会公安一抹抹葵乡春日“警”色坚守岗位,确保清明祭扫平稳有序,为人民群众的平安保驾护航。 为确保2…...

3d怎么在一块模型上开个孔---模大狮模型网

在进行3D建模时,有时候需要在模型上创建孔,以实现特定的设计需求或功能。无论是为了添加细节,还是为了实现功能性的要求,创建孔都是常见的操作之一。本文将介绍在3D模型上创建孔的几种常用方法,帮助您轻松实现这一目标…...

Python景区票务人脸识别系统(V2.0),附源码

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…...

全球化业务的网络安全挑战

随着企业业务的全球化,跨国数据传输和用户跨地域访问成为常态。这不仅带来了巨大的商业机会,也带来了以下网络安全挑战: 数据泄露风险:跨国数据传输增加了数据被截获和泄露的风险。访问限制:某些地区可能对互联网内容…...

SQL简单优化思路

在编写SQL查询时,优化查询性能是一个重要的考虑因素,特别是在处理多表连接(JOIN)和子查询时。以下是一些具体的技巧和最佳实践,可以帮助你在保持相同返回值的前提下,降低SQL执行速度: 明确连接顺…...

外包干了25天,技术倒退明显

先说情况,大专毕业,18年通过校招进入湖南某软件公司,干了接近6年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能…...

webpack环境配置分类结合vue使用

文件目录结构 按照目录结构创建好文件 控制台执行: npm install /config/webpack.common.jsconst path require(path) const {merge} require(webpack-merge) const {CleanWebpackPlugin} require(clean-webpack-plugin) const { VueLoaderPlugin } require(vue-loader); c…...

【蓝桥杯嵌入式】第十三届省赛(第二场)

目录 0 前言 1 展示 1.1 源码 1.2 演示视频 1.3 题目展示 2 CubeMX配置(第十三届省赛第二场真题) 2.1 设置下载线 2.2 HSE时钟设置 2.3 时钟树配置 2.4 生成代码设置 2.5 USART1 2.5.1 基本配置 2.5.2 NVIC 2.5.3 DMA 2.6 TIM 2.6.1 TIM2 2.6.2 TIM4 2.6.3 …...

maya节点绕轴旋转

目录 旋转后并尝试冻结变换 绕x轴旋转90度 使用Python脚本 使用图形界面 使用MEL脚本 绕y轴旋转90度 使用Python脚本 ok 旋转后并尝试冻结变换 import maya.cmds as cmdsdef adjust_root_rotation_for_export(joint_name):# 选择根节点cmds.select(joint_name)# 应用旋…...

如何水出第一篇SCI:SCI发刊历程,从0到1全过程经验分享!!!

如何水出第一篇SCI:SCI发刊历程,从0到1全路程经验分享!!! 详细的改进教程以及源码,戳这!戳这!!戳这!!!B站:Ai学术叫叫兽e…...

SpringBoot表单防止重复提交

哪些因素会引起重复提交? 开发的项目中可能会出现下面这些情况: 前端下单按钮重复点击导致订单创建多次 网速等原因造成页面卡顿,用户重复刷新提交请求 黑客或恶意用户使用postman等http工具重复恶意提交表单 重复提交会带来哪些问题&…...

java面向对象.day17(什么是面向对象)

先认识:面向过程思想,面向对象思想 面向过程思想(具体) 步骤清晰简单,第一步做什么,第二步做什么.... 面对过程适合处理一些较为简单的问题 面向对象思想(抽象) 物以类聚&#x…...

mysql处理并发简单示例

处理并发的基本思路是使用锁来控制对共享资源的访问。在MySQL中,可以使用事务和行级锁来处理并发。 具体处理方式如下: 创建一个用于存储并发任务的MySQL表,该表包含一个自增的ID字段和任务名称字段。设置一个最大并发数量,用来…...

顺序表——功能实现

✨✨欢迎👍👍点赞☕️☕️收藏✍✍评论 个人主页:秋邱博客 所属栏目:C语言 (感谢您的光临,您的光临蓬荜生辉) 目录 1.0 前言 2.0 线性表 2.1 顺序表 2.2 顺序表的分类 2.3 顺序表功能的实现…...

达梦导出工具dexp

基础环境 操作系统:Red Hat Enterprise Linux Server release 7.9 (Maipo) 数据库版本:DM Database Server 64 V8 架构:单实例dexp 逻辑导出 dexp 工具可以对本地或者远程数据库进行数据库级、用户级、模式级和表级的逻辑备份。备份的内容非…...

Ubuntu 22.04安装新硬盘并启动时自动挂载

方法一 要在Ubuntu 22.04系统中安装一个新硬盘、对其进行格式化并实现启动时自动挂载,需要按以下步骤操作: 1. 安装硬盘 - 确保你的硬盘正确连接到计算机上(涉及硬件安装)。 2. 发现新硬盘 - 在系统启动后,打开终端…...

Mybatis中sqlSession.getMapper背后的原理

在通过MyBatis操作数据库之前我们一定先通过Session对象获取指定Mappper接口的代理对象。如下代码所示&#xff1a; public class UserMapper{Select(value"SELECT * FROM user")public List<User> findAll(); }public static void main(String [] args){Conf…...

[环境配置]conda 64位安装32位python

进入32模式 set CONDA_FORCE_32BIT1创建环境 conda create --name yourEnv python3.8退出32模式 set CONDA_FORCE_32BIT0ok...

某虚假交友APP(信息窃取)逆向分析

应用初探 在群里水群的时候 群u发了一个交友APP 于是拿来分析一下 可以看到应用打开后又一个登录的界面 需要用户输入手机号与验证码进行登录 #在线云沙箱分析 将APK放入某安信云沙箱中分析 提示应用请求了过多的敏感权限 逆向分析 直接拖入Jadx分析 好在程序没有加固 也没…...

网站建设中中文模板/网站备案查询工信部官网

答案CL.的答案就是诀窍&#xff01;我最终使用了一个Python脚本(可以在下一节中查看,名为“更新&#xff1a;正在解决问题”),并且一旦我正确设置了数据库,以便将ID列设置为整数键(或者,如果是是不可能的,数字)和名称列被设置为文本然后它工作&#xff01;更新&#xff1a;努力…...

做直播网站需要那些技术/网络营销成功案例有哪些2022

【预热/全开源】机械电子控制“跑通全流程”实践课程【考拉工作室】第一讲&#xff1a;直线滑台的应用和原理【考拉工作室】第二讲&#xff1a;直线滑台的组成【考拉工作室】第三讲&#xff1a;直线滑台非标设计【考拉工作室】第四讲&#xff1a;步进电机的原理和控制大家好&am…...

腾讯广告卖东西怎么建设网站/购买模板建站

GetType和typeof的区别 typeof: The typeof operator is used to obtain the System.Type object for a type. 运算符&#xff0c;获得某一类型的 System.Type 对象。 Type t typeof(int); GetType: Gets the Type of the current instance. 方法&#xff0c;获取当前实例的类…...

武汉网站建设武汉网络公司/seo搜索引擎优化步骤

linux 下手工新建数据库 收藏手工新建数据库create database身为DBA,要永远记住甚用或者禁止使用rm命令&#xff0c;万不得以的情况下&#xff0c;使用时在敲enter也要看了又看、慎重又慎重才行&#xff01;Red Hat Enterprise 3 Oracle 10g Release 2$su – oracle1---设置系…...

郑州网站建设公司排名/河北百度推广seo

1. 缓存 名称描述DiskLruCacheJava实现基于LRU的磁盘缓存2.图片加载 名称描述Android Universal Image Loader一个强大的加载&#xff0c;缓存&#xff0c;展示图片的库Picasso一个强大的图片下载与缓存的库Fresco一个用于管理图像和他们使用的内存的库Glide一个图片加载和缓存…...

wordpress 消息框/中国十大搜索引擎网站

delphi有提供十进制转换成十六进制的函数&#xff1a; IntToStr(); 返回值为String // 十进制转十六进制 vari: integer;str: string; begini : 255; ShowMessage(IntToHex(I, 2)); //FF 2表示返回的位数 // 另外&#xff0c;Formart也有把十进制用十六进制输出的功能s…...