作者:沈世钧
原文链接:
最近这段时间收到了一些读者的私信,他们经常问我某个技术要不要学,还有一些在国外的同学竟然对 Java 图形化很感兴趣,还想找这方面的工作,我一直不知道该如何回答他们这些问题,直到我看到了一位大佬的回答,希望能对他们有帮助吧。
我接触 Java 已近20年了,见证了许多 Java 技术变迁,包括:
JavaEE 框架,从百家混战到现在 Spring 基本一统天下。
Web 开发,从标配的 SSH 到现在 SpirngMVC + MyBatis 组合。
IDE ,从当年如火如荼的 JBuilder 到 Eclipse ,再到更好用的 IDEA。
而本文,我主要谈一下那些Java知识“ 已经过时 ”,没必要继续学习了。您也可以把本文看做上篇文章的补充。
我判断的依据主要有以下几点:
- 实际开发能否用到?
- 是否有助于加深对技术的理解?
- 对面试是否有用?
JSP
JSP在实际开发中,主要是作为 MVC 模型中的 V(View)层出现的。当然,View 层的渲染技术除了JSP,还有 FreeMaker、Velocity 等。
JSP 作为页面模板,在后端通过 MVC 框架渲染成 HMTL,然后再发送到客户端(例如浏览器)来呈现。这也就是我们常说的“前后端不分离”,“混合式”开发。
而当前,包括我所在的公司,以及大部分互联网公司。要么已经抛弃这种模式,要么正在抛弃的路上,而转向彻底的“前后端分离”。
在“前后端分离”模式下,后端只负责提供服务接口(例如 REST),而前端(例如 HTML5 )通过接口发送/获取,呈现数据(例如 JSON 格式)。
这样,在后端,原来的 MVC框架 ,某种意义上已经演变为 MC 框架。因此,与V(View)相关的一切模板技术都失去了学习的必要,其中当然也包括 JSP。所以,后来的 Java 学习者,我的建议是:
“ 完全可以放弃对 JSP 的学习 。”
Struts
在 Java 后端开发中,MVC 模型还是主流。而 Struts 作为一个 MVC 框架,单从技术上来说,还是很优秀的。
但是,现在 Spring 实在是太强势了,越来越成为 Java 开发中的“一站式”工具包,其中的一个利器就是 Spring MVC 。
望名知意,Spring MVC 也是一个 MVC 框架。而且因为它是 Spring 的亲儿子,自然和 Spring 契合的非常完美。
同时,在设计之初,Spring MVC 就参照了其他 MVC 框架的优缺点(包括Struts),所以用起来非常爽。因此,在 MVC 框架领域,Spring MVC 大有一统天下的趋势。
因此现在,很多公司,老的 Struts 项目还在维护。但新的项目开发,更多转向了Spring MVC。因此,如果你是 Java 新手,正在学习中,我的建议是:
“ 不要再学习 Struts 了,从 Spring MVC 开始吧! ”
Hibernate
Hibernate 作为老牌的OR映射框架,功能非常强大,涵盖面非常广。但这既是它的优点,同时也成为它的“负担”,是开发人员“不能承受之重”。
Hibernate 的设计初衷,是为了最大程度的解放 程序员 ,完全隔离数据库,实现彻底的 OR 映射。程序员甚至可以不写一行 SQL 语句 ,单通过配置就能实现对数据库的操作。
当然,为了实现这个目标,Hibernate 也设计的非常复杂、非常精巧。就不可避免的带来以下副作用:
- 学习成本高
- 配置复杂
- 调优困难
前两点不难理解,单说“调优困难”。
因为 Hibernate 的设计目标是彻底的 OR 映射,彻底的隔离 SQL 语句。但必然会带来一定的性能损失。大部分情况下,应用如果对性能不敏感,Hibernate 也没问题。但应用一旦对性能敏感,有SQL级别调优的需求,Hibernate 的优点反而成为缺点。
虽然 Hibernate 也支持 SQL 级别的调优,但因为框架设计的过于复杂和精巧,这就需要开发人员对 Hibernate 理解的非常透彻,这就带来了更高的学习成本。
而现在最流行的 MyBatis ,作为一个“混合式”,轻量级OR映射框架,既继承了Hibernate 的优点,同时也吸取了他的教训。在支持配置的同时,又能接触SQL,从而带来了更多灵活性(包括调试、优化)。
当前,在实际开发中,Hibernate 使用的越来越少了。大家更偏爱MyBatis这种轻量级框架。所以,对后来学习者,我的建议是:
“ 不需要再学习 Hibernate 了,学 MyBatis 就够了 。”
Servlet (要精通)
当然,现在不会有任何公司,再用纯粹的 Servlet 来时实现整个 Web 应用,而是转向一些更高级的技术(例如各种MVC框架)。因此,会给人一种错觉:Servlet 已经过时,后来者就不需要再学习了。
在这里,我可以非常负责任的说:这种观点是极端错误,极端不负责任的。
Servlet 不仅要学,而且要学深,学透。
当前,Servlet 虽然不再是一个主流 web 开发技术,但依然是 Java Web 开发技术的基础,是 Java Web 容器的基石,是行业标准。而现在流行的各种 MVC 框架(包括 SpringMVC),在最底层,还是以 Servlet 为基础的。
为此,我画了一个简单的图(不准确,会意即可):
所以,如果你想要彻底掌握某个 MVC 框架,则必须彻底理解 Servlet。
而且,Servlet 作为一个基础设施。精通它,不仅有助于理解各种 MVC 框架。即使 Servlet 本身,也有很多实用价值。
如果你深刻理解了Servlet 的 生命周期 ,就可以在底层做很多事情。譬如在 Request 进来的时候,进行拦截,进行权限的判定。也可以在 Response 发出的时候,进行拦截,统一检查、统一附加。
所以,如果你正在学习 Java,对 Servlet,我的建议是:
“ Servlet 不仅要学,而且要学深,学透 。”
其他
目前在国内,Java 更多是作为 web 后端技术出现的。因此在实际学习中,很多技术就不符合“国情”,学习的现实意义不大。下面我就简单列举下。
1. Applet
作为页面插件技术,不用多说,连 flash 都快被淘汰了,更无论从未流行的applet。
2. Swing
作为桌面 UI 框架。且不说本身设计的咋样。现实开发中,我接触的桌面应用,要么用 C++(例如 MFC ),要么用 C#(Winform、 WPF )。所以,Swing 就没有学习的必要了。
3. JDBC
作为较低层的数据库基础设施,JDBC 被很多框架(例如MyBatis)支持。但在实际开发中,程序员即使不了解也无大碍。因此,虽然我不能建议你放弃 JDBC学习,但如果你时间有限,完全可以把它的优先级排低一点。
4.XML
XML 现在还在广泛应用。但作为一个 web 数据传输格式,正在逐渐被 JSON 替代。所以,对 Java 后端学习来说,XML 简单了解即可。至于庞杂的 XML 操作 API(例如XPath),完全不必学习。将来真要用到,再查也不迟。
最后
上面是我的一家之言,肯定有武断之处,见谅!
最后,祝你学习顺利。