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 }"

 

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

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

相关文章

前端学习<四>JavaScript基础——14-基本包装类型

基本数据类型不能绑定属性和方法 属性和方法只能添加给对象,不能添加给基本数据类型。我们拿字符串来举例。 1、基本数据类型: 基本数据类型string是无法绑定属性和方法的。 var str qianguyihao;​str.aaa 12;console.log(typeof str); //打印结果…

十大经典排序算法及其C语言实现--带动图展示

排序算法大概算起来有以下十种 一、冒泡排序(Bubble Sort) 冒泡排序(Bubble Sort)也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数…

python统计分析——一般线性回归模型

参考资料:python统计分析【托马斯】 当我想用一个或多个其他的变量预测一个变量的时候,我们可以用线性回归的方法。 例如,当我们寻找给定数据集的最佳拟合线的时候,我们是在寻找让下式的残差平方和最小的参数(k,d): 其…

基于51单片机的秒表设计—0.01精度99.99s

基于51单片机的秒表设计 (仿真+程序+原理图+PCB+设计报告) 功能介绍 具体功能: 1.数码管显示秒表,精度为0.01; 2.记时最大为99.99s,过后清零记数。 3.一个按键实现开始…

突破传统,创新营销:淘宝天猫详情接口API的无限可能

随着互联网的迅猛发展,电子商务平台成为了现代商业营销的重要组成部分。淘宝和天猫作为中国最大的电子商务平台之一,拥有庞大的商品数据库和海量的买家资源。为了更好地实现个性化、精准化的营销策略,淘宝天猫推出了详情接口API,联…

Kibana管理ES生命周期

希望通过Kibana界面管理ES索引的生命周期 版本:7.15.2 创建索引模板 创建索引模板方便匹配索引,对匹配到的一批索引采用同一套生命周期管理策略,例如开发环境的所有索引以dev-开头,可以创建样式为dev-*的索引模板以匹配开发环境…

uni-starter和uni-admin初始化

1. 初始化uni-starter项目之后需要在uniCloud–>cloudfunctions–>common–>uni-config-center下面新增uni-id文件夹,下面新增config.json文件。 1.1配置好tokenSecret和微信的appId,appSecret等,如下: {"passwordSecret"…

pygame旋转角度发射射线

self.x self.x math.cos(math.radians(self.xuanzhuanjiao)) * 70 self.y self.y - math.sin(math.radians(self.xuanzhuanjiao)) * 70 旋转角度,70是间隔 间隔太小会卡 import pygame from pygame.locals import * import sys import mathpygame.init()width, …

03-JAVA设计模式-装饰模式

装饰模式 什么装饰模式 装饰器模式(Decorator Pattern)也叫包装器模式,是一种结构型设计模式,允许用户在不改变对象的情况下,动态地给对象增加一些额外的职责(功能)。装饰器模式相比生成子类更…

echarts 多环形图

环形图效果: option {"angleAxis": {"max": 1,"show": false,"splitLine": {"show": false},"axisLabel": {"show": false},"axisTick": {"show": false}},"ra…

美国N4433A安捷伦电子校准件

181/2461/8938产品概述: 安捷伦N4433A微波电子校准(ECal)模块使矢量网络分析仪的校准变得快速、简单和准确。ECal是一种用于矢量网络分析仪的精密单连接校准技术。与机械校准套件相比,使用ECal进行完整的三端口或四端口校准所需的…

基于FPGA的HDMI设计导航页面

FPGA使用HDMI更多时候用于传输图像数据,并不会传输音频数据,因此以下文章均采用DVI接口协议,HDMI与DVI的视频传输协议基本一致,区别也很小。 首先需要了解HDMI的来源,以及物理接口类型以及引脚信号,最后对几…

【Java】Java使用Swing实现一个模拟计算器(有源码)

📝个人主页:哈__ 期待您的关注 今天翻了翻之前写的代码,发现自己之前还写了一个计算器,今天把我之前写的代码分享出来。 我记得那会儿刚学不会写,写的乱七八糟,但拿来当期末作业还是不错的哈哈。 直接上…

力扣404,左叶子之和

404. 左叶子之和 已解答 简单 相关标签 相关企业 给定二叉树的根节点 root ,返回所有左叶子之和。 示例 1: 输入: root [3,9,20,null,null,15,7] 输出: 24 解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15,…

C:数据结构之链栈(不带头)

目录 前序 准备工作 函数声明 函数接口 1.初始化 2.创造节点 3. 判断栈空 4.入栈 5.出栈 6.取栈顶元素 7.销毁栈 8. 获取栈的元素个数 总结 前序 链栈是基于单链表实现的,其实栈更加适合使用顺序表来实现的,这篇文章我们来探讨一下链栈的实现。 准备工作 老规…

透视 Insilico 英矽智能:AI 制药明星企业的飞跃、困境与破局

衰老,从古至今困扰了无数仁人志士。无论是千古一帝秦始皇,还是雄才大略汉武帝,亦或者挥斥方遒唐太宗,这些伟大的帝王无一例外的都留下了许多追求长生的故事。当时光的指针落在了 21 世纪的第二个十年,随着全球老龄化问…

【c++】string类常见接口函数

🔥个人主页:Quitecoder 🔥专栏:c笔记仓 朋友们大家好啊,本节我们来到STL内容的第一部分:string类接口函数的介绍 目录 1.string类的认识2.常见接口讲解2.1 string类对象的常见构造2.2 对string对象的遍历和…

Jackson解析Json数据

1.概述 Jackson 和 FastJson 一样,是一个 Java 语言编写的,可以进行 JSON 处理的开源工具库,Jackson 的使用非常广泛,Spring 框架默认使用 Jackson 进行 JSON 处理。 Jackson 有三个核包,分别是 Streaming、Databid、…

【实战JVM】类的生命周期

个人名片: 🐼作者简介:一名大三在校生,喜欢AI编程🎋 🐻‍❄️个人主页🥇:落798. 🐼个人WeChat:hmmwx53 🕊️系列专栏:🖼️…

百度OCR身份证识别C++离线SDKV3.0 C#对接

百度OCR身份证识别C离线SDKV3.0 C#对接 目录 说明 效果 问题 项目 代码 下载 说明 自己根据SDK封装了动态库,然后C#调用。 SDK 简介 本 SDK 适应于于 Windows 平台下的⾝份证识别系统,⽀持 C接⼜开发的 SDK,开发者可在VS2015 下⾯进⾏开发(推荐…