架构思路”:

所有外部URL访问请求(对外提供的接口)全部交给intServiceServlet处理, 然后servlet调用BPO通过URL中的命名去寻找相应的javaBean.接口BO,然后接口BO处理对应的请求。

BPO如何找相应的BO,通过URL的命名规则,URL的最后一段作为接口名称 eg:/gjj/api/v1.0/xxxxxx/selPerLoanDetailById

接口代码流程:

IntServiceServlet
doPost() ----->>通过request请求获得参数和URL 然后根据URL找到相对应的BEAN
intServiceBPO.startHandle() 根据BEANID找到对应的BO类,然后所有BO类都继承了父类的HANDLE方法,调用该方法
intServiceBaseBO.handle(intRequestParamVO)

所有/gjj/api/v1.0/xxxxxx/beanID 所有这类请求都被过滤到IntServiceServlet.doPost(),然后在该IntServiceServlet处理REQUEST获取参数和URL,
然后调用intServiceBPO方法,然后BPP方法通过URL中最后的字符串(javaBeanName)去找到相应的BO对象(用户实现的接口)
BPO在调用BO对象(BO对象即实现的相应接口类)。

-------------------------------------------------------------------------
web.xml中配置的servlet
<!-- 综合服务平台接口 -->
<servlet>
<servlet-name>IntServiceServlet</servlet-name>
<servlet-class>
g3.gjj.ifs.servlet.IntServiceServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>IntServiceServlet</servlet-name>
<url-pattern>/api/v1.0/*</url-pattern>
</servlet-mapping>

------------------------------------------------------------------------------------
intServiceServlet
private IntServiceIBPO intServiceBPO;

public void init() throws ServletException {
super.init();
ServletContext servletContext = this.getServletContext();
WebApplicationContext ctx = WebApplicationContextUtils
.getWebApplicationContext(servletContext);
intServiceBPO = (IntServiceIBPO) ctx.getBean("isp.IntServiceIBPO");
}

/**
* 处理post请求
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
result = intServiceBPO.startHandle(intRequestParamVO);
}
-----------------------------------------------------------------------------------------------
intServiceBPO

if (flag == true) {
IntServiceBaseBO intServiceBaseBO = getIntServiceBaseBOByName(name);
if (intServiceBaseBO != null) {
// 事务处理
return intServiceBaseBO.handle(intRequestParamVO);

/**
* 根据请求类型获取IntServiceBaseBO
*
* @param name bean名称
* @return
*/
private IntServiceBaseBO getIntServiceBaseBOByName(String name) {
return (IntServiceBaseBO) ApplicationContextHelper.getBean(name);
}

package g3.gjj.ifs.helper;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

/**
* spring 工具栏
*
* @author renj
*
*/
public class ApplicationContextHelper implements ApplicationContextAware {
private static ApplicationContext appCtx;

/**
* 此方法可以把ApplicationContext对象inject到当前类中作为一个静态成员变量。
*
* @param applicationContext
* ApplicationContext 对象.
* @throws BeansException
* @author wangdf
*/
@Override
public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
appCtx = applicationContext;
}

/**
* 获取ApplicationContext
*
* @return
* @author wangdf
*/
public static ApplicationContext getApplicationContext() {
return appCtx;
}

/**
* 这是一个便利的方法,帮助我们快速得到一个BEAN
*
* @param beanName
* bean的名字
* @return 返回一个bean对象
* @author wangdf
*/
public static Object getBean(String beanName) {
return appCtx.getBean(beanName);
}
}

-----------------------------------------------------------------------------------------------
IntServiceBaseBO

