`

一个小的WEB项目中的实现方法讨论 - 又一篇

阅读更多

转载自http://www.jdon.com/jivejdon/thread/31136.html

该方法使用command模式,以一个入口servlet作为controller,然后根据request的参数servicetarget决定调用哪个modle做处理,然后把结果返回到viewtarget。是一个基本的MVC实现。其controller会根据service参数,使用类的动态加载机制Service service=(Service)serviceClass.newInstance()来实现类似脚本语言的eval()功能来构建动态变量。

深入的分析一下,就会发现以下几个问题:

问题1:随着请求的增加,类的动态加载会造成很大的性能开销,所以这里有必要采取对象池来缓存创建的对象。但这就造成了代码不够简明,加大了学习难度。

问题2:变量target是传给controller供回调时用的,目的是为了把所有页面的跳转都交给controller处理,但一旦modle中的处理出现异常,将不能再返回target指定的页面,这就需要modle给出一个新的返回页面,于是modle层偶尔也要参与页面跳转。

这些问题总觉让人觉得如鲠在喉,虽然做到了MVC的实现,但却不够优雅,甚至牵强。于是我参考了一些资料,结合了以前做c/s软件的思路,本着简化设计的原则,想了以下这种模式来实现系统的设计:

--------------------------------------------------
B/S=统一C的C/S,不要忽视C的处理能力
--------------------------------------------------
1:概念

我们都熟知的MVC理论中,M就是处理业务逻辑的,V就是控制表现的,C就是控制页面跳转的。

一定要这样实现吗?

如果全部都是动态页面,这样的实现是可行和严密的,但如果混杂了静态页面,里边的<a>元素直接定义一个超链接,这样V层直接控制了页面的流向。这就显得不够严密。

这里介绍的概念是:
M=只是处理业务逻辑,并以字符串方式输出最终处理结果。(因为M是V通过script经C验证后调用的,M返回的结果直接就会到了V。)
V=只是处理页面跳转,全部采用静态页面设计,以Ajax或动态加载脚本技术请求V并接收返回值,以脚本在页面处理得到的数据。
C=只是控制V访问M的权限,实现V到M的验证和连接。

更严格的分层如下:
Server层-C+M
Client层-V+Script

这样系统处理的流程就是:
请求V-C-M,返回M-V。

2:实现

以一个Filter充当Controller,将*.do的请求以url方式转向到其他servlet或jsp处理。转向前可做权限检测。

接受转向的servlet全部继承一个接口,此接口实现2种功能,1是verify请求来源是否为Controller,2是execute,并直接将处理结果out.print出来。

V直接得到处理后的结果,并以script表示。

3:优点

A.逻辑严密
所有页面跳转都是V控制的,C只是验证是否有权限访问后台的一个控制器,M根据请求参数做业务处理,并给回返回值。

B.资源耗费最小化
B.1:服务器资源耗费最小化
传统的MVC是通过把数据层层封装,传输到前台以<%=Object.getValue()%>显示,这种MVC是直接取到数据,并以javascript结合DOM在前台动态生成。
传统MVC执行数据库的R操作,服务器的流程是V-C-M-C-V,其中新建数据传输用的临时对象n个。
这种MVC的流程是V-C-M,新建数据传输用的临时对象0个,没有后边的C-V过程。(因为M直接输出结果字符串给V了,V请求的同时就得到了这个结果。M-V的过程不需要后台参与,V的合成是在客户端完成的。)
这样因为M和C都是常驻内存的servlet(C是filter,严格来说不能算是servlet,但也是常驻内存的,jsp本质就是servlet),所以只需要注意线程安全就足够了,线程池一般的容器也都提供,几乎不必使用对象池,对待频繁访问的数据,可以由受到频繁访问的M生成静态文本文件实现cache,节约了大量资源,也简化了编程复杂度。
B.2:网络传输耗费最小化
如果采用Ajax技术,可以实现只传输必要的更新数据,节约大量数据流量。详情请参考Ajax相关资料。

C.服务器平台无关性
因为html和javascript是平台无关的,而对后台的请求得到的都是字符串,我们就可以随意选择后台的运行环境,而不必重新设计V。方便的从jsp-asp-php或其他任何语言中选择。

D.降低学习难度
用这种模式开发WEB站点,jsp/asp/php/等语言,前台编写的难易程度都变成写静态页面的难度了,后台程序员只需要关注自己的后台性能即可。
不论前台还是后台的人员,什么Taglib,什么EL的都不用去看了,甚至连jsp都不需要去学习,只要前台会一点javascript就可以熟练的操作DOM,实现动态更新页面。而后台的程序员也只要控制好各个servlet的访问权限就足够。

E.人员分工合理化
通过使用模板字符替换的技术,可以实现由脚本将数据锚点的内容动态替换成从后台取到的数据,前台美工只需要知道调用哪个url会得到什么结果就可以了,让美工去处理页面的跳转和错误提示信息,这样美工和后台终于可以完全的分割开来。
--------------------------------------------------

正如本文所说,这个构想只是“小”WEB项目的实现方法。大型的企业级分布式应用,我还没接触过。不敢妄加想象。

传统的“推”模式只适合在以前智能终端的年代,那时的客户端处理能力有限,所以是胖Server,瘦Client。
后来客户机的性能逐渐有所提高了,但在WEB方面,Browser的功能还比较单一,所以“推”习惯了的依然在推,CGI把处理好的html推给Browser,Browser只要下载处理好的html,只负责显示就可以了。
到了现在,Browser方面脚本语言的应用早已成熟,我们可以用“拉”模式,仅取出需要的数据,然后在前台合成。实现瘦Server,胖Client,减轻Server的负担。

——不要忽视C的处理能力:C已经吃够现成饭了,不需要S做好了饭菜只管吃了,S只要提供原材料,让C吃自助餐,C会吃的更好!

以上所说由M返回的字符串,可以是一段script代码,也可以是一个xml。具体应用看需求了,如果不是必须,不推荐用xml,因为xml最终也要还原成元数据,倒不如直接写入script来的痛快。构建RSS的时候只需要单独写一个生成RSS的servlet即可。

感谢您看到这里,我刚步入WEB开发行业不久,所学有限,上面的实现方法虽已构思了一段日子,但仍难免考虑不周之处,希望各位朋友看到后能及时斧正。

我喜欢来J道,因为我喜欢Taoism,中国的国教其实是道教,道学是博大精深的。我也敬佩Banq大哥的精神,鄙视一些只是提出批判而没有给出我们其他同道任何有益提示的所谓高手。

祝大家早日得道~

分享到:
评论

相关推荐

    myeclipse和eclipse的web项目导入

    在这篇文章中,我们将讨论如何将 MyEclipse 中创建的 Web 项目导入到 Eclipse 中,并进行相应的配置以便在 Tomcat 服务器上运行。 MyEclipse 中 Web 项目的创建 在 MyEclipse 中,创建一个新的 Web 项目非常简单。...

    IDEA WEB项目启动不加载application.properties配置文件.docx

    在本篇文章中,我们将讨论一种可能的原因,即项目中使用的SpringBoot版本不一致。假设我们在项目中使用的是SpringBoot 2.x版本,但是,在pom.xml文件中,我们可能引用了SpringBoot 1.x版本的依赖项。在这种情况下,...

    基于Spring Boot的商城系统的设计与实现(-java-springboot-项目-代码-源码-项目-系统-毕设-网站)

    企业网站建设的研究课题也自然而然地成为了企业内部及互联网上的一个重要讨论对象。本篇论文将探讨如何实现基于Spring Boot的网络商城管理系统。 #### 技术栈选择 本项目采用Spring Boot框架作为核心支撑,Spring ...

    eth-web-switch-four-plus-1.1.tar.gz_plus

    本篇文章将详细介绍一个名为"eth-web-switch-four-plus-1.1.tar.gz_plus"的项目,它是一个基于ATMEGA32的Web服务器,能够实现设备的远程控制与监控,极大地提高了设备的智能化水平。 首先,我们要理解的是"eth-web-...

    基于web的邮票鉴赏系统及实现--论文.rar

    《基于Web的邮票鉴赏系统及其实现》是一篇以Java编程语言为技术核心的毕业设计论文。这篇论文详细阐述了如何构建一个基于Web的邮票鉴赏平台,涵盖了前端用户界面、后端服务器逻辑以及数据库管理等多个关键模块。在...

    web定时器的实现思路

    这篇博文链接指向的是一个关于在Java应用程序中实现Web定时任务的讨论,虽然具体的细节没有给出,但我们可以根据这个主题来深入探讨Web定时器的实现思路。 1. **Java定时框架** - ** Quartz Scheduler**:Quartz是...

    jax-ws基于web容器发布webServer

    描述部分提到的是一个博客链接,虽然没有提供具体的描述内容,但我们可以推测这篇博客可能详细介绍了如何使用JAX-WS技术在Web容器中发布Web服务。通常,这会包括创建服务接口、实现服务、生成服务端点以及配置Web...

    springboot473基于web的物流管理系统--论文pf.zip

    【描述】"springboot473基于web的物流管理系统--论文pf" 暗示这里可能包含一篇详细的学术论文,探讨了如何利用Spring Boot来构建一个功能完善的Web物流管理系统。"pf"可能是论文的特定标识或作者的缩写,具体含义...

    JeeWeb-Mybatis-myeclipse(非maven版本)

    这表明我们将要讨论的是一个基于JeeWeb和Mybatis的Web项目,该项目并未采用Maven作为构建工具,而是选择在MyEclipse集成开发环境中直接管理依赖。MyEclipse是一款强大的Java EE集成开发环境,它包含了对各种Web框架...

    DDD领域驱动设计初探(7):Web层的搭建 - 文章 - 伯乐在线1

    在本篇文章中,作者将Web层的实现以Web应用为例,采用MVC(Model-View-Controller)架构,并结合Bootstrap框架进行页面构建。 Bootstrap是一款流行的前端开发框架,提供了一系列的UI组件和样式,能快速创建响应式...

    利用jdk web服务api实现,这里使用基于 SOAP message 的 Web 服务

    这个链接指向了一篇关于Java Web服务开发的博客文章,可能会包含如何创建、部署和测试SOAP Web服务的步骤,以及可能遇到的问题和解决方案。 在标签中,“源码”意味着我们将讨论实际的代码示例,而“工具”可能指的...

    在同一个系统里用cxf 实现SOAP 协议和RESTful风格 两种类型的webservice接口

    本篇将详细讲解如何使用Apache CXF框架在同一系统中同时实现这两种类型的Web服务接口。 Apache CXF是一个流行的开源Java框架,用于构建和开发Web服务。它支持SOAP、RESTful等多种Web服务规范,使得开发者能够灵活地...

    基于Web的辅助教学系统设计与实现

    毕业设计项目“基于Web的辅助教学系统设计与实现”是一个包含教材、制作过程和代码的综合项目。其开发过程大致可以分为以下几个阶段: 1. **需求分析**:通过调研现有的教学方式和用户需求,明确系统应具备哪些功能...

    基于web校友的设计与开发-毕设论文.doc

    【基于Web校友录的设计与开发】是一篇计算机科学与技术专业的本科毕业论文,主要探讨了如何构建一个基于Web的校友信息系统。这篇论文由王琳同学撰写,并由薛凯老师指导,于2007年完成。 论文的核心内容可能涵盖了...

    实战Delphi6.Kylix2.SOAP.Web Service程序设计篇李维著

    李维在书中深入讲解了Web Service的基本概念、架构和实现方法,包括WSDL(Web服务描述语言)和UDDI(统一描述、发现和集成)等关键标准。 4. **Chapters内容概览**: - **Chap03**:可能涉及Web Service的基础知识...

    web前端实习报告范文三篇实习报告总结3000字.docx

    这是一个基础的Web应用项目,目的是让学生将学到的面向对象编程思想和Web编程方法进行实践。通过创建一个简易记事本应用,实习生可以熟悉和运用JSP、Servlet和JavaBean技术。 1. 技术栈:JSP(JavaServer Pages)...

    本科毕业论文---基于web开发的图书销售系统设计与实现正文.doc

    基于Web开发的图书销售系统设计与实现是一篇典型的本科毕业论文,主要探讨了如何利用现代互联网技术构建一个高效、易用且功能完善的图书销售平台。本文将深入解析论文中的核心知识点,包括系统开发的背景、相关技术...

    基于WEB的商场管理系统的设计与实现

    通过这篇论文和源码,读者不仅可以学习到如何构建一个完整的基于Web的商场管理系统,还能了解软件开发的全过程,包括需求分析、系统设计、编码实现、测试调试以及部署上线等步骤。对于想从事Web开发或者希望提升自己...

    flaskweb开发论坛项目.zip

    本篇文章将深入探讨一个基于Flask框架的Web论坛项目——"flaskweb开发论坛项目"。我们将从项目的背景、核心概念、主要功能以及实现细节等方面进行详细解析。 一、项目背景 "flaskweb开发论坛项目"是一个使用Python...

Global site tag (gtag.js) - Google Analytics