收藏 分享(赏)

我们所学习的技术框架有很多.doc

上传人:weiwoduzun 文档编号:3117804 上传时间:2018-10-03 格式:DOC 页数:126 大小:1.90MB
下载 相关 举报
我们所学习的技术框架有很多.doc_第1页
第1页 / 共126页
我们所学习的技术框架有很多.doc_第2页
第2页 / 共126页
我们所学习的技术框架有很多.doc_第3页
第3页 / 共126页
我们所学习的技术框架有很多.doc_第4页
第4页 / 共126页
我们所学习的技术框架有很多.doc_第5页
第5页 / 共126页
点击查看更多>>
资源描述

1、 我们所学习的技术框架有很多,例如struts1、struts2、JSF、Spring、SpringMVC、Hibernate、ibatis在上篇博客我说了我们可能在开发的路途上会要学习这些框架,我也给出了我对框架学习的几点:我们首先要看一下这个框架属于开发结构中的那一层。因为我们的开发都是要用分层的思想来做的,所以我们第一个就要看看我们开发分层中,各个层次之间有哪些框架。我们从图上看到了那些框架属于哪一层的(这里还有很多框架没有涉及到)。之后我们来看一些常用的框架(这个常用相对于个人而言,我这里所说的常用针对我自己来说,如果这里我没有介绍全的话,大家可以到相关的框架官网去查阅一下资料自主学习

2、)。下面我就简单的介绍一些我经常使用的框架的结构和一些分析:Struts 框架(分为 struts1 和 struts2):一、Struts 框架结构图:优点:1. Struts 框架是一个基于 mvc 的框架,所以它继承了所有 mvc 的优点,例如:复用性好,团队开发分工明确,结构层次分明等2. 给程序开发者在 servlet 层上节约了大量的开发时间,应用程序开发者不再去触及大量的 servlet 的编写,仅仅变换为配置文件。二、 Struts1 框架1.框架的结构图:2. Struts1 框架有五个常用对象:actionservlet、 actionmapping、actionform、

3、action、actionforwarda) Actionservlet 是核心控制,URL 地址映射、ActionForm 的匹配、 Action 的执行都需要这个类来进行导航b) Actionmapping:它们可将请求 URI 映射到 Action 类,并且将 Action 类与ActionFormbean 相关联c) Actionform:收集表单数据d) Action: 完成所需的业务逻辑,确定要跳转的页面e) Actionforward:用来封装转发路径的3. Struts1 框架的执行流程:1) 检索和用户匹配的 ActionMapping 实例,如果不存在,就返回请求路径无效的

4、错误信息2)如果 ActionForm 实例不存在,就创建一个 ActionForm 的对象,把客户提交的表单数据封装到 ActionForm 对象中。3)根据配置信息决定是否要进行表单验证,如果需要,就调用 ActionForm 的validate()方法4)如果 validate()方法放回 null,或者并不包含 ActionMessage 的 ActionError 对象,就表示验证成功5) ActionServlet 根据 ActionMapping 所包含的映射信息决定将请求转发给那个action,如果相应的 action 实例不存在,就先创建这个 action 对象,然后再调用这

5、个action 的 excute()方法6)action 的 execute()方法返回一个 ActionForword 对象,ActionServlet 会把客户请求转发给 ActionForword 对象所指向的 JSP 组件7)ActionForword 对象指向 JSP 组件生成动态网页返回给客户4.优点:和 struts 框架的优点相同5.缺点:1) 表现层技术单一:仅能用 jsp2) 与 servletAPI 耦合性高,难于测试(httpservletrequest、httpservletresponse)3) 严重依赖于 ServletAPI(继承 action,继承 actio

6、nform),与 struts1 框架耦合性太高这篇博客就写到这里,如果再写篇幅可能会过长,对读者的阅读造成负面影响,所以我会在下面的博客中陆续介绍我经常使用的框架,当然我也会在这些同层之间的框架的分析中加入各个框架的区别,当然在适当的地方会画一些图片来表示他们之间的知识关联性,希望读者能够我一些建议和意见。在 上篇博客中,我简单的介绍了我们分层开发中每一层中拥有的框架,而且介绍了我常用的 框架 struts1 的结构和原理分析,那么今天我继续介绍我熟悉的框架 struts2 的框架的结构和原理分析。在说 struts2 框架之前,我要先介绍另外一个框架 webwork 框架,这个框架也是一个

