Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Struts学习笔记

1,861 views

Published on

  • Be the first to comment

Struts学习笔记

  1. 1. Struts 学习笔记 By: 张红宇 [email_address]
  2. 2. Struts 学习笔记 <ul><ul><li>Struts 框架 </li></ul></ul><ul><ul><li>根据资料整理得 struts 的基本知识 </li></ul></ul><ul><ul><li>个人思考 </li></ul></ul><ul><ul><li>个人学习和应用 struts 的一些心得、思考 </li></ul></ul>
  3. 3. Struts 框架 <ul><li>Struts 简介 </li></ul><ul><li>MVC 模式 </li></ul><ul><li>Struts 流程 </li></ul><ul><li>Struts 核心 </li></ul><ul><li>基于 struts 的开发流程 </li></ul><ul><li>Struts 的学习资料 </li></ul>
  4. 4. 个人思考 <ul><li>Struts 的优点 </li></ul><ul><li>Tiles </li></ul><ul><li>国际化和本地化 </li></ul><ul><li>一个 struts 的小例子 </li></ul><ul><li>Struts + Hibernate 的 J2EE 架构 </li></ul><ul><ul><li>Hibernate </li></ul></ul><ul><ul><li>J2EE </li></ul></ul><ul><ul><li>Struts + Hibernate 的 J2EE 架构 </li></ul></ul><ul><li>总结 </li></ul>
  5. 5. Struts 简介 <ul><li>Struts 最早于 2002 年 5 月作为 Apache Jakarta 项目的组成部分问世。项目的创立者希望通过对该项目的研究,改进和提高 Java Server Pages (JSPs) 、 Servlet 、标签库以及面向对象的技术水准。像其他的 Apache 组织的项目一样, Struts 也是开放源码项目。当前最高发行版本为 Struts1.1 ,可以到 http:// jakarta.apache.org /struts 下载。 </li></ul><ul><li>Struts 是一种 web 框架( framework ),一个比较好的 MVC 框架,提供了对开发 MVC 系统的底层支持,它的目的是为了帮助你减少在运用 MVC 设计模型来开发 Web 应用的时间。 </li></ul>
  6. 6. MVC 模式 <ul><li>Sun 公司在 jsp 早期制定了两种规范,称为 </li></ul><ul><li>model1 和 model2 。 </li></ul><ul><li>Model 1 </li></ul><ul><li>JSP 为中心的开发模型 。 </li></ul><ul><li>Model 2 </li></ul><ul><li>基于 MVC 的模型。 </li></ul><ul><li>Struts 与 MVC </li></ul>
  7. 7. JSP Model 1 <ul><li>以 JSP 为中心的开发模型。 </li></ul><ul><li>在 JSP 页面中同时实现显示、业务逻辑和流程控制,从而可以快速地完成应用开发。 </li></ul><ul><li>适于小项目的开发。 </li></ul>
  8. 8. JSP Model 1 <ul><li>Model 1 的不足: </li></ul><ul><li>1 、不利于应用扩展和更新。 </li></ul><ul><li>应用的实现一般是基于过程的 , 一组 JSP 页面 </li></ul><ul><li>实现一个业务流程,如果要进行改动,必须 </li></ul><ul><li>在多个地方进行修改。 </li></ul><ul><li>2 、不利于应用系统业务的重用和改动。 </li></ul><ul><li>应用不是建立在模块上的,业务逻辑和表示逻辑混 </li></ul><ul><li>合在 JSP 页面中没有进行抽象和分离。 </li></ul>
  9. 9. JSP Model 2 <ul><li>Model 2 表示的是基于 MVC 模式的框架。 </li></ul><ul><li>MVC 是 Model - View - Controller 的简写。 </li></ul><ul><li>这些组件可以进行交互和重用。从而弥补了 Model 1 的不足。 </li></ul>
  10. 10. MVC <ul><li>“ Model” 代表的是应用的业务逻辑(通过 JavaBean , EJB 组件实现) </li></ul><ul><li>“ View” 是应用的表示层(由 JSP 页面产生) </li></ul><ul><li>“ Controller” 是提供应用的处理过程控制(一般是一个 Servlet ) </li></ul><ul><li>通过这种设计模型把应用逻辑,处理过程和显示 </li></ul><ul><li>逻辑分成不同的组件实现,以实现代码重用和易 </li></ul><ul><li>于修改。 </li></ul>
  11. 11. MVC <ul><li>MVC 组件类型的关系和功能: </li></ul>
  12. 12. Struts 与 MVC <ul><li>Model2 容易使系统出现多个 Controller ,并且对页面导航的处理比较复杂。有些人觉得 Model2 不够好,于是 Craig R. McClanahan 2000 年 5 月 提交了一个 WEB framework 给 Java Community 。这就是后来的 Struts 。 </li></ul><ul><li>Struts 其实就是 Model2 基础上实现的一个 MVC 架构。它只有一个中心控制器。 </li></ul>
  13. 13. Struts 与 MVC <ul><li>Struts 提供了 Controller 组件并且整合了其它技术来实现 Model 和 View 。例如,对于 Model , struts 可以使用标准数据访问技术如 JDBC 和 EJB ,也可以使用第三方工具,如 Hibernate 、 iBATIS 、 O/R 桥。至于 View , struts 支持 jsp ,包括 JSTL ( JSP Standard Tag Library )和 JSF(Java Server Faces) ,也可以是 Velocity 模板、 XSLT ( the Extensible Stylesheet Language Transformations )及其它表示系统。 </li></ul>
  14. 14. Struts 与 MVC <ul><li>Controller :控制器的作用是从客户端接受请求,并且选择执行相应的业务逻辑,然后把响应结果送回到客户端。在 Struts 中 Controller 功能由 ActionServlet 和 ActionMapping 对象构成:核心是一个 Servlet 类型的对象 ActionServlet ,它用来接受客户端的请求。 ActionServlet 包括一组基于配置的 ActionMapping 对象,每个 ActionMapping 对象实现了一个请求到一个具体的 Model 部分中 Action 处理器对象之间的映射。 </li></ul>
  15. 15. Struts 与 MVC <ul><li>Model : MVC 系统中的 Model 部分从概念上可以分为两类――系统的内部状态,和改变系统状态的动作。 Struts 为 Model 部分提供了 Action 和 ActionForm 对象:所有的 Action 处理器对象都是开发者从 Struts 的 Action 类派生的子类。 Action 处理器对象封装了具体的处理逻辑,调用业务逻辑模块,并且把响应提交到合适的 View 组件以产生响应。 </li></ul>
  16. 16. Struts 与 MVC <ul><li>Struts 提供的 ActionForm 组件对象,它可以通过定义属性描述客户端表单数据。开发者可以从它派生子类对象,利用它和 Struts 提供的自定义标记库结合可以实现对客户端的表单数据的良好封装和支持, Action 处理器对象可以直接对它进行读写,而不再需要和 request 、 response 对象进行数据交互。通过 ActionForm 组件对象实现了对 View 和 Model 之间交互的支持。 Struts 通常建议使用一组 JavaBean 表示系统的内部状态,根据系统的复杂度也可以使用像 Entity EJB 和 Session EJB 等组件来实现系统状态。 Struts 建议在实现时把 &quot; 做什么 &quot; ( Action )和 &quot; 如何做 &quot; (业务逻辑)分离。这样可以实现业务逻辑的重用。 </li></ul>
  17. 17. Struts 与 MVC <ul><li>View : Struts 应用中的 View 部分是通过 JSP 技术实现的。 Struts 提供了自定义的标记库可以使用,通过这些自定义标记可以非常好地和系统的 Model 部分交互,通过使用这些自定义标记创建的 JSP 表单,可以实现和 Model 部分中的 ActionForm 的映射,完成对用户数据的封装,同时这些自定义标记还提供了像模板定制等多种显示功能。 </li></ul>
  18. 18. Struts 与 MVC <ul><li>也有人认为 Action 也是控制器的一部分 </li></ul>
  19. 19. <ul><li>Struts 简介 </li></ul><ul><li>MVC 模式 </li></ul><ul><li>Struts 流程 </li></ul><ul><li>Struts 核心 </li></ul><ul><li>基于 struts 的开发流程 </li></ul><ul><li>Struts 的学习资料 </li></ul>
  20. 20. Struts 流程
  21. 21. Struts 流程 <ul><li>视图中的 JSP 由于用户的交互作用而生成一个请求( Struts 定制标记库来构建 JSP ) </li></ul><ul><li>Struts ActionServlet 接收请求。这个 ActionServlet 使用配置文件来确定要对请求执行的操作,从而调用 Struts Action 类合适的特定于应用程序的子类。此外,它必须从请求生成被发送到这个操作的表单 bean 。 </li></ul><ul><li>Action 子类与永久存储器和组成模型的一些应用程序交互——调用业务模块接口,返回结果。 </li></ul><ul><li>ActionServlet 接受 Action 的 Execute 方法的返回值 ActionForward ,确定显示结果的合适的视图组件。 </li></ul><ul><li>ActionServlet 将这个信息转发给操作所选择的视图组件(一般来说是 JSP ),然后这个组件将结果显示出来。 </li></ul>
  22. 22. Struts 流程图
  23. 23. Struts 核心组件 可以减轻开发显示层次的工作 Struts 标记库 用来存储和回收错误 ActionError 用来指示操作转移的对象 ActionForward 帮助控制器将请求映射到操作 ActionMapping 显示模块数据 ActionForm 包含事务逻辑 Action 控制器 ActionServlet
  24. 24. Struts 核心组件 <ul><li>Struts 组件结构图 </li></ul>
  25. 25. Struts 核心组件
  26. 26. Struts 核心 <ul><li>ActionServlet 是一个 FrontController ,它是一个标准的 Servlet ,是 javax.servlet.http.HttpServlet 类的扩展。它将 request 转发给 RequestProcessor 来处理 </li></ul><ul><li>RequestProcessor 根据提交过来的 url ,如 *.do ,从 ActionMapping 中得到相应的 ActionForm 和 Action 。然后将 request 的参数对应到 ActionForm 中,进行 form 验证。如果验证通过则调用 Action 的 execute() 方法来执行 Action ,最终返回 ActionFoward 。 </li></ul>
  27. 27. Struts 核心 <ul><li>ActionFoward 是对 mapping 中一个 foward 的包装,对应于一个 url </li></ul><ul><li>ActionMapping 是 ActionConfig 的子类,实质上是对 struts-config.xml 的一个映射,从中可以取得所有的配置信息 </li></ul><ul><li>Action 是用于执行业务逻辑的 RequsestHandler 。每个 Action 都只建立一个 instance 。 Action 不是线程安全的,所以不应该在 Action 中访问特定资源。 </li></ul>
  28. 28. Struts 核心 <ul><li>ActionForm 使用了 ViewHelper 模式,是对 HTML 中 form 的一个封装。其中包含有 validate 方法,用于验证 form 数据的有效性。 ActionForm 是一个符合 JavaBean 规范的类,所有的属性都应满足 get 和 set 对应。对于一些复杂的系统,还可以采用 DynaActionForm 来构造动态的 Form ,即通过预制参数来生成 Form 。这样可以更灵活的扩展程序。 ActionServlet 使用 ActionForm 来保存请求的参数,这些 bean 的属性名称与 HTTP 请求参数中的名称相对应,控制器将请求参数传递到 ActionForm bean 的实例,然后将这个实例传送到 Action 类。 </li></ul>
  29. 29. Struts 核心 <ul><li>ActionErrors 是对错误信息的包装,一旦在执行 action 或者 form.validate 中出现异常,即可产生一个 ActionError 并最终加入到 ActionErrors 。在 Form 验证的过程中,如果有 Error 发生,则会将页面重新导向至输入页,并提示错误 </li></ul>
  30. 30. 基于 Struts 的开发流程 <ul><li>收集和定义应用需求。 </li></ul><ul><li>基于数据采集和显示的原则定义和开发“屏幕显示”需求。 </li></ul><ul><li>为每一个“屏幕显示”定义访问路径。 </li></ul><ul><li>定义 ActionMappings 建立到应用业务逻辑之间的联系。 </li></ul><ul><li>开发满足“屏幕显示”需求的所有支持对象。 </li></ul><ul><li>基于每一个“屏幕显示”需求提供的数据属性莱创建对应的 ActionForm 对象。 </li></ul>
  31. 31. 基于 Struts 的开发流程 <ul><li>7. 开发被 ActionMapping 调用的 Action 对象。 </li></ul><ul><li>8. 开发应用业务逻辑对象( Bean , EJB ,等等)。 </li></ul><ul><li>9. 对应 ActionMapping 数据的流程创建 JSP 页面。 </li></ul><ul><li>10 .建立合适的的配置文件 struts-config.xml , web.xml 。通过它们配置 Struts 中的各个模块之间的交互。 </li></ul><ul><li>11 .开发 / 测试 / 部署。 </li></ul>
  32. 32. Struts 学习资料 <ul><li>目前很多大型公司也注意到 Struts ,它们的工具也提供相应的对 Struts 开发的支持。比如 IBM WSAD5.0 ( Websphere Studio Application Developer ), BEA 的 WebLogic Workshop 8.1 等。另外,一些公司专么提供可视化的 Struts 集成开发环境。如下页表所列: </li></ul><ul><li>其实,这些主要是提供对 taglib 的图形化的操作。从这个角度来说,我觉得直接在 Dreamweaver 里装个支持 Tag 的插件比较好,很小,只有几 K ,又方便。 </li></ul>
  33. 33. Struts 学习资料 http://www.alien-factory.co.uk/struts/struts-index.html 免费 StrutsGUI http://sourceforge.net/projects/rivernorth/ 开放源码 Struts Builder http://www.scioworks.com/scioworks_camino.html 商业软件 Camino http://www.solanasoft.com/ 商业软件 JForms http://www.jamesholmes.com/struts/console 免费 Struts Console http://easystruts.sourceforge.net/ 开放源码 Easy Struts http://www.synthis.com/products/adalon 商业软件 Adalon 网址 性质 应用程序
  34. 34. Struts 学习资料 <ul><li>Struts 论坛: </li></ul><ul><li>Apache Project 论坛: http:// www.javaresearch.org/forum/forum.jsp?column =20 </li></ul><ul><li>ChinaJavaWorld 的 Struts 及 MVCFrameWork 论坛: http:// www.chinajavaworld.net/forum/forums.cgi?forum =48 </li></ul><ul><li>Hibernate 中文网的 Hibernate 中文论坛: http:// forum.hibernate.org.cn / </li></ul>
  35. 35. Struts 学习资料 <ul><li>关于 struts 的书籍,我认为比较好的有,一本是 Struts 的开发人员写的《 Struts In Action 》,一本是《 Jakarta Struts 》。这两本都是英文的,可以精读,也可以做手册、工具书。 </li></ul><ul><li>此外, Struts 自带的丰富文档是学习 Struts 的最好教材。 Struts 是一个开源项目,你可以下载它的源代码进行学习。它的源代码写得非常规范,注释也很详细。 </li></ul>
  36. 36. <ul><li>Struts 框架 </li></ul><ul><li>个人思考 </li></ul>
  37. 37. 个人思考 <ul><li>Struts 的优点 </li></ul><ul><li>Tiles </li></ul><ul><li>国际化和本地化 </li></ul><ul><li>一个 struts 的小例子 </li></ul><ul><li>Struts + Hibernate 的 J2EE 架构 </li></ul><ul><ul><li>Hibernate </li></ul></ul><ul><ul><li>J2EE </li></ul></ul><ul><ul><li>Struts + Hibernate 的 J2EE 架构 </li></ul></ul><ul><li>总结 </li></ul>
  38. 38. Struts 的优点 <ul><li>结构清晰 </li></ul><ul><li>MVC 的实现——“三权分立”(业务逻辑、控制、显示) </li></ul><ul><li>标签丰富 </li></ul><ul><li>六种 Taglib </li></ul><ul><li>易于重用 </li></ul><ul><li>降低了耦合度,且 Tiles 的引入 </li></ul><ul><li>代码美观 </li></ul><ul><li>jsp 页面中几乎不会掺杂 java 脚本 </li></ul><ul><li>开源 </li></ul>
  39. 39. Tiles <ul><li>传统的 Web 页面组织方式: </li></ul><ul><ul><li>采用的基于 jsp 的方式 。 Jsp 页面包含表示逻辑和 HTML 布局标签,两者之间没有分离,这种方式通常应用于小型的、不很复杂的 web 应用程序。 </li></ul></ul><ul><ul><li>使用 JSP 的 include 指令,把其他静态或动态的页面包含到本页面。 </li></ul></ul>
  40. 40. Tiles <ul><li>模板是用 JSP 自定义标签库描述页面布局的 JSP 页面。 </li></ul><ul><li>模板用于定义应用程序的页面样式,而不指定内容。运行时内容插入到模板页面中。 </li></ul><ul><li>Tiles 扩展了模板的概念,除了替代 Template 的基本模板功能外,还增加了布局定义、虚拟页面定义和动态页面生成等功能。 </li></ul><ul><li>Tiles 强大的模板功能能够使页面获得最大的重用性和灵活性此外可以结合 Tiles 配置文件中的页面定义和 Action 的转发逻辑,即你可以将一个 Action 转发到一个在 Tiles 配置文件中定义的虚拟页面,从而减少页面的数量。 </li></ul>
  41. 41. Tiles <ul><li>通常的来说一个页面大概可以划分为如下几块: </li></ul><ul><ul><li>head 页面头部:存放一个运用的公共信息如 logo 等,如果是网站可能是最上面的一块。 </li></ul></ul><ul><ul><li>menu 页面菜单:放置一个运用中需要使用的菜单,或者在每一个页面都使用的连接。 </li></ul></ul><ul><ul><li>footer 页面尾部:如版权信息等。 </li></ul></ul><ul><ul><li>body 页面主题内容:每个页面相对独立的内容。 </li></ul></ul><ul><li>如果按上面的划分那对每一个页面我们只要写 body 里面的内容,其他的就可以共享重用。如果大多数页面的布局基本相同我们甚至可以使用一个 jsp 文件根据不同的参数调用不同的 body 。 </li></ul>
  42. 42. 国际化和本地化 <ul><li>国际化( internationalization ) </li></ul><ul><li>本地化( localization )。 </li></ul><ul><li>用户在他们的计算机中定义自己所在的区域,当 web 应用程序需要输出一条消息时,它将引用一个资源文件,在这个文件中所有的消息都使用了适当的语言。一个应用程序可能提供了很多资源文件,每个文件提供了用不同语言编写的消息。如果没有找到所选语言的资源文件,就将使用默认的资源文件。 </li></ul>
  43. 43. 国际化和本地化 <ul><li>struts 框架对国际化的支持是使用 <bean:message> 标记,以及使用 java.util 数据包中定义的 Locale 和 ResourceBundle 类来实现 Java2 平台对这些任务的支持。 Java.text.MessageFormat 类定义的技术可以支持消息的格式。 </li></ul><ul><li>在具体实现时通过指定 Struts taglib 中每个 tag 的 locale 属性实现选择不同的语言,由于 tag 的 locale 支持 session bean ,所以只需要在用户登录时在 session 中设置一个 Locale 对象,所有的输出信息即可自动处理。 </li></ul>
  44. 44. 一个 struts 的小例子 <ul><li>需求: </li></ul><ul><ul><li>公司员工输入工号和密码;通过验证后查看到自己的详细信息(假设有真实姓名 name 、出生年月 birthdate )。 </li></ul></ul><ul><ul><li>并需要支持中文、英文两种语言。 </li></ul></ul><ul><ul><li>有两个 jsp 页面 signin.jsp 和 detail.jsp 。用户在 signin.jsp 页面输入员工编号和密码,提交; action 中调用验证接口,如果验证通过,再调用获取详细信息接口,返回该员工的信息,在 detail.jsp 页面中显示,呈现给用户。另有一个 StaffAction 和一个 StaffForm. 。 </li></ul></ul>
  45. 45. 一个 struts 的小例子 <ul><li>编写资源文件 ApplicationResources_cn.properties 和 ApplicationResources_en.properties </li></ul><ul><ul><li>ApplicationResources_cn.properties 文件: </li></ul></ul><ul><ul><li>ApplicationResources_en.properties 文件: </li></ul></ul>staff.code =” 编号” staff.name =” 员工姓名” staff.pass =” 密码” staff.birth=” 出生年月” staff.code=”code” staff.name=”name” staff.pass=”password” staff.birth=”the date you were born”
  46. 46. 一个 struts 的小例子 <ul><li>设计显示页面 </li></ul><ul><ul><li>signin.jsp 文件部分代码 : </li></ul></ul><tr> <td><bean:message key=&quot;staff.code &quot; />::</td> <td><html:text property=&quot;staffCode&quot; size=&quot;40&quot; /></td> </tr> <tr> <td><bean:message key=&quot;staff.pass &quot; />::</td> <td><html:text property=&quot;staffPassword&quot; size=&quot;40&quot; /></td> </tr>
  47. 47. 一个 struts 的小例子 <ul><ul><li>2. detail.jsp 文件部分代码: </li></ul></ul><tr> <td><bean:message key=&quot;staff.name &quot; />::</td> <td><html:text property=&quot;staffName&quot; size=&quot;40&quot; /></td> </tr> <tr> <td><bean:message key=&quot;staff.birth &quot; />::</td> <td><html:text property=&quot;staffBirthdate&quot; size=&quot;40&quot; /></td> </tr>
  48. 48. 一个 struts 的小例子 <ul><li>设计 ActionForm : </li></ul><ul><ul><li>StaffForm.java 文件部分代码 </li></ul></ul>public class StaffForm extends ActionForm { public StaffForm (){ } // 构造函数 //get , set private String staffName = null; public String getStaffName(){ return staffName; } public void setStaffName (String staffName ) { this. staffName = staffName; } …… //get set for staffCode 、 staffPassword 、 staffBirthdate }
  49. 49. 一个 struts 的小例子 <ul><li>设计 Action </li></ul><ul><ul><li>StaffAction.java 部分代码 </li></ul></ul>public final class DepartmentAction extends Action { public ActionForward execute(ActionMapping mapping,actionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { StaffForm staffForm = (StaffForm) form; String code = staffForm.getStaffCode(); String pass = staffForm.getStaffPassword(); ………… // 创建对象 staffImpl ,调用接口验证接口。 if(staffImpl.validate(code,pass)) // 验证通过,调用接口,获取其详细信息 { StaffForm staffForm = new StaffForm (); staffImpl.getStaffInfo()(code); HttpSession session = request.getSession(); if (&quot;request&quot;.equals(mapping.getScope())) request.setAttribute(mapping.getAttribute(),staffForm); else session.setAttribute(mapping.getAttribute(),staffForm); return (mapping.findForward(&quot;staff_detail&quot;)); } else return (mapping.findForward(&quot;failuer&quot;)); } }
  50. 50. 一个 struts 的小例子 <ul><li>编写配置文件 struts-config.xml </li></ul><?xml version=&quot;1.0&quot; encoding=&quot;ISO-8859-1&quot; ?> <!DOCTYPE struts-config PUBLIC &quot;-//Apache Software Foundation//DTD Struts Configuration 1.1//EN&quot; &quot;http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd&quot;> <struts-config> <form-beans> <form-bean name=&quot;/example/staffForm&quot; type=&quot;example.StaffForm&quot;/> </form-beans> <global-forwards> <forward name=&quot;/welcome&quot; path=&quot;/welcome.htm&quot;/> <global-forwards> <action-mappings> <action path=&quot;/staffAction&quot; type=&quot;example.StaffAction&quot; name=&quot;/example/staffForm&quot; scope=&quot;request&quot; > <forward name=&quot;/detail&quot; path=&quot;/detail.jsp&quot;/> </action> </action-mappings> <message-resources parameter=“example.ApplicationResources_cn&quot;/> </struts-config>
  51. 51. 个人思考 <ul><li>Struts 的优点 </li></ul><ul><li>Tiles </li></ul><ul><li>国际化和本地化 </li></ul><ul><li>一个 struts 的小例子 </li></ul><ul><li>Struts + Hibernate 的 J2EE 架构 </li></ul><ul><ul><li>Hibernate </li></ul></ul><ul><ul><li>J2EE </li></ul></ul><ul><ul><li>Struts + Hibernate 的 J2EE 架构 </li></ul></ul><ul><li>总结 </li></ul>
  52. 52. Struts + Hibernate 的 J2EE 架构 <ul><li>Hibernate </li></ul><ul><ul><li>一种对象和关系之间映射( ORM )的框架 </li></ul></ul><ul><ul><li>它对 JDBC 进行了轻量级的对象封装,使得 Java 程序员可以使用对象编程思维来操作关系数据库。 </li></ul></ul><ul><ul><li>开源、有丰富的文档和稳定的开发背景。 </li></ul></ul><ul><ul><li>Hibernate 目前最高版本 2004 年 2 月 4 日发布的是 2.1.2 版。 </li></ul></ul><ul><ul><li>Hibernate 官方网站: http:// hibernate.bluemars.net / ( http:// www.hibernate.org / ) </li></ul></ul>
  53. 53. Hibernate <ul><li>配置 Hibernate </li></ul><ul><ul><li>Classpath </li></ul></ul><ul><ul><li>初始化文件 Hibernate.properties 或 hibernate.cfg.xml </li></ul></ul><ul><li>创建持久对象 </li></ul><ul><li>编写对象关系映射描述 Classname. hbm.xml </li></ul><ul><li>编写业务逻辑类。这些 JavaBean 实现了具体的业务逻辑,也封装了对 Hibernate 的访问。 </li></ul>
  54. 54. Struts + Hibernate 的 J2EE 架构 <ul><li>J2EE </li></ul><ul><ul><li>J2EE 规范定义了应用客户组件、 Enterprise JavaBeans 组件、 web 组件( Servlet 、 JSP )和 Applet 。一个多层的分布式的应用模型意味着应用逻辑被根据功能划分成组件,并且可以在同一个服务器或不同的服务器上安装组成 J2EE 应用的这些不同的组件。其最终目的就是成为一个能够使企业开发者大幅缩短投放时间的体系结构。 </li></ul></ul>
  55. 55. Struts + Hibernate 的 J2EE 架构 <ul><li>J2EE </li></ul><ul><ul><li>J2EE 的基本原则之一,是使得各个层的实现解除耦合或耦合最小化。最终实现可以任意地切换某个层的实现。 </li></ul></ul><ul><ul><li>早期的网络系统设计采用三层结构:表示( presentation )层、领域( Domain )层、基础架构( infrastructure )层。 </li></ul></ul><ul><ul><li>传统的 Brown 模型指:表示( presentation )层、控制 / 中介( Controller/Mediator )层、领域( Domain )层、数据映射( Data Mapping )层、基础架构( infrastructure )层。 </li></ul></ul>
  56. 56. Struts + Hibernate 的 J2EE 架构 <ul><li>J2EE </li></ul><ul><ul><li>Cube 理论把 J2EE 进行分析,可以分为 5 层。每层都是按系统中业务逻辑划分的,它具有唯一的职责。每层与相邻层都是松散耦合的。 </li></ul></ul>
  57. 57. Struts + Hibernate 的 J2EE 架构 <ul><li>J2EE </li></ul><ul><ul><li>一个典型的 J2EE 四层结构: </li></ul></ul>
  58. 58. Struts + Hibernate 的 J2EE 架构 <ul><li>J2EE </li></ul><ul><ul><li>struts + Hibernate 的 J2EE 结构与各层之间的对应关系如下表 : </li></ul></ul>RDBMS 数据库 资源层 数据源层 数据层 EntityBean / JDO / Hibernate / JDBC 整合层 数据映射层 Javabeans / SessionBean /Session Facade 业务层 领域层 领域层 Controller 控制器及 Action 控制 / 中介层 浏览器 HTML 页面 , XSL, 手机客户端等 JSP 及 ActionForm ,XML 客户层 服务器表示层 表示层 表示层 对应程序部分 J2EE 层 Brown ISA
  59. 59. Struts + Hibernate 的 J2EE 架构 <ul><li>Struts 和 Hibernate 这两个框架结合起来很好地实现了 MVC 的设计模式 </li></ul>Controller : ActionServlet Model : Action+Hibernate View : JSP+Taglib
  60. 60. Struts + Hibernate 的 J2EE 架构 <ul><li>基于该架构的 J2EE 应用架构图 </li></ul>
  61. 61. Struts + Hibernate 的 J2EE 架构
  62. 62. Struts + Hibernate 的 J2EE 架构 <ul><li>基于 Struts 和 Hibernate 的 J2EE 的完整构架为: JSP(View) ---> Action Form Bean (Model) ---> Action(Control) ; Action(Web Control) ---> Business Bean ---> DAO ---> ORM --->DB </li></ul><ul><li>结合前面的那个小例子,我们来了解这种架构的流程 : </li></ul><ul><ul><li>当用户通过浏览器访问网页,提交了一个页面。于是根据 ActionMapping ,特定 Action 得到了这个 FormBean ,把 FormBean 属性读出来,然后构造一个对象,再调用业务层的 Bean 类。而业务层 Bean 收到这个对象之后,调用 DAO 接口方法,进行持久对象的持久化操作。 </li></ul></ul>
  63. 63. Struts + Hibernate 的 J2EE 架构 <ul><ul><li>业务 Bean 取得 password( 注意 : password 对象只是 Staff 的一个属性 ) 对象之后调用 DAO 接口,返回一个 Staff 对象。然后业务 Bean 把 Staff 对象返回给 Action 。 </li></ul></ul><ul><ul><li>Action 拿到 Staff 之后,把 Staff 的基本属性取出 ( 集合属性如果不需要就免了 ) ,构造 ActionFormBean ( StaffBean ),然后把 StaffFormBean request.setAttribute(...) ,然后重定向到查询结果页面。 </li></ul></ul><ul><ul><li>查询页面得到 request 对象里面的 ActionFormBean ( StaffBean ),调用 tag 显示内容。 </li></ul></ul>
  64. 64. 总结 <ul><li>Struts 是一种 web 框架,其清晰的结构、丰富标签和很 </li></ul><ul><li>好的易扩展性使它得到了很多 java 开发和设计人员的喜 </li></ul><ul><li>爱。还有一个重要的原因,它是一个开源项目,而且文 </li></ul><ul><li>档丰富。和另一个实现对象关系映射的开源项目—— </li></ul><ul><li>Hibernate—— 结合起来,体现了一种小而便捷的 J2EE </li></ul><ul><li>架构。目前,基于 Struts 和 Hibernate 的项目越来越 </li></ul><ul><li>多。有人说, JSF+Struts+Spring+Hibernate/JDO 是 </li></ul><ul><li>未来 J2EE 标准开发模式。 </li></ul>
  65. 65. <ul><li>Struts 框架 </li></ul><ul><li>个人思考 </li></ul>
  66. 66. 题外话 <ul><li>架构 </li></ul><ul><li>框架 </li></ul><ul><li>模式 </li></ul>
  67. 67. <ul><li>架构 </li></ul><ul><li>architecture ,体系结构 </li></ul><ul><ul><li>A style and method of design and construction </li></ul></ul><ul><ul><li>Orderly arrangement of parts; </li></ul></ul><ul><ul><li>Architecture refers to an abstract representation of a system’s components and behaviors. </li></ul></ul><ul><ul><li>Architecture does not contains details about implementation. </li></ul></ul><ul><li>架构一般针对一个行业或一类应用,是技术和应用完美的结合。 </li></ul><ul><li>架构是宏观上的。定义构成一个系统的各个组成部分。比如基于 J2EE 的三层架构: WEB 层,应用中间层及数据层,从宏观上定义系统的各个组成部分。 </li></ul><ul><li>目标 :重用、透明、延展、简明、高效、安全 </li></ul>
  68. 68. <ul><li>框架 </li></ul><ul><li>框架, Framework </li></ul><ul><ul><li>A structure for supporting or enclosing something else, especially a skeletal support used as the basis for something being constructed </li></ul></ul><ul><ul><li>A fundamental structure, as for a written work or a system of ideas. </li></ul></ul><ul><li>框架因为比较小,很多表现为中间件,框架一般是从技术角度解决同类问题 </li></ul><ul><li>框架是具体化的架构。用于细化整个架构或某一组成部分。如 STRUTS 是定义 WEB 层的框架。 </li></ul>
  69. 69. <ul><li>模式 </li></ul><ul><li>Pattern </li></ul><ul><ul><li>Common solutions to recurring problems. </li></ul></ul><ul><ul><li>Help you build complex and heterogeneous software architectures. </li></ul></ul><ul><li>模式的概念更小,更为灵活,可重用的范围更广。 </li></ul><ul><li>一个框架可能使用了多个模式,而一个架构有可能应用了多个框架,这样一个大型系统的设计基本从主骨干到骨架基本能够被设计者考虑设计到,也可以想见,一个系统被细化成了很多工作量,例如一个部分细化到工厂模式,那么就可以要求程序员实现工厂模式的代码即可。 </li></ul>
  70. 70. <ul><li>Thank U !~ </li></ul><ul><li>— The End— </li></ul>

×