09 插件开发快速入门
创始人
2025-05-29 08:48:01

V5标准架构模型

V5平台基于三层模型开发,下面是相关架构图,建议认真阅读业务流向!

入门:字符集

为了实现国际化编程,全局要求使用UTF-8的字符集编码,包括:

  1. 数据库:参考安装维护手册配置字符集
  2. 文件:java、properties、jsp、js、css、html等等使用UTF-8
  3. servlet:response.setContentType(“text/html; charset=UTF-8”);
  4. HTML:
  5. JSP:<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

入门:代码结构

src
    com
        seeyon
            apps(ctp)                                        #1            
                sample
                    controller
                        SampleController.java                #2
                    manager
                        SampleManager.java                   #3
                        SampleManagerImpl.java               #4
                    dao
                        SampleDao.java                       #5
                        SampleDaoImpl.java                   #6
                    po
                        SamplePO.java                        #7
                        SamplePO.hbm.xml                     #8
WebContent
    WEB-INF
        cfgHome
            i18n
                SampleResource_en.properties                 #9
                SampleResource_zh_CN.properties
                SampleResource_zh_TW.properties
            spring
                spring-sample-controller.xml                 #10
                spring-sample-manager.xml                    #11
                spring-sample-dao.xml                        #12

bdc806688c6afe0b1bc55ceb249ec100.png

入门:功能开发步骤

一个模块的开发步骤

  1. 定义插件
  2. 创建spring beans文件
  3. 创建对应的hbm文件
  4. 编写XXXController、XXXManager、XXXDao XXXVO、XXXPO
  5. 编写前端页面

入门:插件注册

V5平台提供“插件式”开发模式:一个业务功能模块就是一个插件,该业务功能模块下的所有代码在各自插件下维护,Spring Bean也交由该插件管理,如果插件停用、删除则该业务功能完全下线。

在本地协同服务ApacheJetspeed\webapps\seeyon\WEB-INF\cfgHome\plugin目录下能看到很多子文件夹,每一个文件夹就是一个插件,比如协同collaboration、公文edoc、表单应用cap4。

如果开发新功能,则同样基于此规则,在ApacheJetspeed\webapps\seeyon\WEB-INF\cfgHome\plugin目录下新建新的插件文件夹,一个标准的目录结构如下所示:

插件定义:插件的信息定义在/src/main/webapp/WEB-INF/cfgHome/plugin/demo/pluginCfg.xml




demo

开发实例

50505

其它spring/spring-demo-*.xml初期可以保持为空,等后续创建对应Java类之后再使用。

i18n下面的文件是国际化文件,初期同样可以保持为空,等需要国际化开发再使用。

将以上plugin/demo文件夹拷贝到本地协同服务ApacheJetspeed\webapps\seeyon\WEB-INF\cfgHome\plugin之后,启动系统完成后,查看ApacheJetspeed\logs_sy\ctp.log日志能够看到如下信息:

[localhost-startStop-1]  INFO: PluginSystemInit: - Load Plugin : 50505, demo, 开发实例

入门:三层功能开发

Controller层

基于Spring MVC开发,后端提供Controller负责数据转发,定义Controller方法需要继承平台的BaseController

Controller的职责:只负责页面转发、参数传递、数据返回,不参与业务计算,所有业务计算和数据抽取均调用Manager层。

package com.seeyon.apps.demo.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import com.seeyon.ctp.common.controller.BaseController;

public class DemoController extends BaseController{
/**
  * index方法是:URL不传任何method,默认访问的方法
  */
@Override
public ModelAndView index(HttpServletRequest request, HttpServletResponse response) throws Exception {
 return new ModelAndView("apps/demo/index");
}

}

新建的Controller需要在Spring中注册,平台建议使用XML的形式注册:/src/main/webapp/WEB-INF/cfgHome/plugin/demo/spring/spring-demo-controller.xml