7、 mvc 的框架,这个框架的设计思路是采用拦截链将用户的请求的数据转发到 Action 中,并负责将 Action 的处理结果转换成对用户的响应。它的这种设计思路能够和 ServletAPI 分离,鉴于我们的上篇博客介绍的 struts1 的缺点,所以 webwork 框架解决了 struts1 的这个缺点。我们来看一下 webwork 框架的结构图:有了这个流程图,我就不给大家讲解具体的原理流程了,它采用的是拦截链的机制,通过这些拦截链完成用户的相应请求,从而与 servletAPI 分离,当与servlet 分离开的时候,也就是表明和容器解耦了;另外,我们从结构图中看到它的视图模版有 js

8、p、FreeMarker 等等,它的表示层技术比 struts1 框架的饱满许多。所以,webwork 框架解决了 struts1 框架存在的问题,而且它的设计思路是非常好的,鉴于此,struts2 框架就在 struts1 框架的基础上引入了 webwork框架的设计思路应运而生了。所以我们就能够发现 struts2 兼具 struts1 的特性而且通过引入 webwork 框架的设计思路解决了 struts1 的一些缺点。struts2 框架的大致的体系图:从图中我们能够看出它是引入的 webwork 框架的设计思路,而且它也是基于 mvc 的一个开源的框架。之后我们来说一下 struts

9、2 框架的一个执行流程(流程图和 webwork 框架非常类似):1. 浏览器发送请求,通过几层过滤器完成一些功能,之后到 actionmapper中,之后将请求传到核心控制器中2. 核心控制器 filterDispatcher 根据请求决定调用合适的 Action3. 调用 webwork 的拦截器链自动请求通用功能,如校验之类的操作4. 回调 action 的 execute 方法,获取用户请求执行相应的业务逻辑5. 之后返回字符串,匹配 result,之后跳转到相应的视图或其他的文档6. 之后在执行相应的拦截器链自动请求功能,随后转到 web 客户端。这样我们就对 struts2 框架的

10、结构上的东西做了一个简单的介绍。在上篇博客讲解了 struts1 框架,所以有必要在这里对他俩进行一下对比(我仅仅总结了五条我认为比较重要的,以后如果发现其他的在随时补充):1. 在 Action 实现类方面的对比( struts1 的 Action 继承 action,struts2实现接口,也可以不实现,可以定制服务)2. 线程模式方面的对比(struts1 存在线程安全问题,struts2 不存在)3. ServletAPI 依赖方面的对比( struts1 依赖 servletAPI,struts2 不是)4. 可测性方面的对比(struts1 难测试,依赖容器,struts2 不是)

11、5. 封装请求参数的对比(struts1 使用 actionform;struts2 直接写到action,并且支持 pojo 对象)在上篇博客中介绍了 struts2 框架的原理和流程分析,可以说 struts 框架一路走来,改变非常大,而且让我们开发人员变得更加轻松,里面的设计理念的改变也是让我们编程人员的思路得到更大的扩展。可以说,一个先进的技术或者框架就是要不断的进步才能永远让编程人员喜欢和使用,一个优秀的编程人员也是要不断的进步才能永远让这个世界变得更加绚丽多彩。其实编程就是这样有意思的!前面说了一些宏观上学习框架相关的思想方面的东西,下面继续来介绍我经常使用的框架和框架的分析,这篇

