架构思路”:

所有外部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. java中的byte

    8 bit (位) = 1 Byte (字节) java中的byte就是Byte 1024 Byte = 1KB 1024 KB = 1MB 1:“字节”是byte,“位”是bit : 2: 1 by ...

  2. <基础> PHP 进阶之 类(Class)

    属性 类的变量成员叫做“属性”,或者叫“字段”.“特征”,在本文档统一称为“属性”.属性声明是由关键字 public,protected 或者 private 开头,然后跟一个普通的变量声明来组成.属 ...

  3. word中怎样设置页码包含总页数

    一个同事做毕业论文,论文是Word格式,1-2页是封面和目录,不需要页码,第3-10页是论文内容,需要从第1页开始显示,并显示论文内容的总页数8 页.具体为页脚处显示“第*页共*页”.他让我帮忙设置一 ...

  4. git安装与基本命令

    一.前言 GibHub的名字源于Git,Git是一个分布式版本控制系统,让程序员团队能够协作开发项目,Git帮助大家管理为项目所做的工作,避免一个人所做的修改影响其他人所做的修改.你在项目中实现一个新 ...

  5. 利用docker-machine安装swarm

    转自:https://www.cnblogs.com/jsonhc/p/7832642.html 安装之前的环境: 两个节点,节点1:192.168.101.14,用来创建manager1 machi ...

  6. C++复习:C++的类型转换

    C++的类型转换 1 类型转换名称和语法 C风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是: TYPE b = (TYPE)a C++风格的类型转换提供了4种类型转换操作符来 ...

  7. 用waitpid函数回收进程

    waitpid函数:作用同wait,但可指定pid进程清理,可以不阻塞. 原型:pid_t waitpid(pid_t pid, int *status, in options); 返回值:成功时返回 ...

  8. 高质量C++/C编程指南

    http://man.chinaunix.net/develop/c&c++/c/c.htm#_Toc520634042 高质量C++/C编程指南 文件状态 [  ] 草稿文件 [√] 正式文 ...

  9. 在系统中使用Bean Validation验证参数

    转自:http://www.importnew.com/18561.html 为什么要使用Bean Validation?  当我们实现某个接口时,都需要对入参数进行校验.例如下面的代码 1 2 3 ...

  10. dependencies与dependencyManagement的区别

    1.DepencyManagement应用场景 当我们的项目模块很多的时候,我们使用Maven管理项目非常方便,帮助我们管理构建.文档.报告.依赖.scms.发布.分发的方法.可以方便的编译代码.进行 ...