当前开发Web应用中,尤其是互联网及移动互联网网站,PHP是绝对的主流。另外,Python也以小清新的姿态,越来越在技术为导向的项目中采用。而一些敢于尝新者,也有应用node.js来开Web网站的例子。而前些年风光无限的Java,如今在Web开发领域,逐渐处于边缘化状态。然而,单就语言本身而言,无论从表现能力、性能、可扩展性方面来看,Java语言无疑是很优秀的,造成Java在Web领域困境的根本原因,不在于Java语言本身,而在于Java业者的思维定式。Java业者过分重视框架,这直接导致了诸如Struts+Spring+Hibernate这种重量级SSH框架的流行,是敏捷开发团队不能承受之重。另外,Java一直崇尚JEE企业级应用开发,由此EJB、JCA等技术大行其道,而这些是典型的屠龙术,具有讽刺意味的是,当前大容量、高并发的系统,基本没有JEE开发出来的。

综上所述,Java语言本身很优秀,但是受框架和规范的拖累,在敏捷开发领域逐渐势微。但是如果我们可以转变思路,采用目前主流PHP的开发模式,相信Java以语言的完备性和性能上的优势,在Web开发方面还是大有可为的。

首先我们来分析一下一个典型的PHP应用的处理流程,用户首先请求一个index.php页面,在该页面中完成各种初始化工作,同时将其路由到对应的Controller,执行业务逻辑,生成需要供页面显示的Model,然后调用页面模板,将Model内容显示到页面中去。

将上棕思路直接映射到Java中,可以得到一个超简单的Web框架。

首先,一个Web应用有一个Servlet,所有用户请求都经过这个Servlet来处理。如下所示:

