




已阅读5页,还剩38页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于mvc模式的CRM框架的研究与改进毕业论文目 录摘 要2ABSTRACT3声明4目 录5绪 论7第一章研究概述8第一节研究背景8第二节研究内容及目标8第三节本章小结9第二章J2EE平台与MVC设计模式9第一节J2EE体系结构9一、概述9二、体系结构10第二节MVC设计模式概述10第三节本章小结12第三章Bosent Crm框架MVC原理12第四节控制器13一、控制器类13二、共享数据区18三、配置文件19第五节模型21一、Action21二、JavaBean23三、数据库连接池24第六节视图26一、视图原理26二、菜单29三、标签库31第七节本章小结32第四章Bosent Crm平台的功能改进32第一节权限体系改造32一、功能需求32二、改造基本思路32三、修改过程33第二节表单重复提交问题34一、问题描述34二、同步令牌机制35三、Bonsent CRM改造详细说明36第三节标签显示错误问题38一、错误现象38二、错误分析39三、修改说明39第四节增强日志功能40一、问题描述40二、实现方案42第五节增加集群功能43一、集群(cluster)和负载均衡的基本概念43二、Bosent CRM平台可以使用集群43三、使用JGroups技术实现集群44第六节本章小结45结 论46致 谢48参考文献49附 录50绪 论 客户关系管理系统是企业为了满足每个客户的特殊需求,同每个客户建立联系,通过同客户的联系来了解客户的不同需求,并在此基础上进行一对一个性化服务。 CRM厂商大致可以分成三类,第一类是国际大型软件厂商,如Oracle、SAP等,他们的客户定位主要在国内特大型企业,或者国内五百强企业。另外一类是用友、金蝶,还有国内传统的几家大型管理软件的企业,这类企业更多的是聚焦在中大型企业身上,他们可能有自己独立的产品,包括自己的服务体系,金额大概几百万到几千万范围。第三类是一些中小型软件厂商,这类厂商主要聚焦在中小型企业或者快速发展型的企业身上。 目前的中小企业在发展过程中,往往存在着非常多的困难,特别是客户管理,从最早的纸质表格到之后的excel报表,到如今的CRM系统,可以说,每一次改革,都是一次质的飞跃。而如今,市场竞争异常激烈,一个企业最重要的资源是什么:无非就是公司的员工和客户资源;而客户资源如何获取?如何非常好的管理这些客户资源,也许这是一个令中小企业一个非常头痛的难题。 本论文研究的是针对中小企业客户关系管理的Bosent Crm框架,它是一种基于MVC模式的B/S结构的框架,它的前身是Intel公司投资的一个小型开源应用框架Centric CRM 2.9 。在研究Bosent Crm框架基础上对该框架的各个层次的组成、功能进行了详细的描述,并在熟悉框架的基础上对框架进行改进,包括权限体系改进、表单重复提交、标签显示错误、增强日志功能和集群功能。第一章 研究概述第一节 研究背景 上世纪90年代初,随着Internet的出现和迅速发展,国外的CRM应用开始投入使用 ,到如今发展已经非常的强大,例如美国的ORACLE、德国的SAP等。 目前随着国内中小企业的迅速发展,国内中小企业为了提高客户满意度,必须完整掌握客户信息,准确把握客户要求,快速响应个性化需求,提供便捷的购买渠道、良好的售后服务。但是传统的客户关系管理系统难以达到目的,尤其是在国内,许多企业的内部管理混乱随意,有的企业从过去的“计划经济”体制下改革而来,对客户管理缺乏了解,没有经验。因此对客户关系管理系统的研究具有重要意义。第二节 研究内容及目标该论题来源于北京长信通信息技术有限公司的客户关系管理系统的二次开发,在公司的客户关系管理系统需求等变化的情况下,我开始研究公司的客户关系管理系统开发所使用的Bosent CRM框架。研究的主内容就是Bosent CRM 框架在J2EE平台体系之下实现MVC设计模式的原理。论文首先介绍J2EE平台的体系结构与MVC设计模式,其次论述了Bosent CRM实现MVC设计模式的整个过程。研究目标是在深入理解J2EE体系结构的基础上,深入研究Bosent CRM 框架的原理,并对Bosent CRM框架进行改进,使开发出更好的客户关系管理系统。第三节 本章小结 本章主要介绍我研究的课题的背景,并介绍了在这样的背景之下我研究的课题的内容以及研究的目标。第二章 J2EE平台与MVC设计模式第一节 J2EE体系结构一、 概述 J2EE是一种利用Java2平台来简化企业解决方案的开发部署和管理相关的复杂的体系结构。它的核心技术就是java平台标准版,J2EE中不仅保留了java2标准中的优点,例如平台的可移植性特性,数据库处理的JDBC接口,CORBA技术已经能够在Internet应用中保护数据的安全模式,还提供了对EJB,Servlet,JSP、XML技术的支持。J2EE平台的出现使得企业开发者大幅度缩短软件开发时间,它提供中间件集成框架用来满足无需太多费用而又需要高可靠性,高可用性和可扩展性的需求。实际上,J2EE平台最大的优点在于它提供了统一标准,并且是开源的。只要按照J2EE标准开发出的中间件,都可以在J2EE容器中运行,这是得中间件的可移植性提高,并且专注于J2EE标准的进行开发web应用的人员可以自由编写中间件。二、 体系结构J2EE体系结构主要包括客户端、表示层、业务逻辑层、后台支持系统组成。详述如下:1. 客户端:括IE和应用客户端。2. 表示层:主要是web服务器,典型的web表示层包括jsp、servlet组件。3. 业务逻辑层:包括JavaBean、EJB,它们根据规则进行业务逻辑处理。4. 后台支持系统:主要是指数据库服务器。J2EE体系结构图本论文主要研究的是表示层和业务逻辑层用MVC结构实现。第二节 MVC设计模式概述 模型-视图-控制器(下文简称为“MVC”)设计模式是Xerox PARC 在20世纪80年代为编程语言Smalltalk 80发明的用于用户交互应用程序的一种软件设计模式,它将表现逻辑与业务逻辑分开,并且使用一个控制器控制表现逻辑与业务逻辑,使它们能够有序的工作。这种三层架构广泛应用于基于J2EE的web系统中,其原理如下图所示:模型-视图-控制器三层架构图1. MVC设计模式主要的组成部分包括:1) 视图:它是和用户交互的界面,用来显示应用系统数据,并能接收用户输入的数据。但是它并不进行任何实际的业务处理。视图可以向模型查询业务状态,但是不能改变模型。视图还能接受模型发出的数据更新事件,从而对用户界面进行同步更新。需要注意的是:在基于请求/响应模式的web应用系统中,模型位于web服务器端,视图位于用户浏览器端,而无法做到模型向视图主动发出数据更新事件,使用户界面能自动刷新。2) 模型:它是应用系统的主体。模型表示业务数据和业务逻辑。一个模型能为多个视图提供数据。由于同一个模型可以被多个视图重用,因此提高了应用的可重用性。3) 控制器:它是用来接受用户的输入并调用模型和视图完成用户的需求。当web用户单击web页面中的提交按钮发送HTML表单时,控制器接收请求并调用相应的模型组件来处理请求,然后调用相应的视图显示模型返回的数据。2. MVC模型的优点: 在传统的web系统中,通常将操作数据库的数据层代码和html这样的表现层代码混合在一起。而MVC模型从根本上强制性的将它们分开,这样的好处是:1) 多个视图可以共享一个模型。在MVC模型中,模型响应用户请求并返回响应数据,视图负责格式化数据并将数据显示给用户,业务逻辑和表示层分离,同一个模型可以被不同的视图重用,大大提高了代码的可重用性;2) 模型是自包含的,和控制器、视图保持相对独立,可以方便改变应用程序的数据层和业务逻辑,能构造良好的松耦合的构件;3) 控制器提高了应用程序的灵活性和可配置性。控制器可以用来连接不同的模型和视图去完成用户的需求,也可以为构造应用程序提供强有力的手段。第三节 本章小结本章主要介绍了J2EE体系结构和MVC设计模式的原理。第三章 Bosent Crm框架MVC原理 Bosent Crm架构是基于J2EE体系之下的中间件框架,它采用MVC设计模式,它是类似struts1.x的架构,其中使用一个servlet作为控制器,目前使用jsp模板构建视图(框架支持Xsl模板,但目前还没有实现),使用自定义标签库使业务逻辑与视图分离,使用JavaBean实现数据模型,使用action处理业务逻辑。它的架构如下图所示:Bosent CRM请求-应答的具体流程描述如下:l 控制器部分当客户端发出web请求时,请求将被控制器中的Service方法接收到;首先,在Service方法中会调用SecurityHook(安全钩子)对请求进行安全检验,但是不处理名称为LOGIN、SETUP、UPGRADE、LICENSESERVER和PROCESS的请求;对PORTAL请求进行特殊处理,以创建用户session,在SecurityHook中如果检查到是第一次调用,则还会创建SystemStatus对象;然后,将从页面传递来的数据绑定为和Action对应的Formbean对象;随后,调用Action,执行Action中定义的方法;最后,处理完后调用Forward方法;l Action:架构中的模型部分Action中定义了业务逻辑,实现业务处理和数据库的交互。l 视图部分在Forward方法中,根据action配置文件,决定是调用action,还是根据XSL模板生成页面(目前没有实现),还是返回jsp页面,在jsp页面中菜单的形成是可配置的,通过在XML文件中配置菜单包括它的链接,使得在视图非常的灵活可配置。最终将生成的菜单添加到JSP模板中形成视图发送给客户端浏览器。第一节 控制器一、 控制器类 控制器类是一个Servlet类,它是MVC机制的核心类,它控制整个框架有秩序的工作。这个控制器除了实现了HttpServlet接口外,还实现了其它的钩子接口,这也是框架可扩展性的体现。控制器servlet主要的三个生命周期方法init、service、destroy。在init方法中解析一个xml文件得到视图与模型之间的映射关系,并提供全局的HashMap类型的变量保存这些映射关系提供多线程使用。当用户请求URL被service方法接收到,首先解析整个URL得到要处理的action名称,根据名称反射生成action类的实例并调用相关的方法处理请求,servlet提供全局的HashMap类型的变量缓存这些action实例,这样做的好处是当服务器配置支持多线程时,第一个用户请求了这个action后其它用户可以直接到HashMap类型的实例缓存中查找并使用这个实例。详细论述如下:1. 控制器初始化重庆邮电大学本科毕业设计(论文) 第43页/共43页 控制器类的初始化包括整个匡架的共享数据初始化、钩子类的初始化,这些类都是通过配置文件配置,然后解析XML文件得到配置信息,再通过反射机制生成这些类的实例。所有这个框架的很多资源都是可配置的。例如,在web.xml文件中配置servlet的初始化参数,容器解析初始化参数并传递给控制器servlet的初始化方法。具体的处理流程如左图所示。2. 控制器的service方法 service方法是整个框架核心的方法,客户端浏览器发出请求,Tomcat容器将请求参数封装成HttpRequest对象,并创建HttpResponse对象,将这两个对象传递到service方法,service方法中读取HttpRequest对象中封装的请求信息,从请求URL中读取出处理请求的action名称,再反射生成action实例,调用action中的哪一个方法处理请求是由请求URL中的command参数值决定的。其中在数据传递过程中,框架的数据绑定机制是非常重要的,它不同于struts1.x数据绑定机制,在Struts1.x中表单bean类继承ActionForm类才能实现参数绑定,而本框架是根据URL中传递的auto-populate参数值决定是否绑定参数的,这样做了使系统的与框架之间的耦合性降低,系统可移植性得到提高。最终action的方法执行返回常量字符串,调用forward方法跳转到视图。具体流程如图所示:3. 安全校验 安全校验是框架的重要的一个方面,它保证了框架的安全性。安全性校验是在控制器类的service方法中进行的,它主要包括SSL安全验证、验证用户会话的有效性、将用户信息存放到session中,重点在于创建共享数据区SystemStatus对象,这个对象是一个框架本身提供的一个共享数据区,它存放所有用户共享数据,这个在论文后面框架改进的集群(缓存同步)部分得到体现。流程图如下图所示:4. 创建SystemStatus对象流程图如下图所示:(1). 获取所有用户数据(Hashtable类型)(2). 获取系统参数数据(Site Preferences) (LinkedHashMap类型)(3). 配置工作流管理器参数(4). 获取全局权限数据(Role permission cache)(5). 获取WebdavResources数据5. 参数自动绑定参数绑定是整个框架中的重点,它是框架中数据从视图层传递到模型层的关键所在。参数是否自动绑定是由请求URL中参数auto-populate参数值决定,只要参数值为true,则会将请求对象HttpRequest中的参数信息绑定到相匹配的JavaBean中,再将JavaBean传递到模型层进行业务逻辑处理。 而页面数据和JavaBean数据的自动绑定是类com.darkhorseventures.framework.beans.BeanUtils实现的,原理是:(1). 从requset区域中获得所有的参数;(2). 反射创建配置文件(cfs-config.xml)中定义的JavaBean;(3). 循环参数,根据参数的名字,调用JavaBean中的“set+参数名字”方法,将参数值写入JavaBean中;(4). 将JavaBean存放到requset区域中;6. 控制器forward方法forward方法根据action执行结果进行跳转,目前框架使用jsp模板实现视图,框架也支持xsl模板。这个方法重点在于形成菜单的过程,包括主菜单、子菜单,然后把菜单信息封装在JavaBean中传递到前台的jsp模板中构建视图。这里的菜单是比较特别的,它是通过xml文件配置的,配置中包括主菜单、子菜单的层次结构、名称、链接、菜单权限以及格式css文件,通过解析配置文件得这些信息并封装在JavaBean中,传递给jsp模板。其实这样做的好处是菜单非常的灵活,通过xml文件配置主菜单、子菜单,而不用修改代码即可增加一个模块。在流程图如下图所示:二、 共享数据区共享数据区是这个框架比交重要的一个点,也是我在研究过程中遇到问题最多的一个地方,当然最终还是理解了。在Bosent CRM系统中共享数据区是用来存放系统共用的数据,一般在系统启动过程中构建,用于存放系统级数据,或者用户共享的数据。共享数据区的层次关系如下图所示:架构内置的共享数据区一共有三种:1) SystemStatus:虚拟主机(Virtual Host)共享数据区。主要从system.xml、workflow.xml等配置文件中载入数据。以及系统共享的“缓存的用户数据”、 “Lookup Lists对象”和“workflow”对象等。2) ServletContext:存放全局共享对象,例如ApplicationPrefs对象、ImportManager对象、Crontab、Scheduler等。3) ApplicationPrefs:上下文共享数据区,存放全局共享对象的参数。需要特别注意:ApplicationPrefs存放的是存放在Servlet Context中对象的参数,而不是对象本身,这点很重要。ApplicationPrefs主要从perties文件(perties文件位于安装路径下)中读取参数。特别注意:perties文件包括数据库连接数量这个重要参数。三、 配置文件1. 配置文件类型架构内置的共享数据区其数据主要来源于各种配置文件,将其分为三类:1) 框架级配置文件,主要指web.xml,cfs-config.xml主要用于配置CRM框架;2) 安装配置文件,主要指perties,此文件在安装过程中形成;此参数主要存放在ApplicationPrefs对象中,是非常重要的数据对象;3) 应用系统配置文件:用于配置应用系统模块,例如action、菜单等。2. 配置文件参数1 框架级配置文件 web.xmlweb.xml配置文件主要用于配置CRM框架,它与容器交互。cfs-config.xml该配置文件配置了action、jsp视图和表单Bean三者之间的关系。通过该配置文件控制器就可以按照规则来调用Bean绑定请求参数并调用相关的action处理请求,最终返回相应的JSP视图。这个配置文件在整个MVC框架中起到核心作用,控制整个流程。2 安装配置文件 安装过程中会产生配置文件perties,此配置文件位于安装路径下(例如:C:BosentCRM),主要存放用户配置系统的一些参数. 3 资源文件存放系统共用的数据字典数据。语言资源文件位于web应用的WEB-INFlanguages目录中,不同语种资源文件是一个由dictionary 加上语言代码组成.xml文件,例如:dictionary_zh_CN.xml,具体位置如下图所示:资源文件主要内容包括下面四个组成部分:1) 标识字符串标志system.fields.label2) 菜单字符串标志system.container.menu.label3) 子菜单字符串标志system.submenu.label4) 模板字符串标志system.modules.label4 system.xml在安装过程中,system.xml文件被复制到安装路径下的数据库名称文件夹中,即fileLibrary/database name/system.xml。此文件包含安装时的配置数据,标签库和模块能访问这些数据。例如开发一个action能访问第三方的数据库,那么可以把数据库连接信息存放在此文件中,而不用在action类中写死。 5 应用系统配置文件1. cfs-modules.xml 此配置文件用于确定主菜单和子菜单的显示顺序,以及每个菜单项的权限。 Action以URL的形式映射到菜单项。其他的参数用来定义显示在菜单项上的文字、定义权限标识以及显示在HTML页面的标题。例如下面的配置信息:第二节 模型 模型(Action)表示企业数据和业务规则。在MVC的三个部件中,模型拥有最多的处理任务。例如它可能用象EJBs和ColdFusion Components这样的构件对象来处理数据库。被模型返回的数据是中立的,就是说模型与数据格式无关,这样一个模型能为多个视图提供数据。由于应用于模型的代码只需写一次就可以被多个视图重用,所以减少了代码的重复性。一、 基类在Bosent CRM框架中,所有的模型Action类都必须继承基类org.aspcfs.modules.actions.CFSModule,其实也就是说基类CFSModule中定义了Action的公共功能,此类包含的比较重要的方法有:1) freeConnection方法要对整个action中的异常捕获,以释放资源,如数据库连接的释放。调用基类的方法。2) 执行Action缺省动作的executeCommandDefault方法;3) 获取SystemStatus共享数据的getSystemStatus(ActionContext context)方法;4) 获取当前用户的getUser方法;5) 获取用户列表的getUserTable方法;二、 映射特性 如果在Action中定义了多个处理业务逻辑的方法,就必须处理好映射特性:一般的,struts Web框架中的action只有一个固定服务方法(execute),而Bosent CRM的Action是一个多方法的action。通过在URL中定义方法,让控制器识别,并调用Action中对应的方法。 之所以如此设计,是为减少action类的数量,选择了在请求中映射方法的策略,也就是说Action在cfs-config.xml中可以有多个返回资源,各个资源在action中是一个方法的多个程序分支的返回,也可以是action的不同方法的返回。即:通过URL中的“command”参数,可以将一个控制器中定义的方法映射到命令中。而不用像Struts1.0中为一个命令定义一个控制器。三、 数据传递机制数据传递机制是框架的核心,无论是什么框架都必须思考的问题。通过配置文件,配置页面中的JavaBean数据(例如标签定义的数据)和控制器之间的映射关系。例如cfs-config.xml文件中Action配置内容如下所示: 上述配置文件将名称是“user”的UserBean类和名称是login的action相关联。特别注意的是:如果在URL中设置了“auto-populate=true”,则将实现参数自动绑定功能。例如下面的代码: 将页面中的用户名和密码自动绑定到JavaBean类LoginBean。开发者不需要在直接从request数据区中获取数据,而是页面元素和JavaBean能自动绑定,这种功能其实类似于Struts1.0中的ActionForm类的作用 auto-populate功能将HTML的“名称-值”对映射到特定的JavaBean。四、 Action配置文件Action配置文件包括WebContentWEB-INF 路径下的cfs-config.xml和cfs-config-globalactions.xml, 主要用于配置用户开发的Action。五、 JavaBean JavaBean是实现业务逻辑的关键类,因此必须遵守一定的规范,以加强代码质量。在Bosent CRM框架中必须按照如下规则开发JavaBean:(1). 所有新增JavaBean仍然依靠程序员手写。 不考虑加入DAO框架。原因:加入DAO框架会破坏CRM原有的持久层体系,并且没有直接手写JavaBean灵活。(2). JavaBean继承于GenericBean所有新增JavaBean都继承于GenericBean,这个类是在包com.darkhorseventures.framework.beans中的。(3). 采用“主动域对象模式”开发JavaBean并且仍然采用原来JavaBean的“主动域对象模式”来开发,增,删,改,查操作全部都封装在同一个对象中,查询返回的参数统一为泛型的ArrayList对象。原因:原有JavaBean的查询模式太过复杂,直接在JavaBean的查询方法里面返回结果集更易于理解和操作。(4). 没有复杂的多表关联查询功能,只对一个表进行操作数据库连接仍然从外部传入。所有新增的JavaBean都只针对本表操作,不操作其他JavaBean,SQL语句里面也不会有多表联合操作,具体逻辑由上层程序去实现。原因:这样做是为了简化JavaBean的编写,把逻辑从持久层抽取出来,由上层程序去实现。(5). 所有新增的JavaBean都不管理事务不容许在JavaBean的方法里出现commit和rollback。原因:如果在持久层管理事务的话会对程序逻辑造成混乱,特别是多表联合操作的时候,并且使程序层次不清晰,CRM原有的逻辑层次确实不够清晰,但我们至少保证新增的程序逻辑层次清晰。六、 数据库连接池 Bosent CRM系统中会启动多个线程,包括:日志线程、后台管理线程、主线程等。每个线程都要使用单独的数据库连接对象。为了让多个线程高效使用数据库连接,所以设计了复杂的数据库连接缓存机制(即数据库连接池)。1. 数据库连接管理类1. 连接类(ConnectionElement类)ConnectionElement类只是辅助类,包含完整的建立新的数据库连接对象所需的所有参数,以及两个辅助ConnectionPool类管理的两个属性:l activeDate属性:表示激活(包括创建和再次使用)的时间l allowCloseOnIdle:当连接空闲时,是否允许删除,一般设置为true2. 数据库连接池类(ConnectionPool类)ConnectionPool类本身是个“假连接池”,其本质只是使用HashMap结构实现的数据库连接对象缓存,其中存放的都是数据库连接类Connection对象,而不是真正的应用程序服务器数据库连接池资源(例如WebSphere Server中定义的数据库源)。 ConnectionPool对象不是在session中创建的,不是为每一个用户都创建一个。 ConnectionPool类用定时器管理这两个数据库连接池:定时器会定时(设置为5秒)检查和关闭空闲JDBC数据库连接的定时器。此定时器在创建ConnectionPool对象5秒后开始启动此定时器。 每5秒钟开始循环检测。定时器的循环时间在程序中写死了,如果要加快速度,必须修改代码。检测ConnectionPool主要包括两个任务:1)删除空闲队列中的JDBC数据库连接,管理空闲JDBC连接缓存。2)删除使用队列中死锁的JDBC数据库连接,管理正在使用的JDBC连接缓存。2. 配置连接池参数本框架的优点就在与大部分参数是可配置的,其中数据库连接池参数也是可以配置的,当然在程序中提供了默认的配置。即安装路径下的perties文件,其参数含义如下所述:3. 连接池的问题 连接池类本身是个假连接池,只是使用HashMap结构实现的数据库连接对象缓存,其中存放的都是数据库连接类Connection对象,而不是真正的应用程序服务器数据库连接池资源。而且,当系统中数据库连接对象超过设定值后,将不再创建新的连接对象,而是抛出异常、或者处于等待状态。因此,当应用程序没有及时用free方法从HashMap中释放资源、或者系统客户端很多,导致数据库连接超出设定值时,系统性能急剧下降,或者有的功能无法正常使用。因此,建议不要让CRM系统框架管理应用系统的数据库连接,而是让应用程序服务器(例如Netweaver)来管理;不再使用ConnectionPool类,而是使用应用程序服务器(例如Netweaver)本身提供的数据库连接池获取数据库连接对象。第三节 视图一、 视图概述 视图是用户看到并与之交互的界面。对老式的Web应用程序来说,视图就是由HTML元素组成的界面,在新式的Web应用程序中,HTML依旧在视图中扮演着重要的角色,但一些新的技术已层出不穷,它们包括Adobe Flash和象XHTML,XML/XSL,WML等一些标识语言和Web services. 如何处理应用程序的界面变得越来越有挑战性。MVC一个大的好处是它能为你的应用程序处理很多不同的视图。在视图中其实没有真正的处理发生,不管这些数据是联机存储的还是一个雇员列表,作为视图来讲,它只是作为一种输出数据并允许用户操纵的方式。1. 视图框架模型在Bosent Crm框架中支持三种Action和JSP的设计模式:l 模式1:各自独立的Action和JSPl 模式2:复用JSP代码,包括Form数据和JSP页面l 模式3:复用Action(1). 模式1:各自独立的Action和JSP 模式如下图所示:一个Action对应一个JSP页面,即Action返回后仅仅转向一个JSP。(2). 模式2:复用JSP代码,包括Form数据和JSP页面 模式如下图所示:一个JSP页面能响应多个Action。模式2增强了模型1的可重复利用能力。(3). 模式3:复用Action一个Action能返回多个值,以对应多个JSP页面。而在这个Action中其实实现了多个Action功能。这种方法充分扩展了Action的功能。也是Bosent Crm平台中最常使用的方式。2. JSP模板JSP模板文件提供一种标准的统一的页面展示风格,除了显示的内容不同外,页面的整体框架都一致。使用JSP模板,大大减轻了页面的编程工作,而一般web系统中,页面的编程工作量占到全部工作量的70%。所有模板文件存放在WebContenttemplates路径下。基于布局的JSP页面,页面由下面几个部分组成,Templates目录下的JSP页面:1) template1bosent.jsp(标准layout布局)2) template1nav.jsp(导航布局页面)多数请求由导航布局页返回,对应cfs-config.xml配置文件中forward配置项的layout=nav,例如: 二、 菜单1. 菜单类型在Bosent Crm系统中,菜单主要包括下面三种类型:1) 显示主模块的顶层菜单(Top-level menu displaying modules)2) 显示每个具体模块的子菜单(Sub-menus for each module)3) 标签样式菜单(Tab-style container menus)而在平台初始化过程中一共生成三种类型的菜单数据:l 标签样式(a tabbed version)l 图形样式(a graphic version)l 文本样式(a text version)这些菜单数据存放在Request中,包括:Requset属性值菜单类型MainMenu标签样式菜单MainMenuTableCells标签样式菜单MainMenuGraphic图形样式菜单MainMenuSmall文本格式菜单MainMenuWidth菜单长度MainMenuTops菜单提示信息2. 菜单生成过程(1). 在ControllerServlet的初始化函数中,载入所有的菜单数据。ControllerServlet类从cfs-modules.xml配置文件获得所有菜单的数据,存放在主菜单钩子类MainMenuHook的菜单属性(类型是MainMenuItem)中。(2). 在ControllerServlet的forward函数中,根据用户权限生成菜单 在ControllerServlet的service函数中,如果action对应的forward中的“layout”属性定义为“nav”,则调用MainMenuHook类的generateMenu方法,根据用户权限生成HTML格式的主菜单和子菜单 3. 和菜单相关的配置文件(1). 菜单配置文件(cfs-modules.xml) 此配置文件用于确定主菜单和子菜单的显示顺序,以及每个菜单项的权限信息。Action以URL的形式映射到菜单项。其他参数用来定义显示在菜单项上的文字、定义权限标识以及显示在HTML页面的标题。例如下面的配置信息:(2). 系统配置文件(即perties)在安装路径下有系统配置文件(即perties),其中的“SYSTEM.LANGUAGE”属性应该设置为“zh_CN”,即:SYSTEM.LANGUAGE=zh_CN,这样设置菜单才能显示为中文。即在SystemStatus对象中属性Language才会设置为“zh_CN”。 (3). 资源文件(dictionary_zh_CN.xml)存放系统共用的数据字典数据。语言资源文件位于web应用的WEB-INFlanguages目录中,不同语种资源文件是一个由dictionary 加上语言代码组成.xml文件,例如:dictionary_zh_CN.xm。 (4). system.xml在安装过程中,system.xml文件被复制到安装路径下的数据库名称文件夹中,即fileLibrary/database name/system.xml。此文件包含安装时的配置数据,标签库和模块能访问这些数据。例如开发一个action能访问第三方的数据库,那么可以把数据库连接信息存放在此文件中,而不用在action类中写死。此文件一般内容如下所示:其中:1) system.fields.ignore:用于定义可以动态忽略的JSP模块;2) system.fields.label:用于定义JSP页面中使用的可重命名的字符串标识。4. 菜单两种配置 在实际使用中,需要特别注意:system.xml和资源文件(dictionary_zh_CN.xml)可能同时对同一个数据字典进行了定义,例如system.modules.label和system.container.menu.label在这两个文件中都定义了相同的数据字典:system.xml中定义了“system.modules.label”, 在资源文件dictionary_zh_CN.xml中同样也定义有system.modules.label, 而system.xml和资源文件都同时存放在SystemStatus类中,只不过存放在不同的对象中:system.xml存放在preferences对象中,资源文件存放在ApplicationPrefs对象的dictionaries对象中。 因此SystemStatus类规定了优先级,system.xml的优先级大于资源文件。 如果要覆盖资源文件中某菜单的标识,可以在system.xml中覆盖此标识。但是此功能必须谨慎使用。在有的项目组中,出现的菜单中英文混杂问题,可能就是因为这个原因造成的。三、 标签库Bosent Crm平台使用标签库在页面上按规则显现信息。Bosent Crm平台使用的标签库有:JSTL、dhv-taglib、zeroio-taglib。标签是SUN JSP的标准实现,这里不做介绍。第四节 本章小结 在本章中,详细阐述了Bosent Crm框架实现MVC设计模式的原理,包括模型、视图、控制器编程规范实现原理等。第四章 Bosent Crm平台的功能改进 在研究Bosent CRM 框架的基础上,我对公司所使用的CRM系统进行了相关的改进。第一节 权限体系改造一、 功能需求 现有系统中一个用户只有一个角色,要求改造为一个用户能拥有多个角色。二、 改造基本思路 首先,改造基本的业务逻辑,将用户和角色之间一对一的关系修改为一对多;修改完后需要检验一下是否能兼容处理一对一的关系; 然后,修改页面,能通过页面配置用户和角色之间一对多的关系; 最后,测试系统和权限相关的模块,检查是否有遗留的地方。三、 修改过程1. 创建用户-角色表创建用户-角色表,把用户和角色一对一的关系转换为一对多的关系,但是同时又要保证一对一的关系不变。CREATE TABLE user_role ( user_id INTEGER NOT NULL,role_id INTEGER NOT NULL);改造之后的表结构之间的关系如下图所示:2. 修改业务逻辑 CRM权限体系主要包括和权限相关的业务逻辑和页面。 1) 角色类:org.aspcfs.modules.admin.base.Role:修改计算属于某角色的用户数函数buildUserCount。2) 修改角色集合类:org.aspcfs.modules.admin.base.RoleList3) 修改用户类:org.aspcfs.modules.admin.base.User类 4) 用户集合类:org.aspcfs.modules.admin.base.UserList 类5) 修改用户权限列表类org.aspcfs.modules.admin.base.UserPermissionList 3. 修改SystemStatus全局数据类即org.aspcfs.controller.SystemStatus类。修改权限校验函数boolean hasPermission(int userId, String thisPermission)。这个函数很重要,是权限认证最核心的函数。4. 修改用户管理1) 用户列表,用户的角色需要能显示多个。2) 用户详细信息,角色需要能显示多个。第二节 表单重复提交问题一、 问题描述Bonsent CRM平台存在刷新引起的表单重复提交问题,即当用户提交完表单,进行页面刷新操作,表单会重复提交。例如:如果用户对同一个HTML表单多次提交,web应用必须能够判断用户的重复提交行为,以做出相应的处理。例如对于注册表单,如果用户已经提交表单并且服务器成功注册了用户信息,此时用户又通过浏览器的后退功能,退回到原来的页面,重复提交表单,服务器端代码应该能够识别用户的误操作行为,避免为用户重复注册。 在Structs1.X中,使用同步令牌机制解决了重复提交问题,因此在Bonsent CRM平台中引入此技术,解决此问题。二、 同步令牌机制 原理阐述:服务器端在处理客户端的请求之前,会将请求中包含的令牌值与保存在当前会话中的令牌值进行比较,看是否匹配。在处理完该请求后,并且在信息达到客户端之前,将产生一个新的令牌。该令牌值将会替换当前会话中的令牌值,并且传到客户端。这样如果用户回退到刚才的提交页面并再一次提交的话,客户端传过来的令牌与服务其中的令牌值不一致,从而有效的防止了提交。Structs1.X中利用同步令牌(Token)机制可以解决重复提交问题。Structs给出了个参考实现。Structs同步令牌机制的具体流程如下图所示:利用Struts的Token机制来避免重复提交表单的流程具体描述如下:1) 首先,在用户请求jsp页面之前,将请求转发给PrepareInsertAction。此action会调用saveToke方法,创建一个新令牌,并把它保存在当前的session范围内。PrepareInsertAction会把请求转发给jsp页面;2) 然后,转向insert.jsp。jsp页面中的标签的处理类判断在session范围内是否存在Token,如果存在,就在表单中生成一个包含Token信息的隐藏字段,这段逻辑由org.apache.struts.taglib.html.FormTag类的renderToken方法完成的。在jsp页面的源代码中会看到表单中定义了一个包含Token信息的隐藏字段。Action类的isTokenValid方法在判断Token是否有效时,实际上就是把这个隐藏字段的值和当前用户会话中的令牌值做比较。3) 最后,insert.jsp提交数据到InsertAction这个Action中。在提交表单后,由InsertAction处理请求。在此Action中,首先调用isTokenValid方法判断当前用户会话中的令牌值和请求参数中的令牌值是否匹配。如果不匹配,就生成错误信息,并调用saveToken方法,创建一个新的令牌,然后返回;如果匹配,就调用resetToken方法,从当前会话中删除Token,然后执行插入数据库操作。这样,在用户提交了表单后,如果又通过浏览器的后退功能,退回到刚才的jsp页面,如果再提交表单,其请求将由Action来处理。action先调用isTokenValid方法来判断当前用户会话中
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 知识产权赋能新质生产力的作用
- 医患关系发展时间线
- 建设工程安全管理实务讲解
- 工信新质生产力
- 2025年呼吸内科常见呼吸系统疾病诊断试卷答案及解析
- 构建新质生产力的实践路径
- 2025年呼吸内科疾病检测与治疗综合考试答案及解析
- 2025年精神科护理知识测试卷答案及解析
- 2025年骨科骨折固定术后康复方案制定模拟考试卷答案及解析
- 2025年骨科骨折固定操作规范考核模拟测试卷答案及解析
- 最新低压电工安全培训课件
- 第一章原核生物的形态、构造和功能
- 水土保持工程质量评定表
- 整机部整机出货检验重点标准
- 人像摄影:户外人像摄影课件
- 美丽中国中英文字幕
- 《中国传统服饰简介》PPT课件(完整版)
- 《教育技术学导论》课程教学大纲
- 污染土壤异位修复现场施工方案
- CCP点确认记录参考模板
- 《日汉翻译2》教学大纲
评论
0/150
提交评论