13
回答
其实java web的设计从底层开始就有些比不上php了
百度AI开发者大赛带你边学边开发,赢100万奖金,加群:418589053   

暂时先随便说一点探探大家的口风,未来会成为一篇博客细说。所有内容的术语来自https://jcp.org/aboutJava/communityprocess/pr/jsr315/index.html

 

首先,作为一个web系统的底层,我其实指的是servlet,我觉得java做web在servlet层面就有点走偏了,如下:

 

addServletMapping

作为一个底层API,居然会定义【路由】这种高层次东西,这让tomcat/jetty浪费多少代码去实现它?然后被框架如jfinal各种嫌弃抛弃不用。

 

addFilter

fileter和普通servlet就差一点点东西,如果有人真的想实现filter的功能,几行代码的事,居然在这么底层的地方把这个也定义出来了。结果就是造成到底用servlet还是filter的confuse。

 

Web Application Directory Structure (也就是/WEB-INF/等目录结构)

定义这个我觉得完全是为了war这个文件格式,作为一个底层的规范,定义这些做什么?

 

Lifecycle

记得在定制session存到数据库等操作的时候,发现要实现n多lifecycle相关的东西。现在已经是分布式系统的时代,lifecycle已经没啥可用的价值了。重要的状态信息全部入数据库等存储,系统要能保证在断电等异常情况下通过重启能自恢复。检测shutdown啥的没意义。

 

另一层面,规范要求servlet按需加载(合理),还要按需卸载(这个就不明白做什么用了,热升级?)

 

这些都会无端增加如tomcat/jetty的代码量,而用处不大的设计。

 

Security

这玩意也会在这么底层的API里定义也是醉了

 

getReader/getInputStream 和 getWriter/getOutputStream 互斥

这一点也是很让人纠结,如果要混合输出byte[]和String,只能抛弃servlet所有writer代码,自己做一套String到byte[]的writer

举报
乌龟壳
发帖于1年前 13回/1K+阅
共有13个回帖 最后回答: 1年前

不要用现在的眼光去看历史问题  你没有上帝视角 N年前,能用的框架能有几个……

--- 共有 9 条评论 ---
潮爱lkp 回复 @花心Yy5109 : 额额,你可能是个假程序员 1年前 回复
乌龟壳 回复 @花心Yy5109 : 多了去了,设计得那么好的web工具 1年前 回复
花心Yy5109 回复 @乌龟壳 : php不都淘汰了 还有人用么 1年前 回复
乌龟壳 回复 @魔力猫 : 所以工作量其实并没有想象的大,我并非推倒servlet/jsp完全重来,因为其实不需要实现那么多繁琐的无用的东西。 1年前 回复
魔力猫 回复 @乌龟壳 : 那就静等出炉了。你这是要从底层把整套结构推倒重来么,工作量和成本实在是不怎么合算。特别是现代的Web程序,服务器端已经越来越少负责渲染页面的工作了。返回的JSON越来越多,页面越来越少。 1年前 回复

然而php框架在玩命玩路由

--- 共有 5 条评论 ---
乌龟壳 回复 @魔力猫 : 其实jsp和asp是静态语言,本来就有比php好的基因,所以我题目里加了“设计”两个字,因为虽然有好的基因,但是没经过良好的设计,难用得要死。关于设计我不是崇尚过度设计的那些人,这里就是我一般的设计风格https://my.oschina.net/visualgui823/blog/829168 1年前 回复
魔力猫 回复 @乌龟壳 : PHP初步成熟推广的时候,微软的ASP和Sun的JSP也都出来了。但是更早的时候,PHP完全就是一个个人玩具而不是大型网站和企业应用程序开发的选择。 1年前 回复
乌龟壳 回复 @魔力猫 : 很不幸,php就是因为写c的cgi太麻烦而造的,和servlet是同时期的产物 1年前 回复
魔力猫 回复 @乌龟壳 : 你开发更早的C语言版CGI的时候,就知道Servlet的好了。任何事物都是不断发展的,你现在这种文章,差不多就是拿着C语言当标准指着汇编的鼻子骂他太繁琐。 1年前 回复
乌龟壳路由这东西对于web开发来说很重要,但是考虑其抽象层次比较高,觉得不应该在servlet这一层面去定义它。 1年前 回复
public interface Servlet {
    public void init(ServletConfig config) throws ServletException;
    public ServletConfig getServletConfig();
    public void service(ServletRequest req, ServletResponse res)throws ServletException, IOException;
    public String getServletInfo();
    public void destroy();
}

public interface Filter {
    public void init(FilterConfig filterConfig) throws ServletException;
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException;
    public void destroy();
}

public interface FilterChain {
    public void doFilter ( ServletRequest request, ServletResponse response ) throws IOException, ServletException;
}

@快速开发师

基本就是传config/request/response,FilterChain的功能可以通过servlet里调用下一阶段的servlet来实现过滤器等功能。实际不少框架是在filter上挂个钩子完全不用servlet实现的。

然后,我选择Spring boot打成jar,以及使用undertow。

--- 共有 1 条评论 ---
乌龟壳偏题了,哈哈。如果说spring boot啥的,java不依赖servlet的也有一些可选择 1年前 回复

如果用现代的标准,我觉得php不如js。既然做web,直接整个前置node,后置提供API接口即可,而提供API接口,直接上go或者Rust,java生态也是不错的选择,何必去引入php呢?

--- 共有 2 条评论 ---
junanphp 的websocket 用swoole 扩展实现了 1年前 回复
乌龟壳node哪有php方便,php库面面俱到,官方质量。node虽然npm很多库,但是质量实在是让人不放心。php的短板就是websocket等服务器推送技术在经典的fpm和mod_php上难以实现。 1年前 回复

最近在教一些外行妹子学php,够痛苦了,但始终庆幸不是java。

php比较好的地方是规避了一些本身和网站设计上没什么关联的xx器,yy器。这些xx器完全可以打击到多数妹子们不敢进入这个领域,导致男程序员终生孤独。

 

--- 共有 2 条评论 ---
乌龟壳 任何框架想解决问题,必须分成好几层去实现它,最顶层必须对于普遍场景,只暴露必要的接口出来即可。java对于服务器的选型过于宽松,php也有点,这方面最好的是asp.net,不用想什么,点几下鼠标就部署上去了。虽然iis部署方便,但并不是说它没有办法调整细节。 1年前 回复
乌龟壳这就是我想解决的问题,java不是做不好web开发,只是没人愿意把它做到php或者asp.net的方便性级别。 1年前 回复
顶部