09 插件开发快速入门
V5标准架构模型
V5平台基于三层模型开发,下面是相关架构图,建议认真阅读业务流向!
入门:字符集
为了实现国际化编程,全局要求使用UTF-8的字符集编码,包括:
- 数据库:参考安装维护手册配置字符集
- 文件:java、properties、jsp、js、css、html等等使用UTF-8
- servlet:response.setContentType(“text/html; charset=UTF-8”);
- HTML:
- 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
![]() |
|
---|---|
入门:功能开发步骤
一个模块的开发步骤
- 定义插件
- 创建spring beans文件
- 创建对应的hbm文件
- 编写XXXController、XXXManager、XXXDao XXXVO、XXXPO
- 编写前端页面
入门:插件注册
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
<?xml version="1.0" encoding="UTF-8"?>
<plugin>
<!-- id最重要:保证全系统唯一 -->
<id>demo</id>
<!-- name仅仅是在ctp.log日志中输出 -->
<name>开发实例</name>
<!-- category暂无作用,避开标准产品的category即可 -->
<category>50505</category>
</plugin>
其它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
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans default-autowire="byName">
<!-- 注意是name不是id -->
<bean name="/demo.do" class="com.seeyon.apps.demo.controller.DemoController"></bean>
</beans>
下一步是编写跳转页面,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"%>
<!DOCTYPE html>
<html class="over_hidden h100b">
<head>
<%@include file="/WEB-INF/jsp/common/common_header.jsp"%>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="renderer" content="webkit">
<title>${ctp:i18n("文件标题") }</title>
<link rel="stylesheet" href="${path}/apps_res/{module}/css/xxx.css${ctp:resSuffix()}">
</head>
<body class="over_hidden h100b">
这里是index.jsp页面
</body>
<%@include file="/WEB-INF/jsp/common/common_footer.jsp"%>
<script type="text/javascript" src="${path }/apps_res/{module}/js/xxx.js${ctp:resSuffix()}"></script>
</html>
更详细的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<String,Object> params) throws BusinessException;
}
然后编写实现类:
public class DemoManagerImpl implements DemoManager {
@Override
public void saveDemo(Map<String, Object> params) throws BusinessException {
//代码实现块
}
}
新建的Manager需要在Spring中注册,平台建议使用XML的形式注册:/src/main/webapp/WEB-INF/cfgHome/plugin/demo/spring/srping-demo-manager.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans default-autowire="byName">
<bean id="demoManager" class="com.seeyon.apps.demo.manager.DemoManagerImpl"></bean>
</beans>
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
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans default-autowire="byName">
<bean id="demoDao" class="com.seeyon.apps.demo.dao.DemoDaoImpl"></bean>
</beans>
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"%>
<!DOCTYPE html>
<html class="over_hidden h100b">
<head>
<%@include file="/WEB-INF/jsp/common/common_header.jsp"%>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="renderer" content="webkit">
<title>${ctp:i18n("文件标题") }</title>
<link rel="stylesheet" href="${path}/apps_res/{module}/css/xxx.css${ctp:resSuffix()}">
</head>
<body class="over_hidden h100b">
这里是index.jsp页面
</body>
<%@include file="/WEB-INF/jsp/common/common_footer.jsp"%>
<script type="text/javascript" src="${path }/apps_res/{module}/js/xxx.js${ctp:resSuffix()}"></script>
</html>
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 --%>
<style>
.stadic_head_height {
height: 40px;
}
.stadic_body_top_bottom {
bottom: 0px;
top: 40px;
}
</style>
</head>
<body class="over_hidden h100b">
<div class="stadic_layout">
<div class="stadic_layout_head stadic_head_height">
<div id="toolbar"></div>
</div>
<div class="stadic_layout_body stadic_body_top_bottom"
id="layout_bottom">
<table id="mytable" style="display: none"></table>
</div>
</div>
</body>
第二步:通过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事件,在初次进入页面时执行渲染即可实现按钮的显示:
<script type="text/javascript">
$().ready(function() {
DemoIndex.initToolbar();
});
</script>
第三步:同理,通过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() {}
<script type="text/javascript">
$().ready(function() {
DemoIndex.initToolbar();
DemoIndex.initGrid();
});
</script>
基于以上方式,一个简单的前后端页面即开发完成。
完整示例源码
我将这个简单的示例源码致远OA的DEMO项目-Java文档类资源-CSDN文库
09 插件开发快速入门相关推荐
- AngularJS快速入门指南09:SQL
我们可以将之前章节中的代码用来从数据库中读取数据. 通过PHP Server从MySQL数据库中获取数据 <div ng-app="myApp" ng-controller= ...
- 大数据快速入门(09):永久弄清楚 Hive 分区表和分桶表的区别
蛋蛋 和 小智 今天又在"打情骂俏",他们今天在谈论分区表和分桶表,走,我们去听听. 这天,蛋蛋去茶水间倒水,他把水杯放在饮水机下面,打开开关,一直盯着墙上的画在看,灵魂仿佛已经飞 ...
- Spring Boot 2 快速教程:WebFlux 快速入门(二)
2019独角兽企业重金招聘Python工程师标准>>> 摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘 ...
- Elastricsearch 索引操作详解(快速入门、索引管理、映射详解、索引别名)
一.快速入门 1. 查看集群的健康状况 http://localhost:9200/_cat http://localhost:9200/_cat/health?v 说明:v是用来要求在结果中返回表头 ...
- Quartz 框架快速入门(二)
尽可能的用声明式处理软件配置,其次才考虑编程式的方式.在上一篇<Quartz 框架快速入门(一)>中,如果我们要在 Job 启动之后改变它的执行时间和频度,必须去修改源代码重新编译.这种方 ...
- 深入浅出Istio:Service mesh快速入门与实践-读书笔记(By GisonWin)
01 服务网格历史 (以后补充) 02 服务网格的基本特性 连接 微服务错综复杂,要完成其业务目标,连接问题是首要问题.连接存在于所有服务的整个lifcecycle中,用于维持服务的运行. 安全 保障 ...
- python入门教程软件-程序员带你十天快速入门Python,玩转电脑软件开发(四)
本系列文章立志于从一个已经习得一门编程语言的基础之上,全面介绍Python的相关开发过程和相关经验总结.本篇文章主要是基于上一篇的程序员带你十天快速入门Python,玩转电脑软件开发(三)的基础之上, ...
- MySQL 快速入门教程
转:MySQL快速 入门教程 目录 一.MySQL的相关概念介绍 二.Windows下MySQL的配置 配置步骤 MySQL服务的启动.停止与卸载 三.MySQL脚本的基本组成 四.MySQL中的数据 ...
- ADO.NET Entity Framework Beta2(五)/快速入门(实体框架)
This quickstart illustrates a series of tasks that support the topics in Getting Started with the En ...
最新文章
- 深度学习编译器综述The Deep Learning Compiler
- JAVA中栈和堆总结
- Oracle表数据恢复
- golang正则表达式
- n-sphere计算方法-
- opcuaclient 文档_连接协议-OPC UA Client
- 细胞培养中出现黑胶虫污染处理方法
- 张老师讲Python~
- 2020年秋计算机科学导论,南开大学《主干课1-计算机科学导论》2020秋主干课考试...
- barrel-distortion
- python连接数据库oracle_python连接oracle数据库
- 数位板驱动压力测试_【又来甩锅了】数位板/数位屏延迟怎么办?
- CentOS/Ubuntu 下 FTP 服务器(vsftpd)的安装
- 翻译:图解HTTPS工作原理、秘钥、握手、HTTPS,SSL,TLS的区别、证书
- 网络拓扑图(附华为、CiscoVisio图标)
- IDE、SATA、SCSI、SAS、FC、SSD硬盘类型介绍
- 用diskpart恢复U盘
- matlab出现问题:TRANSPOSE 不支持 N 维数组。请使用 PAGETRANSPOSE/PAGECTRANSPOSE 转置页,或使用 PERMUTE 重新排列 N 维数组的维度。
- Quadratic Assignment Problem 二次分配问题 QAP
- matlab R2013a 生成exe 脱离matlab开发环境运行
热门文章
- 使用4G模块实现IOT_Python库中,如何使用jieba模块来实现古典名著《西游记》的分词...
- JS 小坑 - AJAX请求的小坑,请求接口404
- (Fabric学习坑)com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;CLjava/lang/Object;
- 三国志战略版:萌新手册系列_总结
- Zabbix监控学习系列(2):agent的安装与Server端添加客户端
- [日推荐]『口红IN』女票生气了怎么哄?这里有妙招!
- 关于Certificate、Provisioning Profile、App ID的介绍及其之间的关系
- 从安装包中提取wear OS手表端应用
- 解决: Attribute meta-data#package_name@value at AndroidManifest.xml:23:13-44 requires a placeholder 错误
- jQuery带缩略图轮播效果图片切换带缩略图