Severt基本使用

news2024/11/23 21:44:33

 severt是让我们自己写一些类,然后把这些类给加载Tomcat中,后续Tomcat收到HTTP请求(来自于浏览器),就会执行到咱们上面写的代码.从而通过这些代码,完成一定的业务逻辑.

创建项目

此处创建的是一种新的项目的形式称为Maven项目,Maven是Java 中的一个的构建工具,IDEA已经集成,不用额外下载安装,帮助你编译/打包代码的工具。


新建项目的构建系统改为Maven就可以。

maven项目在首次创建的时候,会自动的从maven的网站上下载一些依赖的组件.(这个过程如果你的网络不稳定,就可能出错,就可能影响后续对maven的使用)
 

依赖组件下载好之后就会出现如上图所示的目录结构        

其中main是业务代码:完成什么需求

pom.xml:maven 项目的入口配置文件.

手动导入maven中央仓库,找到需要的servlet的jar包.

点击网站进入其中找寻severt的包

https://mvnrepository.comd


找到下面的Maven将其中的代码复制到IDEA中的pom.xml

必需加入<dependencies>和</dependencies>包裹住他们

进去之后一般会自动下载如果不成功会标红

创建目录

必需按照这个结构来创建

Tomcat要求的结构.
咱们写的代码后面会放到Tomcat 上.
必须要遵守Tomcat的要求.否则Tomcat识别不了,也就无法执行你的代码了.

然后需要向xml文件中输入一段其格式的文件即可(无论是什么都可以)

编写代码

此处的包是来自前面引入的severt库中的如果标红前面库的引入有问题

doGet的意思是当收到HTTP GET请求,就会对其进行接收然后执行自己内部的代码
当tomcat收到一个GET请求的时候,就有可能执行这个子类的内部代码

两个参数一个是HTTP请求,一个是HTTP响应

写一个服务器,主要的三个步骤

1.读取请求并解析

2.根据请求计算响应

3.把响应返回给客户端

第一个步骤

HTTP请求本身是个字符串就是将这个请求构造成HttpServletRequest对象
(由Tomcat自动完成的)

其中第二个步骤

doGet方法所实现的内容
根据请求HttpServletRequest对象,构造生成HttpServletResponse 对象来进行其要实现的业务

第三个步骤

就会把响应对象组织成HTTP格式的字符串返回客户端


上图中的@WebServlet("/hello")让这个类和一个HTTP请求路径关联起来“配置路由"。

Tomcat不是收到所有的get请求都调用这个doGet/方法而是必须同时满足
1.请求是get
⒉.请求url中的路径是/hello

 打包程序

在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.coloradmin.cn/o/1583199.html

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

相关文章

微服务项目sc2024第一个子项目

1. 第一个子项目 2.pom文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apa…

【机器学习300问】66、ReLU激活函数相对于Sigmoid和Tanh激活函数的优点是什么?ReLU它有局限性吗?如何改进?

一、ReLU相对于Sigmoid和Tanh的优点 &#xff08;1&#xff09;计算效率高 ReLU函数数学形式简单&#xff0c;仅需要对输入进行阈值操作&#xff0c;大于0则保留&#xff0c;小于0则置为0。Sigmoid和Tanh需要指数运算但ReLU不需要。所以相比之下它会更快&#xff0c;降低了神经…

MySQL innoDB存储引擎多事务场景下的事务执行情况

一、背景 在日常开发中&#xff0c;对不同事务之间的隔离情况等理解如果不够清晰&#xff0c;很容易导致代码的效果和预期不符。因而在这对一些存在疑问的场景进行模拟。 下面的例子全部基于innoDB存储引擎。 二、场景&#xff1a; 2.1、两个事务修改同一行记录 正常来说&…

每日一题 — 最大连续 1 的个数III

解法一&#xff1a;暴力枚举 先定义left和right双指针&#xff0c;left先固定在起始位置&#xff0c;遍历right当值等于1的时候&#xff0c;直接跳过&#xff0c;等于0的时候&#xff0c;zero计数器加一当zero等于k的时候&#xff0c;就开始记录此时最大长度是多少然后left加一…

urwid,一个好用的 Python 库!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个好用的 Python 库 - urwid。 Github地址&#xff1a;https://github.com/urwid/urwid Urwid 是一个功能强大的 Python 库&#xff0c;用于创建基于文本的用户界面&#xf…

Linux入门攻坚——18、SELinux、Bash脚本编程续

SELinux——Secure Enhanced Linux&#xff08;安全加强的Linux&#xff09;&#xff0c;工作于Linux内核中。 SELinux 主要作用就是最大限度地减小系统中服务进程可访问的资源&#xff08;最小权限原则&#xff09;。采用委任式存取控制&#xff0c;是在进行程序、文件等细节权…

蓝桥杯2023A-05-互质数(Java)

5.互质数 题目描述 给定 a, b&#xff0c;求 1 ≤ x < a^b 中有多少个 x 与 a^b 互质。由于答案可能很大&#xff0c;你只需要输出答案对 998244353 取模的结果。 输入格式 输入一行包含两个整数分别表示 a, b&#xff0c;用一个空格分隔。 输出格式 输出一行包含一个…

