`
笨鸟也会飞
  • 浏览: 4770 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
最近访客 更多访客>>
社区版块
存档分类
最新评论

深入浅出的理解框架(Struts2、Hibernate、Spring)与 MVC 设计模式

阅读更多

现在许许多多的初学者和程序员,都在趋之若鹜地学习Web开发的宝典级框架:Struts2,Spring,Hibernate。似乎这些框架成为了一个人是否精通Java,是否会写J2EE程序的唯一事实标准和找工作的必备基础。

然而,如果在面试的时候问这些程序员,你们为什么要学习这些框架?这些框架的本质到底是什么?似乎很少很少有人能够给我非常满意的答复。因为他们都在为了学习而学习,为了工作而学习,而不是在真正去深入了解一个框架。其实所有的人都应该思考这样的问题:为什么要学习框架?框架到底给我带来了什么?接下来,我们以登录作为一个最简单的例子,来看看不同的年代,我们是怎么写Web程序的。   

在很多年前,我们这么写程序的  

很多年前,那是一个贫苦的年代,如果我们要使用Java在网页上做一些动态的交互功能。很多人会告诉你一个技术,叫做JSP。在我还对Java非常困惑的时候,就有人告诉我,JSP是个好东西,它可以在HTML代码里面写Java代码来完成逻辑。

复制代码
<%   
     String name = request.getParameter("name");   
     String password = request.getParameter("password");   
   
     UserHandler userHandler =new UserHandler();   
     if(userHandler.authenticate(name, password)) {   
%><p>恭喜你,登录成功</p><%   
      } else {   
%><p>对不起,登录失败</p><%   
      }   
%>
复制代码

作为一张JSP,它可以接收从别的JSP发送过来的登录请求,并进行处理。这样,我们不需要任何额外的配置文件,也不需要任何框架的帮忙,就能完成逻辑。

后来,我们放弃了在页面上写逻辑

后来,程序写得越来越多,我们发现,这种在HTML代码中编写Java代码来完成逻辑的方式存在着不少问题:

1. Java代码由于混杂在一个HTML环境中而显得混乱不堪,可读性非常差。一个JSP文件有时候会变成几十K,甚至上百K。要找一段逻辑,经常无法定位。

2. 编写代码时非常困惑,不知道代码到底应该写在哪里,也不知道别人是不是已经曾经实现过类似的功能,到哪里去引用。

3. 突然之间,某个需求发生了变化。于是,每个人蒙头开始全程替换,还要小心翼翼的,生怕把别人的逻辑改了。

4. 逻辑处理程序需要自己来维护生命周期,对于类似数据库事务、日志等众多模块无法统一支持。

在这个时候,如果有一个产品,它能够将页面上的那些Java代码抽取出来,让页面上尽量少出现Java代码,该有多好。于是许多人开始使用servlet来处理那些业务逻辑。

  

复制代码
publicclass LoginServlet extends HttpServlet {   
    
    /* (non-Javadoc)  
     * @see javax.servlet.http.HttpServlet#doPost

(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)  
     */  
    @Override  
    protectedvoid doPost(HttpServletRequest req, 
HttpServletResponse resp) throws 

ServletException, IOException {   
        String message =null;   
        RequestDispatcher dispatcher = 
req.getRequestDispatcher("/result.jsp");   
        String name = req.getParameter("name");   
        String password = req.getParameter("password");   
            
        UserHandler userHandler =new UserHandler();   
        if(userHandler.authenticate(name, password)) {   
            message ="恭喜你,登录成功";   
        } else {   
            message ="对不起,登录失败";   
        }   
            
        req.setAttribute("message", message);   
        dispatcher.forward(req, resp);   
    }   
} 
复制代码

 

在这里,我们需要在web.xml中为这个servlet配置url的请求关系。    

  

复制代码
<servlet>   
  <servlet-name>Login</servlet-name>   
    <servlet-class>   
      com.demo2do.servlet.LoginServlet   
  </servlet-class>   
</servlet>   
<servlet-mapping>   
  <servlet-name>Login</servlet-name>   
  <url-pattern>   
    /Login   
  </url-pattern>   
</servlet-mapping>
复制代码


 

 代码重构到这里,我们发现,其实我们的工作量本身并没有减少,只是代码从JSP移动到了Servlet,使得整个流程看上去稍微清楚了一些。然而,为了这么点干净,我们付出的代价是什么?为每个servlet都在web.xml里面去做一个url的请求配置!  

再后来,出现框架

时代进一步发展,人们发现简单的JSP和Servlet已经很难满足人们懒惰的要求了。于是,人们开始试图总结一些公用的Java类,来解决Web开发过程中碰到的问题。这时,横空出世了一个框架,叫做struts。它非常先进地实现了MVC模式,成为了广大程序员的福音。

struts的代码示例我就不贴了,网上随便搜搜你可以发现一堆一堆的。在一定程度上,struts能够解决web开发中的职责分配问题,使得显示与逻辑分开。不过在很长一段时间内,使用struts的程序员往往无法分别我们到底需要web框架帮我们做什么,我们到底需要它完成点什么功能?

我们到底要什么

在回顾了我们写代码的历史之后,我们回过头来看看,我们到底要什么?

无论是使用JSP,还是使用Struts1,或是Struts2,我们至少都需要一些必须的元素(如果没有这些元素,或许我还真不知道这个程序会写成什么样子):

1. 数据

在这个例子中,就是name和password。他们共同构成了程序的核心载体。事实上,我们往往会有一个User类来封装name和password,这样会使得我们的程序更加OO。无论怎么说,数据会穿插在这个程序的各处,成为程序运行的核心。

2.页面展示

在这个例子中,就是login.jsp。没有这个页面,一切的请求、验证和错误展示也无从谈起。在页面上,我们需要利用HTML,把我们需要展现的数据都呈现出来。同时我们也需要完成一定的页面逻辑,例如,错误展示,分支判断等等。

3.处理具体业务的场所

在这里,不同阶段,处理具体业务的场所就不太一样。原来用JSP和Servlet,后来用Struts1或者Struts2的Action。

上面的这些必须出现的元素,在不同的年代,被赋予了不同的表现形式,有的受到时代的束缚,其表现形式非常落后,有的已经不再使用。但是拨开这些外在的表现形式,我们就可以发现,这不就是我们已经熟门熟路的MVC嘛?


数据 ———— Model
页面展示 ———— View
处理具体业务的场所 ———— Control

所以,框架不重要,概念是王道。只要能够深刻理解MVC的概念,框架对你来说,只是一个jar包而已。

MVC的概念其实就那么简单,这些概念其实早已深入我们的内心,而我们所缺乏的是将其本质挖掘出来。我们来看看下面这幅图,这是一副流行了很多年的讲述MVC模型的图:


在这幅图中,MVC三个框框各司其职,结构清晰明朗。不过我觉得这幅图忽略了一个问题,就是数据是动的,数据在View和Control层一旦动起来,就会产生许多的问题:

1. 数据从View层传递到Control层,如何使得一个个扁平的字符串,转化成一个个生龙活虎的Java对象

2. 数据从View层传递到Control层,如何方便的进行数据格式和内容的校验?

3. 数据从Control层传递到View层,一个个生龙活虎的Java对象,又如何在页面上以各种各样的形式展现出来

4. 如果你试图将数据请求从View层发送到Control层,你如何才能知道你要调用的究竟是哪个类,哪个方法?一个Http的请求,又如何与Control层的Java代码建立起关系来?

除此之外,Control层似乎也没有想象中的那么简单,因为它作为一个控制器,至少还需要处理以下的问题:

1. 作为调用逻辑处理程序的facade门面,如果逻辑处理程序发生了异常,我们该如何处理?

2. 对于逻辑处理的结果,我们需要做怎么样的处理才能满足丰富的前台展示需要?

这一个又一个问题的提出,都基于对MVC的基本概念的挖掘。所以,这些问题都需要我们在写程序的时候去一一解决。说到这里,这篇文章开头所提的问题应该可以有答案了:框架是为了解决一个又一个在Web开发中所遇到的问题而诞生的。不同的框架,都是为了解决不同的问题,但是对于程序员而言,他们只是jar包而已。框架的优缺点的评论,也完全取决于其对问题解决程度和解决方式的优雅性的评论。所以,千万不要为了学习框架而学习框架,而是要为了解决问题而学习框架,这才是一个程序员的正确学习之道。

分享到:
评论

相关推荐

    spring+struts2+hibernate框架说明

    Struts的MVC设计模式可以使我们的逻辑变得很清晰,让我们写的程序层次分明。Spring 提供了管理业务对象的一致方法,并鼓励注入对接口编程而不是对类编程的良好习惯,使我们的产品在最大程度上解耦。Hibernate 是用来...

    JSP SSH耗材进销存管理系统 JSP java struts2 hibernate spring MVC编程开发 myeclipse

    JSP SSH耗材进销存管理系统 是一套完善的WEB设计系统,对理解JSP java struts2 hibernate spring MVC编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。 应用技术:java|jsp+mysql 开发...

    基于Struts,Hibernate和Spring的J2EE架构研究

    介绍Struts,Hibernate和Spring三个开源框架及它们对MVC设计模式的实现,阐述如何更好地将三者结合起来构建一个健壮、高效、易于扩展的J2EE分层架构,并给出该架构的结构图,分析它的优缺点,并且通过网上购物系统给出了...

    Struts + Spring + Hibernate 中文帮助文档

    Struts 的MVC设计模式可以使我们的逻辑变得很清晰。 Spring 的IOC和AOP可以使我们的产品在最大限度上解藕。 hibernate的当然就是实体对象的持久化了 适合初级和中级JavaWeb开发者使用。 灰常经典。。。不容错过。...

    图书管理系统(struts+hibernate+spring).rar

    通过这个资料包,用户可以深入了解和学习如何在Web应用程序中实现一个图书管理系统,掌握如何将Struts、Hibernate和Spring框架整合在一起,实现分层架构、MVC设计模式以及ORM映射等关键技术。Struts作为一款优秀的...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (1)

    2.1.1 MVC模式的设计思想 2.1.2 MVC模式的处理过程 2.2 Model规范 2.2.1 Model1规范 2.2.2 Model2规范 2.3 使用MVC的优劣 2.3.1 使用MVC模式的好处 2.3.2 使用MVC模式的不足之处 2.4 目前市场上常见的轻量级J2EE开发...

    SSH struts Spring Hibernate

    我们的目标是:能够熟练运用当前流行的java开源框架:Struts、Hibernate以及Spring来构建灵活、易于扩展的多层Web应用程序 1.Struts的目标是提供一个开发Web应用...Struts鼓励基于M2模式(即MVC设计模式)来开发程序。

    struts spring hibernate整合框架

    Struts : MVC 设计模式的框架. MVC : V : view 视图层 : 用户与应用程序交互的界面。 用户通过view向服务器发送请求 并查看处理结果(JSP). M : Model(模型) : 是用户业务逻辑的实现,用于处理 用户发出的各种...

    Struts2+Hibernate+Spring框架电子商城

    本系统采用的关键技术是Struts2+...Spring是以MVC模式为基础,依赖注入为核心的Java应用框架,它利用Java的反射机制,将系统各层无缝的整合在一起,实现了系统各模块和各层次的解藕,提高了系统的可维护性和可移植性。

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (3)

    2.1.1 MVC模式的设计思想 2.1.2 MVC模式的处理过程 2.2 Model规范 2.2.1 Model1规范 2.2.2 Model2规范 2.3 使用MVC的优劣 2.3.1 使用MVC模式的好处 2.3.2 使用MVC模式的不足之处 2.4 目前市场上常见的轻量级J2EE开发...

    搞定J2EE核心技术与企业应用:Ajax,JSP,Struts2,Spring,Hibernate,完整扫描版

    《搞定j2ee核心技术与企业应用:ajax,jsp,struts 2,spring,hibernate》是笔者在多年项目开发过程中的经验总结,它通过丰富的实例由浅入深、循序渐进地介绍了目前采用java进行web开发的各种框架的使用方法,从而...

    会员管理系统(struts+hibernate+spring)130226.rar

    "会员管理系统(struts+hibernate+spring)130226.rar" 是一个针对计算机专业的JSP源码资料包,它集成了Struts、Hibernate和Spring框架,旨在为用户提供一个高效、稳定且易于维护的会员管理解决方案。这个系统通过使用...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (2)

    2.1.1 MVC模式的设计思想 2.1.2 MVC模式的处理过程 2.2 Model规范 2.2.1 Model1规范 2.2.2 Model2规范 2.3 使用MVC的优劣 2.3.1 使用MVC模式的好处 2.3.2 使用MVC模式的不足之处 2.4 目前市场上常见的轻量级J2EE开发...

    论文研究-基于Struts和Hibernate的在线考试系统 .pdf

    基于Struts和Hibernate的在线考试系统,段朋鹏,郭庆平,在J2EE的B/S应用架构下,以Struts作为表示层框架,Hibernate作为数据持久层框架,设计一个MVC模式的在线考试系统。该系统运行效率高,具��

    源码基于JSP的车辆管理系统(struts+hibernate+spring+oracle).rar

    在技术架构方面,该系统采用MVC设计模式,实现了业务逻辑、数据访问与界面展示的分离。Struts框架负责处理用户请求和页面跳转,Hibernate框架实现了对象关系映射(ORM),简化了数据库操作,而Spring框架则提供了...

    项目申报系统(Struts2+Spring+Hibernate+Jsp+Mysql5)源码.zip

    该系统源码采用了先进的MVC设计模式,通过Struts2框架实现前端页面的展示与交互,Spring框架负责业务逻辑的处理与组件管理,Hibernate框架则负责数据的持久化操作。同时,JSP技术被广泛应用于前端页面的开发,为用户...

    SSH2(spring3.2+strust2.3.4+hibernate4.2)框架演示代码

    Struts2是一个基于MVC设计模式的Web应用框架,负责处理请求和响应;Hibernate是一个对象关系映射(ORM)框架,用于将Java对象映射到关系数据库中的表。 以下是一个SSH2框架演示代码的资源描述: 项目结构 Web层...

    源码基于JSP的内容管理系统(hibernate3+struts2+spring2).rar

    本资料包是一个基于JSP的内容管理系统,采用了Hibernate3、Struts2和Spring2这三个流行的Java框架进行开发。整个系统的设计遵循了MVC(Model-View-Controller)模式,将数据、界面和控制逻辑分离,使得代码结构清晰...

    21道Java Spring MVC综合面试题详解含答案(值得珍藏)

    Spring MVC是Spring框架中的一部分,全称是Spring Web MVC,主要用于实现MVC设计模式的Web框架。它分离了控制器、模型对象、过滤器以及处理程序对象的角色,使得它们更容易进行定制。 Spring MVC的优点包括: 基于...

    OA办公自动化管理系统(Struts1.2+Hibernate3.0+Spring2+DWR)130224.rar

    该系统采用了MVC设计模式,将业务逻辑、数据访问和表示层分离,提高了代码的可维护性和可扩展性。Struts1.2作为Web层的框架,负责处理用户的请求和响应,以及页面之间的跳转。它通过ActionForm和Action类来实现数据...

Global site tag (gtag.js) - Google Analytics