J2EE Web核心技术《Web组件与框架开发技术》第4 章 Web系统架构设计及MVC模式第4部分.docx
- 文档编号:16450754
- 上传时间:2023-07-13
- 格式:DOCX
- 页数:14
- 大小:84.30KB
J2EE Web核心技术《Web组件与框架开发技术》第4 章 Web系统架构设计及MVC模式第4部分.docx
《J2EE Web核心技术《Web组件与框架开发技术》第4 章 Web系统架构设计及MVC模式第4部分.docx》由会员分享,可在线阅读,更多相关《J2EE Web核心技术《Web组件与框架开发技术》第4 章 Web系统架构设计及MVC模式第4部分.docx(14页珍藏版)》请在冰点文库上搜索。
J2EEWeb核心技术《Web组件与框架开发技术》第4章Web系统架构设计及MVC模式第4部分
第4章Web系统架构设计及MVC模式(第4/4部分)
1.1利用AOP分离系统中的核心和横切关注点
1.1.1面向切面的系统架构设计
1、面向切面架构设计方法擅长解决系统中的“横跨”关系的问题
面向切面编程AOP(AspectOrientedProgramming)技术可以解决传统的面向对象编程OOP中不能够很好地解决的横切(CrossCut)方面的问题,比如在应用系统中所经常需要解决的如事务、安全、日志、缓存和并发访问中的锁定等问题都属于应用系统中的“横切”关注方面的问题。
关于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过滤器组件部署时所设置的
因此,有必要熟悉和正确地设置Web过滤器组件拦截的URL地址。
表4.2为不同形式的URL模式所对应的目标资源的含义。
表4.2不同形式的URL模式所对应的目标资源的含义
URL模式
含义
/*
Web应用系统的根目录下的所有目标资源
/filter/*
根目录内的/filter目录下的所有目标资源
/filter/*.jsp
根目录内的/filter目录下的所有的JSP页面文件
/filter/someOne/*
根目录内的/filter/someOne/目录下的所有资源
3、应用Web过滤器组件保护系统中的JSP页面资源
客户关系信息系统目前所存在的安全漏洞之一,主要表现在用户如果直接在浏览器的URL地址栏中输入http:
//127.0.0.1:
8080/webcrm/userManage/deleteUserInfo.jsp后,将能够直接进入到系统中的删除客户信息的功能页面。
当然,如果输入其它敏感的URL地址也都能够直接进入系统,并完成敏感操作。
这将给系统带来一定的安全隐患,应该禁止这样的Http请求而只允许以*.action的形式进行访问。
为此,需要在项目中添加一个过滤器组件。
类名称为TransferJSPPage,包名称为com.px1987.webcrm.filter,并且实现javax.servlet.Filter接口。
【例4-13】所示为满足此功能需求的代码示例,但除掉了无关的代码没有附录出。
【例4-13】保护系统中的JSP页面资源的过滤器组件代码示例
packagecom.px1987.webcrm.filter;
importjava.io.IOException;
importjava.util.Observable;
importjavax.servlet.*;
importjavax.servlet.http.*;
publicclassTransferJSPPageimplementsFilter{
publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,
FilterChainchain)throwsIOException,ServletException{
RequestDispatcheroneRequestDispatcher=null;
HttpServletRequesthttprequest=(HttpServletRequest)request;
oneRequestDispatcher=request.getRequestDispatcher("/index.jsp");
oneRequestDispatcher.forward(request,response);
return;
}
}
在【例4-13】示例中识别是否为非法的Htpp请求(也就是直接对系统中的JSP页面的访问),并自动地将请求转发到系统的首页。
当然,也可以改变为其它的目标程序,并且为了提高过滤器组件的灵活性,可以将转发的目标页面(如本示例中的index.jsp)文件名放到XML配置文件中,然后在过滤器组件中动态获得。
在web.xml文件中部署【例4-13】示例中的过滤器组件,并正确地设置其中的
【例4-14】部署【例4-13】示例中的过滤器组件的代码示例
测试【例4-13】示例中的过滤器组件TransferJSPPage类的功能效果,在浏览器中输入http:
//127.0.0.1:
8080/webcrm/userManage/deleteUserInfo.jsp后,系统将自动地进行跳转到系统的首页,如图4.24所示的局部截图。
图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、利用监听器组件技术加载系统中的全局工作参数
1)功能需求的应用背景及代码示例
在Web应用系统中一般都会存在有许多全局工作参数,比如连接数据库的各种连接参数等,如【例4-15】中黑体标识的代码语句。
为了减少对这些全局工作参数的重复解析,可以在Web应用系统启动时一次性加载这些配置参数并缓存起来,在后台的Servlet程序及业务功能的JavaBean组件中获得这些工作参数,然后再改变自身的工作状态。
为此,可以在项目中添加一个监听器组件,并且实现ServletContextListener接口,最终的LoadAllParametersListener类的代码示例如【例4-15】所示。
【例4-15】加载系统中全局工作参数的监听器组件代码示例
packagecom.px1987.webcrm.listener;
importjava.util.HashMap;
importjava.util.Map;
importjavax.servlet.ServletContextEvent;
importjavax.servlet.ServletContextListener;
publicclassLoadAllParametersListenerimplementsServletContextListener{
privateMap
publicLoadAllParametersListener(){
}
@Override
publicvoidcontextDestroyed(ServletContextEventevent){
allCommonParameterHashMap.clear();
allCommonParameterHashMap=null;
}
@Override
publicvoidcontextInitialized(ServletContextEventevent){
allCommonParameterHashMap=newHashMap
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);
}
}
2)部署该监听器组件类程序
在web.xml部署描述文件中部署该LoadAllParametersListener监听器组件类程序,如下为最终的部署标签:
3)在某个Servlet组件中获得由监听器解析和缓存的工作参数
【例4-16】所示为在某个Servlet组件中获得由监听器解析和缓存的工作参数的代码示例,但除掉了无关的代码没有附录出。
【例4-16】获得由监听器解析和缓存的工作参数的代码示例
publicvoidgetCommonParameter(){
Map
ServletContextapplication=this.getServletContext();
allCommonParameterHashMap=(HashMap
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);
}
4)测试本示例的功能效果
将系统中的连接数据库的各个工作参数保存在一个XML文件中,然后启动Tomcat服务器并进入系统登录功能页面,正常进行系统登录。
由于在登录功能处理的Servlet程序中调用【例4-16】所示的getCommonParameter()方法获得工作参数,并在控制台中打印输出所获得的参数值,如图4.25所示。
图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.log(Level.INFO,"Servlet容器已经启动....");
}
publicvoidcontextDestroyed(ServletContextEventevent){
logger.log(Level.INFO,"Servlet容器已经关闭....");
}
}
1.2本章小结
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组件一般为不可视化的软件组件,主要封装系统中的业务逻辑处理及业务数据代码。
1.2.4学习要点
面向方面编程的基本思想是要求开发人员尽可能分离“技术问题实现”和“业务问题实现”的功能代码,将应用系统中的通用功能从各个业务功能类中分离出来,这样将能够更好地遵守“单一职责”的类设计原则;同时,也能够实现代码的重用和提高系统功能实现程序的可扩展性。
当某个通用的功能实现的行为发生变化时,不必修改和维护许多程序类,而只需要修改这些共享的功能程序类。
为此,仔细阅读和理解【例4-13】、【例4-15】和【例4-16】等示例程序。
1.3本章练习
1.3.1单选题
1、Service(响应请求的服务)是下面哪个J2EE应用组件生命周期中的一个阶段?
()
(A)JSP(B)JavaBean(C)JavaClass(D)Servlet
2、在Servlet程序类对象实例中如何得到HttpSession对象的引用?
()
(A)调用ServletContext对象的getSession()获取
(B)调用HttpServletRequest对象的getSession()获取
(C)newSession()(D)使用固定变量session
3、选出关于J2EE和JavaEE的正确描述是哪一项?
()
(A)J2EE和JavaEE都是Java企业应用平台(B)JavaEE是J2EE的下一个版本
(C)JavaEE和J2EE都支持JSP(D)JavaEE和J2EE都支持JSF
4、选出可以从JSP缺省的内置对象request中获取的信息()
(A)cookie(B)contenttype(C)session(D)ServletName
5、JSTL标签库中的 forEach>标签的主要作用是哪一项? () (A)条件判断(B)赋值(C)循环(D)跳转 1.3.2填空题 1、JSPModelOne架构模式的主要实现方式是利用_________或者____
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Web组件与框架开发技术 J2EE Web核心技术Web组件与框架开发技术第4 Web系统架构设计及MVC模式第4部分 W
链接地址:https://www.bingdoc.com/p-16450754.html