关于XOA的架构

关于XOA的架构,结合项目经验作以下陈述:
1、分层
renren-wap-fuxi-model:对外提供的实体对象
renren-wap-fuxi-service:内部接口和实现及数据库表单的实体对象,主要的开发
及DAO的编写在此处
renren-wap-fuxi-xoa-api:对外提供的接口
renren-wap-fuxi-xoa-server:具体业务映射的Controller类,主要用于api和 service层的交互。

2、依赖
<name>renren-wap-wqo-model</name>
  <dependencies>
<dependency>
<groupId>net.paoding</groupId>
<artifactId>paoding-rose</artifactId>
</dependency>
<dependency>
<groupId>com.renren</groupId>
<artifactId>xoa-commons-interceptors</artifactId>
</dependency>
<dependency>
<groupId>com.xiaonei</groupId>
<artifactId>renren-wap-wqo-model</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>


<name>renren-wap-fuxi-service</name>
<dependency>
<groupId>net.paoding</groupId>
<artifactId>paoding-rose-jade</artifactId>
</dependency>
<dependency>
<groupId>com.xiaonei</groupId>
<artifactId>xiaonei-datasource4jade</artifactId>
</dependency>
<dependency>
<groupId>com.xiaonei</groupId>
<artifactId>renren-wap-framework-logic</artifactId>
</dependency>
<dependency>
<groupId>com.xiaonei</groupId>
<artifactId>renren-wap-fuxi-model</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.xiaonei</groupId>
<artifactId>xiaonei-xcache</artifactId>
</dependency>


<name>renren-wap-fuxi-xoa-api</name>
  	<dependency>
<groupId>com.renren</groupId>
<artifactId>xoa-api</artifactId>
</dependency>
<dependency>
<groupId>com.xiaonei</groupId>
<artifactId>renren-wap-wqo-model</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>net.paoding</groupId>
<artifactId>paoding-rose</artifactId>
</dependency>
<dependency>
<groupId>com.renren</groupId>
<artifactId>xoa-commons-interceptors</artifactId>
</dependency>


<name>renren-wap-fuxi-xoa-server Maven Webapp</name>
<dependency>
<groupId>net.paoding</groupId>
<artifactId>paoding-rose</artifactId>
</dependency>
<dependency>
<groupId>com.renren</groupId>
<artifactId>xoa-commons-interceptors</artifactId>
</dependency>
<dependency>
<groupId>com.xiaonei</groupId>
<artifactId>renren-wap-fuxi-model</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.xiaonei</groupId>
<artifactId>renren-wap-fuxi-service</artifactId>
<version>1.0-SNAPSHOT</version>
<exclusions>
<exclusion>
<artifactId>xiaonei-commons-interceptors</artifactId>
<groupId>com.xiaonei</groupId>
</exclusion>
</exclusions>
</dependency>