【MPI并行程序】完美解决Attempting to use an MPI routine before initializing MPI

文章目录 错误原因解决方案 最近在写并行程序&#xff0c;犯了一个小错误&#xff0c;记录一下&#xff0c;以防止以后再犯。 Attempting to use an MPI routine before initializing MPI&#xff08;在初始化 MPI 之前尝试使用 MPI 例程&#xff09; 错误原因 这个错误通常是因…

编写Markdown时如何爽爽地渲染树?

在使用VitePress/Dumi等静态网站生成时&#xff0c;一般均支持直接在Markdown中渲染显示Vue/React组件&#xff0c;这给个网站非常丰富极致的表现力&#xff0c;我们在创建静态网站时开心的使用各种Vue/React组件&#xff0c;但是在输出树结构时&#xff0c;实际场景中存在几个…

Git的简单入门使用

文章目录 拷贝项目的步骤创建项目的步骤提交项目或项目文件的步骤恢复项目文件的步骤推送项目文件的步骤 拷贝项目的步骤 找到需要用来存放项目的文件夹&#xff1b;在文件夹页面空白处右键点击&#xff0c;然后再菜单中选择“Open Git Bash here”。在Github上找到需要进行拷…

【Java核心能力】美团优选后端一面:网络 操作系统

欢迎关注公众号&#xff08;通过文章导读关注&#xff1a;【11来了】&#xff09;&#xff0c;及时收到 AI 前沿项目工具及新技术的推送&#xff01; 在我后台回复 「资料」 可领取编程高频电子书&#xff01; 在我后台回复「面试」可领取硬核面试笔记&#xff01; 文章导读地址…

Vue2 —— 学习(五)

一、生命周期 &#xff08;一&#xff09;引入案例 我们想让一行文字按一定频率逐渐变得透明 1. Vue 实例外写法 函数写在 Vue 实例外面也能实现但是不推荐 <body><div id"root"><h2 :style"{opacity}">欢迎学习Vue</h2><…

服务器开发 Socket 相关基础

Socket 三要素 1.通信的目的地址&#xff1b; 2.使用的端口号&#xff1b; 3.使用的传输层协议&#xff08;如 TCP、UDP&#xff09; Socket 通信模型 服务端实现 #include <iostream> #include <unistd.h> #include <stdio.h> #include <sys/types.h&…

【QT】pro文件里添加又删除LIBS不影响运行的原因

我发现个问题啊&#xff0c;如果运行项目&#xff0c;发现报错&#xff0c;缺少某dll&#xff0c;接着你在pro文件里加上win32:LIBS -lOpengl32&#xff08;举个例子&#xff09;&#xff0c;接着可以运行了&#xff0c;接着把这行删掉&#xff0c;再运行&#xff0c;仍然可以…

hive 数据库表常用操作及相关函数讲解

创建数据库并指定hdfs存储位置 create database myhive2 location ‘/myhive2’; 使用location关键字&#xff0c;可以指定数据库在HDFS的存储路径。 Hive的库在HDFS上就是一个以.db结尾的目录 默认存储在&#xff1a; /user/hive/warehouse内 当你为Hive表指定一个LOCATION时…

数据库(mysql)-连接嵌套查询-2

子查询 MySQL中的子查询&#xff08;Subquery&#xff09;是嵌套在其他SQL查询中的查询。子查询可以出现在SELECT、FROM或WHERE子句中&#xff0c;并用于返回将被用于外部查询的数据。子查询的结果可以是一个单一的值、一行、一列或多行多列的数据集。 单行单列查询 实例 #查…

如何提高旋转花键运行稳定性?

现代化精密仪器设备中&#xff0c;精密仪器的稳定工作性能对于生产效率和产品质量至关重要&#xff0c;运行效率和精度是常见问题。旋转花键作为机械传动系统中的重要组成部分&#xff0c;其稳定性也是直接影响到机械装配的质量和使用寿命&#xff0c;那么我们应该如何提升旋转…

【汇编语言实战】已知10个整数求最大值

C语言描述该程序流程&#xff1a; #include <stdio.h> int main() {int a[]{11,33,23,54,12,51,2,4,34,45};int maxa[0];for(int i1;i<9;i){if(a[i]>max){maxa[i];}}printf("%d",max); }汇编语言&#xff1a; include irvine32.inc .data arr dword 11…

STM32G030F6P6 HSE时钟不能使用无源晶振,只能使用有源晶振!

STM32G030F6P6 HSE时钟不能使用无源晶振&#xff0c;只能使用有源晶振。 参见STM32CubeMX配置 使能RCC中 BYPASS CLOCK SOURCE后只有一个 PC14引脚。 查手册中 5.2.1 HSE clock章节 部分引脚少的封装&#xff0c;HSE时钟只有 OSC-IN&#xff0c;因此只能使用有源晶振 查Data…

经典机器学习模型(八)梯度提升树GBDT详解

经典机器学习模型(八)梯度提升树GBDT详解 Boosting、Bagging和Stacking是集成学习(Ensemble Learning)的三种主要方法。 Boosting是一族可将弱学习器提升为强学习器的算法&#xff0c;不同于Bagging、Stacking方法&#xff0c;Boosting训练过程为串联方式&#xff0c;弱学习器…