现在的各种服务端框架比如 structs springmvc springboot 等都是运行在 serverlet 容器里的
为什么不脱离 serverlet 一个框架本身就是一个 server,监听 http 请求 业务逻辑部分只需要编写 controller 就行了
类似 golang 的那种方式,一个服务打包好后就是一个 server,业务逻辑也被打包进去了
当然感觉是历史问题,毕竟 serverlet 这种形式也满足需求
1
guyeu 2020-06-15 18:42:52 +08:00
你可以把 servlet 理解成一个标准,这个标准的定义很简单,就是这个接口:javax.servlet.Servlet,总共五个方法,不脱离这个 servlet 的原因很简单,生态在这儿 ,你想和这个生态对接,就得尊重人家的标准。
我猜你的 servlet 是类似 tomcat 、undertow 的 web 容器,那显然是可以脱离这种 web 容器的,别的不说,基于 netty 的 web server 一抓一大把,像 spring webflux,vertx 都是很香的东西。 |
2
xizismile 2020-06-15 19:45:19 +08:00 via Android
servlet 只是一种规范,tomcat 只是 servlet 容器的一种实现方式
脱离了 servlet,你就得自己定义一套规范了。 既然已经有了 servlet,生态也是很成熟的,你为啥要自己重新定义一套新的呢? |
3
6IbA2bj5ip3tK49j 2020-06-15 20:24:06 +08:00
问题本身就不完全正确。
就算是 servlet 也可以把容器嵌到程序里去 而且现在的 spring boot webflux,vert.x 已经不是 servlet 了。 |
6
jinsongzhao 2020-06-15 20:48:11 +08:00 via Android
基于 servlet 也可以打包进一个可执行 jar 包,2007 年主要嵌入模式为主的 jetty 就很流行了,大概相当 tomcat 的 80%占有率。
|
7
saberlong 2020-06-15 20:56:31 +08:00 via Android
我们公司就脱离了。netty 通信加 http 协议解析就好了。
|
8
zsdroid 2020-06-15 21:01:33 +08:00
那么问题来了,Java 服务端开发为什么不脱离框架,用原生 java 手撸呢
|
9
nicevar 2020-06-15 21:07:15 +08:00
这个个人用户专享包的逻辑亮了, 点击一键免费领取, 未认证前提示认证才能领取, 认证完成后提示"您已完成实名认证无法领取实名认证大礼包", 哈哈.
|
10
nicevar 2020-06-15 21:07:57 +08:00
原来是服务器延时...
|
11
qwerthhusn 2020-06-15 21:57:27 +08:00
Servlet 是一个协议
一些软件实现了这些协议,所以项目可以在 tomcat 跑,也可以在例如 jetty 或 undertow 等只要实现了 servlet 规范的服务器跑 开发人员只要使用 Servlet API 去处理 HTTP 请求就行了,当然那种比较原始,所以有 JAX-RS 、Spring MVC 这些进一步包装了 Servlet API 不过现在新的一些东西,像 WebFlux,Vert.X 这些就不实现 Servlet 了,自行实现 Http 服务(一般用 Netty )然后自行定义 API (类似 Servlet 那样)给用户使用 |
12
Cbdy 2020-06-15 22:14:50 +08:00 via Android
Sprint WebFlux 、Vert.x Web 、
|
13
MarkLeeyun 2020-06-15 23:20:34 +08:00 1
你的 servlet 都打错了。。。
|
14
glaucus 2020-06-15 23:30:15 +08:00 via iPhone
why not?不要为了改变而改变
|
15
misaka19000 2020-06-15 23:35:58 +08:00
一个协议而已,包含了一些标准,有现成的标准不用干嘛要自己发明一套轮子?而且还不兼容各大 HTTP 服务容器
|
16
zhuangzhuang1988 2020-06-15 23:36:19 +08:00
|
17
CoderGeek 2020-06-16 01:39:03 +08:00
我还记得 ejb 那套 weblogic jetty
|
19
szq8014 2020-06-16 09:15:38 +08:00
servlet 只是一个规范,代表的是 java 中 [同步阻塞] 模型的生态,很多框架会在这个限定下进行工作,比如同步阻塞最典型的就是一个线程从头干到尾,假如想暂存一个数据的话用 ThreadLocal 就可以了,不会出意外。但是你如果切换到基于事件驱动的那样的实现中就会出问题。
|
20
BBCCBB 2020-06-16 09:58:38 +08:00
如果每个公司都是一套不同的东西. 那大家还怎么玩.
|
21
monkeyWie 2020-06-16 10:00:54 +08:00
放在当下是有点笨重啊,但是在以前那个年代,java 就靠着 servlet 规范才从 web 开发中突出重围,百花齐放啊。
|
23
zzzmh 2020-06-16 13:47:23 +08:00
按照这思路,干脆脱离 java 得了,用 c 重写一套语言,专门跑 web 项目
|
24
whenwind 2020-06-16 14:51:04 +08:00
轻量的我是喜欢用 nanohttpd,跑在 android 上面
|
25
hantsy 2020-06-16 16:56:53 +08:00
Servlet 只是 Java EE/Jakarta EE 的一种规范,事实证明,Servlet 可能是所有规范中影响力最大的规范,是 Java EE 体系中最成功的规范。
目前不用 Servlet 的也大把。Netty 是典型代表,ReactiveStreams 流行起来后,很多第三方框架都是基于 netty 的作品。Spring WebFlux 在 Spring Boot 中默认启用 Netty 作为服务器,当然也可以使用 Tomat,Jetty,Undertow 。 |
26
xuanbg 2020-06-16 17:29:33 +08:00
你为什么要用 TCP/IP 协议,自己搞一套不好吗?当然不好!没有标准,自行其是,哪来的互联互通。
|
28
Narcissu5 2020-06-17 09:18:13 +08:00
springboot 打包完就是一个 executable jar 啊,楼主你的痛点究竟在哪里
|
29
yizmaoaa 2020-06-17 10:35:59 +08:00
Vert.x Webflux micronaut quarkus
|
30
yizmaoaa 2020-06-17 10:39:42 +08:00
Servlet 本来就是很久以前定义的东西,放在现在看来是不合适,而且麻烦了。
以前定 Servlet 的 interface 的时候,就是想让各家自己去搞底下的 IO 层。然后用户可以随便换 放到现在来看,Servlet 的规范设计很明显是麻烦且不够直观了。 这也就是为何这几年都开始将协议 IO 处理交给 netty 的原因了。 |
32
ychost 2020-07-02 17:18:37 +08:00
netty 就好了
|
33
yamasa 2020-09-15 10:41:45 +08:00
spring 这些难道就不是一个 jar 或者 war 打好了就是一个服务?人间迷惑行为。
|