12、博客主要介绍的是 hibernate 框架。首先说 hibernate 框架是数据持久层的框架,这个框架是非常强大的,它让编程人员纯粹的用面向对象的方式来做开发,让编程人员所面对的都是对象。仅仅从这一点它的设计思路就是非常让编程人员喜爱的。回想我们普通的开发流程,和客户沟通定需求,抽象出来原型,从原型中建立数据模型到库表结构的建立,之后在映射成对象模型,之后在用 oo 的设计思想完成后续的程序开发。但是当我们使用了 hibernate 框架以后,原先的设计思路就显得不再那么具有优势了。我们直接建立对象模型,之后利用 hibernate框架映射成数据模型,我们不再去考虑数据库关系模型的东西,仅仅

13、考虑的东西仅仅就是类和对象,这样的开发才是面向对象的开发,也才是最接近人类思考问题的方式。所以 hibernate 框架的设计思路是非常好的。hibernate 框架设计思路的优越性其实体现在了它本身的框架的原理上。hibernate 封装了 JDBC,减轻了开发人员在持久层的大量重复性工作,它利用了java 反射机制来实现程序的透明性;它就是通过这两点才达到从对象出发而非关系数据库出发的效果。介绍这么多理论性的东西之后我们能够感觉到 hibernate 框架的强大,来看看它的结构图:在 hibernate 框架中有几个比较重要的接口和类:1. Query 接口:Query 负责执行各种数据库

14、查询。它可以使用 HQL 语句或 SQL 语句两种表达方式。2. Configuration 类:Configuration 类负责配置并启动 Hibernate,创建 SessionFactory 对象3. SessionFactory 接口:SessionFactory 接口负责初始化 Hibernate。它充当数据存储源的代理,并负责创建 Session 对象4. Session 接口:Session 接口负责执行被持久化对象的 CRUD 操作5. Transaction 接口:Transaction 接口负责事务相关的操作hibernate 框架就是在利用这几个接口来封装了 JDBC,

15、而且我们用这些接口来操作数据库变得非常简单,减少了我们在持久层的代码量。从这个结构图和我的一些分析就能发现 hibernate 框架是非常强大,而且它给我们开发人员的开发带来了非常大的便利,尤其是他的设计思路还有它的“全自动”的映射对象模型和关系模型。但是 hibernate 框架也有它的一些缺点:1. 既然是封装了 JDBC,所以很明显它没有 JDBC 的效率高,尤其是在大量的处理表更新操作的时候。2. 它有局限性,一个持久化类不能映射多个表3. 它应对大数量的时候显得非常笨拙,这一点没有 JDBC 和接下来要介绍的IBatis 框架其实一项技术或者一个框架都有它的优缺点,选择最合适的才是王

16、道。这篇博客主要是介绍了 hibernate 框架的结构和分析,阐述了 hibernate 框架的优缺点,【具体详细使用要等到我的框架学习的后续文章】。总的来说hibernate 框架在持久层的作用非常明显,我们懂得了它的优缺点之后,才能做到我们是否是要选择这个框架作为我们持久层开发的必须的技术支撑,所以这些我常用的框架结构和分析不单单是在介绍一些框架学习的宏观知识把控,更多的是在为将来做项目开发中选择合适的技术支撑做铺垫。后续的博客在不断更新,希望这些博客能够对读者的开发过程带来帮助,当然如果读者对我的博客有什么好的建议或者意见,请与我联系。联系方式见博客侧边栏!先看 MVC 模式流程图(其

17、实 MVC 设计模式就是 java 中的model2。):就像图上所标识的 C 层主要是 Servlet 层控制页面跳转,M 层就是具体的业务处理逻辑,而 JSP 就是所谓的 V 层。MVC 是有别于我们所说的三层,我们平常所说的三层是 UI 层、BLL 层、DAL 层,具体的区别如图:从图上能看出来,JSP 和 Servlet 构成了 UI 层,而 Model 层分成了 BLL 层和 DAL 层(也就是业务逻辑和数据持久层)。从理论上认清了 MVC 设计模式之后,下面开始动手敲一个 MVC设计模式示例代码:JSP 索引页面 index.jsp:html view plain copyprin