//BO接口抽象父类
//其他子类继承父类后需要实现实现相应方法
//这样BPO通过JAVABEANNAME找到对应接口BO时,通过BO.handle()方法
public abstract class IntServiceBaseBO {

private static Map<String, IntLoginToken> tokenMap = new HashMap<String, IntLoginToken>();

/**
* 将请求参数转换为对应的请求参数VO
*
* @param para
* @return
*/
public abstract IntRequestParamVO transferRequestParam(String para);

/** 处理请求参数,并执行相关查询 */
public String handle(IntRequestParamVO intRequestParamVO) {
/** 1.校验请求参数 */
String result = checkRequestParam(intRequestParamVO);
if (StringUtils.isBlank(result)) {
/** 校验通过,执行具体操作 */
return operate(intRequestParamVO);
}
/** 校验未通过,返回结果 */
return result;
}

/**
* 校验必填参数
*
* @param intRequestParamVO 通用请求参数
* @return 返回空,表示校验通过;否则返回Json串
*/
public abstract String checkRequestParam(IntRequestParamVO intRequestParamVO);

/**
* 执行具体操作
*
* @param intRequestParamVO 通用请求参数
* @return Json串
*/
public abstract String operate(IntRequestParamVO intRequestParamVO);

----------------------------------------------------------------------------

//该接口继承父接口 这样BPO找到BO之后调用父对象的handle()方法,然后handle()方法调用子对象实现的相应方法
I9005打印一次性接口
/**
* I9005 一次性贷款结清打印 BO
*
*
*
*/
@SuppressWarnings("deprecation")
public class I9005BO extends IntServiceBaseBO {

@Override
public IntRequestParamVO transferRequestParam(String para) {
return JsonUtil.getObjectFromJsonString(para, I9005RequestParamVO.class);
}

@Override
public String checkRequestParam(IntRequestParamVO intRequestParamVO) {
// 设置默认返回结果
I9005ResponseResultVO vo = new I9005ResponseResultVO();
在项目启动时,servlet中注册了intServiceBPO.
。。。
------------------------------------------------------------------------------------------------------
即servlet中调用BPO,BPO中调用BO。

定义一个servlet用于处理所有外部接口类 架构思路的更多相关文章

  1. 简单练习题2编写Java应用程序。首先定义一个描述银行账户的Account类,包括成员变 量“账号”和“存款余额”,成员方法有“存款”、“取款”和“余额查询”。其次, 编写一个主类,在主类中测试Account类的功能

    编写Java应用程序.首先定义一个描述银行账户的Account类,包括成员变 量“账号”和“存款余额”,成员方法有“存款”.“取款”和“余额查询”.其次, 编写一个主类,在主类中测试Account类的 ...

  2. 用CIL写程序:定义一个叫“慕容小匹夫”的类

    前文回顾: <用CIL写程序:你好,沃尔德> <用CIL写程序:写个函数做加法> 前言: 今天是乙未羊年的第一天,小匹夫先在这里给各位看官拜个年了.不知道各位看官是否和匹夫一样 ...

  3. 3.编写Java应用程序。首先定义一个描述银行账户的Account类,包括成员变 量“账号”和“存款余额”,成员方法有“存款”、“取款”和“余额查询”。其次, 编写一个主类,在主类中测试Account类的功能。

    Account package com.hanqi.test; public class Account { private String zhanghao;private double yve; A ...

  4. 编写Java应用程序。首先定义一个描述银行账户的Account类,包括成员变 量“账号”和“存款余额”,成员方法有“存款”、“取款”和“余额查询”。其次, 编写一个主类,在主类中测试Account类的功能

    package com.hanqi.test; //银行账号 public class account { private String zhanghao;//账号 //私有余额 private do ...

  5. 首先定义一个描述银行账户的Account类,包括成员变 量“账号”和“存款余额”,成员方法有“存款”、“取款”和“余额查询”。其次, 编写一个主类,在主类中测试Account类的功能。(已完善)

    package java1; public class Account { String zhanghao; double yue=0; double add; double get; Account ...

  6. (二)第一个Servlet

    一.预备知识 一.Servlet简介 Servlet是sun公司提供的一门用于开发动态web资源的技术. Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个 ...

  7. 编写Java程序,定义一个类似于ArrayList集合类

    返回本章节 返回作业目录 需求说明: 设计一个类似于ArrayList的集合类ListArray. ListArray类模拟实现动态数组,在该类定义一个方法用于实现元素的添加功能,以及用于获取List ...

  8. 定义一个复数(z=x+iy)类Complex,包含: 两个属性:实部x和虚部y 默认构造函数 Complex(),设置x=0,y=0 构造函数:Complex(int i,int j) 显示复数的方法:showComp()将其显示为如: 5+8i或5-8i 的形式。 求两个复数的和的方法:(参数是两个复数类对象,返回值是复数类对象)public Complex addComp(Compl

    因标题框有限,题目未显示完整,以下再放一份: 定义一个复数(z=x+iy)类Complex,包含: 两个属性:实部x和虚部y 默认构造函数 Complex(),设置x=0,y=0 构造函数:Compl ...

  9. CREATE OPERATOR CLASS - 定义一个新的操作符类

    SYNOPSIS CREATE OPERATOR CLASS name [ DEFAULT ] FOR TYPE data_type USING index_method AS { OPERATOR ...

随机推荐

  1. 01.制作ico图标的工具

    制作ico图标的工具在线转换地址: http://lvwenhan.com/convertico/ http://lvwenhan.com/convertico/Converticon.swf

  2. Phabricator代码审核Audit用户指南

    作者: shaneZhang 分类: 互联网技术 发布时间: 2015-07-04 13:37 概览 Phabricator支持两种代码审查工作流:“review”(提交前审查)和 “audit”(提 ...

  3. How to start a VirtualBox VM headless in Windows 10

    If you wanted to start a VirtualBox VM headless (no UI) in the past, you needed additional tools.  I ...

  4. Centos6 下安装Nginx+Mysql+PHP

    安装nginx https://segmentfault.com/a/1190000007928556 添加源 $ wget http://nginx.org/packages/centos/6/no ...

  5. Choose unique values for the 'webAppRootKey' context-param in your web.xml files!

    在Tomcat的server.xml中配置两个context,出现其中一个不能正常启动,交换配置顺序,另一个又不能正常启动,即始终只有第二个配置能启动的情况.如果单独部署,都没有问题.报错大致内容如下 ...

  6. Rocket MQ 问题排查命令

    修改rocketmq官方代码测试: package com.alibaba.middleware.race.rocketmq; import java.util.Scanner; import com ...

  7. python语言中的函数装饰器

    装饰器 什么是装饰器? 装饰:给已有的对象(函数)添加新的功能 器:工具              在python中指具备某些功能的函数 装饰器:装饰器就是一个给其他函数增加功能的函数 一种设计原则: ...

  8. Linux 循环创建多个线程

    这里说一下相关的基础知识: 线程概念 什么是线程 LWP:light weight process 轻量级的进程,本质仍是进程(在Linux环境下)     进程:独立地址空间,拥有PCB     线 ...

  9. OPENWRT路由3G拔号实验

    以下摘自:http://www.right.com.cn/forum/thread-155168-1-1.html 首先下载 Barrier Breaker 14.07 固件 配置好网络,可以访问到i ...

  10. 第五次Scrum冲刺

    第五次Scrum冲刺 1.成员今日完成情况 队员 今日完成任务 刘佳 前端初步构建 李佳 后端设计初级阶段 周世元 数据设计 杨小妮 博客编写 许燕婷 管理团队当日及次日任务 陈水莲 测试矩阵用例设计 ...