/*** 无论POST还是GET请求,均通过本函数进行处理* @param request* @param response* @throws IOException* @throws ServletException*/public void doProcess(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {request. setCharacterEncoding("UTF-8");response.setCharacterEncoding("UTF-8");response.addHeader("Content-Type", "text/html; charset=utf-8");PrintWriter out = response.getWriter();// 求出请求命令String cmd = "none";if (request.getParameter("cmd") != null) {cmd = request.getParameter("cmd");}// 根据请求命令调用不同方法switch (cmd) {case "dispApplyCapital":dispApplyCapital(request, response);break;}}

如上所示,系统根据请求中不同的cmd参数,转到不同的处理方法。比如上例中,对dispApplyCapital命令就将调用dispApplyCapital方法。代码如下所示:

private void dispApplyCapital(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {String json = "{\"name\":\"yt闫涛\", \"userId\":200}";request.setAttribute("json", json);Map<String, String> model = new HashMap<String, String>();model.put("page_title", "股票交易");model.put("header_title", "交易v1");JSONArray capOpts = new JSONArray();JSONObject capOptsItem = null;try {capOptsItem = new JSONObject();capOptsItem.put("amount", 1);capOpts.put(capOptsItem);capOptsItem = new JSONObject();capOptsItem.put("amount", 10);capOpts.put(capOptsItem);capOptsItem = new JSONObject();capOptsItem.put("amount", 100);capOpts.put(capOptsItem);} catch (JSONException e) {// TODO Auto-generated catch blocke.printStackTrace();}model.put("capOpts", capOpts.toString());model.put("procFeeRatio", "0.00399");model.put("marginRatio", "0.08");request.setAttribute("model", model);this.getServletContext().getRequestDispatcher("/caporder/apply_capital.jsp").forward(request, response);}

在上述代码中,对Controller的调用以及生成Model内容都在这个方法中完成了,主要是为了演示目的,在实际应用中需要调用独立的Controller类,生成Model内容。同时,需要注意的是,在上面代码中,并没有定义值对象,而是直接使用Map接口类,因为在Java中传递任何内容都需要定义一个值对象,非常麻烦,反观PHP,所有参数传递,基本都是通过数组来实现的,PHP中的数组,大致等价于Java中的Map,所以这里通过Map对象向页面传递Model内容。最后,将请求转到对应的页面。

在页面中实现模板技术,Java的主流方法是采用Tag,通过加入Tag来实现在模板不同位置添加不同内容。但是PHP是直接采用require_once来实现包含其他页面的功能,因此我们也直接采用JSP中的<%@ page include="" %>来实现,具体代码如下所示:

<%@page contentType="text/html;charset=UTF-8"%>
<%@ include file="/header.jsp" %><script>
var g_mjson = null;
$(document).ready(function(){ g_mjson = <%=model.get("capOpts")%>;var opts = "";var i = 0;for (i=0; i<g_mjson.length; i++) {opts += "<input type='radio' name='applyAmount' value='" + g_mjson[i].amount + "'>" + g_mjson[i].amount + "万  ";}    $("#capOpts").html(opts);var procFeeRatio = <%=model.get("procFeeRatio")%>;$("#procFeeTxt").val("0.0");$("input[name='applyAmount']").click(function(eve) {alert("click me! v1 v=" + $("[name='applyAmount']:checked").val() + "!");$("#procFeeTxt").val(procFeeRatio*10000.0);});
});
</script>实盘申请<%=model.get("capOpts")%><br />
申请金额:<span id="capOpts"></span><input type="text" id="amount" /><br />
手续费:<input type="text" id="procFeeTxt" readonly /> 金币账户:<a href="#">立即充值</a><br />
保证金:钱包账户:<a href="#">立即充值</a><br />
<input type="button" value="确认申请" />
<input type="button" value="取消申请" /><br /><%@ include file="/footer.jsp" %>

在上面代码中,通过包含header.jsp文件,加入了jQuery这个javascript库的支持。在页面显示中,直接将JSP作为模板技术,直接将Model中的内容打印到页面中。PHP中也有采用专门模板技术的风格,但是通常以牺牲性能为代价。只是为了避免在页面中出现Java或PHP代码而采用模板技术得不偿失,现在页面设计工具大多可能完美解决页面中嵌入Java或PHP代码的情况,所以直接在页面中嵌入代码是可以的。同时这也使开发人员少学一种模板语言,减轻了开发人员的负担。

新Java运动Nava:师PHP技术以开发Web应用相关推荐

  1. java程序设计与j2ee中间件技术/软件开发技术(III)-大作业-采用MVC模式实现商品信息的查询显示(可以模糊查询)、增加和删除功能,商品表自拟,实现简单菜单操作和分页显示

    目录 1.题目说明 2.实验设计 2.1 表设计 2.2 工程结构 3.运行界面截图与说明 4.小结 附录:源代码 src/main/java src/main/java/bean Goods.jav ...

  2. 软件架构(10)---java资深架构师分布式技术分享

    1 大型网站的特点 用户多,分布广泛 大流量,高并发 海量数据,服务高可用 安全环境恶劣,易受网络攻击 功能多,变更快,频繁发布 **从小到大,渐进发展 ** 以用户为中心 免费服务,付费体验 2 大 ...

  3. mean技术栈 linux,“MEAN”技术栈开发web应用

    var express = require('express'); var app = express(); app.listen(3000); var _rootDir = __dirname; v ...

  4. 2018.7-2019.7一周年Java进阶架构师技术文章整理 建议收藏

    其实师长的公众号从2017年就开始发技术文章了,但是因为某些原因(就是懒)太监了许久,直到2018.7的时候才恢复更新.不知不觉中,已经更新了一年的广告,在没广告的日子里,顺带更新技术文章,截至201 ...

  5. 阿里 P8 Java高级架构师,都需要掌握哪些技术栈?

    大家都知道,阿里P8高级技术专家,基本上是一线技术人能达到的最高职级,也是很多程序员追求的目标.达到平均年入百万的P8 Java高级架构师级别,不仅要具备优秀的编程能力和系统设计能力,在技术视野和业务 ...

  6. Java基础(适合新学者和架构师阅读)

    近日为了复习CoreJava故自己收集了很多书籍汇编成以下java最核心的内容:参考出处(Java从入门到精通,Java学习手册(app))备注:我不留对别人毫无用处的博文,所以如果对你有用处请评论. ...

  7. 横瓜执导众程序员开展大讨论关于C、JAVA及其它主流IT技术使用情况和优点缺点。...

    横瓜执导众程序员开展大讨论关于C.JAVA及其它主流IT技术使用情况和优点缺点. 遥执乾坤(44758121)  18:21:23 mysql据说只能使用一个索引,我这里几乎所有字段都有索引. 但每个 ...

  8. Java成神之路技术整理

    转载自 Java成神之路技术整理 以下是Java技术栈微信公众号发布的所有关于 Java 的技术干货,会从以下几个方面汇总,本文会长期更新. Java 基础篇 Java 集合篇 Java 多线程篇 J ...

  9. 好好讲一讲,到底什么是Java高级架构师!

    一. 什么是架构师 曾经有这么个段子: 甲:我已经应聘到一家中型软件公司了,今天上班的时候,全公司的人都来欢迎我. 乙:羡慕ing,都什么人来了? 甲:CEO.COO.CTO.All of 程序员,还 ...

最新文章

  1. [原]SSL 开发简述(Delphi)
  2. linux zlib简介
  3. ASP.NET基础教程-SqlConnection对象-使用连接事件
  4. 15.枚举enum.rs
  5. 开心果 | 即使天天看的图标 你未必都认识
  6. 永洪bi_案例分享!永洪BI助力知名三甲医院数字化转型升级
  7. 蔡高厅老师 - 高等数学阅读笔记 - 03 - 极限(13、14、15、16、17)
  8. JavaScript中的类方法、对象方法、原型方法
  9. 2020年创业公司到底过得怎么样?数据分析来为你揭晓
  10. [家里蹲大学数学杂志]第275期华中师范大学2011年数学专业复试试题及部分参考解答...
  11. Python安装cv2库出错及解决:Could not find a version that satisfies the requirement cv2
  12. 大数据_HDFS原理
  13. 什么是青藤零域·微隔离安全平台?
  14. html文字超过部分显示为省略号
  15. python的一些技巧操作,提高编码效率
  16. 云原生Envoy边缘服务代理简介和使用指南
  17. android混淆简单教程
  18. IP电话解决方案(网络拓扑图 解决方案)^
  19. 云图和热力图的绘制算法
  20. python网络爬虫--下载图片

热门文章

  1. 个人独立博客的去与从
  2. PAT乙级 1018 锤子剪刀布 (JAVA)
  3. 苹果cmsv10简洁清新漂亮wap+pc自适应大屏免费模板
  4. treeview 的show属性
  5. FastJson小技巧——@JSONField
  6. 我的TCSVT投稿经历,共勉!
  7. 怎么查看便签的历史记录
  8. [LeetCode] N-ary Tree Postorder Traversal N叉树的后序遍历
  9. html调节tr的距离,css tr间距怎么设置?
  10. 白底黑字!Android浅色状态栏黑色字体模式