18、t?1. 3. 4. 5. 6. 7. Insert title here 8. 9. 10. 11. 姓名: 12. 13. 14. 15. 16. 业务逻辑代码 UserManager:java view plain copyprint?1. package com.cjq.servlet; 2. 3. import java.util.ArrayList; 4. import java.util.List; 5. 6. public class UserManager 7. 8. public void addUser(String username) 9. System.out.pri

19、ntln(“UserManager.addUsre()-username:“+username); 10. 11. 12. public void delUser(String username) 13. System.out.println(“UserManager.delUser()-username:“+username); 14. 15. 16. public void modifyUser(String username) 17. System.out.println(“UserManager.modifyUser()-username“+username); 18. 19. 20.

20、 public List queryUser(String username) 21. System.out.println(“UserManager.queryUser()-username“+username); 22. List userList=new ArrayList(); 23. userList.add(“a“); 24. userList.add(“b“); 25. userList.add(“c“); 26. return userList; 27. 28. Servlet 控制代码:java view plain copyprint?1. package com.cjq.

21、servlet; 2. 3. import java.io.IOException; 4. import java.util.List; 5. 6. import javax.servlet.ServletException; 7. import javax.servlet.http.HttpServlet; 8. import javax.servlet.http.HttpServletRequest; 9. import javax.servlet.http.HttpServletResponse; 10. 11.public class TestServlet extends HttpS

