版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章Web系统架构设计及MVC莫式(第4/4部分)利用AOP分离系统中的核心和横切关注点1.1.1面向切面的系统架构设计1、面向切面架构设计方法擅长解决系统中的“横跨”关系的问题面向切面编程AOP(AspectOrientedProgramming技术可以解决传统的面向对象编程OOP中不能够很好地解决的横切(CrossCu)方面的问题,比如在应用系统中所经常需要解决的如事务、安全、日志、缓存和并发访问中的锁定等问题都属于应用系统中的“横切”关注方面的问题。关于AOP的具体编程及应用技术,作者在《J2EE项目实训一一Spring框架技术》一书(见本书的参考文献)的第6章“AOP和SpringAOP技术”和第7章“SpringAOP中的Advice通知”作了比较详细的介绍。2、面向切面设计思想在J2EEWeb过滤器组件中的应用Web过滤器是一种J2EEWeb组件,它拦截用户通过浏览器发出的请求输入和后台服务器程序的响应输出。因此,可以在过滤器组件中查看、提取或以某种方式操作正在客户机和服务器主机之间交换的Http请求数据。应用Web过滤器组件技术同样也能够达到AOP所倡导的分离“技术问题实现”和“业务问题实现”的设计效果。因此,在Web应用系统的开发实现中可以将系统中的日志记录、安全验证和会话处理、对象缓存、表单数据验证等有关应用系统中的“技术问题实现”的功能代码放在过滤器组件程序中。这样的设计方案,不仅使得在业务层中将不需要再重复地编程这些功能实现代码,也使得核心业务功能实现的代码和附加技术功能实现的代码相互分离,有利于系统的功能扩展和维护修改。3、面向切面设计思想在J2EEWeb监听器组件中的应用在Web应用系统的开发中,还可以部署一些特殊的 Servlet组件类,通过它们从而实现对Web应用中的上下文信息、会话信息等的监听,最终实现在服务器后台自动地完成某些特定的应用功能。比如,实现ServletContextListener接口的监听器组件可以在Web应用系统的启动和关闭时插入附加的功能行为实现,同样实现HttpSessionListener接口的监听器组件可以监控用户的会话状态,在会话开始或者结束时插入附加的功能行为实现。而这些附加的功能实现代码并不需要直接包含在各个业务功能处理代码中,同样也达到将系统中的核心业务功能实现的代码和附加技术功能实现的代码相互分离的设计目标,并且监听器组件可以动态地配置改变,也提高了项目的灵活性。1.1.2在项目中应用Web过滤器组件技术1、 Web过滤器组件的主要作用Web应用中的过滤器组件(Filter)可以截取从客户端浏览器发出的 Http请求,并对Http请求进行转换和处理,实现前端控制器的作用;同时还可以实现项目中的日志记录、安全身份认证、会话处理等方面的功能。多个不同的过滤器组件还可以相互串接形成过滤器链;过滤器组件不仅可以对客户端浏览器发出的 Http请求进行过滤处理,同时也可以对服务器端向客户端浏览器发送的Http响应结果进行过滤处理。因为在filterChain.doFilter(request,response)代码之前的功能代码为过滤请求的代码,而以下的功能代码则为过滤响应的功能代码。因此,可以在处理 Http请求之前或之后,通过过滤器组件增加一些附加的通用功能。比如:拦截 Http请求,实现安全认证和日志记录;对Http请求的数据转换,实现解密Http请求,然后再将响应的结果数据加密输出到客户端。而且多个不同的过滤器组件可以组合在一起形成过滤器链,但调用的先后顺序取决于web.xml中对过滤器注册的顺序。关于 Web过滤器组件的具体编程及应用技术,作者在《J2EE课程设计一一技术应用指导》一书(见本书的参考文献)的第8章“Web监听器和过滤器技术及应用”作了比较详细的介绍。2、 正确地设置Web过滤器组件拦截的URL地址由于Web过滤器组件最终是由Servlet容器加载和执行的,而Servlet容器的加载策略是依据开发人员在web.xml部署描述文件中对Web过滤器组件部署时所设置的<url-pattern>标签(代表URL模式)内的URL地址。因此,有必要熟悉和正确地设置Web过滤器组件拦截的URL地址。表4.2为不同形式的URL模式所对应的目标资源的含义。表4.2不同形式的URL模式所对应的目标资源的含义URL模式含义/*Web应用系统的根目录下的所有目标资源/filter/*根目录内的/filter目录下的所有目标资源/filter/*.jsp根目录内的/filter目录下的所有的JSP页面文件/filter/someOne/*根目录内的/filter/someOne/目录下的所有资源3、应用Web过滤器组件保护系统中的 JSP页面资源客户关系信息系统目前所存在的安全漏洞之一,主要表现在用户如果直接在浏览器的URL地址栏中输入:8080/webcrm/userManage/deleteUserlnfo.jsp后,将能够直接进入到系统中的删除客户信息的功能页面。当然,如果输入其它敏感的URL地址也都能够直接进入系统,并完成敏感操作。这将给系统带来一定的安全隐患,应该禁止这样的Http请求而只允许以*.action的形式进行访问。为此,需要在项目中添加一个过滤器组件。类名称为 TransferJSPPage包名称为com.px1987.webcrm.filter,并且实现javax.servlet.Filter接口。【例4-13】所示为满足此功能需求的代码示例,但除掉了无关的代码没有附录出。【例4-13】保护系统中的JSP页面资源的过滤器组件代码示例packagecom.px1987.webcrm.filter;importjava.io.10Exception;importjava.util.Observable;importjavax.servlet.*;importjavax.servlet.http.*;publicclassTransferJSPPageimplementsFilter{publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,ServletException{RequestDispatcheroneRequestDispatcher=nuII;HttpServletRequesthttprequest=(HttpServletRequest)request;oneRequestDispatcher=request.getRequestDispatcher("/index.jsp");oneRequestDispatcher.forward(request,response);return;}}在【例4-13】示例中识别是否为非法的Htpp请求(也就是直接对系统中的JSP页面的访问),并自动地将请求转发到系统的首页。当然,也可以改变为其它的目标程序,并且
index.jsp)文件名为了提高过滤器组件的灵活性,可以将转发的目标页面(如本示例中的放到index.jsp)文件名在web.xml文件中部署【例4-13】示例中的过滤器组件,并正确地设置其中的vurl-pattern>为需要保护的目标资源(可以为多组),最终的结果如【例4-14】所示【例4-14】部署【例4-13】示例中的过滤器组件的代码示例<filter>vfilter-name>transferjsppagev/filter-name><filter-class>com.px1987.webcrm.filter.TransferJSPPage</filter-class></filter>vfilter-mapping><filter-name>transferjsppagev/filter-name><url-pattern>*.jsp</url-pattern>v/filter-mapping>vfilter-mapping>vfilter-name>transferjsppagev/filter-name><url-pattern>/webResource/*</url-pattern>v/filter-mapping>测试【例4-13】示例中的过滤器组件TransferJSPPag啖的功能效果,在浏览器中输入:8080/webcrm/userManage/deleteUserlnfo.js后,系统将自动地进行跳转到系统的首页,如图4.24的首页,如图4.24所示的局部截图aciltioxl=eoT地址⑪|曜]hl切:"1ST.D.D.Iaciltioxl=eoT玄.蓝廿集餌CRM糸统图4.24系统对非法的Http请求将自动地转发到目标页面中当然,一旦在系统中采用该过滤器组件拦截直接对 JSP页面的请求方式以后,页面中的所有超链接形式的页面跳转将应该采用“*.action”的方式实现,也就是在浏览器的URL地址栏中将不再出现*.jsp形式的URL地址,如图4.24所示。1.1.3在项目中应用Web监听器组件技术1、Web监听器组件技术J2EEWeb组件在Servlet容器中运行时存在有生命周期,并且在生命周期中的不同阶段,Servlet容器也将会触发不同的事件。在J2EEWeb技术规范中定义了这些事件相关的各个接口,开发人员可以根据项目中的功能需要,实现有关的事件接口,并重写事件接口中的特定事件响应方法而最终形成Web监听器组件。当Servlet容器触发上下文信息(ServletContext)、会话信息(HttpSession)等特定的事件时,相关的Web监听器组件中的事件处理方法的程序代码将会被自动地调用。因此,开发者所实现的Web监听器组件最终能够实现在服务器后台系统中自动地执行某个特定功能的程序,从而完成某些“自动化”的应用功能。比如,定时备份系统中的各种关键性数据、数据汇总和创建报表等。关于Web监听器组件的具体编程及应用技术,作者在《J2EE课程设计一一技术应用指导》一书(见本书的参考文献)的第8章“Web监听器和过滤器技术及应用”作了比较详细的介绍。2、利用监听器组件技术加载系统中的全局工作参数功能需求的应用背景及代码示例在Web应用系统中一般都会存在有许多全局工作参数,比如连接数据库的各种连接参数等,如【例4-15】中黑体标识的代码语句。为了减少对这些全局工作参数的重复解析,可以在Web应用系统启动时一次性加载这些配置参数并缓存起来, 在后台的Servlet程序及业务功能的JavaBean组件中获得这些工作参数,然后再改变自身的工作状态。为此,可以在项目中添加一个监听器组件,并且实现 ServletContextListener接口,最终的LoadAIIParametersListener类的代码示例如【例4-15】所示。【例4-15】加载系统中全局工作参数的监听器组件代码示例packagecom.px1987.webcrm.listener;importjava.util.HashMap;importjava.util.Map;importjavax.servlet.ServletContextEvent;importjavax.servlet.ServletContextListener;publicclassLoadAllParametersListenerimplementsServletContextListener{privateMap<String,String>allCommonParameterHashMap=nuII;publicLoadAllParametersListener(){}@OverridepublicvoidcontextDestroyed(ServletContextEventevent){allCommonParameterHashMap.clear();allCommonParameterHashMap=nuII;}@OverridepublicvoidcontextInitialized(ServletContextEventevent){allCommonParameterHashMap=newHashMap<String,String>();allCommonParameterHashMap.put("JDBC_DBDriver_ClassName","com.mysql.jdbc.Driver");allCommonParameterHashMap.put("JDBC_DSN_URL","jdbc:mysql://localhost:3306/webcrm");allCommonParameterHashMap.put("JDBC_dbUserName","root");allCommonParameterHashMap.put("JDBC_dbUserPassWord","root");event.getServletContext().setAttribute("allCommonParameter",allCommonParameterHashMap);}}部署该监听器组件类程序在web.xml部署描述文件中部署该LoadAIIParametersListener 监听器组件类程序,如下为最终的部署标签:<listener><listener-class>com.px1987.webcrm.listeneLoadAIIParametersListener</listener-class></Iistener>在某个Servlet组件中获得由监听器解析和缓存的工作参数【例4-16】所示为在某个Servlet组件中获得由监听器解析和缓存的工作参数的代码示例,但除掉了无关的代码没有附录出。【例4-16】获得由监听器解析和缓存的工作参数的代码示例publicvoidgetCommonParameter(){MapvString,String>allCommonParameterHashMap=null;ServletContextapplication=this.getServletContext();allCommonParameterHashMap=(HashMap<String,String>)application.getAttribute("allCommonParameter");StringJDBC_DBDriver_ClassName=allCommonParameterHashMap.get("JDBC_DBDriver_ClassName");StringJDBC_DSN_URL=allCommonParameterHashMap.get("JDBC_DSN_URL");StringJDBC_dbUserName=allCommonParameterHashMap.get("JDBC_dbUserName");StringJDBC_dbUserPassWord=allCommonParameterHashMap.get("JDBC_dbUserPassWord");System.out.println("JDBC_DBDriver_ClassName="+JDBC_DBDriver_ClassName);System.out.println("JDBC_DSN_URL="+JDBC_DSN_URL);System.out.println("JDBC_dbUserName="+JDBC_dbUserName);System.out.println("JDBC_dbUserPassWord="+JDBC_dbUserPassWord);}测试本示例的功能效果将系统中的连接数据库的各个工作参数保存在一个 XML文件中,然后启动Tomcat服务器并进入系统登录功能页面,正常进行系统登录。由于在登录功能处理的 Servlet程序中调用【例4-16】所示的getCommonParameter(方法获得工作参数,并在控制台中打印输出所获得的参数值,如图4.25所示。F*Pr^bl<®s刼JwvaxUf|屬■仙lur-lioG CwboI*-=rtorackllSSarvHr[Fan自2 App-1.1 lon.]fIPf.pxjaFil.iA修 料 1手 S'Tj■lveie_C ■啊曹 j业t;・Delvet jJDBC_DSN_1P1!hj皿匸:1s/?LocalhosT;s3306/webcnaJDBCl—dhUnExbiarwciQtJDBCdbir^EE-PeissUoEd."root —— q图4.25 在系统控制台中打印输岀所获得的参数值3、监听Servlet 容器启动和关闭并实现日志记录1)功能需求的应用背景通过监听Servlet容器启动和关闭的事件,在事件发生时记录Servlet容器程序启动和关闭的系统日志,以便系统管理员通过这个日志查看Servlet容器在启动和关闭时所可能出现的错误情况。2)满足此功能需求的原理性的代码示例【例4-17】所示为监听Servlet容器启动和关闭并实现日志记录的原理性代码示例,在其中利用JDK中的Logger日志类中的log()方法记录Servlet容器启动和关闭时的状态信息,注意其中黑体所标识的代码。为了节省本书的篇幅,在代码中只简单地打印输出普通的提示信息。【例4-17】监听Servlet容器启动和关闭并实现日志记录的代码示例packagecom.px1987.webcrm.listener;importjava.util.logging.Level;importjava.util.logging.Logger;publicclassListenerServerStateimplementsServletContextListener{privateLoggerlogger=Logger.getLogger(this.getClass().getName());publicvoidcontextInitialized(ServletContextEventsce){logger」og(Level」NFO,"Servlet容器已经启动");}publicvoidcontextDestroyed(ServletContextEventevent){logger」og(Level」NFO,"Servlet容器已经关闭");}}本章小结1.2.1教学重点软件系统架构设计师不仅要考虑软件系统的整体结构方面的设计工作以及软件系统所应该具有的功能,还要关注整个软件系统的可用性、可重用性和可扩展性以及可靠性、安全性等相关方面的技术实现问题,以期望能够达到“高内聚、低藕合”的系统架构设计目标。为此,首先要增强学生对应用系统的总体架构设计的重要性的意识,“高内聚、低藕合”是系统设计的主要目标,而 JSPModelOne和ModelTwoWeb系统架构是具体的实现形式。本章的第2个教学重点是对MVC架构模式及在Web系统中的具体应用,MVC架构模式广泛地被应用于应用系统的开发实现中,并很好地实现了业务处理层与表现层的分离。最后一个教学重点则是面向切面架构设计在J2EE平台中的具体实现和应用,面向切面编程技术可以解决传统的面向对象编程中不能够很好地解决的横切( CrossCut)方面的问题。比如在应用系统中所经常需要解决的如事务、安全、日志、缓存和并发访问中的锁定等问题都属于应用系统中的“横切”关注方面的问题。1.2.2学习难点大型企业级Web应用系统的开发通常要求有一个良好的软件架构、便于协作开发和扩展升级,面向方面的设计思想弥补了面向对象设计思想在实际软件系统开发应用中所存在的缺陷。因为面向对象的编程技术不能实现软件系统中的核心关注点与横切关注点的相互分离,而面向方面的编程思想正是为了解决这个问题而提出的。因此,在软件系统的开发实现中应该要综合应用面向对象的编程技术和面向方面的编程技术。另外,还要理解为什么要提出标签技术。 JSTL标签可以封装业务处理逻辑代码,从而可以减少页面中的Java脚本代码量。1.2.3教学要点面向对象的架构设计能够适应不断变化的软件系统的需求,而面向切面架构设计是对面向对象架构设计的进一步扩展和完善,但面向对象的架构设计和面向切面架构设计都是针对单一的软件系统设计的方法。采用面向对象的软件系统体系架构设计方法设计软件系统可以使得软件系统的功能实现代码能够更容易扩展、更好的可重用性。但普通的学生在学习本章的内容时,会存在对面向切面架构设计方法可能比较陌生或者不了解。面向对象的架构设计方法更擅长解决“纵向”和“核心和外围”关系的问题,而面向切面架构设计方法擅长解决有“横跨”关系的冋题。另一个教学要点是要让学生熟悉JavaBean组件规范,JavaBean组件是一个特殊的Java类。在J2EEWeb应用系统中的JavaBean组件一般为不可视化的软件组件,主要封装系统中的业务逻辑处理及业务数据代码。
124学习要点面向方面编程的基本思想是要求开发人员尽可能分离“技术问题实现”和“业务问题实现”的功能代码,将应用系统中的通用功能从各个业务功能类中分离出来,这样将能够更好地遵守“单一职责”的类设计原则;同时,也能够实现代码的重用和提高系统功能实现程序的可扩展性。当某个通用的功能实现的行为发生变化时,不必修改和维护许多程序类,而只需要修改这些共享的功能程序类。为此,仔细阅读和理解【例 4-13】、【例4-15】和【例4-16】等示例程序。本章练习1.3.1单选题1、Service(响应请求的服务)是下面哪个 J2EE应用组件生命周期中的一个阶段?()(A)JSP (B)JavaBean(C)JavaClass (D)ServletTOC\o"1-5"\h\z2、在Servlet程序类对象实例中如何得到HttpSession对象的引用?( )(A)调用ServletContext对象的getSession(获取(B) 调用HttpServletRequest对象的getSession(获取(C)newSession() (D)使用固定变量session3、选出关于J2EE和JavaEE的正确描述是哪一项?( )(A)J2EE和JavaEE都是Java企业应用平台 (B)JavaEE是J2EE的下一个版本(C)JavaEE和J2EE都支持JSP (D)JavaEE和J2EE都支持JSF4、选出可以从JSP缺省的内置对象request中获取的信息( )(A)(A)cookie(B)contenttype(C)session(D)ServletName5、JSTL标签库中的<c:forEach>标签的主要作用是哪一项?( )(A)条件判断(B(A)条件判断(B)赋值(C)循环(D)跳转1.3.2填空题1、JSPModelOne架构模式的主要实现方式是利用 者 标准的J2EEWeb组件技术构建出Web应用系统。2、MVC架构模式中的模型层组件由 件承担,并完成业务功能和数据处理等方面的功能;而视图层组件由 担;而控制层组件协调表现层组件和模型层组件,TOC\o"1-5"\h\z主要由 担。3、JSTL中的<c:out>标签的主要作用是 ,<c:if>标签的主要作用是 ,<c:choose>标签的主要作用是 ,<c:forEach>标签的主要作用是 。4、JavaBean组件其实就是一般的Java程序类,但需要在该类中提供一个 如果该组件类为实体类,需要为其中的各个成员变量提供 和 性访问方法。
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 制作儿童课件教学课件
- 目送课件底板教学课件
- 蘑菇屋课件教学课件
- 卡通游戏课件教学课件
- 2024年度云计算平台广告业务合同
- 2024年度八宝山殡仪馆鲜花制品物流配送服务合同
- 2024年度委托加工协议(定制产品)
- 2024年塑料模具生产与交付合同
- 2024年度健康医疗服务合同服务细节
- 2024供水供电合同
- 教师专业发展及教师专业发展阶段
- 儿童危重症患者的护理
- 可持续发展的采购战略
- LED灯具光学基础知识
- 2024抖音运营计划书
- 海洋科学类专业职业生涯规划书
- 2022年江苏省苏州市吴中、吴江、相城区中考一模语文试题
- 精神科常见危机状态处理
- 工程开工令模板(全)
- 作文格子稿纸800字-A4打印版
- 个人住房贷款提前还款月供及节省利息EXCEL计算
评论
0/150
提交评论