一个module中的web组件,负责将Service的结果按照适当的规范输出给前端。
格式:http://server/moduleID/param0/param1/paramN/p.TYPE
格式上包含三部分:
moduleID:将请求分发到具体的模块,分发器参考下面具体介绍;
paramX:参数部分
TYPE:使用什么请求服务完成,对应到module中的一个具体的RequestService

从MVC的角度来看,这个相当于C,将服务提供的模型数据以适当的形式展现给前端;

一、请求分发器
framework中的web组件,一个标准的Http Filter或HttpServlet,下面是Filter版本的代码
public void doFilter(ServletRequest sreq, ServletResponse sresp,
  FilterChain chain) throws IOException, ServletException {
 HttpServletRequest req = (HttpServletRequest)sreq;
 HttpServletResponse resp = (HttpServletResponse)sresp;
 req.setAttribute(Constants.SERVLET_CONTEXT, servletContext);
 //
 String path = req.getRequestURI();
 if((path == null || path.length() <= 1) && !StringUtils.isEmpty(welcomePage))
  path = this.welcomePage;
 //
 LocalModule module = null;
 String[] uris = null;
 String reqType = null;
 if(path.indexOf(".") > 0) {
  path = path.replaceAll("/+", "/").substring(req.getContextPath().length());
  reqType = path.substring(path.lastIndexOf(".") + 1);
  final String pathEff = path.substring(0, path.lastIndexOf("."));
  
  uris = StringUtils.split(pathEff, "/");
  
  final String moduleId = uris[0];
  module = Application.getInstance().getModules().exists(moduleId)?Application.getInstance().getModules().getLocalModule(moduleId): null;
  Principal principal = (Principal)req.getSession().getAttribute(Principal.PRINCIPAL);
  if(principal == null && req.getUserPrincipal() != null) {
   principal = new SimpleUserPrincipal(req.getUserPrincipal().getName(), req.getUserPrincipal().getName(), req.getUserPrincipal());
  }
  if(module != null) {
   req.setAttribute(Constants.MODULE, module);
   Data request = DataUtils.convert(module, req);
   ThreadContext ctx = new ThreadContext(module, request, principal);
   ThreadContext.setContext(ctx);
  }
 }
 //
 if(module != null && !StringUtils.isEmpty(reqType) && module.canHandleRequest(reqType)) {
  final String[] pathItems = new String[uris.length - 1];
  System.arraycopy(uris, 1, pathItems, 0, uris.length - 1);
  processRequestInChain(module, reqType, req, resp, pathItems);
 } else {
  chain.doFilter(sreq, sresp);
 }
}
判断规则:
1、请求的模块存在:Application.getInstance().getModules().exists(moduleId)
2、请求的模块能够处理该类型请求:module.canHandleRequest(reqType)

二、开发RequestService
需要实现接口RequestService:
public interface RequestService {
 public void service(LocalModule module, String[] pathItems, HttpServletRequest req, HttpServletResponse resp)
   throws ServletException, IOException;
}

一个典型的把服务的处理结果输出为Json的RequestService:
public class JsonRequestService extends AbstractRequestService implements RequestService {

private final static Logger logger = Logger.getLogger(JsonRequestService.class);

public void service(LocalModule module, String[] uris, HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

Data request = DataUtils.convert(module, req);
  request.put(Constants.ACTION_TYPE, Constants.ACTION_TYPE_ACTION);
  resp.setContentType("application/json");

JSONResult result = new JSONResult();
  result.setRequest(request);

String serviceId = uris[0];
  if (!module.getModuleConfig().getServiceConfigs().containsKey(serviceId))
   serviceId += "Action";
  String method = uris[1];
  String serviceModuleId = uris.length == 3 ? uris[2] : module.getId();
  try {
   final Data data = ServiceInvoker.invoke(module.getId(), serviceModuleId, serviceId + ":" + method, request);
   String results = (String) data.get("result");
   result.setResult(results);
   result.setData(data);
  } catch (ObjectNotFoundException e) {
   resp.sendError(404);
   return;
  } catch (AppException e) {
   logger.error(this.getClass().getName(), e);
   result.setResult(e.getErrorCode());
   result.setMessage(e.getMessage());
  } catch (Exception e) {
   logger.error(this.getClass().getName(), e);
   result.setResult("1");
   result.setMessage(e.getMessage());
  }
  String jsonString = result.toJSONString();
  logger.debug(jsonString);
  resp.getWriter().append(jsonString);
  resp.flushBuffer();
 }

}

三、注册
注册为服务,如下:
<service id="com.flyingwords.framework.request.impl.ShtmlRequestService" type="class" target="com.flyingwords.framework.request.impl.ShtmlRequestService">
 <desc></desc>
 <configs>
  <config name="content-type">text/html; charset=UTF-8</config>
  <config name="encoding">UTF-8</config>
 </configs>
</service>
注册为RequestService,如下:
<requests>
 <request type="json" service="com.flying.framework.request.impl.JsonRequestService"/>