22、ervlet 12. 13. 14. protected void doGet(HttpServletRequest request, HttpServletResponse response) 15. throws ServletException, IOException 16. 17. String requestURI=request.getRequestURI(); 18. System.out.println(“request=“+requestURI); 19. String path=requestURI.substring(requestURI.indexOf(“/“,1),

23、requestURI.indexOf(“.“); 20. System.out.println(“path=“+path); 21. 22. String username=request.getParameter(“username“); 23. UserManager userManager=new UserManager(); 24. /userManager.addUser(username); 25. String forward=“; 26. if(“/servlet/delUser“.equals(path) 27. userManager.delUser(username);

24、28. forward=“/del_success.jsp“; 29. else if(“/servlet/addUser“.equals(path) 30. userManager.addUser(username); 31. forward=“/add_success.jsp“; 32. else if(“/servlet/modifyUser“.equals(path) 33. userManager.modifyUser(username); 34. forward=“/modify_success.jsp“; 35. else if(“/servlet/queryUser“.equa

25、ls(path) 36. List userList=userManager.queryUser(username); 37. request.setAttribute(“userList“, userList); 38. forward=“/query_success.jsp“; 39. else 40. throw new RuntimeException(“请求失败“); 41. 42. request.getRequestDispatcher(forward).forward(request, response); 43. 44. 这个 servlet 代码主要实现的功能判断是那个页面

26、请求服务器做那些操作,之后调用业务逻辑实现相应业务操作。配置 Servlet:html view plain copyprint?1. 2. 3. test_Servlet 4. 5. index.html 6. index.htm 7. index.jsp 8. default.html 9. default.htm 10. default.jsp 11. 12. 13. 14. TestServlet 15. com.cjq.servlet.TestServlet 16. 17. 18. TestServlet 19. *.action 20. 21. 22. 23. 输出结果:通过上面的

27、示例已经对 MVC 设计模式有了初步的认识,其实这个示例是对 Struts 框架学习的基础,只有弄清楚了这个实例才能弄清楚 Struts 框架的实现原理和 Struts 框架使用。那么我们怎么才能通过这个示例引入 Struts 框架呢?这个问题从IF-Eles 开始。首先我们看到了 TestServlet 中出现了许多 if-else 语句,这样是非常不稳定的,这样的程序是非常不灵活的,以后如果有变化,那么维护是非常差的;而且我们在 if-else 中出现了大量的字符串,这样在coding 的时候会出现写错,这样无形中给调试带来了麻烦。所以去掉if-else 成了我们重构的第一步,也是我们进行

28、 Struts 框架学习的第一步。如何才能去掉 If-ELSE 呢?请看下一篇文章 深入浅出学习Struts1 框架(二):重构 MVC 模式代码中跳转路径和业务逻辑。在上篇博文 深入浅出学习 Struts1 框架(一):一个简单 mvc 模式代码示例开始中简单说了一下 MVC 模式代码的实现和 MVC 模式和三层架构的区别,并且留下一个问题如何去掉 TestServlet 中的IF-Else 语句块。因为在 TestServlet 中出现了 If-Else 语句块,所以让程序变得不再灵活,让应付需求变化时变得笨拙。所以就承接上篇文章来重构一下 TestServlet 代码,主要是用继承多肽来

29、进一步对 TestServlet 进行重构。虽然这一篇文章最后没有将 if-else 彻底去掉,但是比起上篇文章的代码显得更加灵活,也为下一篇彻底去掉 If-else 埋下伏笔。下面进入重构阶段:先看一下上篇文章的 TestServlet 代码:java view plain copyprint?1. package com.cjq.servlet; 2. 3. import java.io.IOException; 4. import java.util.List; 5. 6. import javax.servlet.ServletException; 7. import javax.se

30、rvlet.http.HttpServlet; 8. import javax.servlet.http.HttpServletRequest; 9. import javax.servlet.http.HttpServletResponse; 10. 11.public class TestServlet extends HttpServlet 12. 13. 14. protected void doGet(HttpServletRequest request, HttpServletResponse response) 15. throws ServletException, IOExc

31、eption 16. 17. String requestURI=request.getRequestURI(); 18. System.out.println(“request=“+requestURI); 19. String path=requestURI.substring(requestURI.indexOf(“/“,1),requestURI.indexOf(“.“); 20. System.out.println(“path=“+path); 21. 22. String username=request.getParameter(“username“); 23. UserMan

32、ager userManager=new UserManager(); 24. /userManager.addUser(username); 25. String forward=“; 26. if(“/servlet/delUser“.equals(path) 27. userManager.delUser(username); 28. forward=“/del_success.jsp“; 29. else if(“/servlet/addUser“.equals(path) 30. userManager.addUser(username); 31. forward=“/add_suc

33、cess.jsp“; 32. else if(“/servlet/modifyUser“.equals(path) 33. userManager.modifyUser(username); 34. forward=“/modify_success.jsp“; 35. else if(“/servlet/queryUser“.equals(path) 36. List userList=userManager.queryUser(username); 37. request.setAttribute(“userList“, userList); 38. forward=“/query_succ

34、ess.jsp“; 39. else 40. throw new RuntimeException(“请求失败“); 41. 42. request.getRequestDispatcher(forward).forward(request, response); 43. 44. 首先我们看到了在每个语句块中都出现了给 forward 赋值,其实也就是给页面跳转的路径赋值,针对每个请求路径判断来赋值跳转路径。另外每个 IF-Else 语句块中都有业务处理,我们要把这些业务处理分别放到类里面,让职责更加单一,这样更加符合面向对象的思路。就从这里我们开始重构,我们可以将这个跳转路径和业务逻辑封装起

35、来。既然封装,那么我们就抽象出来一个借口,主要完成一个方法,这个方法主要的功能就是要完成业务逻辑封装和路径跳转的返回。随后建立四个类,主要实现相应的增删改查的业务处理和处理之后的跳转路径返回。代码如下:接口 Action:java view plain copyprint?1. package com.cjq.servlet; 2. 3. import javax.servlet.http.HttpServletRequest; 4. import javax.servlet.http.HttpServletResponse; 5. 6. public interface Action 7.

36、8. public String execute(HttpServletRequest request,HttpServletResponse response) 9. throws Exception; 10. 增删改查实现类:添加用户实现类:java view plain copyprint?1. package com.cjq.servlet; 2. 3. import javax.servlet.http.HttpServletRequest; 4. import javax.servlet.http.HttpServletResponse; 5. 6. public class Ad

37、dUserAction implements Action 7. 8. 9. public String execute(HttpServletRequest request, 10. HttpServletResponse response) throws Exception 11. String username=request.getParameter(“username“); 12. UserManager userManager=new UserManager(); 13. userManager.addUser(username); 14. return “/add_success

38、.jsp“; 15. 16. 17. 删除用户实现类:java view plain copyprint?1. package com.cjq.servlet; 2. 3. import javax.servlet.http.HttpServletRequest; 4. import javax.servlet.http.HttpServletResponse; 5. 6. public class DelUserAction implements Action 7. 8. 9. public String execute(HttpServletRequest request, 10. Htt

39、pServletResponse response) throws Exception 11. String username=request.getParameter(“username“); 12. UserManager userManager=new UserManager(); 13. userManager.delUser(username); 14. return “/del_success.jsp“; 15. 16. 17. 更新用户实现类:java view plain copyprint?1. package com.cjq.servlet; 2. 3. import ja

40、vax.servlet.http.HttpServletRequest; 4. import javax.servlet.http.HttpServletResponse; 5. 6. public class ModifyUserAction implements Action 7. 8. Override 9. public String execute(HttpServletRequest request, 10. HttpServletResponse response) throws Exception 11. String username=request.getParameter

41、(“username“); 12. UserManager userManager=new UserManager(); 13. userManager.modifyUser(username); 14. return “/modify_success.jsp“; 15. 16. 17. 查询用户实现类:java view plain copyprint?1. package com.cjq.servlet; 2. 3. import java.util.List; 4. 5. import javax.servlet.http.HttpServletRequest; 6. import ja

42、vax.servlet.http.HttpServletResponse; 7. 8. public class QueryUserAction implements Action 9. 10. Override 11. public String execute(HttpServletRequest request, 12. HttpServletResponse response) throws Exception 13. String username=request.getParameter(“username“); 14. UserManager userManager=new Us

43、erManager(); 15. List userList=userManager.queryUser(username); 16. request.setAttribute(“userList“, userList); 17. return “/query_success.jsp“; 18. 19. 20. TestServlet 类重构如下:java view plain copyprint?1. package com.cjq.servlet; 2. 3. import java.io.IOException; 4. import java.util.List; 5. 6. impor

44、t javax.servlet.ServletException; 7. import javax.servlet.http.HttpServlet; 8. import javax.servlet.http.HttpServletRequest; 9. import javax.servlet.http.HttpServletResponse; 10. 11.public class TestServlet extends HttpServlet 12. 13. 14. protected void doGet(HttpServletRequest request, HttpServletR

45、esponse response) 15. throws ServletException, IOException 16. 17. String requestURI=request.getRequestURI(); 18. System.out.println(“request=“+requestURI); 19. String path=requestURI.substring(requestURI.indexOf(“/“,1),requestURI.indexOf(“.“); 20. System.out.println(“path=“+path); 21. 22. Action ac

46、tion=null; 23. if(“/servlet/delUser“.equals(path) 24. action=new DelUserAction(); 25. else if(“/servlet/addUser“.equals(path) 26. action=new AddUserAction(); 27. else if(“/servlet/modifyUser“.equals(path) 28. action=new ModifyUserAction(); 29. else if(“/servlet/queryUser“.equals(path) 30. action=new

47、 QueryUserAction(); 31. else 32. throw new RuntimeException(“请求失败“); 33. 34. String forward=null; 35. try 36. forward=action.execute(request, response); 37. catch(Exception e) 38. e.printStackTrace(); 39. 40. request.getRequestDispatcher(forward).forward(request, response); 41. 42. 运行结果:这样 TestServlet 类虽然没有彻底去掉 If-Else,但是这样的代码变得更加简练,利用多肽实现业务逻辑处理和路径跳转返回。职责更加清晰,让维护变得更加轻松。问题遗留:If-else 语句块没有彻底剔除,而且程序中依旧出现了过多的字符串,所以程序依旧是不灵活,而且字符串过多增加调试的复杂性。所以下一篇文章就把 if-else 语句块剔除,并且把字符串放到配置文件来用 dom4j 来动态读取。我们离 Struts 框架越来越

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报