请求服务(RequestService)
一个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)的更多相关文章
- (转)ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务 的解决方法
早上同事用PL/SQL连接虚拟机中的Oracle数据库,发现又报了"ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务"错误,帮其解决后,发现很多人遇到过这样的问 ...
- 关于Oracle报“ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务”错误
关于Oracle报“ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务”错误原因:listener.ora中没有指定监听服务器名. 如下是解决思路: 尝试1.通过重启服务的方式启动数 ...
- tomcat7 ajax请求服务中文乱码
在确保请求服务编码格式为utf-8的情况下,确保tomcat的配置 <Connector connectionTimeout="20000" port="8080& ...
- 【教程】【FLEX】#002 请求服务端数据(UrlLoader)
为什么Flex需要请求服务端读取数据,而不是自己读取? Flex 是一门界面语言,主要是做界面展示的,它能实现很多绚丽的效果,这个是传统Web项目部能比的. 但是它对数据库和文件的读写 没有良好的支持 ...
- ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务 的解决方法
今天用PL/SQL连接虚拟机中的Oracle数据库,发现报了“ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务”错误,也许你也遇到过,原因如下: oracle安装成功后,一直未停止 ...
- ***PHP请求服务curl以及json的解析
对于thinkphp框架,相信每一个php开发者都会有了解或者熟悉吧!前端很多都用的ajax的结合,前几天遇到了一个问题,就是请求另一个服务,也就是请求一个接口,然后对方返回一个json串,一开始对c ...
- Angularjs总结(七) 路由及请求服务等
define(['angular'], function (ng) { 'use strict'; var app = ng.module('index-module', ['ngCookies', ...
- 防止tab页重复的去请求服务端
直接看图吧. 左边是企业树,右边是依据企业变化的一个tab页 实现功能:1.我们希望假设选中的企业不变,我们在切换旁边五个tab页的时候,仅仅是第一次进去的时候请求server端.以下来回切换tab页 ...
- windows7 ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务 的解决方法
用PL/SQL连接虚拟机中的Oracle数据库,发现又报了“ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务”错误,帮其解决后,发现很多人遇到过这样的问题,因此写着这里. 也许你没 ...
随机推荐
- iOS中 学会如何对sqlite3 进行封装 (纯手工)
#waring ---(看官注意) ---使用说明: ①在创建自定义model类之前让该类继承自文件中的Model类, ②为model类选一个NSString属性作为主键:(既,在初始化方法里面将从父 ...
- 浏览器history操作实现一些功能
返回拦截 功能:从广告进入到落地页后,给history增加一个页面,拦截返回动作 主要用到的是h5中的history对象,使用了pushState,和replaceState来操作. 并且加入了一些条 ...
- 希尔排序(Go语言)
func ShellSort(num []int) { //increment相隔数量 ;increment> ;increment/= { //i序号较大的数组下标,i ,j进行比较 for ...
- 重构仿vue社区代码
半年前根据vue社区提供的开放api制作的vue社区,功能大部分和原vue社区一样,还一些功能没做完,项目是半年前做的,已经过了半年,当时因为公司一个项目打算要vue来重构,提取小试牛刀做了个dom试 ...
- ubuntu 使用sudo apt-get update 出现 被配置多次导致无法升级错误解决方法
这个周六周末在考虑升级自己GPU开发机,在琢磨使用docker来配置tensorflowGPU环境,在升级软件的时候爆出了如下错误 在 /etc/apt/sources.list.d/sogoupin ...
- 【JavaScript随机生成验证码及其颜色】
css样式: <style type="text/css"> /*给验证码设一个盒子*/ #yzm{ width: 120px; height: 50px; text- ...
- MongoDB(一)环境搭建与初始配置
前言 最近的项目中需要用到MongoDB,所这段时间需要学习知道怎么去使用这个数据库. 这里我先简单的介绍一下什么是MongoDB,后面还会详细的介绍: MongoDB 是一个面向文档的通用型数据库, ...
- [51nod1407]与与与与
有n个整数,问从他们中取出若干个数字相与之后结果是0的有多少组. 答案比较大,输出对于 1,000,000,007 (1e9+7)取模后的结果. Input 第一行输入一个整数n.(1<=n&l ...
- GDOI 2016 & APIO 2016 游记
缓慢施工中...... UPD:APIO游记已烂尾......因为Cu滚粗+生病一直没心情写..过了几天就发现APIO的事都快忘光了...去看KPM的就可以啦 今年apio竟然没和gdoi撞...智障 ...
- BZOJ3930: [CQOI2015]选数
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=3930 容斥原理. 令l=(L-1)/k,r=R/k,这样找k的倍数就相当于找1的倍数. 设F[ ...