架构思路”:

所有外部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. leetcode435

    使用贪心思想,先按照end排序,然后依次寻找下一个(结束时前最早的)不重叠的区域,这样就得到了数量最多的构成不重叠的区域的数量,再用总数量减去最大不重叠区域的数量,就得到了最少的会引起重叠的区域的数量 ...

  2. 机器学习进阶-案例实战-答题卡识别判 1.cv2.getPerspectiveTransform(获得投射变化后的H矩阵) 2.cv2.warpPerspective(H获得变化后的图像) 3.cv2.approxPolyDP(近似轮廓) 4.cv2.threshold(二值变化) 7.cv2.countNonezeros(非零像素点个数)6.cv2.bitwise_and(与判断)

    1.H = cv2.getPerspectiveTransform(rect, transform_axes) 获得投射变化后的H矩阵 参数说明:rect表示原始的位置左上,右上,右下,左下, tra ...

  3. keyword模块

    导入关键字模块 import keyword 列出当前系统中Python的关键字 >>> keyword.kwlist ['and', 'as', 'assert', 'break' ...

  4. Yum安装MySQL以及相关目录路径和修改目录

    有些时候,为了方便,有些同学喜欢通过yum的方式安装MySQL,没有设置统一的文件目录以及软件目录,那么就会为后续的维护工作带来很大的麻烦! 下面就简单介绍一下yum安装MySQL的步骤以及这类安装下 ...

  5. java 浅克隆(浅复制)和深克隆(深复制)

    http://www.voidcn.com/blog/u011380813/article/p-6161450.html https://gold.xitu.io/entry/570d89651ea4 ...

  6. jq动画分析

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. Linux命令:索引

    目录 A B C D E F G H I  jobs J K L M N   nohup O P Q R S T  trU V W X Y Z A alias B C cd D dirs E F G ...

  8. where后一个条件和多个条件的查询速度

    如果记录中有两个都是 唯一标识的  ,那是都where  and 还是只写一个比较快 ---- 一个快

  9. Ajax接收后台发送过来的布尔值以及指定的字符串

    后台: aContext.getResponse().getWriter().println("" + result); 前端: $.ajax({ url:encodeURI(en ...

  10. 18.1利用socket .io 实现 editor间代码的同步

    首先,我们想实现在同一个页面editor 大家同时编辑 同步 所以能 我们需要这个url 作为我们 session id 或者叫聊天室的roomid 或者 反正就是保证他们在同一个list里面 就是 ...