下一步是编写跳转页面,Controller中ModelAndView("apps/demo/index")意味着,页面需要放置在WEB-INF/jsp文件夹下面的:/WEB-INF/jsp/apps/demo/index.jsp

V5平台推荐的一个标准的JSP页面应该是如下的结构:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>



<%@include file="/WEB-INF/jsp/common/common_header.jsp"%>



${ctp:i18n("文件标题") }



 这里是index.jsp页面

<%@include file="/WEB-INF/jsp/common/common_footer.jsp"%>

更详细的JSP开发规范参考这个链接:JSP前端开发规范

如果以上开发编译完成,部署到V5平台下之后,可以通过如下链接访问到(method对应Controller下的方法名):

http://[host]:[port]/seeyon/demo.do?method=index
如果你是本地默认端口则可以访问:http://localhost/seeyon/demo.do

Manager层

Manager是业务层,负责代码逻辑运算、解析、转换、涉及业务逻辑实现全部在此层完成。

首先要定义Manager接口:

public interface DemoManager {
 public void saveDemo(Map params) throws BusinessException;
}

然后编写实现类:

public class DemoManagerImpl implements DemoManager {
 @Override
 public void saveDemo(Map params) throws BusinessException {
   //代码实现块
 }
}

新建的Manager需要在Spring中注册,平台建议使用XML的形式注册:/src/main/webapp/WEB-INF/cfgHome/plugin/demo/spring/srping-demo-manager.xml





Manager被Controller所调用,我们可以在Controller中通过Inject注解注入Manager,随后就可以调用业务层的方法了。

public class DemoController extends BaseController{
// 通过Inject注入Manager
@Inject
private DemoManager demoManager;

@Override
public ModelAndView index(HttpServletRequest request, HttpServletResponse response) throws Exception {
 // 调用Manager方法,伪代码
 demoManager.saveDemo(params);
 return new ModelAndView("apps/demo/index");
}
}

DAO层

DAO层用于数据访问,直接对数据库进行操作,SQL全部在DAO层维护。

首先要定义Dao接口

public interface DemoDao {
 public List find();
}

然后编写实现类:

public class DemoDaoImpl implements DemoDao {

public List find() {
  String sql = "select id from demo order by id";
 // CTP平台基于JDBC的工具类
 JDBCAgent jdbc = new JDBCAgent(false,false);
 try {
  // SQL查询方法
  return jdbc.findNamedSql(sql);
 } catch (BusinessException e) {
  return null;
 } finally {
  // 使用完毕后关闭连接,不关闭会造成连接池泄露
  jdbc.close();
 }
}
}

新建的Dao需要在Spring中注册,平台建议使用XML的形式注册:/src/main/webapp/WEB-INF/cfgHome/plugin/demo/spring/srping-demo-dao.xml





Dao被Manager所调用,我们可以在Manager中通过Inject注解注入Dao,随后就可以调用数据库底层数据了。

public class DemoManagerImpl implements DemoManager {
@Inject
private DemoDao demoDao;

public void findData() throws BusinessException {
  List result = demoDao.findDemoList();
}
}

以上是DAO的最基本用法。

V5平台基于数据库持久层引入了Hibernate框架,我们可以介入Hibernate相关API特性进行快速开发,同样也可以基于HQL进行数据库兼容编写。

V5平台不允许直接使用JDBC原生的Connection或Hibernate的Session对数据库进行操作,如果编写SQL则请使用JDBCAgent封装的API进行开发,如果编写Hibernate相关代码(HQL等)则请使用DBAgent封装的API进行开发。

更详细的DAO数据库开发知识参考:DAO数据库持久层开发

三层开发总结

综上:前端请求调用=>Controller=>Controller支持注入Manager,调用业务方法获取数据并返回=>Manager支持注入DAO,实现业务的组装=>Dao直连数据库进行CRUD操作。

Controller、Manager、Dao三层开发各司其职,只有做好正确的切分才能保障代码的健壮性。

