




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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、action、
3、actionforward a) Actionservlet是核心控制,URL 地址映射、ActionForm的匹配、 Action 的执行都需要这个类来进行导航 b) Actionmapping:它们可将请求URI映射到Action类,并且将Action类与ActionFormbean相关联 c) Actionform:收集表单数据 d) Action: 完成所需的业务逻辑,确定要跳转的页面 e) Actionforward:用来封装转发路径的 3. Struts1框架的执行流程: 1) 检索和用户匹配的ActionMapping实例,如果不存在,就返回请求路径无效的错误信息 2)如果Act
4、ionForm实例不存在,就创建一个ActionForm的对象,把客户提交的表单数据封装到ActionForm对象中。 3)根据配置信息决定是否要进行表单验证,如果需要,就调用ActionForm的validate()方法 4)如果validate()方法放回null,或者并不包含ActionMessage的ActionError对象,就表示验证成功 5) ActionServlet根据ActionMapping所包含的映射信息决定将请求转发给那个action,如果相应的action实例不存在,就先创建这个action对象,然后再调用这个action的excute()方法 6)action的e
5、xecute()方法返回一个ActionForword对象,ActionServlet会把客户请求转发给ActionForword对象所指向的JSP组件 7)ActionForword对象指向JSP组件生成动态网页返回给客户 4.优点:和struts框架的优点相同 5.缺点: 1) 表现层技术单一:仅能用jsp 2) 与servletAPI耦合性高,难于测试(httpservletrequest、httpservletresponse) 3) 严重依赖于ServletAPI(继承action,继承actionform),与struts1框架耦合性太高 这篇博客就写到这里,如果再写篇幅可能会过长
6、,对读者的阅读造成负面影响,所以我会在下面的博客中陆续介绍我经常使用的框架,当然我也会在这些同层之间的框架的分析中加入各个框架的区别,当然在适当的地方会画一些图片来表示他们之间的知识关联性,希望读者能够我一些建议和意见。 在上篇博客中,我简单的介绍了我们分层开发中每一层中拥有的框架,而且介绍了我常用的框架struts1的结构和原理分析,那么今天我继续介绍我熟悉的框架struts2的框架的结构和原理分析。 在说struts2框架之前,我要先介绍另外一个框架webwork框架,这个框架也是一个mvc的框架,这个框架的设计思路是采用拦截链将用户的请求的数据转发到Action中,并负责将Action的
7、处理结果转换成对用户的响应。它的这种设计思路能够和ServletAPI分离,鉴于我们的上篇博客介绍的struts1的缺点,所以webwork框架解决了struts1的这个缺点。 我们来看一下webwork框架的结构图:有了这个流程图,我就不给大家讲解具体的原理流程了,它采用的是拦截链的机制,通过这些拦截链完成用户的相应请求,从而与servletAPI分离,当与servlet分离开的时候,也就是表明和容器解耦了;另外,我们从结构图中看到它的视图模版有jsp、FreeMarker等等,它的表示层技术比struts1框架的饱满许多。 所以,webwork框架解决了struts1框架存在的问题,而且它
8、的设计思路是非常好的,鉴于此,struts2框架就在struts1框架的基础上引入了webwork框架的设计思路应运而生了。所以我们就能够发现struts2兼具struts1的特性而且通过引入webwork框架的设计思路解决了struts1的一些缺点。 struts2框架的大致的体系图: 从图中我们能够看出它是引入的webwork框架的设计思路,而且它也是基于mvc的一个开源的框架。之后我们来说一下struts2框架的一个执行流程(流程图和webwork框架非常类似):1. 浏览器发送请求,通过几层过滤器完成一些功能,之后到actionmapper中,之后将请求传到核心控制器中2. 核心控制器
9、filterDispatcher根据请求决定调用合适的Action3. 调用webwork的拦截器链自动请求通用功能,如校验之类的操作4. 回调action的execute方法,获取用户请求执行相应的业务逻辑5. 之后返回字符串,匹配result,之后跳转到相应的视图或其他的文档6. 之后在执行相应的拦截器链自动请求功能,随后转到web客户端。 这样我们就对struts2框架的结构上的东西做了一个简单的介绍。在上篇博客讲解了struts1框架,所以有必要在这里对他俩进行一下对比(我仅仅总结了五条我认为比较重要的,以后如果发现其他的在随时补充):1. 在Action实现类方面的对比(struts
10、1的Action继承action,struts2实现接口,也可以不实现,可以定制服务)2. 线程模式方面的对比(struts1存在线程安全问题,struts2不存在)3. ServletAPI依赖方面的对比(struts1依赖servletAPI,struts2不是)4. 可测性方面的对比(struts1难测试,依赖容器,struts2不是)5. 封装请求参数的对比(struts1使用actionform;struts2直接写到action,并且支持pojo对象) 在上篇博客中介绍了struts2框架的原理和流程分析,可以说struts框架一路走来,改变非常大,而且让我们开发人员变得更加轻松,
11、里面的设计理念的改变也是让我们编程人员的思路得到更大的扩展。 可以说,一个先进的技术或者框架就是要不断的进步才能永远让编程人员喜欢和使用,一个优秀的编程人员也是要不断的进步才能永远让这个世界变得更加绚丽多彩。其实编程就是这样有意思的! 前面说了一些宏观上学习框架相关的思想方面的东西,下面继续来介绍我经常使用的框架和框架的分析,这篇博客主要介绍的是hibernate框架。 首先说hibernate框架是数据持久层的框架,这个框架是非常强大的,它让编程人员纯粹的用面向对象的方式来做开发,让编程人员所面对的都是对象。仅仅从这一点它的设计思路就是非常让编程人员喜爱的。 回想我们普通的开发流程,和客户沟
12、通定需求,抽象出来原型,从原型中建立数据模型到库表结构的建立,之后在映射成对象模型,之后在用oo的设计思想完成后续的程序开发。但是当我们使用了hibernate框架以后,原先的设计思路就显得不再那么具有优势了。我们直接建立对象模型,之后利用hibernate框架映射成数据模型,我们不再去考虑数据库关系模型的东西,仅仅考虑的东西仅仅就是类和对象,这样的开发才是面向对象的开发,也才是最接近人类思考问题的方式。所以hibernate框架的设计思路是非常好的。 hibernate框架设计思路的优越性其实体现在了它本身的框架的原理上。hibernate封装了JDBC,减轻了开发人员在持久层的大量重复性工
13、作,它利用了java反射机制来实现程序的透明性;它就是通过这两点才达到从对象出发而非关系数据库出发的效果。介绍这么多理论性的东西之后我们能够感觉到hibernate框架的强大,来看看它的结构图: 在hibernate框架中有几个比较重要的接口和类:1. Query接口:Query负责执行各种数据库查询。它可以使用HQL语句或SQL语句两种表达方式。2. Configuration类:Configuration类负责配置并启动Hibernate,创建SessionFactory对象3. SessionFactory接口:SessionFactory接口负责初始化Hibernate。它充当数据存储
14、源的代理,并负责创建Session对象4. Session接口:Session接口负责执行被持久化对象的CRUD操作5. Transaction接口:Transaction接口负责事务相关的操作 hibernate框架就是在利用这几个接口来封装了JDBC,而且我们用这些接口来操作数据库变得非常简单,减少了我们在持久层的代码量。 从这个结构图和我的一些分析就能发现hibernate框架是非常强大,而且它给我们开发人员的开发带来了非常大的便利,尤其是他的设计思路还有它的“全自动”的映射对象模型和关系模型。 但是hibernate框架也有它的一些缺点:1. 既然是封装了JDBC,所以很明显它没有JD
15、BC的效率高,尤其是在大量的处理表更新操作的时候。2. 它有局限性,一个持久化类不能映射多个表3. 它应对大数量的时候显得非常笨拙,这一点没有JDBC和接下来要介绍的IBatis框架 其实一项技术或者一个框架都有它的优缺点,选择最合适的才是王道。 这篇博客主要是介绍了hibernate框架的结构和分析,阐述了hibernate框架的优缺点,【具体详细使用要等到我的框架学习的后续文章】。总的来说hibernate框架在持久层的作用非常明显,我们懂得了它的优缺点之后,才能做到我们是否是要选择这个框架作为我们持久层开发的必须的技术支撑,所以这些我常用的框架结构和分析不单单是在介绍一些框架学习的宏观知
16、识把控,更多的是在为将来做项目开发中选择合适的技术支撑做铺垫。后续的博客在不断更新,希望这些博客能够对读者的开发过程带来帮助,当然如果读者对我的博客有什么好的建议或者意见,请与我联系。联系方式见博客侧边栏! 先看MVC模式流程图(其实MVC设计模式就是java中的model2。): 就像图上所标识的C层主要是Servlet层控制页面跳转,M层就是具体的业务处理逻辑,而JSP就是所谓的V层。MVC是有别于我们所说的三层,我们平常所说的三层是UI层、BLL层、DAL层,具体的区别如图: 从图上能看出来,JSP和Servlet构成了UI层,而Model层分成了BLL层和DAL层(也就是业务逻辑和数据
17、持久层)。 从理论上认清了MVC设计模式之后,下面开始动手敲一个MVC设计模式示例代码: JSP索引页面index.jsp: htmlview plaincopyprint?1. 3. 4. 5. 6. 7. Inserttitlehere8. 9. 10. 11. 姓名:12. 13. 14. 15. 16. 业务逻辑代码UserManager: javaview plaincopyprint?1. packagecom.cjq.servlet;2. 3. importjava.util.ArrayList;4. importjava.util.List;5. 6. publicclassU
18、serManager7. 8. publicvoidaddUser(Stringusername)9. System.out.println(UserManager.addUsre()-username:+username);10. 11. 12. publicvoiddelUser(Stringusername)13. System.out.println(UserManager.delUser()-username:+username);14. 15. 16. publicvoidmodifyUser(Stringusername)17. System.out.println(UserMa
19、nager.modifyUser()-username+username);18. 19. 20. publicListqueryUser(Stringusername)21. System.out.println(UserManager.queryUser()-username+username);22. ListuserList=newArrayList();23. userList.add(a);24. userList.add(b);25. userList.add(c);26. returnuserList;27. 28. Servlet控制代码: javaview plaincop
20、yprint?1. packagecom.cjq.servlet;2. 3. importjava.io.IOException;4. importjava.util.List;5. 6. importjavax.servlet.ServletException;7. importjavax.servlet.http.HttpServlet;8. importjavax.servlet.http.HttpServletRequest;9. importjavax.servlet.http.HttpServletResponse;10. 11. publicclassTestServletext
21、endsHttpServlet12. 13. 14. protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)15. throwsServletException,IOException16. 17. StringrequestURI=request.getRequestURI();18. System.out.println(request=+requestURI);19. Stringpath=requestURI.substring(requestURI.indexOf(/,1),requestUR
22、I.indexOf(.);20. System.out.println(path=+path);21. 22. Stringusername=request.getParameter(username);23. UserManageruserManager=newUserManager();24. /userManager.addUser(username);25. Stringforward=;26. if(/servlet/delUser.equals(path)27. userManager.delUser(username);28. forward=/del_success.jsp;2
23、9. elseif(/servlet/addUser.equals(path)30. userManager.addUser(username);31. forward=/add_success.jsp;32. elseif(/servlet/modifyUser.equals(path)33. userManager.modifyUser(username);34. forward=/modify_success.jsp;35. elseif(/servlet/queryUser.equals(path)36. ListuserList=userManager.queryUser(usern
24、ame);37. request.setAttribute(userList,userList);38. forward=/query_success.jsp;39. else40. thrownewRuntimeException(请求失败);41. 42. request.getRequestDispatcher(forward).forward(request,response);43. 44. 这个servlet代码主要实现的功能判断是那个页面请求服务器做那些操作,之后调用业务逻辑实现相应业务操作。 配置Servlet: htmlview plaincopyprint?1. 2. we
25、b-appxmlns:xsi=/2001/XMLSchema-instancexmlns=3. test_Servlet4. 5. index.html6. index.htm7. index.jsp8. default.html9. default.htm10. default.jsp11. 12. 13. 14. TestServlet15. com.cjq.servlet.TestServlet16. 17. 18. TestServlet19. *.action20. 21. 22. 23. 输出结果: 通过上面的示例已经对MVC设计模式有了初步的认识,
26、其实这个示例是对Struts框架学习的基础,只有弄清楚了这个实例才能弄清楚Struts框架的实现原理和Struts框架使用。 那么我们怎么才能通过这个示例引入Struts框架呢?这个问题从IF-Eles开始。 首先我们看到了TestServlet中出现了许多if-else语句,这样是非常不稳定的,这样的程序是非常不灵活的,以后如果有变化,那么维护是非常差的;而且我们在if-else中出现了大量的字符串,这样在coding的时候会出现写错,这样无形中给调试带来了麻烦。所以去掉if-else成了我们重构的第一步,也是我们进行Struts框架学习的第一步。 如何才能去掉If-ELSE呢?请看下一篇文
27、章深入浅出学习Struts1框架(二):重构MVC模式代码中跳转路径和业务逻辑。在上篇博文深入浅出学习Struts1框架(一):一个简单mvc模式代码示例开始中简单说了一下MVC模式代码的实现和MVC模式和三层架构的区别,并且留下一个问题如何去掉TestServlet中的IF-Else语句块。 因为在TestServlet中出现了If-Else语句块,所以让程序变得不再灵活,让应付需求变化时变得笨拙。所以就承接上篇文章来重构一下TestServlet代码,主要是用继承多肽来进一步对TestServlet进行重构。虽然这一篇文章最后没有将if-else彻底去掉,但是比起上篇文章的代码显得更加灵活
28、,也为下一篇彻底去掉If-else埋下伏笔。 下面进入重构阶段: 先看一下上篇文章的TestServlet代码:javaview plaincopyprint?1. packagecom.cjq.servlet;2. 3. importjava.io.IOException;4. importjava.util.List;5. 6. importjavax.servlet.ServletException;7. importjavax.servlet.http.HttpServlet;8. importjavax.servlet.http.HttpServletRequest;9. impor
29、tjavax.servlet.http.HttpServletResponse;10. 11. publicclassTestServletextendsHttpServlet12. 13. 14. protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)15. throwsServletException,IOException16. 17. StringrequestURI=request.getRequestURI();18. System.out.println(request=+requestU
30、RI);19. Stringpath=requestURI.substring(requestURI.indexOf(/,1),requestURI.indexOf(.);20. System.out.println(path=+path);21. 22. Stringusername=request.getParameter(username);23. UserManageruserManager=newUserManager();24. /userManager.addUser(username);25. Stringforward=;26. if(/servlet/delUser.equ
31、als(path)27. userManager.delUser(username);28. forward=/del_success.jsp;29. elseif(/servlet/addUser.equals(path)30. userManager.addUser(username);31. forward=/add_success.jsp;32. elseif(/servlet/modifyUser.equals(path)33. userManager.modifyUser(username);34. forward=/modify_success.jsp;35. elseif(/s
32、ervlet/queryUser.equals(path)36. ListuserList=userManager.queryUser(username);37. request.setAttribute(userList,userList);38. forward=/query_success.jsp;39. else40. thrownewRuntimeException(请求失败);41. 42. request.getRequestDispatcher(forward).forward(request,response);43. 44. 首先我们看到了在每个语句块中都出现了给forwa
33、rd赋值,其实也就是给页面跳转的路径赋值,针对每个请求路径判断来赋值跳转路径。另外每个IF-Else语句块中都有业务处理,我们要把这些业务处理分别放到类里面,让职责更加单一,这样更加符合面向对象的思路。 就从这里我们开始重构,我们可以将这个跳转路径和业务逻辑封装起来。 既然封装,那么我们就抽象出来一个借口,主要完成一个方法,这个方法主要的功能就是要完成业务逻辑封装和路径跳转的返回。随后建立四个类,主要实现相应的增删改查的业务处理和处理之后的跳转路径返回。 代码如下: 接口Action:javaview plaincopyprint?1. packagecom.cjq.servlet;2. 3.
34、 importjavax.servlet.http.HttpServletRequest;4. importjavax.servlet.http.HttpServletResponse;5. 6. publicinterfaceAction7. 8. publicStringexecute(HttpServletRequestrequest,HttpServletResponseresponse)9. throwsException;10. 增删改查实现类: 添加用户实现类:javaview plaincopyprint?1. packagecom.cjq.servlet;2. 3. impo
35、rtjavax.servlet.http.HttpServletRequest;4. importjavax.servlet.http.HttpServletResponse;5. 6. publicclassAddUserActionimplementsAction7. 8. 9. publicStringexecute(HttpServletRequestrequest,10. HttpServletResponseresponse)throwsException11. Stringusername=request.getParameter(username);12. UserManage
36、ruserManager=newUserManager();13. userManager.addUser(username);14. return/add_success.jsp;15. 16. 17. 删除用户实现类:javaview plaincopyprint?1. packagecom.cjq.servlet;2. 3. importjavax.servlet.http.HttpServletRequest;4. importjavax.servlet.http.HttpServletResponse;5. 6. publicclassDelUserActionimplementsA
37、ction7. 8. 9. publicStringexecute(HttpServletRequestrequest,10. HttpServletResponseresponse)throwsException11. Stringusername=request.getParameter(username);12. UserManageruserManager=newUserManager();13. userManager.delUser(username);14. return/del_success.jsp;15. 16. 17. 更新用户实现类:javaview plaincopy
38、print?1. packagecom.cjq.servlet;2. 3. importjavax.servlet.http.HttpServletRequest;4. importjavax.servlet.http.HttpServletResponse;5. 6. publicclassModifyUserActionimplementsAction7. 8. Override9. publicStringexecute(HttpServletRequestrequest,10. HttpServletResponseresponse)throwsException11. Stringu
39、sername=request.getParameter(username);12. UserManageruserManager=newUserManager();13. userManager.modifyUser(username);14. return/modify_success.jsp;15. 16. 17. 查询用户实现类:javaview plaincopyprint?1. packagecom.cjq.servlet;2. 3. importjava.util.List;4. 5. importjavax.servlet.http.HttpServletRequest;6.
40、importjavax.servlet.http.HttpServletResponse;7. 8. publicclassQueryUserActionimplementsAction9. 10. Override11. publicStringexecute(HttpServletRequestrequest,12. HttpServletResponseresponse)throwsException13. Stringusername=request.getParameter(username);14. UserManageruserManager=newUserManager();1
41、5. ListuserList=userManager.queryUser(username);16. request.setAttribute(userList,userList);17. return/query_success.jsp;18. 19. 20. TestServlet类重构如下:javaview plaincopyprint?1. packagecom.cjq.servlet;2. 3. importjava.io.IOException;4. importjava.util.List;5. 6. importjavax.servlet.ServletException;7
42、. importjavax.servlet.http.HttpServlet;8. importjavax.servlet.http.HttpServletRequest;9. importjavax.servlet.http.HttpServletResponse;10. 11. publicclassTestServletextendsHttpServlet12. 13. 14. protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)15. throwsServletException,IOExce
43、ption16. 17. StringrequestURI=request.getRequestURI();18. System.out.println(request=+requestURI);19. Stringpath=requestURI.substring(requestURI.indexOf(/,1),requestURI.indexOf(.);20. System.out.println(path=+path);21. 22. Actionaction=null;23. if(/servlet/delUser.equals(path)24. action=newDelUserAction();25. elseif(/servlet/addUser.equals(path)26. action=newAddUserAction();27. elseif(/servlet/modifyUser.equals(path)28. action=newModifyUserAction();29. elseif(/servlet/queryUser.e
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 交通设备制造业数字化转型中的智能交通设备智能交通信号灯控制研究报告
- 基于人工智能的2025年互联网医疗平台问诊辅助诊断报告
- 互联网教育行业的创新与变革研究报告
- 从可行性分析报告看宠物殡葬服务行业的市场前景
- 乡村产业增效的数字化商贸工匠培养模式
- 普通高中生涯指导课程的核心素养培养路径
- 城市生物廊道建设市场调研与前景预测
- 2025-2030年中国空气过滤面罩行业市场现状供需分析及投资评估规划分析研究报告
- 2025-2030年中国收缩包装行业市场现状供需分析及投资评估规划分析研究报告
- 旅游行业未来技术融合大揭秘:AI 旅游安全的行业潜力分析
- 2025至2030中国电动踏板车行业项目调研及市场前景预测评估报告
- 中国公安信息化市场前景预测及未来发展趋势报告
- 粮食机收减损培训课件
- 2025至2030中国耐腐蚀高温合金行业发展趋势分析与未来投资战略咨询研究报告
- 人文关怀病区管理制度
- 2025年山西省中考数学试卷真题(含标准答案)
- 中华诗词大赛1-3年级题库(含答案)
- 中国军魂课件
- 油田调度汇报管理制度
- 2025至2030中国汽车线束与连接器行业发展趋势分析与未来投资战略咨询研究报告
- 2025春季学期国开电大本科《会计信息系统(本)》一平台在线形考客观题试题及答案
评论
0/150
提交评论