已阅读5页,还剩90页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
SG-UAP高级开发手册国家电网公司应用系统统一开发平台(SG-UAP V3.0.0)服务端开发手册国网信息通信产业集团研发中心2017年5月修订记录章节号修订说明修订人修订时间审核人1.0创建章名尚2017-05-05核心框架研发组1.12017-05-08 目录1.1SG-UAP业务系统之后台篇41.1.1技术储备REST风格的前端与后台交互注解(Annotation).1注解基本概念.2平台提供的注解.3常用Spring注解其它技术储备111.1.2后台框架概述概述运行机制与前端展现框架的关系.1REST风格服务调用.2面向服务的服务调用131.1.3后台开发控制层(交互层).1服务交互-面向资源(通过REST请求操作资源)持久层功能组件-工具包30.1概述30.2基本使用3.3异常定义75第95页/共95页1.1 SG-UAP业务系统之后台篇1.1.1 技术储备 REST风格的前端与后台交互在UAP中,为了向前端屏蔽不同数据以及不同服务接口之间的差异,平台套件和业务应用的数据和逻辑以rest的形式统一封装。后台提供rest服务,由前端或其他业务模块调用。简单说:Rest是一种URI风格,是一组架构约束条件和原则,是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,提高系统的可伸缩性。REST风格应用可以实现交互,但它却天然的具有服务器无状态的特征。在状态迁移的过程中,服务器不需要记录任何Session,所有的状态都通过Url的形式记录在了前端。更准确的说,这里的无状态服务器,是指服务器不保存会话状态,而资源本身则是天然状态,通常是需要被保存的。在UAP中前后端交互采用rest风格的服务暴露形式。REST提出了一些设计概念和准则:1. 网络上的所有事物都被抽象为资源(resource);2. 每个资源对应一个唯一的资源标识(resourceidentifier);3. 通过通用的连接器接口(genericconnectorinterface)对资源进行操作;4. 对资源的各种操作不会改变资源标识;5. 所有的操作都是无状态的(stateless)。REST示例:GET请求:http:/localhost:9000/appname/module/rest/user/获取所有user的记录GET请求:http:/localhost:9000/appname/module/rest/user/0001获取单一的资源。主键为0001的user记录POST请求:http:/localhost:9000/appname/module/rest/user/save保存user记录 注解(Annotation).1 注解基本概念Annotation(注解)是JDK5.0及以后版本引入的。它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查。注解是以注解名在代码中存在的,根据注解参数的个数,我们可以将注解分为:标记注解、单值注解、完整注解三类。它们都不会直接影响到程序的语义,只是作为注解(标识)存在,我们可以通过反射机制编程实现对这些元数据的访问。另外,你可以在编译时选择代码里的注解是否只存在于源代码级,或者它也能在class文件中出现。注解定义很简单:Target(ElementType.PARAMETER)publicinterfaceTest/TODO使用时以Test方式标记在方法体,类或参数上。Target(ElementType.PARAMETER)可以定义注解的标记类型。.2 平台提供的注解平台提供了一些注解,用于封装前台传递的数据和返回给前台的数据,简化开发。与前端约定返回的数据格式为:successful:true,resultValue:,resultHint:1. ColumnRequestParam:参数注解。引用类名:com.sgcc.uap.rest.annotation.ColumnRequestParam请求体是columns:id,name的形式,指明方法的参数是从请求体中获取的字符串数组。用于在获取元数据信息时,从请求体获取显示的列,并将列名封装为字符串数组。使用示例:/前端代码demo.views.MainView = function()var me = $extend(mx.views.View);var base = ;base.init = me.init;var hsplit = null;var toolbar = null;var grid = null;me.init = function()base.init();_init();function _init()hsplit = new mx.containers.HSplit(rows: 26px, *);me.addControl(hsplit);toolbar = new mx.controls.ToolBar( width: 100%, items: name: add, text: 添加, imageUrl : /demo/resources/icons/add.png, name: edit, text: 编辑, imageUrl : /demo/resources/icons/edit.png, name: delete, text: 删除, imageUrl : /demo/resources/icons/delete.png , onitemclick: _toolBar_click );hsplit.addControl(toolbar, 0);grid = new mx.datacontrols.DataGrid( entityContainer: new mx.datacontainers.GridEntityContainer( baseUrl : Constant.gatewayURL + /, primaryKey : id, loadMeta: true ), allowPaging: true, pageSize:10, allowSorting: true, allowEditing: false, displayCheckBox: true, columns: name: id, caption: ID, align: center, allowSorting:true, dataType: string , name: productModel, caption: 1111111111, align: center, width: 100px, allowSorting:true, dataType: string , name: productName, caption: 产品名称, align: center, width: 100px, allowSorting:true, dataType: string , name: partDrawingNumber, caption: 零件图号, align: center, width: 100px, allowSorting:true, dataType: string );hsplit.addControl(grid, 1);grid.load();说明:baseUrl的参数Constant.gatewayURL为前端访问的URL/后端代码RequestMapping(/meta)public WrappedResult getMetaData(ColumnRequestParam(params) String columns) tryList datas = null;datas = ViewAttributeUtils.getViewAttributes(columns, ProductVO.class);WrappedResult wrappedResult = WrappedResult.successWrapedResult(new ViewMetaData(datas);return wrappedResult;catch(Exception e)logger.error(e.getMessage(), e);return WrappedResult.failedWrappedResult(e.getMessage();2. QueryRequestParam:参数注解。引用类名:com.sgcc.uap.rest.annotation.QueryRequestParamGET请求中从url中通过指定KEY值将参数取出,用于条件查询方法。QueryRequestParam(params),将url中的params:filter:name=eqe&sex=female,sorter:age,columns:id,name,age,sex转换为RequestCondition对象。如果是查询的子表的信息,需要传入parentID。例如:params:filter:name=eqe&sex=female,sorter:age,columns:id,name,age,sex,parentID:xxxxxxx。其中params的参数项有columns、pageIndex、pageSize、filter、sorter、parentID,这些参数项可以根据需求任选,但不可添加其他参数。传递方式为get。使用示例:/前端代码:demo.views.MainView = function()var me = $extend(mx.views.View);var base = ;base.init = me.init;var hsplit = null;var toolbar = null;var grid = null;me.init = function()base.init();_init();function _init()hsplit = new mx.containers.HSplit(rows: 26px, *);me.addControl(hsplit);toolbar = new mx.controls.ToolBar( width: 100%, items: name: add, text: 添加, imageUrl : /demo/resources/icons/add.png, name: edit, text: 编辑, imageUrl : /demo/resources/icons/edit.png, name: delete, text: 删除, imageUrl : /demo/resources/icons/delete.png , onitemclick: _toolBar_click );hsplit.addControl(toolbar, 0);grid = new mx.datacontrols.DataGrid( entityContainer: new mx.datacontainers.GridEntityContainer( baseUrl : Constant.gatewayURL + /, primaryKey : id, loadMeta: true ), allowPaging: true, pageSize:10, allowSorting: true, allowEditing: false, displayCheckBox: true, columns: name: id, caption: ID, align: center, allowSorting:true, dataType: string , name: productModel, caption: 1111111111, align: center, width: 100px, allowSorting:true, dataType: string , name: productName, caption: 产品名称, align: center, width: 100px, allowSorting:true, dataType: string , name: partDrawingNumber, caption: 零件图号, align: center, width: 100px, allowSorting:true, dataType: string );hsplit.addControl(grid, 1);grid.load();/后端代码:RequestMapping(/)public WrappedResult query(QueryRequestParam(params) RequestCondition requestCondition) try QueryResultObject queryResult = productService.query(requestCondition);(查询数据成功); return WrappedResult.successWrapedResult(queryResult); catch (Exception e) logger.error(e.getMessage(), e);return WrappedResult.failedWrappedResult(e.getMessage();说明:RequestCondition 用法实例参考平台生成代码查询方法。.3 常用Spring注解l 1)ControllerController注解将一个类标明为用来接收HTTP请求控制器l 2)RequesMappingRequestMapping注解将特定的URL和具体的控制器类或控制类类中的方法绑定l 3)PathVariable添加PathVariable注解,可以通过方法参数的形式,直接在方法中使用请求URI中的值。l 4)Repository用于将数据访问层(DAO层)的类标识为SpringBean。具体只需将该注解标注在DAO类上即可。同时,为了让Spring能够扫描类路径中的类并识别出Repository注解,需要在XML配置文件中启用Bean的自动扫描功能,这可以通过:如此,我们就不再需要在XML中显式使用进行Bean的配置。Spring在容器初始化时将自动扫描base-package指定的包及其子包下的所有class文件,所有标注了Repository的类都将被注册为SpringBean。下面通过示例具体解释一下注解的用法:Controller/控制器RequestMapping(/mall/cartitem/*)/映射路径publicclassCartItemControllerResource/默认按bean的name进行查找,如果没有找到会按type进行查找此时与Autowired类似,在没有为Resource注解/其它情况:/显式指定name属性的前提下,如果将其标注在BeanFactory类型、ApplicationContext类型、ResourceLoader类型、/1、Resource(name=dataSource)/ApplicationEventPublisher类型、MessageSource类型上,那么Spring会自动注入这些实现类的实例,不需要额外的/2、Resource(type=DataSource.class)/操作。此时name属性不需要指定(或者指定为),否则注入失败;privateIAdminLogServiceiadminlogservice;RequestMapping(value=delete)publicStringdelete(HttpServletRequestrequest)SuppressWarnings(unchecked)/废弃警告信息RequestMapping(value=addToGwc/id/num)/映射位置publicStringaddToGwc(HttpServletRequestreq,Modelmodel,ValidProductionproduction/实体设置+类+类的引用直接将页面传过来的production对象中的信息封装到里面去了PathVariableLongid,/此处id对应映射时传递过来的值PathVariableintnum)/此处num对应映射时传递过来的值/*.内容.*/ 其它技术储备了解springbean的概念;了解springMVC框架;了解springIOC;了解springAOP;了解html和jsp标签;掌握J2EE开发规范;了解hibernatepojo、掌握面向对象进行持久化存储的中间件实现机制;1.1.2 后台框架概述 概述在UAP中,为了向前端屏蔽不同数据以及不同服务接口之间的差异,平台套件和业务应用的数据和逻辑以rest的形式统一封装。后台提供rest服务,由前端或其他业务模块调用。 运行机制后台采用基于REST风格的web服务,是一种基于资源的服务访问架构。REST从资源的角度来观察整个网络,分布在各处的资源由URI确定,通常使用一个唯一标识符来指定某个资源。用户可以通过前端发送一个HTTP请求,后台根据请求返回一个web页面,使得Web程序能进一步运行。当后台收到前端发送的请求后,控制层对此请求的参数(平台提供了一些注解,用于封装前台传递的数据和返回给前台的数据)进行拦截,并封装为字符串数组的形式,然后按照确定的规则,通过调用逻辑层方法对相应事务进行处理;处理返回的结果以JSon串的形式传送到前台页面。 与前端展现框架的关系.1 REST风格服务调用Rest是一种URI风格,是一组架构约束条件和原则。REST风格服务调用就是通过解析URL请求,将请求由逻辑构件处理,并将处理结果返回给前端的一种调用形式。GET请求示例:http:/localhost:9000/appname/module/rest/context/param,后台拦截到该请求后,解析请求,交给相应的逻辑构件进行处理,将处理结果返回。其中appname为应用项目名称,module为模块名。模块间rest调用安全控制:定义模块调用的安全拦截器。在拦截器中解析调用方的IP地址,根据此IP在配置文件中找到相应的安全规则(可多条安全规则),对安全规则进行校验,必须满足所有安全规则才能允许调用方访问,否则拒绝其访问并抛出异常,异常信息的格式是与前端约定的,前端将异常信息读取并显示出来;如果调用方的IP地址不存在配置文件中,则不进行安全控制,调用方可直接访问系统。安全控制相关的配置放在perties文件中,配置内容如下:INTERCEPTOR_RULE=70-interfaceName:controller.I1%controller.I2,com.test.I3&methodName:query,query1&returnType:java.util.List;,70-interfaceName:com.sgcc.Test;methodName:query1&returnType:java.lang.String说明:在perties中配置认证规则配置。w interfaceName:规则名称,调用方实现的接口;w methodName:规则名称,调用方的方法名称;w returnType:规则名称,调用方的方法的返回类型。调用方必须满足配置的所有规则才可被接受访问。每种规则之间用”&”分隔。每个或每组IP地址对应一条或多条安全规则。.2 面向服务的服务调用后台提供WebService支持,将逻辑组件发布成WebService。后台拦截前端的WebService请求,并交给相应的逻辑构件进行处理,将处理结果返回。1.1.3 后台开发 控制层(交互层)服务交互部分是核心框架最重要的部分之一,它负责接收并处理浏览器或者异构系统发送的请求,提供用户请求数据的格式化、传输、封包与解包,URL处理的派发等功能。平台内部的服务调用支持面向构件面向资源两种方式,对于系统间的集成,平台提供对Web服务的支持。.1 服务交互-面向资源(通过REST请求操作资源).1.1 概述在统一应用开发平台中,为了向前端屏蔽不同数据以及不同服务接口之间的差异,平台套件和业务应用的数据和逻辑均以“资源(Resource)”的形式统一封装。所谓资源,就是网络上的一个实体,或者说是网络上的一个具体信息。一条业务数据记录、一条日志、一张报表都可被看作是“资源”。每一个资源类和其资源实体都可以用一个URI地址来唯一标识。如“http:/sgcc.pms.bd/bo/bdz/”表示变电站资源类,该资源类属于sgcc.pms.bd模块,资源的一级路径为业务数据,资源类的名称为“bdz”(变电站的拼音首字母缩写);“http:/sgcc.pms.bd/bo/bdz/e80d3cf8”表示一个唯一的变电站资源实体,它的资源类是“变电站资源类”,资源实体的标识ID为“e80d3cf8”。对资源类和对资源实体的访问和操作被称为资源请求(ResourceRequest),请求中包含要访问的资源类、资源实体(可选)以及资源动作。如上所述,资源类和资源实体可以由一个唯一的URI表示,而资源动作(即对资源增删改查)则需要用方法(Method)和参数(Param)表示。下面表格是对资源进行操作的实例:基于资源的请求示例示例解释GEThttp:/sgcc.pms.bd/bo/bdz/获取变电站资源类的所有实体GEThttp:/sgcc.pms.bd/bo/bdz/e80d3cf8获取指定标识的变电站资源实体POSThttp:/sgcc.pms.bd/bo/bdz/新建一个变电站,参数可以是一个包含初始值的对象PUThttp:/sgcc.pms.bd/bo/bdz/e80d3cf8更新指定标识的变电站资源实体,参数是增量变更的对象DELETEhttp:/sgcc.pms.bd/bo/bdz/e80d3cf8删除指定的资源实例资源概念横跨后台和各类前端,两端之间采用REST风格的服务暴露形式,因此每一个资源URI会对应于一个HTTPURL,而资源请求中的方法正好对应于HTTPMethod。在后台,首先需要定义资源操作,约定根据URL请求路径地址信息、URL请求路径中的参数和HTTP请求方法对应的资源操作方法,映射到具体操作资源类和方法。.1.2 控制层的组织.1.3 控制层运行机制(交互图)图表:面向资源交互图1. 前端发送一个HTTP请求2. 在系统启动的时候,扫描注解定义信息,保存于DefaultAnnotationHandlerMapping中。DispatcherServlet这个请求之后,执行getHandler方法,查找已经注册的所有URL-处理器映射信息,找到业务处理类。并组合配置的拦截器,组成执行链。3. DispatcherServlet调用执行链拦截器的前置方法,如果某个方法返回false,整个执行过程终止;4. DispatcherServlet执行handle方法调用AnnotationMethodHandlerAdapter适配器类;5. AnnotationMethodHandlerAdapter调用具体的业务类进行业务处理;6. 业务处理类根据请求信息,执行具体的业务逻辑,根据前端组件需求,组装并返回结果信息;7. DispatcherServlet调用执行链拦截器的后置方法8. DispatcherServlet调用执行链拦截器的完成方法9. DispatcherServlet向浏览器前端组件返回HTTP响应。.1.4 异常处理l 默认异常处理策略配置错误页面解析器,rest交互异常没有统一跳转页面,有异常抛出会以统一的json格式返回给前端。如:successful:false,resultHint:异常信息,data:有异常信息时successful为false,resultHint中带有异常的具体信息。l 自定义异常处理策略在使用默认异常处理策略的同时,平台利用spring自带的ExceptionHandler注解,支持用户自定义的异常处理。例如:ExceptionHandler(MyException.class)publicStringhandleException(MyExceptione)/.returnmyExceptionView;在上边的代码中,用户自定义handleException方法,处理当前控制器抛出的MyException异常。.1.5 基本使用REST请求处理后台是资源的具体操作者,在接收到浏览器发出的REST风格的请求之后,后台需要将HTTP请求内容“翻译”为本身能够理解的信息,然后按照确定的规则,将请求交由某个组件进行处理,并返回处理结果。.1.5.1 映射关系的配置HTTP协议规定了浏览器和万维网服务器之间相互通信的规则,前端通过HTTP协议,向后台发送请求,请求包含请求方法、请求URI地址、协议版本、以及包含请求修饰符、前端信息等内容。在实现对于REST请求处理之前,需要首先确定HTTP请求和资源操作组件之间的映射规则。这样,在后台接收到HTTP请求之后,才能够够根据这一规则,找到具体的资源处理组件。在统一应用开发平台,使用注解的方式定义HTTP请求和资源处理组件之间的映射关系。其中Controller注解将一个类标明为用来接收HTTP请求控制器,RequestMapping注解将特定的URL和具体的控制器类或控制类类中的方法绑定。下面通过样例的方式,定义基于注解的映射关系的配置规则。l 映射URL地址Controller/publicclassForumControllerRequestMapping(value=/forum)/publicStringlistAllBoard().在处的Controller注解表明这个类是平台的控制器类,可以处理HTTP请求;处的RequestMapping注解定义了可以接收URI的地址为/forum.uap,这样如果后台接收到一个URL为/forum.uap的HTTP请求时,就会交由ForumController类的listAllBoard方法进行处理。RequestMapping的默认属性为value,处的注解也可以写成RequestMapping(/forum)。RequestMapping注解的值支持ANT风格的URI,其中有三种通配符定义:通配符匹配规则?匹配任何单字符*匹配0或者任意数量的字符*匹配0或者更多的路径目录下面举例说明通配符的用法URI配置值匹配约束说明/app/*匹配所有/app/路径下的直接请求/app/f?rum匹配所有URI为/app/fXrum的请求,其中X为任意单个字符/*/forum匹配所有URI结尾为forum的请求RequestMapping注解不仅可以标注在方法上,也可以使用标注在类上。Controller/RequestMapping(value=/forum)/publicclassForumControllerRequestMapping(/list)/publicStringlistAllBoard()/TODO如果在类级别和方法级别上同时标注了RequestMapping注解,两者将重叠URL地址,在例如上边的实例中,listAllBoard方法将接收URI为/forum/list的请求。l 使用URI模板变量REST从资源的角度来观察整个网络,分布在各处的资源由URI确定,通常使用一个唯一标识符来指定某个资源,例如/transformer/beijing/sg01048624。前端发出REST请求之后,后台需要获取对资源的标识。使用PathVariable注解结合RequestMapping注解,在URI中定义模板变量的方式,获取URI中的标识符。例如:Controller/publicclassForumControllerRequestMapping(value=/forum/boardId/topicId)/publicStringqueryBoard(PathVariableStringboardId,PathVariableStringtopicId)/TODO在上例中,处RequestMapping中注解值为/forum/boardId/topicId,其中boardId和topicId为模板变量,分别包含在大括号中。在处的方法参数中,定义与模板变量同名的参数,并添加PathVariable注解,就可以通过方法参数的形式,直接在方法中使用请求URI中的值。l 限定HTTP请求方法在REST请求中,使用HTTP方法指定了对资源操作的动作,后台也应该能够根据HTTP方法,确定对资源的操作。RequestMapping注解的method属性对HTTP请求方法进行了约束,可以让组件的某个方法处理指定HTTP请求方式的请求,例如让一个方法处理HTTPDELTE请求,而另一个方法处理HTTPGET和POST请求,如下所示:Controller/publicclassForumControllerRequestMapping(value=/forum/boardId/topicId,method=RequestMethod.GET,RequestMethod.POST)/publicStringqueryBoard(PathVariableStringboardId,PathVariableStringtopicId)/TODORequestMapping(value=/forum/boardId/topicId,method=RequestMethod.DELETE)/publicvoiddeleteBoard(PathVariableStringboardId,PathVariableStringtopicId)/TODO通过对HTTP请求方法的约束,结合模板变量,可以简单地实现对大多数REST请求的映射关系定义。l 约束请求头信息对于不同类型的前端,REST对同一个资源的请求应当有不同的响应。在HTTP请求的头信息中,定义了前端缓存处理策略、使用的字符集、可以接收处理的内容类型等信息。RequestMapping注解的heads属性可以利用HTTP请求的头信息,使后台可以根据不同请求头信息进行做不同的响应。ControllerpublicclassForumControllerRequestMapping(value=/forum/boardId/topicId,headers=Accept=text/plain)/publicStringqueryBoardForBigScreen(PathVariableStringboardId,PathVariableStringtopicId)/TODORequestMapping(value=/forum/boardId/topicId,headers=Accept=text/json)/publicvoidqueryBoardForLaptop(PathVariableStringboardId,PathVariableStringtopicId)/TODO例如在上边的例子中,分别创建了真对大屏和笔记本两种响应方式,后台会根据请求头信息的Accept值,调用组件相应的处理,返回不同的响应。l 约束查询字符串HTTP标准中,URI不仅有地址部分,还包括?后以field1=value1&field2=value2方式的查询字串。平台RequestMapping注解的params属性提供了对查询字符串的约束,使REST请求的URI标识可以更加灵活。Controller/publicclassForumControllerRequestMapping(value=/forum/boardId/,params=order=month)/publicStringqueryTopicByMonth(PathVariableStringboardId)/TODORequestMapping(value=/forum/boardId/,params=order=author)/publicvoidqueryTopicByAuthor(PathVariableStringboardId)/TODO例如在上边的例子里,如果REST请求的URI的查询字符串中包含order=month,将调用queryTopicByMonth方法,如果包含查询字符串中order=author,将调用queryTopicByAuthor方法。如果需要包含多个查询值,写成params=“key1=value1”,”key2=value2”这种形式。通常使用自定义查询字符串的方式,进行增删改查之外的用户自定义操作的映射。l 获取请求参数使用RequestParam注解,获取HTTP请求中的参数信息,用法为RequestParam(接收的参数名),例如:Controller/publicclassForumControllerRequestMapping(value=/forum/boardId/)/publicvoidqueryTopicByAuthor(PathVariableStringboardId,RequestParam(month)Stringmonth)/TODO如果请求中包含名为month的参数,将自动赋值到方法参数中。如果参数名称和对方法参数名称相同,参数名称可以省略。例如上边就可以写成RequestParamStringmonth。.1.5.2 映射关系的加载平台在启动的时候,需要扫描上一个步骤所配置的注解信息,建立映射关系。这样,当接收到前端发送的REST请求的时候,后台可以根据映射关系,将请求转发到具体的业务组件和业务方法进行处理。下面简单介绍映射关系加载的步骤。A. 配置当前应用中,接受HTTP请求的控制器类的包路径。B. 平台启动时,扫描指定包路径,获取所有通过注解定义控制器类。C. 对所有控制器类进行遍历,扫描类的映射配置信息,并注册保存到应用缓存中。根据上个步骤映射信息的配置可以看到,URI映射信息既可以配置在类级别,也可以配置在方法级别,所以需要综合进行处理。1) 根据控制器的类型,读取定义在类上的映射关系注解信息2) 如果当前控制器上有映射关系注解的配置i. 获取控制器的方法级别所有URI映射配置信息ii. 遍历类级别URI映射值和类中所有方法的URI映射值,组合类级URIPattern和方法级别的Pattern,添加到映射关系结果集中。3) 如果当前控制器上没有映射关系注解的配置,说明当前控制器的URI模式信息完全由方法级别的映射配置确定,则解析方法级别配置的映射关系,保存到应用中。通过以上的步骤,平台启动时就完成了映射信息的读取和加载过程。.1.5.3 REST请求的转发除了具体的业务处理,平台需要在对请求处理之前进行安全验证、日志记录,在请求处理之后进行资源回收、日志记录等必要性非业务工作。核心框架中定义了一类称之为拦截器的对象,在拦截器中可以定义前置方法和后置方法,通过配置的方式,在处理业务前后执行拦截器中定义的方法。在上边的步骤中,完成了对HTTP请求与后台组件之间映射关系的配置和读取。当后台接收到REST请求之后,就可以根据HTTP请求信息查找当前加载的映射关系,找到处理当前请求的控制器类,并组合控制器类和定义的拦截器,组装成为一个完整的执行链。.1.5.4 请求处理与响应在完成REST请求的转发之后,针对某个REST请求,已经构造出后台需要执行的所有行为方法,这些行为方法组成一个执行链。图表:请求响应图A. 按照拦截器的配置顺序,顺序执行其中定义的前置方法。如果某一个前置方法返回false,停止执行链的进行。B. 查找执行请求的控制器类,根据控制器类找到控制器类的适配器,使用适配器对控制器方法进行调用。在这里使用Command设计模式,没有直接调用控制器类中的方法,而是使用控制器类进行方法调用,将请求的处理和请求的实现解耦。1) 创建解析器,分析当前控制器类所有方法的注解信息,并结合请求信息,确定要执行的方法。2) 创建处理类方法调用器,结合方法的注解信息,从请求中获取需要的参数等信息,执行对方法的具体调用。3) 按照拦截器的配置顺序,反序执行其中定义的后置方法4) 返回响应数据.1.5.5 响应信息格式定义浏览器向后台发送REST请求,后台根据请求内容调
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 年产xxx伺服定位系统项目可行性分析报告
- 外迫膨胀壁虎项目可行性分析报告范文
- 年产xxx多功能包装机项目可行性分析报告
- 教育行业合规管理现状与挑战
- 年产20000吨柑桔罐头生产项目可行性研究报告
- 独家巨献2010年更新淘宝开店大全
- 城市水资源AI管理方案
- CNAS-EC-026 2008 关于CNAS-CC01 2007《管理体系认证机构要求》部分条款的说明
- 2025年影响力报告 State of Impact 2025 A decadein transition
- 小班乘车安全课件
- 德云社空降人员管理制度
- 2022浙DT9 民用建筑常用水泵和风机控制电路图
- 2024年江苏公务员考试申论试题(B卷)
- 工艺报警分级管理制度
- 2025+CSCO结直肠癌诊疗指南解读
- 2024锅炉射线检测工艺规程
- 闪婚彩礼合同协议
- 湖北省武汉市2025届高中毕业生四月调研考试英语试卷
- 校医室管理制度
- 管道焊接技术交底
- 授权去银行打流水的委托书
评论
0/150
提交评论