使用XWAF框架(1)——Web项目的代码分层

  建议在Eclipse环境下使用XWAF框架来开发用户的Web项目,并遵循以下步骤和约定。

1、获取XWAF框架压缩包文件

  程序员点击下列地址免费下载XWAF框架的压缩包文件:XWAF框架压缩文件

2、安装XWAF框架

  下载XWAF框架的压缩包文件后,其名称格式类似于:com.xwaf_10.jar

  将该文件放到用户Web项目的子目录“WEB-INF/lib/”中即完成了安装。

3、XWAF框架的代码分层规范

     XWAF框架按照MVC的分层思想,要求用户对代码合理分层,并通过简单配置和注解融入XWAF框架的代码管理体系。

  所谓MVC就是将项目的全部代码分为模型(Model)、视图(View)和控制(Control)三大部分,每一部分的代码实现一定的功能。模型层代码负责数据访问、数据传递和业务逻辑处理,视图层代码实现数据展示和用户交互,控制层代码接受客户请求,组织和调度视图层与模型层的代码协调工作,向客户端做出响应。MVC的核心思想就是代码分层和逻辑控制。

XWAF框架和XWAG插件遵循了MVC的代码分层与逻辑控制思想,但进行了细化,将MVC三大部分划分成如下六层:

3.1  视图层(View

  也称为视图表现层或用户交互界面层(UI),是展示数据和接受用户输入的地方,一般使用HTML页面或JSP页面实现。

      XWAF框架提供了JSP动态网页模板库和JavaScript函数库(XJQL),支持用户快速开发视图文件。

  如果使用XWAG插件生成用户的项目代码,将依据动态网页模板、用户的菜单设置和数据库绑定,以及XJQL函数创建首页,同时自动生成“客户注册、完善注册、登录、修改密码”和“基础数据维护”等JSP页面。

  用户项目中更为复杂的业务交互页面,需要程序员自己设计和编码完成,可以使用XWAG提供的CSS样式和XJQL中的函数。同时XWAG支持使用第三方动态网页模板,生成具有特定功能的页面。

3.2  控制层(Control

       XWAF框架提供了服务器端访问控制的两个核心类:

  1com.xwaf.control.XwafDispatchServlet——请求响应调度器。这是一个遵循Servlet访问规范的Servlet类,开发人员需要在web.xml文件中,使用<servlet><servlet-mapping>配置项来注册类路径和映射地址,将特定的URL请求纳入XWAF框架控制之下。

     2com.xwaf.control.XwafHandlerAndInterceptorAdapter——请求处理与拦截适配器。XWAF框架自动扫描用户项目的HttpHandlerWebSocketHandler处理器类型包,以及HttpInterceptorWebSocketInterceptor拦截器类型包,建立请求地址(URL)与处理器和拦截器的映射关系库,提供动态匹配功能,供请求响应调度器调用。

       XWAG插件还会自动生成DownloadServletDrawCodeServletExitLoginServletPageClosedServlet等几个特殊功能的Servlet类文件。分别控制下载文件、绘制验证码、注销登录和客户端关闭页面等特殊请求的服务器响应。

  项目开发人员也可以编写ServletFilter过滤器,更加灵活地控制客户访问。过滤器代码将在Servlet类文件之前被执行。

3.拦截层(HttpInterceptorWebSocketInterceptor

        XWAF支持面向切面的开发模式,这有利于程序员在不修改已有代码的前提下,扩展或插入新的功能。

        XWAF框架使用处理拦截器机制,实现切面开发。控制器在执行HttpHandler代码之前,会先执行拦截器的代码。比如:程序员可以将工作日志代码全部写在拦截器中,不必在HttpHandler类中考虑工作日志,这样会节省大量的日志代码。

    XWAF框架支持HttpInterceptorWebSocketInterceptor两种拦截器,XWAF约定:HttpInterceptor必须使用@HttpInterceptor注解标识,而WebSocketInterceptor必须使用@WebSocketInterceptor注解标识。拦截器类的处理方法,则必须使用@RequestMapping注解映射要拦截的URL地址。

  为了让XWAF框架找到用户的拦截器位置,必须在“XConfig/XwafConfig.xml”配置文件的“<interceptorPackage></interceptorPackage>”节点中,注册拦截器类所在的包名称。如果有多个拦截器的包名称,请使用英文“,”分隔包名。

3.请求处理层(HttpHandlerWebSocketHandler

   请求处理层是XWAF框架真正处理用户请求的重要代码,是控制层的核心处理器。主要工作是提取来自客户端的请求参数和数据,经过分析后,调用业务逻辑服务类的合适方法,实现相应的业务逻辑。并将结果返回给控制器,也可以直接响应客户端(使用Response对象实现)。处理层的代码一般由开发人员编写。

       XWAF支持HttpHandler和WebSocketHandler两种处理类。XWAF约定:程序员自定义的HttpHandler类必须使用@HttpHandler注解标识,WebSocketHandler类必须使用@WebSocketHandler注解标识。一个处理方法对应一个客户端请求地址(URL)。方法必须使用@RequestMapping注解映射匹配的请求地址。当Handler处理类的所有方法匹配的请求地址包含共同的地址前缀字符串时,可以给类添加@RequestMapping注解来标识这个前缀,同时,在方法的@RequestMapping注解中去掉这个前缀字符串,达到优化代码的目的。

       XWAG插件在生成用户项目代码时,会自动生成基于单表的HttpHandler类,实现对单表的“增、删、改、查”等操作,程序员可以参考。涉及复杂业务逻辑的HttpHandler处理类需要程序员自己编写,并正确注解。

       XWAF框架提供了转发WebSocket消息和数据的默认处理类和方法,如果仅仅是转发数据和消息,不需要编写任何处理类;如果要实现复杂的逻辑处理,就需要程序员按照规范自己编写处理类和方法。为了规范程序员编程,XWAF定义了一个IWebSocketHandler接口,程序员可以实现它来完成自己的业务需求。

     XWAF框架约定:程序员编写的HttpHandler和WebSocketHandler类可以放在同一个包中,并在框架配置文件“XConfig/XwafConfig.xml”中,使用配置节点“<handlerPackage></handlerPackage>”设置处理类所在的包名称。如果用户项目有多个处理类型包,则使用英文“,”隔开它们。

       Web服务器启动项目时,XWAF框架会扫描注册的包,将添加有@HttpHandler注解和@WebSocketHandler注解的类,及其添加有@RequestMapping注解的方法的信息保存到管理器中,以备匹配之用。

  过滤器、控制器、Http处理器和拦截器的执行顺序如下:

  Servlet 过滤器(Filter>XWAF 控制器(XwafDispatchServlet>XWAF 拦截器(HttpInterceptor>XWAF 处理器(HttpHandler

3.5  业务逻辑服务层(Service

   业务逻辑服务层是真正处理用户业务逻辑的主体类,应该由开发人员编写,以实现各种各样复杂的业务逻辑处理,并接受Handler类的调用。

  为了减轻程序员的工作量,如果使用XWAG插件生成用户项目代码,会自动生成了与各个数据表对应的业务逻辑服务类文件,类文件实现了IHttpXwafService接口提供对单个数据表进行“增、删、改、查”等基本操作的方法,类文件的命名规则是:数据表名称(去掉前缀字符)+ ”Service.java”

  如果用户项目有更复杂的业务逻辑,可以优先考虑组合这些单表的服务类提供的方法,实现更为复杂的功能。

3.6  数据访问层(DAO

      DAO类是实现数据库访问的基础类,SQL语句和命令应该在DAO方法中组织,不应该放在Service服务层中。

  一般地,在Handler层中提取用户提交的参数,转化为DataField或其子类对象的集合后,传递给被调用的Service方法;Service方法再传递给被调用的DAO方法。DAO类的静态方法依据这些来自用户的参数,借助XWAF框架的数据库服务器(DataServer)、数据访问器(DataAccessor)和数据库助手(DataBaseHelper)实现对数据库的访问和更新。如果有返回结果集,就以PageDataSet对象原路返回给Handler层。

      XWAG插件为每一个数据表建立一个DAO文件,命名规则是:数据表名称(去掉前缀字符)+ ”DAO.java”,提供对每个数据表的“增、删、改、查”静态方法。也就是说,在XWAF框架中,XWAG插件生成的DAO文件实现了对真实数据表的个性化操作。同时,插件还会为每一个数据表自动创建了“存储过程、触发器、函数、序列等数据库对象,以提高数据访问的性能。

      XWAF框架主张使用DataField数据字段、Record记录和PageDataSet分页数据集对象在不同层次之间传递数据。PageDataSet包含Record对象的Map集合,Record包含DataField对象的List集合。只有DataField对象与数据表的原始字段结构有关联,记录和分页数据集对象都是大小可伸缩的集合,可以随实际参数的个数或结果集的变化而变化。返回结果集PageDataSet与实体类没有关系,因此不需要再考虑查询结果集与实体类的字段不匹配的问题。

  为了给开发者提供更多的选择和便利,使用Eclipse插件XWAG生成项目代码时,还是会自动生成与各个数据表对应的实体类,开发人员也可以选作传递数据之用,但框架不建议这样做。因为实体类在Web项目中传递客户的请求数据不够灵活,在输出查询结果集时,又难以满足只输出部分字段值的特殊情况,还需要额外的数据实体映射编程。

 

posted on 2018-11-06 11:16  徐正银  阅读(790)  评论(1编辑  收藏  举报

导航