Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
部门后台框架
Search
cssrain
September 02, 2014
Technology
190
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
部门后台框架
部门后台框架
cssrain
September 02, 2014
More Decks by cssrain
See All by cssrain
UED工作流程分享和交流
cssrain
1
480
解读HTML
cssrain
0
160
解读HTML5
cssrain
2
180
基础CSS(1)
cssrain
0
170
基础CSS(2)
cssrain
0
120
高效的CSS
cssrain
0
170
高级CSS—继承
cssrain
0
140
PhoneGap分享和交流
cssrain
0
120
PhoneGap实践
cssrain
0
91
Other Decks in Technology
See All in Technology
AWS Security Hub CSPMの成功・失敗体験
cmusudakeisuke
0
550
徹底討論!ECS vs EKS!
daitak
3
1.7k
事業会社における 機械学習・推薦システム技術の活用事例と必要な能力 / ml-recsys-in-layerx-wantedly-2026
yuya4
0
160
時期が悪い!それでもRaspberry Piを買って遊んで活用するには / 20260627-osc26do-rpi-jikigawarui
akkiesoft
0
820
GitHub Copilot app最速の発信の裏側
tomokusaba
1
260
FPGAの開発コンペでZephyrを使ってみた
iotengineer22
0
200
AIAU_UMEMOGU_ninomiya_slide
ninomiya_ii
0
260
アラート調査向けAIエージェントの本番導入とその後/AI Agents for Alert Investigation: Production Deployment and After
taddy_919
0
140
「軸足」は 固定しなくていい - 熱量と強みで描く、しなやかなキャリアの形
kakehashi
PRO
1
270
ぼっちではじめた登壇が「51名」「241件」の発信に化けた
subroh0508
1
310
From Prompt Engineering to Loop Engineering
shibuiwilliam
1
220
AI 不只幫你寫 Code: 當專案從 300 暴增到 1500, 我們如何撐住 DevOps
appleboy
0
230
Featured
See All Featured
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.9k
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
400
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
55
3.4k
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
750
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Information Architects: The Missing Link in Design Systems
soysaucechin
0
980
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
200
A better future with KSS
kneath
240
18k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
250
1.3M
Rails Girls Zürich Keynote
gr2m
96
14k
Discover your Explorer Soul
emna__ayadi
2
1.1k
The World Runs on Bad Software
bkeepers
PRO
72
12k
Transcript
项目开发框架分享 --框架一小步,开发一大步 UED分享 · 交流 http://cssrain.github.io
项目框架结构 Broswer、Phone、Pad等终端 系统表结构 客户端 项 目 前 台 模 版
项 目 后 台 模 版 数据库 Request Web Services JSON JSON JDBC 请求参数验证(XML) 代 码 插 件 Action控制类 IControlService 统一调用接口 Action控制类 IControlService 统一调用接口 IControlService Service服务类 Dao操作类 Java Bean InputObject OutputObject 统一调用接口 JSON JSON
Html Filter Interceper Action IControlService Service Dao || tp Converter
IControlService (1) 页面请求 (3) (2) (4) (5) (6) (10) (9) (8) (7) WebService调用 WebService调用 (1) 验证参数个数、顺序、正则表达式 (2) 根据control.xml封装InputObject对象, 存 储在ActionContext中 (3) 获取InputObject对象 (4) 将InputObject对象转成Json (5)将Json转换成InputObject (6)数据处理 (7)封装OutputObject对象 (8)将OutputObject对象转成Json (9) 将Json转换成OutputObject对象 (10) 封装Json 项目框架流程 返回数据,处理完成
<control> <action path="" service="" method=""> <input uid="1" service="" method=""> <parameter
key="" order="" regex="" scope="" toKey=""/> <parameter key="" order="" regex="" scope="" toKey=""/> ……… </input> <output uid="1" convertor="" method=""/> ……… </action> …….. </control> control.xml文件配置
<control>标签 整个应用的控制请求,control.xml的根标签。 control.xml详解 <action>标签 <!ELEMENT control (action+)> 请求动作标签,代表一个请求动作,各请求根据path属性进行区别。
<path>属性: Request请求路径; #REQUIRED <service>属性:Request请求调用后台的WebService服务类,值为后台工程中 spring-services.xml中Service对应的id值; #IMPLIED <method>属性:服务类中的方法; #IMPLIED <input>标签 <!ELEMENT action (input,output?)*> 请求参数标签,<action>中可包含多个<input>标签,各标签通过uid区别。 <uid>属性: 请求的唯一编号; #IMPLIED <service>属性:若填写,则重写父类action属性的service; #IMPLIED <method>属性:若填写,则重写父类action属性的method; #IMPLIED
<parameter>标签 <!ELEMENT input (parameter*)> Request的参数映射标签,参数列表 <key>属性: Request中对应的key; #REQUIRED <toKey>属性:InputObject对象中params属性中的key值;
#IMPLIED <order>属性:参数的顺序,按照验证需求添加; #IMPLIED <regex>属性:正则表达式验证,按照验证需求添加; #IMPLIED <scope>属性: key属性对应值的取值范围; (request|session|constants|properties) #IMPLIED control.xml详解 注意: 1、若scope不配置,则默认为“request”,从前台请求中获取数据; 2、若scope为“session” ,则根据key到session中获取对应值,并以toKey属性的值作为 params的键值存储,key的配置规则为: session中key值[.属性][.属性]; 3、若scope为“constants”,则从com.ai.***.util.Constants.java中读取属性为key的值; 4、若scope为“properties”,则从config/system.properties中读取数据; 5、若toKey属性不配置,则以key为params的键值存储。
control.xml详解 <output>标签 <!ELEMENT action (input,output?)*> 请求返回结果转换标签,output标签通过uid属性和input匹配 <uid>属性: 请求的唯一编号; #REQUIRED
<convertor>属性:Json转换类 ; #REQUIRED <method>属性:调用的方法; #IMPLIED 注意: 1、 output标签是否需要可视Action返回给前台的Json而定; 2、 convertor属性为转换类全称,形如“com.ai.***. convertor.****Convertor”; 3、转换类需要继承com.ai.frame.convertor.BaseConvertor; 4、方法定义: public String XXX(InputObject inputObject , OutputObject outputObject);
InputObject对象 private String service; // 调用后台服务类的名称 private String method; //
服务类中的方法名 private String serverIp; // 调用服务的主机IP private String userId; // 用户信息 private Map<String, String> params; // 参数信息 private List<Map<String, String>> beans; // 参数集 private Map<String, String> logParams ; // 日志参数 // 将params属性转换成JavaBean public <T> T convertParams2Bean(Class<T> clz); // 将beans属性转化成List<JavaBean> public <T> List<T> convertBeans2Beans(Class<T> clz);
InputObject对象获取 从ActionContext中获取 InputObject input= (InputObject) ServletActionContext.getContext().get("inputObject"); 自创建InputObject对象 InputObject inputObject =
new InputObject(); 注意:框架中已对该方法进行封装,在Action中可调用父类BaseAction中的 getInputObject()方法获得。 提醒:创建的inputObject对象中的params、 beans等属性已被实例化,可直接通过 getter方法获取使用。
前后台交互 在前台注入IControlService对象,通过调用 OutputObject execute(InputObject inputObject)完成方法调用。 同样,在基类BaseAction中,已对该方法进行封装,重载了两种方法: OutputObject getOutputObject(); 从ActionContext中读取创建的InputObject对象,作为参数调用后台服务。 OutputObject
getOutputObject(InputObject inputObject); 自创建InputObject对象作为参数,调用后台服务。
public String getWaitCheckByPage(){ String start = getRequest().getParameter("start"); String everyPage =
getRequest().getParameter("limit"); User user = (User)getSession().getAttribute("User"); int userId = user.getId(); InputObject inputObject = new InputObject(); inputObject.setService("mediastoreService"); inputObject.setMethod("getWaitCheckByPage"); Map<String,String> map= new HashMap<String,String>(); map.put("compareName", String.valueOf(userId)); map.put("start", start); map.put("everyPage", everyPage); inputObject.setParams(map); OutputObject outputObject = getControlService().execute(inputObject); String json = JsonDataUtil.getWaitCheckJson(outputObject); sendJson(json); return null; } 使用示例1 当 前 开 发 模 式
public String execute() { OutputObject object = super.getOutputObject(); super.sendJson(super.convertOutputObject2Json(object)); return
null; } <control> <action path="/front/sh/common!execute"> ………. <input uid= "4" service="mediastoreService" method="getWaitCheckByPage"> <parameter key="start" order="0" regex="" toKey="start"/> <parameter key="limit" order= "1" regex="" toKey="everyPage"/> <parameter key="User.id" regex="" scope="session" toKey ="compareName" /> </input> <output uid= "4" convertor="com.ai.mpt.convertor.NoticeConvertor" /> </action> </control> 框 架 模 式
Tools是一个可实现常规代码的自动生成的插件! 代码生成插件Tools 公告表: CREATE TABLE DB_AP_MPT_NOTICE( ID NUMBER NOT NULL,
--公告ID REGION_ID VARCHAR2(2), --归属地市 NAME VARCHAR2(100), --公告名称 CONTENT VARCHAR2(2000), --公告内容 CREATE_OPID VARCHAR2(50), --创建人 CREATE_DATE DATE --创建时间 );
单表操作 后台工程右键选择AILK_TOOLSSingle-Table, 输入数据库Url、用户名、密码 下一步 双击选择需要操作的表,点击确定即完成操作!
文件名称 文件路径 备注 Notice.java java/**/bean/ 创建Bean文件 Notice.xml resources/orm/ 创建Ibatis配置文件 SqlMapConfig.xml
resources/orm/ 修改主配置文件 INoticeDao.java java/**/dao/ 创建Dao接口类 NoticeDaoImpl.java java/**/dao/impl/ 创建Dao接口的实现类 INoticeDaoTest.java test/**/dao/ 创建Dao的测试类 INoticeService.java java/**/service/ 创建Service接口类 NoticeServiceImpl.java java/**/service/impl/ 创建Service接口的实现类 INoticeServiceTest.java test/**/service/ 创建Service的测试类 spring-dao.xml resources/spring/ 修改文件,添加Dao声明 spring-services.xml resources/spring/ 修改文件,添加Service声明 生成文件列表:
多表操作 后台工程中选择AILK_TOOLSMulti-Table,输入SQL、选择Dao、输入方法名、选择是否同 步Service,点击确定即可。 文件名称 文件路径 备注 Notice.xml resources/orm/ 修改Bean的ORM文件 INoticeDao.java
java/**/dao/ Dao中添加声明方法 NoticeDaoImpl.java java/**/dao/impl/ Dao实现类实现该方法 INoticeDaoTest.java test/**/dao/ 测试该方法 INoticeService.java java/**/service/ 不勾选则不生成 NoticeServiceImpl.java java/**/service/impl/ 不勾选则不生成 INoticeServiceTest.java test/**/service/ 不勾选则不生成 生成文件列表:
使用示例2 需求:获取当前登录用户所在地区的公告名称包含“test”的 信息列表。 Region.java int id; String regionName; User.java int
id; String name; Region region; Notice.java int id; String regionId; String name; String content; String createOpid; Date createDate; 假设: session.setAttribute("user",user);
步骤1:使用Tools生成后台服务 SQL: SELECT * FROM DB_AP_FWE_NOTICE N WHERE N.REGION_ID =
#regionId# AND N.NAME LIKE '%' || #name# || '%' 选中的DAO: INoticeDao 方法名: getNoticesByName 同步Service: √
步骤2:配置前台control.xml文件 <control> <action path="/front/sh/common!execute"> ………. <input uid="2" service="noticeService " method="getNoticesByName">
<parameter key= "a" order="0" regex="" toKey="name"/> <parameter key="user.region.id" regex="" scope="session" toKey ="regionId" /> </input> <output uid="2" convertor="com.ai.fwe.convertor.NoticeConvertor" method=“convert2Json" /> </action> </control> 配置output标签,需 自行编写Json转换类
步骤3:编写转换类(如果需要) public class NoticeConvertor extends BaseConvertor { public String convert2Json(InputObject
input, OutputObject output) { String json = "{\"colmodel\":[],\"rows\":"; json += JsonUtil.convertObject2Json(output.getBeans()); json += ",\"total\":"+output.getBean.get("total")+"}"; return json; } } Json工具:JsonView \\192.168.1.217\software\tools
步骤4:前台请求 $.AjaxJson(contextPath+"/front/sh/common! execute?a="+$("#name").val(), dealData); function dealData (state,data){ //处理数据 } common.js
$.extend({ AjaxJson: function(url,callback){ $.ajax({ url:url, type:"post", cache:false, dataType : "json", success:function(data){ callback("success", data); }, error:function(){ callback("error", null); } }); } }); 框架示例 FrameWork Example svn://192.168.1.217/fwe
感谢聆听!!