以上仅仅是最传统的三层模型开发,而随着技术的演进,V5平台基于这三层还衍生出了多种架构模式,如Restful、Ajax、Api等,万变不离其宗,只要三层结构封装够健壮,都可以顺利桥接。

入门:前端JSP开发

V5平台是传统的单体应用开发,后端采用MVC框架,前端可以使用JSP或Html方案开发。

如果需要短平快的形式开发,可以采用JSP的开发模型,V5平台提供了完整的JSP开发配套前端组件,可以使用Seeyon UI+JQuery+AJAX进行页面操作,早期的应用均采用这种开发模式。详细JSP开发文档见:JSP前端开发规范

如果前端技能比较强,可以基于VUE+Html纯前后端分离的开发模式开发,V5部分应用正是采用这种开发模式。本章节不讲解Vue相关前后端分离开发方案,详细开发文档见:Vue开发

JSP基本规则

 V5平台推荐的一个标准的JSP页面应该是如下的结构:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>



<%@include file="/WEB-INF/jsp/common/common_header.jsp"%>



${ctp:i18n("文件标题") }



 这里是index.jsp页面

<%@include file="/WEB-INF/jsp/common/common_footer.jsp"%>

common_header.jsp是平台统一封装的各种CSS以及JSP常用的JSTL和自封Taglib。

common_footer.jsp是平台统一封装的各种Javascript、js变量。

如果当前页面有比较特殊的css样式控制,可以自己编写独立的css文件,通过link rel="stylesheet" href引入。

不推荐大篇幅的Javascript在JSP中直接编写,我们推荐编写独立的.js文件,通过script type="text/javascript" src引入。

不推荐在JSP中嵌入EL表达式,甚至JSTL表达式,我们推荐使用Javascript+AJAX的形式进行页面的布局、渲染(或者就把JSP当前一个Html来开发),这样在以后做前后端分离的时候将会极大节省工作量。

JSP开发演示

下面是一个增、删、查的常规页面,本章基于此页面做代码演示。

第一步:使用SeeyonUI的static layout进行上下布局,上部分是操作按钮,下部分是table表格:

<%-- CSS静态上下布局,更多布局参考http://open.seeyon.com/seeyonui/V2.0/components/index.html#___stadic-layout --%>




 

  

 

 
  id="layout_bottom">
  

 


第二步:通过Javascript调用SeeyonUI API将上部分“添加”和“删除”按钮渲染出来:

var DemoIndex = {};

/**
 * toolbar学习资料:http://open.seeyon.com/seeyonui/V2.0/components/index.html#___toolbar
 */
DemoIndex.initToolbar = function() {
var tt = $("#toolbar").toolbar({
    toolbar : [{
       id : "add",
       name : $.i18n('common.button.add.label'),
       className : "ico16 add_16",
       click : DemoIndex.openDemoDialog
      }, {
       id : "delete",
       name : $.i18n('common.button.delete.label'),
       className : "ico16 del_16",
       click : DemoIndex.deleteDemo
      }]
   });
}

以上只是定义了初始化操作按钮的方法initToolbar,接着我们通过JQuery的ready事件,在初次进入页面时执行渲染即可实现按钮的显示:

第三步:同理,通过Javascript调用SeeyonUI API将下部分列表渲染出来,由于SeeyonUI ajaxGrid涉及数据获取,还需要编写后端代码,本章就不做全部代码,只做伪代码演示:

var DemoIndex = {};

// 工具按钮参考文档:http://open.seeyon.com/seeyonui/V2.0/components/index.html#___toolbar
DemoIndex.initToolbar = function() {}

// 列表渲染参考文档:http://open.seeyon.com/seeyonui/V2.0/components/index.html#___grid
DemoIndex.initGrid = function() {}

基于以上方式,一个简单的前后端页面即开发完成。

完整示例源码

我将这个简单的示例源码致远OA的DEMO项目-Java文档类资源-CSDN文库

相关内容

热门资讯