</requests>

四、访问
http://server:port/pas/UserService/findByUserNameAndPassword.json
即可访问该接口了。

flying框架中,RequestService定义为服务的外延,是WEB访问服务的桥梁。

请求服务(RequestService)的更多相关文章

  1. (转)ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务 的解决方法

    早上同事用PL/SQL连接虚拟机中的Oracle数据库,发现又报了"ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务"错误,帮其解决后,发现很多人遇到过这样的问 ...

  2. 关于Oracle报“ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务”错误

    关于Oracle报“ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务”错误原因:listener.ora中没有指定监听服务器名. 如下是解决思路: 尝试1.通过重启服务的方式启动数 ...

  3. tomcat7 ajax请求服务中文乱码

    在确保请求服务编码格式为utf-8的情况下,确保tomcat的配置 <Connector connectionTimeout="20000" port="8080& ...

  4. 【教程】【FLEX】#002 请求服务端数据(UrlLoader)

    为什么Flex需要请求服务端读取数据,而不是自己读取? Flex 是一门界面语言,主要是做界面展示的,它能实现很多绚丽的效果,这个是传统Web项目部能比的. 但是它对数据库和文件的读写 没有良好的支持 ...

  5. ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务 的解决方法

    今天用PL/SQL连接虚拟机中的Oracle数据库,发现报了“ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务”错误,也许你也遇到过,原因如下: oracle安装成功后,一直未停止 ...

  6. ***PHP请求服务curl以及json的解析

    对于thinkphp框架,相信每一个php开发者都会有了解或者熟悉吧!前端很多都用的ajax的结合,前几天遇到了一个问题,就是请求另一个服务,也就是请求一个接口,然后对方返回一个json串,一开始对c ...

  7. Angularjs总结(七) 路由及请求服务等

    define(['angular'], function (ng) { 'use strict'; var app = ng.module('index-module', ['ngCookies', ...

  8. 防止tab页重复的去请求服务端

    直接看图吧. 左边是企业树,右边是依据企业变化的一个tab页 实现功能:1.我们希望假设选中的企业不变,我们在切换旁边五个tab页的时候,仅仅是第一次进去的时候请求server端.以下来回切换tab页 ...

  9. windows7 ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务 的解决方法

    用PL/SQL连接虚拟机中的Oracle数据库,发现又报了“ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务”错误,帮其解决后,发现很多人遇到过这样的问题,因此写着这里. 也许你没 ...

随机推荐

  1. 如何将VS 2015中的项目上传到github

    最近开始慢慢接触github,现在希望将自己平时写的小程序,上传到github上,以便以后有个参考,在遇到同样问题的时候不至于想不起来怎么做而到处找别人的例子. VS 2015设置 首先下载跟gith ...

  2. 【C#】发票助手二维码生成

    之前一起吃饭听说了发票助手这个东西,可以生成发票抬头的二维码,扫码就可以开票了. 官方也有个小程序的 [税务发票助手],微信中搜这个名字就可以了. 我准备在自己的小程序中也尝试一下,本来觉得只要拼接一 ...

  3. Effecvtive Java Note

    代码应该被重用,而不是被拷贝 同大多数学科一样,学习编程的艺术首先要学会基本的规则,然后才能知道什么时候可以打破这些规则   创建和销毁对象 1.考虑用静态工厂方法代替构造器. 优势:有名称.不必再每 ...

  4. jQuery实现跨域请求实例

    首先准备两个项目做测试(jsonp1,jsonp2) 一:在jsonp1中做一个用于测试的链接 def ajax(request): callbacks = request.GET.get(" ...

  5. 【转】Java中super和this的几种用法与区别

    1. 子类的构造函数如果要引用super的话,必须把super放在函数的首位.   class Base {   Base() {   System.out.println("Base&qu ...

  6. Mac 安装 Gradle

    首先下载 Gradle 通过官网进行下载 https://gradle.org 下载的文件名可能是 gradle-3.3-bin.zip 解压 将此文件解压到任意位置,如解压到 /usr/local ...

  7. deeplearning.ai 构建机器学习项目 Week 2 机器学习策略 II 听课笔记

    1. 误差分析(Error analysis) 误差分析的目的是找到不同误差源的比重,从而指引我们接下来往哪个方向努力改进.NG建议手工统计随机100个错误的误差源,比如对于猫分类器,错误的照片可能是 ...

  8. BZOJ2338: [HNOI2011]数矩形

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2338 中学数学老师告诉我们,一个矩形的两条对角线相等,所以只要把所有的边拿出来,记录下中点坐标 ...

  9. Quoit Design(最近点对+分治)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1007 Quoit Design Time Limit: 10000/5000 MS (Java/Oth ...

  10. Entity Framework Core 懒加载

    众所周知在EF 6 及以前的版本中,是支持懒加载(Lazy Loading)的,可惜在EF Core 并不支持,必须使用Include方法来支持导航属性的数据加载.不过现在EF Core的开发团队打算 ...