3、sevice层的接口开发
wap.fuxi目录下
dao
--IAppPageDAO 编写基本的与数据库交互的sql语句,规则如下:
@DAO(catalog = "user_fuxi")
public interface IAppPageDAO {

/**
* 插入游戏信息表、返回自增主键id
* @param appPage
*/
@ReturnGeneratedKeys
@SQL("insert into app_page(page_name,company,introduction,web_logo_url,wap_logo_url,web_snapshot,wap_snapshot,keyword,display_order,status,source,source_url,add_time) "
+ "values( "
+ ":appPage.pageName,:appPage.company, "
+ ":appPage.introduction, "
+ ":appPage.webLogoUrl,:appPage.wapLogoUrl,:appPage.webSnapshot, "
+ ":appPage.wapSnapshot,:appPage.keyword,:appPage.displayOrder, "
+ ":appPage.status,:appPage.source,:appPage.sourceUrl, "
+ ":appPage.releaseTime "
+ ")")
public int save(@SQLParam("appPage") AppPageEntity appPage);

/**
* 根据id更新游戏记录
* @param appPage
*/
@SQL("UPDATE app_page " + " set page_name = :appPage.pageName, "
+ " company = :appPage.company, "
+ " introduction = :appPage.introduction, "
+ " web_logo_url = :appPage.webLogoUrl, "
+ " wap_logo_url = :appPage.wapLogoUrl, "
+ " web_snapshot = :appPage.webSnapshot, "
+ " wap_snapshot = :appPage.wapSnapshot, "
+ " keyword = :appPage.keyword, "
+ " status = :appPage.status, "
+ " source = :appPage.source, "
+ " source_url = :appPage.sourceUrl, "
+ " add_time = :appPage.addTime "
+ " where id = :appPage.id ")
public int update(@SQLParam("appPage") AppPageEntity appPage);


/**
* 根据id查询游戏记录
* @param id
*/
@SQL("select id,page_name,company,introduction,web_logo_url,wap_logo_url,web_snapshot,wap_snapshot,keyword,display_order,status,source,source_url,add_time "
+ "from app_page where id = :id")
public AppPageEntity select(@SQLParam("id") int id);


entity
--AppPageEntity 数据库表单实体的属性及set、get方法
service
--IAppPageService 定义内部接口
/**
* 前台根据id获取前台游戏信息
* @param id
* @return
*/
public AppPage getAppPageById(int id);

--impl
--AppPageServiceImpl 内部接口的实现,程序的主要业务逻辑在此实现并将结果加入缓存
	@Override
public AppPage getAppPageById(int id) {
XCache<AppPage> cache = XCache.getCache(CACHE_TYPE_APPPAGE,
AppPage.class);
String key = String.valueOf(id);
AppPage appPageResult = cache.get(key);
if (appPageResult == null) {
AppPageEntity appPage = appPageDAO.select(id);
if (appPage != null) {
AppCategoryRelationEntity appCategoryRelation = appCategoryRelationDAO
.selectCategoryRelationByPageId(id);
List<AppPageSupport> appList = appPageSupportDAO
.selectAppListByPageId(id);

appPageResult = buildAppPage(appCategoryRelation, appList,
appPage);
cache.set(key, appPageResult, cacheTime);
}
} else {
if (logger.isDebugEnabled()) {
logger.debug("getAppPageById from cache:" + id);
}
}
return appPageResult;
}

4、api层和server层的url关系映射
一个url请求过来,通过请求api的接口,通过xoa规则映射到具体的controller里的方法,在方法中调用service层的内部接口,完成一次调用过程

api层GameCenterService
@XoaService(serviceId = "fuxi.xoa.renren.com") 唯一标识的serviceId

final static String _PREFIX_PAGE_TOPAPPPAGE_LIST = "/gamecenter/page/toppagelist";
/**
* 获取推荐page的列表
* @param pageNum
* @param pageSize
* @return
*/
@XoaGet(_PREFIX_PAGE_TOPAPPPAGE_LIST)
public List<AppPage> getAppPageListByStatus(@XoaParam("pageNum") int pageNum,
@XoaParam("pageSize") int pageSize);

以上代码标识 /gamecenter/page/toppagelist这里url请求 会走getAppPageListByStatus 这个get方法

5、server层的GameCenterController中完成对内部接口的调用

@Path("/gamecenter") 表示接受路径为"/gamecenter"的api请求

private final static String _PREFIX_PAGE_TOPAPPPAGE_LIST = "/page/toppagelist";
@Get(_PREFIX_PAGE_TOPAPPPAGE_LIST)
public List<AppPage> getAppPageListByStatus(@XoaParam("pageNum") int pageNum,
@XoaParam("pageSize") int pageSize) {

return appPageService.getAppPageListByStatus(pageNum, pageSize);
}


通过@Path和@Get等和api层的@XoaGet构成一个完整的映射关系,
在Controller中调用内部接口appPageService中的具体方法,完成一个具体调用过程。

在这里api相当位于客户端,controller相当位于服务端

编程接口中,XOA服务的开发者也应该同时提供一个API包,其中是XOA接口的定义文件,即Java接口类,接口中定义的XOA服务的serviceId、URI、入口参数以及返回值等信息,这非常类似Jade的DAO接口,不需要实现,放在容器中运行的时候,容器会将其用动态代理封装,自动提供那些可复用的调用逻辑。

* example: UserController下有一个方法xyz<br>
* 1、在没有配置任何注解的情况下,xyz方法代表的资源是/user/xyz,支持GET和POST两种访问<br>
* 2、如果对xyz标注了@Get()注解,xyz代表的资源是/user,并且仅支持GET访问<br>
* 3、如果对xyz标注了@Get("abc"),xyz代表的是资源/user/abc,并且仅支持GET访问<br>

* example: UserController下有一个方法xyz<br>
* 1、在没有配置任何注解的情况下,xyz方法代表的资源是/user/xyz,支持GET和POST两种访问<br>
* 2、如果对xyz标注了@Put()注解,xyz代表的资源是/user,并且仅支持PUT访问<br>
* 3、如果对xyz标注了@Put("abc"),xyz代表的是资源/user/abc,并且仅支持PUT访问<br>

时间的处理
if (userAccessFlow.getAddTime() != null) {
userAccessFlowResult.setAddTime(userAccessFlow.getAddTime().getTime());
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值