鸟哥的Linux私房菜 She... 第十二章、学习 Shell Scripts https://linux.vbird.org/linu...
2分钟快速了解!全网最详细的性...  目录:导读 Redis 简介 Redis 优势 Redis与其他key-value存...
设计模式-02 4,创建型模式 4.2 工厂模式 4.2.1 概述 需求:设计一个咖啡店...
纠错码中的汉明码,NAND F...      纠错码是一种用在不可靠的或者噪音比较大的通信信道中用来控制数据传输错误的技术。这种技术的核...
【Java】P14 面向对象(... 类的封装性封装性高内聚与低耦合何为封装性如何封装get 与 set 方法案例 封装性 高内聚与低耦...
【FPGA】Xilinx Co... 功能描述 1、Rotate Rotate 实现的功能是坐标的旋转。 输入 X, Y, Phase 输...
【Pytorch】使用Pyto... 文章目录1. 题目描述2. 代码实现验证写在最后 1. 题目描述 在这个例子中网络结构如下所示&#...
client-go disco... 1. 概述 discovery包主要用来发现服务器支持的API组、版本和资源的方法,及...
[LeetCode周赛复盘] ... [LeetCode周赛复盘] 第 100 场双周赛20230318 一、本周周赛总结二、 [Easy...
Matlab基础教学入门 Matlab是一种非常强大的数学计算工具,广泛应用于科学和工程领域。本篇文章将介绍一些...
设计模式-02 4,创建型模式 4.2 工厂模式 4.2.1 概述 需求:设计一个咖啡店...
条款21:优先考虑使用std:... 让我们先对std::make_unique和std::make_shared做个铺垫。std::ma...
Leetcode 第四天 动态... 来源:力扣(LeetCode) 链接:htt...
MongoDB用户管理授权 文章目录1 角色类型2 注意事项3 给单个数据库授权4 给一个用户授权多个数据库5 其它命令 1 角...
下载、安装JDK、sublim... 直接官网下载,jdk8或者jdk11。配置环境变量:如果不配置环境变量&...
算法的时间复杂度介绍 本文主要算法时间复杂度的相关知识。1 概述算法(Algorithm)是指...
编码方式概括 1.三种码表1.iso8859-1码表:是一种8位的单字节编码方式。它可以表示256个...
YOLOv5源码逐行超详细注释... 前言  本篇文章主要是对YOLOv5项目的验证部分。这个文件之前是叫test.py,后...
centos docker 安... 1、首先安装docker 下面是一键安装脚本 curl -fsSL https://get.dock...
线上操作规范 1.目的    1)为了避免测试线上随意操作给客户造成损失   2)为了...
查找算法之费氏搜寻法 给定一个大小为n的排序数组arr[],并在其中搜索一个元素x。如果x在数组中ÿ...
cv2报错:Unsupport... cv2 报错 error: OpenCV(4.6.0) /io/opencv/modules/img...
DVWA_xss 反射型xsslow直接在输入框输入提前准备的代码,就可以得到回显cookie信息 Me...
音视频开发编程技术(二):音频... 1. 音频简介   上一节讲过,视频的帧率即每秒钟采集多少张图片的概念。同理ÿ...
【Java学习笔记】33.Ja... 前言 本章介绍Java的HashSet及HashMap。 Java HashSet HashSet ...
RabbitMQ基础介绍及同步... 一、同步通讯与异步通讯 大多数情况下会使用同步,对并发没有很高的要求,但...
面试官:整理了一些react的... 请解释一下React生命周期。它们各自的作用是什么? React生命周期是指组件从创建...
【C++进阶】AVL树的实现 文章目录AVL树概念AVL树性质AVL树节点的结构AVL树的插入插入新节点更新整体节点的平衡因子旋转...
缺失的第一个正整数:给定一个未... 给定一个未排序的整数数组,找出其中未出现的最小正整数。 (本文获得CSDN质量评分...
[架构之路-141]-《软考-... 前言:如何“从无到有”设计一个企业信息系统?本文将探索这个话题。第1章 ...