简单介绍一下,我的 Java/C# web 后端开发技术选择。与网上一般人所用,大不相同。
先来一个表格,以下是我常用的Java/C# web 后端开发技术:
技术分类 | Java web | C# web |
---|---|---|
数据库 | bonecp,commons-dbcp,commons-dbutils | Npgsql |
网页模板引擎 | freemarker,velocity | NVelocity |
应用日志 | commons-logging,slf4j,logback | log4net,NLog |
配置参数 | commons-configuration | |
代码简洁化 | commons-lang3,commons-io,guava | |
定时任务 | quartz | |
文件上传 | commons-fileupload | |
前端、后端交互, json 数据 | json-lib | Newtonsoft.Json |
辅助工具 | commons-beanutils,commons-codec,commons-collections,commons-pool,commons-vfs2,ezmorph,httpclient,httpcore,jsch,jxl,opencsv,dom4j,rhino ,unboundid-ldapsdk,oro,poi | ZXing.Net,FluentFTP,SSH.NET,LumenWorksCsvReader,NPOI,Microsoft Report Viewer Control,NPOI,SharpZipLib |
单元测试 | junit | xUnit.net |
公司自写框架/组件 | velocityweb | common_db,common_uitls |
数据库层,在 Java 7 引入 try-with-resources 语法之前,代码编写比较繁琐,需要手工 close db-Connection, PreparedStatement, ResultSet。所以一般使用 Apache 的 commons-io,commons-dbutils 来简化此处代码。而在 Java 7 之后,有了 try-with-resources 语法,这种事情就容易处理了。
按理,Java/C# 代码,均应及时关闭数据库的各种资源。但在 C# 编程界,没有像 Java 那样特别强调这方面。猜测可能是因为,Java 编程习惯性地搭配 Oracle 数据库,它需要及时关闭数据库的各种资源,包括 Connection, PreparedStatement, Resul,否则容易出问题。而 C# 习惯性地搭配 MS SQL Server, 不及时关闭数据库的各种资源,好像也不碍事。
因此,此处有一个“软件技术的选择,影响编程思路与习惯”这种老问题。
网页模板引擎方面,我习惯于不使用 Java 自带的 JSP/JSTL, 也不使用 ASP.NET 自带的 ASP/Razor,而习惯于使用 Apache velocity、NVelocity 这种第三方模板引擎。主要原因,在于第三方引擎,可以兼容多个 web 容器(Tomcat/IIS)的不同版本,可以持续使用很多年。且第三方模板,技术足够简单,容易上手。
当然了,使用这种第三方模板,需要自己写代码,维护一个全局的 static Map, 其 key 为相对网址,Map 为对应的 Java/C# Request Dispatcher 子类。
上表中,Java 编程的配置参数、代码简洁化、定时任务、文件上传等所用第三方 jar 包,在 C# 编程中一般无对应的第三方组件。原因是因为 C# 在自身标准库的功能,简单且功能足够。
定时任务方面,Java web 编程习惯于在固定时间运行定时任务,比如 quartz。而 C# Web 编程常见的做法则是将代码隔离出来,使用 Windows Service 来运行。换句话说,Java web 习惯于将后台线程代码与 web 后端逻辑放在同单个 .war 包中,而 C# web 则习惯于拆分,使用 Windows Service(服务), 或 Windows OS task(操作系统定时任务) 来运行单个 exe 模块。
.Net framework 自带 json 解析类,而 Java JRE/JDK 则缺少此类功能,需要使用第三方组件包。
因前端网页编程,我一般使用 jqGrid, 基于 json 数据格式,进行 web 前后端数据传输查询翻页表格数据。所以,表格中的 Java web 与 C# web ,均使用了 json 组件。
单元测试方面,Java 编程有使用 JUnit 的习惯,而 C# 编程这方面的习惯较少,一般都是人工在界面上测试。这方面的差异,大概是 Java 编程界,更喜欢折腾、更经常重构代码,频繁大批量更改代码,导致 JUnit 必不可少。
基于 transaction-per-request 的 web 编程模式,是很常见的。我很奇怪,Java web 与 Asp.Net 均未提供对应的功能。没办法,只能自己写一些简单的框架/组件,来达到这个功能。
Velocityweb 是我自己的写的一个 Java 框架,早期版本放在 http://velocityweb.sourceforge.net/ 。后续更新未上传到 sourceforge.net 网站上去。基于 transaction-per-request 的 web 编程模式,结合 velocity 的一些常用功能。