因爲新工做是在AWS PaaS平臺上進行開發,爲不耽誤工做,先整理一下AWS MVS的使用規範,快速上手。對AWS PaaS平臺的相關介紹留到之後再來補充。本文幾乎是對官方學習文檔的整理,有遺漏的後補。javascript
AWS MVC(Model-View-Controller),輕量級、高性能,是開發AWS App的標準框架,同時AWS PaaS自身也是基於它開發。與傳統開源的Spring MVC、Strusts2相比:css
請求驅動
(請求-響應)的輕量級Web編程框架No Servlet
、No JSP
,Just J2SE
,更容易的開發調試和問題追蹤NIO
通訊和多線程池化管理,可以充分對計算資源的擴容作出適應,實現縱向擴展(Scale Up)特色:基於請求驅動,使用了前端控制器模式設計,再根據請求映射規則分發給相應的後端邏輯控制器(動做/處理器)進行處理html
上圖,前端控制器
(AWS Web Server / Front Controller)和後端處理控制
(AWS App Server / Controller)是AWS MVC的核心通訊框架,黃色區域(視圖組裝、模型、模版)寫業務邏輯,元素描述:前端
AWS Web Server | 安裝有AWS Portal的標準Servlet容器,例如:Tomcat、WebLogic |
AWS App Server | 安裝有AWS Server的應用服務器,全部的業務邏輯在這裏處理 |
Servlet 前端控制器 | 接收全部來自用戶的請求,封裝後轉發給AWS App服務器 |
後端處理控制器 | 經過註解攔截到方法,綁定邏輯處理程序 |
View視圖組裝 | 實現業務邏輯,返回處理的結果 |
Model模型 | 資源處理對象,如處理邏輯、對象、國際化、Dao處理、緩存 |
Template模版 | 基於靜態模版的渲染,處理成動態頁面結果 |
AWS MVC編程框架的主要組成部分:java
其它(略):提升生產環境下的SLA服務可用性;應用的分發、安裝和卸載;對計算資源的擴容作出適應,實現縱向擴展(Scale Up)、得到線性的橫向擴展(Scale Out)jquery
AWS MVC基於Command命令請求驅動,約定5類常見url
請求地址,均可以經過GET
/POST
提交web
url | 類型 | 說明 |
---|---|---|
./w | text/html | (web)-請求結果必定是普通Web頁面數據時 |
./jd | application/json | (json data)-請求結果必定是ResponseObject Json |
./xd | application/xml | (xml data)-請求結果必定是ResponseObject XML |
./df | application/octet-stream(成功) application/json(失敗) |
(download file)-文件下載流,以下載失敗或權限校驗不經過,返回Json處理結果 |
./uf | application/json | (upload file)-文件上傳流,返回Json處理結果 |
測試:啓動完本地AWS服務,瀏覽器輸入請求url:http://localhost:8088/portal/r/w?cmd=API_BENCHMARK_TEST&p=Hello AWS
ajax
說明spring
1.8088
是安裝AWS開發服務的默認Web端口號sql
2./portal
/是默認的Web App根名
3.返回結果:「Hello AWS」,以下:
任何請求在極端環境或服務故障時都會發生錯誤。若是在瀏覽器背後(如一個Ajax請求)發送的HTTP返回一個特定數據結構或操做狀態值,那麼AWS MVC會要求你在Java代碼使用ResponseObject
對象進行封裝,並在前端對result
進行檢查,只有當result
爲ok
時從data
中讀取結果,不然應該檢查errorCode
及msg
項,並處理該異常(如提醒操做者或其餘操做)。模擬一個停機故障:關閉AWS服務,但保持Web服務的正常運行,在瀏覽器中輸入如下URL請求:http://localhost:8088/portal/r/jd?cmd=API_BENCHMARK_TEST&p=Hello AWS
說明
1.使用./jd請求一個json數據結果,模擬加載ajax數據
2.得到了非預期的「Hello AWS」
{ result: "error", msg: "AWS Instance Server鏈接失敗!(590)" }
result值類型
ok
(操做成功)error
(服務端發生錯誤,錯誤描述在msg
項)warning
(服務端發生警告,警告描述在msg
項)
3.查看結果:↓
3.查看結果:↓
sid
(用戶會話)cmd
(請求指令。命名規範:前綴爲該應用的Id,後面是動做名,中間如下劃線分割,區分大小寫)
每一個AWS App的Web資源被獨立的定義在webapp根目錄apps/%AppId%
下。若是該應用須要cmd處理,至少應定義一個接參配置文件,並建議命名爲action.xml
(若是使用AWS自帶的Developer開發工具,該配置文件可忽略,AWS Developer會自動根據Controller類同步構建該配置)。配置文件存爲 UTF-8 NO BOM,格式爲一個或多個符合Schema規範、以action(不區分大小寫)開頭、後綴爲xml的文件。action.xml位置
及內容示例:
<?xml version="1.0" encoding="utf-8"?> <aws-actions> <cmd-bean name="%AppId%_xxx1"> <param name="p1" /> </cmd-bean> <cmd-bean name="%AppId%_xxx2"> <param name="p1" /> </cmd-bean> <cmd-bean name="%AppId%_xxx3"> <param name="p1" type="body"/> </cmd-bean> </aws-actions>
實際項目中配置
![](http://static.javashuo.com/static/loading.gif)
cmd-bean的type屬性:
type
不配置時,該參數的值來自請求中查詢參數或者application/x-www-form-urlencoded類型內容中請求參數type=body
時,該參數的值來自請求內容application/xml、application/json等類型的值,Controller將接收到請求內容的字符串值type=cookie
時,該參數的值來自請求內容的cookie,Controller將接收到對應name
的cookie
值type=header
時,該參數的值來自請求內容的header,Controller將接收到對應name
的header
值普通表單提交處理方式,包括HTML的form提交和js提交。以下模擬一個數值運算場景,由瀏覽器提交兩個數值和運算類型,通過前端控制器傳參和後端控制器的接參,最終抵達邏輯區
<!doctype html> <html> <head> <meta charset="UTF-8"> <title>數據計算</title> <!-- JQuery --> <script type="text/javascript" src="../commons/js/jquery/scripts/jquery.js"></script> <!-- AWS UI --> <link rel="stylesheet" type="text/css" href="../commons/css/awsui.css"> <script type="text/javascript" src="../commons/js/awsui.js"></script> </head> <body> <form id="editForm" method="post" action="./jd?sid=<#sid>&cmd=%AppId%_calculation"> <table class="awsui-ux"> <tr> <td class="awsui-ux-title">計算</td> <td class="required"> <input id="number1" name="number1" class="awsui-textbox" /> <select id="sign" name="sign" class="awsui-select"> <option value="+">+</option> <option value="-">-</option> <option value="*">*</option> <option value="/">/</option> </select> <input id="number2" name="number2" class="awsui-textbox" /> <span> = </span> <input id="results" name="results" class="awsui-textbox" /> </td> </tr> <tr> <td class="awsui-ux-title" colspan="2" style="text-align: center; "> <span id="submitBtn" class="button blue">提交</span> </td> </tr> </table> </form> </body> </html>
注:上述源碼中,<#sid>
在實際運行中由實際的用戶會話Id替代<#sid>
$('#submitBtn').click(function(e) { // 提交表單 $('#editForm').submit(); });
<?xml version="1.0" encoding="utf-8"?> <aws-actions> <cmd-bean name="%AppId%_calculation"> <param name="number1" /> <param name="number2" /> <param name="sign" /> </cmd-bean> </aws-actions>
- 聲明
%AppId%
_calculation命令,%AppId%
是你實際的應用Id- 該命令接收
number1
,number2
,sign
三個參數
@Mapping("%AppId%_calculation") public String calculation(UserContext me, int number1, int number2, @Param(defaultValue = "+")String sign) { TestWeb web = new TestWeb(me); return web.calculation(number1, number2, sign); }
- 顯示定義與變量名匹配的方法參數
UserContext
是AWS MVC內置對象,得到當前操做者上下文信息
@Mapping("%AppId%_calculation") public String calculation(UserContext me, RequestParams params) { // 參數接收 int number1 = params.getInt("number1"); // 獲取整數類型 int number2 = params.getInt("number2"); // 獲取整數類型 String sign = params.get("sign", "+"); // 獲取字符串類型,第二個參數爲默認值,如下方式相同 // Boolean bool = params.getBoolean('paramsName'); // 獲取Boolean類型 // Double number = params.getDouble('paramsName'); // 獲取浮點型參數 TestWeb web = new TestWeb(me); return web.calculation(number1, number2, sign); }
- 不定義方法參數,動態從
RequestParams
對象中讀取變量- 這種方式可讓你的代碼更靈活,但不利於重構
e) View層邏輯處理
public class TestWeb extends ActionWeb { public TestWeb() { } public TestWeb(UserContext ctx) { super(ctx); } public String calculation(int number1, int number2, String sign) { ResponseObject ro = ResponseObject.newOkResponse(); // 處理邏輯 // ro.put("newNum",newNum); return ro.toString(); } }
1)AWS在JQuery ajax基礎上對經常使用異步請求封裝,提供4類請求(request、load、post、get),並對底層進行了統一的處理,如異常攔截。方法說明:
1.awsui.ajax.request
a) 經過 HTTP 請求加載遠程數據,參考jQuery.ajax()。
b) 參數:url,[settings]。分別是String,Object類型
url:一個用來包含發送請求的URL字符串。
settings:AJAX 請求設置。全部選項都是可選的。
2.awsui.ajax.load
a) 載入遠程 HTML 文件代碼並插入至 DOM 中。默認使用 GET 方式 - 傳遞附加參數時自動轉換爲 POST 方式
b) 參數:url,[data,[callback]]。類型:String,Map/String,Callback
url:待裝入 HTML 網頁網址。
data:發送至服務器的 key/value 數據。
callback:載入成功時回調函數
3.awsui.ajax.post
a) 簡單POST 請求,成功可調用回調函數
b) 參數:url,[data],[callback],[type]。類型:String,Map,Function,String
url:發送請求地址。
data:待發送 Key/value 參數。
callback:發送成功時回調函數。
type:返回內容格式,xml, html, script, json, text, _default
4.awsui.ajax.get
a) 簡單GET 請求。請求成功時可調用回調函數
b) url,[data],[callback],[type]。類型:String,Map,Function,String
url:發送請求地址。
data:待發送 Key/value 參數。
callback:發送成功時回調函數。
type:返回內容格式,xml, html, script, json, text, _default。
5,awsui.ajax.ok
a) 驗證是否爲返回狀態是否爲成功
b) data:ajax請求後的返回對象
6.awsui.ajax.responseObject
a)驗證是否爲ResponseObject對象
b)data:字符串或對象。
7.awsui.ajax.alert
a)彈出請求提示消息
b)data, model, callback 。類型:Object, boolean,Function
data: 異步請求返回對象。
model: 消息提示框的展現模式,是否爲模態。
callback:彈出消息提示後回調函數
示例代碼
awsui.ajax.request 示例
awsui.ajax.request({
type: "POST", url: "./jd?sid="+sid+"&cmd=%AppId%_calculation", data: "number1=15&number2=1032&sign=+", ok : function(r) { //請求處理成功 }, err : function(r){ //請求處理錯誤 } });
awsui.ajax.load 示例
awsui.ajax.load("./jd?sid="+sid+"&cmd=%AppId%_calculation", { number1: 15, number2: 1032, sign: '+' }, function(data){ awsui.ajax.alert(data, true, function(){ alert('callback'); }); });
awsui.ajax.post 示例
awsui.ajax.post("./jd?sid="+sid+"&cmd=%AppId%_calculation", { number1: 15, number2: 1032, sign: '+' }, function(data) { awsui.ajax.alert(data, true, function(){ alert('callback'); }); }, 'json');
awsui.ajax.get 示例
awsui.ajax.get("./jd?sid="+sid+"&cmd=%AppId%_calculation", { number1: 15, number2: 1032, sign: '+' }, function(data) { if(awsui.ajax.responseObject(data)) awsui.ajax.alert(data, true, function(){ alert('callback'); }); }, 'json');
awsui.ajax.ok 示例
if(awsui.ajax.ok(data)) alert(data['msg']);
awsui.ajax.responseObject 示例
if(awsui.ajax.responseObject(data)) awsui.ajax.alert(data, true, function(){ alert('callback'); });
awsui.ajax.alert 示例
awsui.ajax.alert(data, true, function(){ alert('callback'); });
2)後端接參
@Mapping("%AppId%_calulation") public String calculation(UserContext me, int number1, int number2, String sign) { TestWeb web = new TestWeb(me); return web.calculation(number1, number2, sign); }
3)View層邏輯處理
public class TestWeb extends ActionWeb { public TestWeb() { } public TestWeb(UserContext ctx) { super(ctx); } public String calculation(int number1, int number2, String sign) { ResponseObject ro = ResponseObject.newOkResponse(); // 處理邏輯 // ro.put("newNum",newNum); return ro.toString(); } }
AWS容器對各資源提供沙箱管理,對文件讀寫提供了一套完善的DC
(Doc Center)機制,文件必須經過DC處理器進行處理。AWS對文件上傳封裝了一個公用的組件,可以知足經常使用瀏覽器(IE8+, Firefox,Google Chrome,Safari,平板UC等)的文件上傳功能。
a)服務端插件註冊和聲明
註冊DCPluginProfile要聲明repositoryName
(存放文件的根目錄名)和文件處理器(繼承com.actionsoft.bpms.server.fs.AbstFileProcessor)。
- 有關
DC
開發詳細內容,參見《AWS 插件擴展開發參考指南》- 有關DC API操做(如讀、寫文件),參見aws-api-doc提供的
DCAPI
b)客戶端調用
upfile
是AWS UI封裝的通用文件上傳組件,採用雙核技術(IE8/IE9提供Flash模式,對支持HTML5的瀏覽器採用無插件模式)實現批量文件上傳、文件類型過濾、文件大小控制和上傳進度控制,對各種瀏覽器提供了較好的體驗支持。
i)上傳組件的資源引用
<link rel="stylesheet" type="text/css" href="../commons/css/awsui.css"/> <script type="text/javascript" src="../commons/js/jquery/scripts/jquery.js"></script> <script type="text/javascript" src="../commons/js/awsui.js"></script>
ii)用JavaScript打開上傳對話框
<script type="text/javascript"> $(function(){ //myUpfile對象綁定upfile組件 $("#myUpfile").upfile({ sid: "<#sid>", // 會話ID appId: "com.actionsoft.apps.poc.plugin", // 應用ID groupValue: "dir1", // DC大類,建議變量規則 fileValue: "dir2", // DC小類,建議變量規則 numLimit: "2", //最多一次容許上傳幾個,0(無限制) filesToFilter : [["Images (*.jpg; *.jpeg; *.gif; *.png; *.bmp)","*.jpg; *.jpeg; *.gif; *.png; *.bmp"]], repositoryName: "myfile", // 該應用申請的DC名 done: function(e, data){ //事件回調函數 //上傳完成後,開始調用導入代碼 if (awsui.ajax.ok(data.result.data)) {//判斷請求是否執行成功 //能夠調用公共方法處理提示信息 awsui.ajax.alert(data.result.data); //或者自行處理提示信息 //$.simpleAlert('文件上傳成功!'); // downloadURL var url = data.result.data.data.attrs.url; //若是定義了其餘返回的屬性,也須要使用data.result.data.data.attrs調用 } else { // 上傳失敗,提示出錯誤信息 awsui.ajax.alert(data.result.data); } } }); }); </script>
iii)上傳按鈕的定義
<span id="myUpfile" class="button green" onclick="return false;">上傳</span>
上述客戶端調用示例,也可從
AWS企業應用商店
安裝擴展插件概念驗證
應用,全部源碼在src目錄下
c)參數說明
Name | Type | Description | Default |
---|---|---|---|
sid(*-必須) | String | 會話ID | |
appId(*-必須) | String | 應用ID | |
repositoryName(*-必須) | String | DC插件定義 | |
groupValue(*-必須) | String | 文件大類 | |
fileValue(*-必須) | String | 文件小類 | |
filesToFilter | String | var filter = [["Images (.jpg; .jpeg; .gif; .png; .bmp)",".jpg; .jpeg; .gif; .png; .bmp"]]; | 不過濾,可上傳全部文件 |
sizeLimit | number | 文件大小限制 | 25*1024*1024(25M) |
numLimit | int | 上傳個數限制 | 0(無限制) |
Name | Param | Description |
---|---|---|
add | e 事件;data(返回的數據) | 文件被添加到上傳列表時觸發,當返回false時,可阻止上傳。 例如: //data.files 爲上傳文件的數組 add:function(e, data){ //data.files 爲上傳文件的數組 $.each(data.files, function(index, file) { // file.name 文件名稱 file.size 文件大小 file.type 文件類型 }) if(size==0){ //空文件不容許上傳 return false; } } |
progress | e 事件;data(返回的數據) | 文件上傳中觸發 |
done | e 事件;data(返回的數據) | 單個文件上傳完畢後觸發 |
error | e 事件;data(返回的數據) | 單個文件上傳失敗後觸發。 多是web服務器也多是app服務器形成的失敗 |
complete | 文件成功上傳結束後觸發 |
下載DC
倉庫內文件的url必須由DCContext
的getDownloadURL()
獲取。
如下是獲取文件下載連接的Java示例
// 構造下載附件的url連接 UserContext me = getContext(); String appId = "xxxxxx"; //該App Id名 String repositoryName = "orderFile"; //該App的DC倉庫根目錄 String groupValue = yearMonth; //一級目錄爲年月,201402 String fileValue = orderId; //訂單Id String fileName = "order.jpg"; //文件名 DCContext context = new DCContext(me, SDK.getDCAPI().getDCProfile(appId, repositoryName), appId, groupValue, fileValue, fileName); result.put("url", context.getDownloadURL());
JavaScript示例
window.open(url); // or window.location.href = url;
就這麼簡單,提交的請求已經被AWS MVC傳輸至AWS應用層。
AWS MVC的後端控制器以@Controller
註解到普通的Java類,併爲該方法增長@Mapping("%Command%")
註解便可。控制器會負責將前端cmd參數名與該Java方法的參數名進行匹配和賦值,完成攔截、綁定和執行過程。
@Controller public class ABCController { // Test1 @Mapping("%AppId%_xxx1") public String apiTestHome(UserContext me, String p1) { return "Hi,p1="+p1; } //Test2 @Mapping("%AppId%_xxx2") public String apiInfo(UserContext me, String p2) { ABCWeb abc= new ABCWeb(me); return abc.getMainPage(p2); } }
控制器只負責攔截、綁定和執行cmd方法,對於該方法的具體實現應交給View層處理,不建議直接在Controller中完成邏輯處理。
註解 | 說明 |
---|---|
@Controller | 類註解。聲明該類是一個後端處理控制器 |
@Mapping | 方法註解。聲明該方法將響應一個前端Web請求,參數值是該cmd值 |
默認每一個請求必須含有sid的會話信息,如開發者要求在無session場景下執行服務端請求,可參考以下語法
@Mapping(value = "%AppId%_xxx3", session = false, noSessionEvaluate = "無安全隱患", noSessionReason = "用於MVC框架穩定性測試")
被標記爲無session驗證的請求是很是不安全的,緣由是AWS沒法識別請求者身份。開發者應審慎評估該請求背後執行的邏輯規則,不會被用於惡意處理
如下參數能夠出如今方法參數中
參數 | 說明 |
---|---|
UserContext對象類型 | 【可選】獲取AWS用戶會話對象 |
RequestParams對象類型 | 【可選】獲取請求參數,Key爲變量名,Value爲值 |
clientIp變量名 | 【可選】String類型。客戶端ip地址 |
responseType變量名 | 【可選】String類型。請求結果類型(W/JD/XD...)見Message常量 |
%變量名% | 【可選】cmd的參數名,支持String、Integer、Boolean、Long、Double類型。變量的命名來自具體請求中提供的參數 |
package包結構命名建議
第一次建立Controller類並進行調試時,須要編譯jar文件至該app的lib目錄下,不然可能會提示找不到cmd異常。這是一個設計缺陷,咱們計劃在時間充分的時候修復
下圖爲實例:
不建議直接在處理控制器中完成業務處理過程。
在AWS MVC框架中,View層負責實現具體的業務邏輯,組織處理結果。View提供客戶端用戶會話、身份及設備等信息,經過繼承ActionWeb
,完成View的開發。
public class ABCWeb extends ActionWeb { public ABCWeb (UserContext uc) { super(uc); } public String getMainPage(String p2) { return 「Hi,p2=」+p2; } }
當操做發生錯誤時,框架將拋出uncheck
異常(如AWSDataAccessException),若是你的邏輯沒有方案或需求去處理這個異常能夠繼續向外拋出。
當操做發生參數非法、執行非法等常見View層處理邏輯場景時,建議拋出以下異常(詳細請參見異常處理章節)
若是業務處理邏輯相對複雜,建議將邏輯操做封裝成util類或service類
一般你在爲PC端瀏覽器的界面交互編程。若是須要你的程序可以更好的服務於其餘移動設備,能夠調用UserContext.getDeviceType()
方法獲取到當前用戶的設備類型。
AWS MVC提供了頁面模版處理框架,經過定義模版變量和程序對變量的處理生成最終頁面內容。
提交請求的響應結果一般是一個完整的HTML Document。在一些前端動態拼裝場景,局部DOM結構也能夠被獨立的定義成模版文件。但有時局部DOM無需使用模版,直接由程序動態組裝。
模版被存放在該應用安裝目錄的template/page
下,一般以html或htm後綴結尾(命名區分大小寫)。除內容符合標準HTML、CSS、JavaScript規範外,模版標籤變量定義的規則是,將須要程序生成的部分以<#變量名>
替換,最終由HtmlPageTemplate.merge()
混合成用戶瀏覽器中的html內容。
若是該模版中出現的文字須要進行多語言處理,能夠<I18N#變量名
>定義,其中變量名是爲該應用抽取的多語言配置項的Item的Key。
public class ABCWeb extends ActionWeb { public ABCWeb (UserContext uc) { super(uc); } public String getMainPage(String p2) { Map<String, Object> macroLibraries = new HashMap<String, Object>(); macroLibraries.put("page_title", "hello"); macroLibraries.put("p2", p2); macroLibraries.put("sid", getContext().getSessionId()); return HtmlPageTemplate.merge("%AppId%", "模版文件名", macroLibraries); } }
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title><#page_title></title> <!-- 在JS中使用變量,若是須要 --> <script> var sid = '<#sid>'; </script> </head> <body> <form action="./w" method=post name=frmMain > <!-- 在HTML中使用變量,若是須要 --> p2的值是<b><#p2></b> </form> </body> </html>
utf-8
一些來自前端Ajax操做或服務請求一般須要響應一個結構化數據:
類型支持:
com.actionsoft.bpms.commons.mvc.view.ResponseObject
ResponseObject
對象是AWS爲開發者提供的一個通用數據對象封裝,用於封裝一個結構化處理結果。ResponseObject
支持三種處理狀態:
常量 | 值 | 說明 |
---|---|---|
ResponseObject.SUCCESS | ok | 被成功處理。對應AWS UI中simpleAlertd的ok或info提示 |
ResponseObject.WARNING | warning | 操做發生警告。對應AWS UI中simpleAlertd的warning提示 |
ResponseObject.ERROR | error | 操做發生錯誤。對應AWS UI中simpleAlertd的error提示 |
狀態值可在返回結果的
result
項檢查,這是一個必須結構
當處理成功或發生失敗時,應該將進階的信息反饋給調用者。
//success msg return ResponseObject.newOkResponse("a訂單被取消").toString(); //或者 ResponseObject ro=ResponseObject.newOkResponse(); ro.msg("a訂單被取消"); return ro.toString(); //warning msg return ResponseObject.newWarnResponse("a訂單已經發出").toString(); //或者 ResponseObject ro=ResponseObject.newWarnResponse(); ro.msg("a訂單已經發出"); return ro.toString(); //error msg return ResponseObject.newErrResponse("a訂單取消失敗,緣由是xxxx").toString(); //或者 ResponseObject ro=ResponseObject.newErrResponse(); ro.msg("a訂單取消失敗,緣由是xxxx"); return ro.toString();
補充信息可在返回結果的
msg
項檢查,這是一個附加結構
以key/value形式由開發者自定義,value能夠是一個簡單Java對象也能夠是一個集合對象。
Map<String, Object> orderDetails = new HashMap<>(); orderDetails.put("orderId", "001"); orderDetails.put("customerId", "999"); orderDetails.put("customerName", "Actionsoft"); orderDetails.put("amount", Double.valueOf("980.01")); ResponseObject ro = ResponseObject.newOkResponse(); ro.put("enabled", true); ro.put("orderDetails", orderDetails); return ro.toString();
數據可在返回結果的
data
項檢查,這是一個附加結構
默認ResponseObject
的toString()
將數據結構拼裝成JSON串。
return ro.toString();
含有狀態信息的JSON結構
{ data: { enabled: true, orderDetails: { amount: 980.01, customerName: "Actionsoft", customerId: "999", orderId: "001" } }, msg: "", result: "ok" }
return ro.toDataString();
只有數據的JSON結構
{ enabled: true, orderDetails: { amount: 980.01, customerName: "Actionsoft", customerId: "999", orderId: "001" } }
return ro.toXML();
含有狀態的XML Document片斷
<result type="ok" errorCode="" msg="" />
若是你的Java程序讀取本地文件系統的文件,建議文件名和內容強制以utf-8讀和寫。這樣作的緣由是中文系統的Window默認是936
字符集(可使用chcp
命令查看和設置),而大部分OS Server以utf-8進行編碼。
若是程序強制以utf-8處理文件,當AWS PaaS在部署一段時間後,客戶但願在Windows和Linux之間作遷移時,可以確保用戶數據編碼格式的一致性。
與其餘MVC開發框架同樣,編寫出結構清晰的程序代碼,須要對業務實體對象進行屬性封裝(概念如POJO
、JavaBean
)。
AWS MVC提供了設計業務實體對象的父類ModelBean
和IModelBean
接口,採用ModelBean
封裝的業務實體對象,還有如下優點:
public class TestModel extends ModelBean implements IModelBean { private String id; private String f1; private double f2; public TestModel() { } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getF1() { if (f1 == null) { f1 = ""; } return f1; } public void setF1(String f1) { this.f1 = f1; } public double getF2() { return f2; } public void setF2(double f2) { this.f2 = f2; } }
/** * AWS MVC框架中,表示實體業務對象接口 */ public interface IModelBean extends Serializable { /** * 將當前對象轉換成json處理對象 */ public JSONObject toJsonObject(); /** * 將當前對象轉換成json串 */ public String toJson(); /** * 將當前對象轉化成XML片斷 */ public String toXML(); }
AWS的DAO基於對JDBC的直接封裝,與當今流行的Hibernate、iBATIS相比,去除了O/R映射關係的直接依賴,並借鑑了Apache DBUtils設計思想,只在須要的場景完成O/R Mapping。
採用AWS MVC的DAO優點以下:
RowMapper
,將JDBC對象轉換成業務實體對象(ModelBean
)DBSql
工具類AWS SLA
的質量和性能監控、告警Dao(Data Access Object)是一個設計模式,它是對數據訪問的一種抽象。com.actionsoft.bpms.commons.mvc.dao.IDaoObject
是AWS設計的數據庫訪問接口,DaoObject
是實現了IDaoObject
接口用於訪問AWS本地數據庫的抽象父類,該類對單主鍵數據庫表的查詢/更新/刪除等常規操做提供了實現。
ModelBean
,實現業務實體對象繼承DaoObject
,實現Dao處理對象
public class TestDao extends DaoObject<TestModel> { public TestDao() { } /** * 插入一條測試記錄 */ @Override public int insert(TestModel model) throws DataAccessException{ model.setId(UUIDGener.getUUID()); String sql = "INSERT INTO " + entityName() + "(ID,F1,F2)VALUES(:ID,:F1,:F2)"; Map<String, Object> paraMap = new HashMap<>(); paraMap.put("ID", model.getId()); paraMap.put("F1", model.getF1()); paraMap.put("F2", model.getF2()); return DBSql.update(sql, paraMap); } /** * 更新一條測試記錄 */ @Override public int update(TestModel model) throws DataAccessException{ if (UtilString.isEmpty(model.getId())) { throw new DataAccessException("Method getId() Does Not Allow Empty!"); } Map<String, Object> paraMap = new HashMap<>(); paraMap.put("F1", model.getF1()); paraMap.put("F2", model.getF2()); // 不須要寫sql,可調用基類封裝的update方法 return update(model.getId(), paraMap); } /** * 封裝測試 * * @param id * @param f2 * @return */ public int updateF2(String id, double f2) throws DataAccessException{ Map<String, Object> paraMap = new HashMap<>(); paraMap.put("F2", f2); return update(id, paraMap); } /** * 封裝DBSql測試 * * @return */ public long count() { return DBSql.getLong("SELECT COUNT(ID) AS C FROM " + entityName(), "C"); } /** * 封裝DBSql測試 * * @param f2 * @return */ public List<TestModel> queryByF1(String f1) { return query("F1=?", f1).orderBy("F2").desc().list(); } /** * 該Dao實現的表名稱 */ @Override public String entityName() { return "TEST_DAO"; } /** * 構建該Dao從一條記錄轉換成對象的映射對象 */ @Override public RowMapper<TestModel> rowMapper() { return new Mapper(); } /** * TestDao Mapper */ private class Mapper implements RowMapper<TestModel> { public TestModel mapRow(ResultSet rset, int rowNum) throws SQLException { TestModel model = new TestModel(); try { model.setId(rset.getString("ID")); model.setF1(rset.getString("F1")); model.setF2(rset.getDouble("F2")); } catch (Exception e) { e.printStackTrace(); } return model; } } }
當操做發生錯誤時,框架將拋出uncheck
異常(如AWSDataAccessException),若是你的邏輯沒有方案或需求去處理這個異常能夠繼續向外拋出。
當操做發生參數非法、執行非法等常見Dao處理邏輯場景時,建議拋出以下異常(詳細請參見異常處理章節)
utf-8
Spring MVC自動接管了事務與資源釋放,這是很是棒的編程體驗。爲提升性能,目前AWS DAO框架未接管JDBC事務和自動完成Connection
釋放。
當你的程序須要事務支持時,能夠遵循標準的JDBC編程規範,對Connection
對象進行事務的開啓、回滾或提交。
若是你的程序得到了一個新的Connection
(如經過DBSql.open()
),那麼最終須要你的代碼經過DBSql.close()
釋放這個鏈接。
建議使用AWS的BO
模型設計和維護你的物理表結構,若是某些表必須由本身的sql建立(不推薦),那麼須要遵循App開發規範中約定的表名前綴和sql安裝/升級腳本規範。
AWS MVC的數據庫鏈接池使用了tomcat-jdbc,相關高級參數調優,可修改對應AWS安裝目錄bin/conf/db_pool.properties
文件。
com.actionsoft.bpms.util.DBSql
是和AWS數據庫交互的工具類,它基於PreparedStatement
實現了數據庫的查詢、插入、更新、批處理,DBSql通常用於DaoObject中。
// 查詢單個字段 String value_a = DBSql.getString("select a from table_test where id=?", new Object[]{"id1"}); // 查詢多個字段 Map<String,Object> value_map = DBSql.getMap("select a,b,c from table_test where id=?", "id1"); // 查詢返回自定義對象,MyBean是java類 List<MyBean> list = DBSql.query("select a,b,c from table_test where id=?", new RowMapper<MyBean>() { @Override public MyBean mapRow(ResultSet rs, int rowNum) throws SQLException { MyBean mybean = new MyBean(); mybean.setA(rs.getString("a")); return mybean; } }, "id1");
詳細請參見aws-api-doc的
DBSql
AWS MVC的Cache框架支持本地緩存和集羣緩存,能夠經過擴展AWS平臺的Cache插件(Plugin)實現本身的緩存對象。
有關Cache開發詳細內容,參見《AWS 插件擴展開發參考指南》
AWS MVC框架的異常處理過程以下所示
在上圖中,請求者(用戶或服務API)被前端控制器封裝成指令並傳輸至AWS服務器,當圖中紅色、橙色和黃色區域異常發生後,由AWS的頂層異常攔截器捕獲,向請求者返回錯誤消息。
在這個章節中,你將瞭解以下內容:
經過對錯誤碼定義,可以簡單的幫助用戶或開發者識別和理解異常性質,錯誤碼與錯誤不是一對一關係,是錯誤類型的一種抽象代號。
AWS的錯誤碼參照了HTTP
狀態碼定義。錯誤碼以3
位的數字代碼表達,全部錯誤碼首數字
表明的一類錯誤。
首數字 | 說明 |
---|---|
4 | 客戶端錯誤 |
5 | 服務端錯誤 |
7 | 服務可用性 |
8 | 配合限制和其餘 |
當請求返回了AWS非預期消息或錯誤時,除了提供錯誤碼,一般咱們會根據具體的場景提供問題概要說明,若是是出錯類異常,詳細信息必定被記錄到AWS的error.log
文件。
Code | 描述 | 異常或發生場景 |
---|---|---|
400 | 錯誤的參數請求(Bad Request) 一般當缺乏必要參數,或者參數值格式不正確時,會返回該錯誤信息。此時能夠查看相關文檔確認每一個參數的格式是否正確。例如:執行啓動流程方法時,未提供processInstId參數 |
AWSIllegalArgumentException * 當客戶端請求AWS服務時,若處於該場景將以該錯誤碼返回到ResponseObject數據結構 |
401 | 未受權被拒絕(Unauthorized) 當用戶提供了無效的session,或者請求的鑑權結果不正確時,會返回該錯誤信息。 |
目前只適用於SOAP/REST API的Web層封裝的錯誤代碼,不適用於服務器端異常處理 當客戶端請求AWS服務時,若處於該場景將以該錯誤碼返回到ResponseObject數據結構 |
403 | 訪問被拒絕(Forbidden) 該請求是有效的,但操做是被禁止且不該該再次嘗試時,會返回該錯誤信息。例如:要執行的任務實例已結束 |
AWSForbiddenException * 當客戶端請求AWS服務時,若處於該場景將以該錯誤碼返回到ResponseObject數據結構 |
404 | 找不到資源對象(Not Find Resource) 當用戶試圖訪問不存在的資源時,會返回該錯誤信息。例如:要執行的任務實例已不存;帳戶不存在 |
AWSObjectNotFindException |
405 | 請求方法不容許(Method Not Allowed) 使用了不支持的請求方法去操做資源時,會返回該錯誤信息。例如:使用GET請求一個POST操做 |
* 目前只適用於REST API的Web層封裝的錯誤代碼,不適用於服務器端異常處理 |
408 | 資源請求超時(Request Timeout) 請求超出了等待時間,會返回該錯誤信息。例如:在調用AWS的SOAP或REST服務,鏈接至AWS服務器超時 |
* 目前只適用於SOAP/REST API的Web層封裝的錯誤代碼,不適用於服務器端異常處理 |
500 | 內部錯誤(Internal Server Error) 當服務器執行請求過程當中,遇到內部處理錯誤時,會返回該錯誤信息。遇到這種錯誤,請檢查AWS的錯誤日誌,及時與咱們聯繫 |
AWSException 全部繼承該異常子類,未實現錯誤號的異常(getAPIErrorCode()) 全部JDK或非AWS異常拋出,被系統捕獲的 * 當客戶端請求AWS服務時,若處於該場景將以該錯誤碼返回到ResponseObject數據結構 |
520 | 引擎錯誤(Engine Error) 當服務器執行請求過程當中,遇到流程引擎、表單引擎等引擎類錯誤時,會返回該錯誤信息。遇到這種錯誤,請檢查AWS的錯誤日誌,及時與咱們聯繫 |
AWSEngineException AWSExpressionException |
521 | 傳輸轉換錯誤(Transfer Error) 當服務器執行請求過程當中,遇到導入導出或格式轉換錯誤時,會返回該錯誤信息。遇到這種錯誤,請檢查AWS的錯誤日誌,及時與咱們聯繫 |
AWSTransferException |
530 | 應用容器錯誤(App Container Error) 當服務器執行請求過程當中,遇到PaaS應用容器類錯誤時,會返回該錯誤信息。遇到這種錯誤,請檢查AWS的錯誤日誌,及時與咱們聯繫 |
AppContainerException |
540 | 應用商店錯誤(AppStore Error) 當服務器執行請求過程當中,遇到PaaS與AppStore相互處理過程當中發生錯誤時,會返回該錯誤信息。遇到這種錯誤,請檢查AWS的錯誤日誌,及時與咱們聯繫 |
AppStoreException |
550 | 業務錯誤(BPMN Error) 當BPMN引擎執行時由開發者拋出BPMNError業務異常時,會返回該錯誤信息。遇到這種錯誤,請與業務開發者聯繫 |
BPMNError |
590 | AWS Instance Server鏈接失敗 當客戶端以HTTP(S)經Web鏈接至AWS服務器時,未能正常創建通訊鏈接時會返回該錯誤信息。遇到這種錯誤,多是AWS服務已中止或Web與AWS之間的網絡故障 |
Web層錯誤 |
591 | 處理AWS Instance Server響應時發生錯誤 當客戶端以HTTP(S)與AWS服務器創建鏈接後,在發生指令請求等待返回結果發生錯誤時,會返回該錯誤信息。遇到這種錯誤,請檢查AWS的錯誤日誌,及時與咱們聯繫 |
Web層錯誤 |
760 | 服務正在啓動(Instance Starting) 當服務器正在啓動還沒有就緒時,會返回該錯誤信息。遇到這種錯誤,請稍後執行 |
*當客戶端請求AWS服務時,若處於該場景將以該錯誤碼返回到ResponseObject數據結構 |
761 | 服務正在關閉(Instance Stoping) 當服務器正在關閉時,會返回該錯誤信息。遇到這種錯誤,請不要再重複請求,服務器將被關閉 |
* 當客戶端請求AWS服務時,若處於該場景將以該錯誤碼返回到ResponseObject數據結構 |
762 | 服務脫機(Instance Offline) 當服務器處於運行中,由運維人員暫停客戶端響應時,會返回該錯誤信息。遇到這種錯誤,請聯繫系統管理員 |
* 當客戶端請求AWS服務時,若處於該場景將以該錯誤碼返回到ResponseObject數據結構 |
770 | 應用正在啓動(App Starting) 當訪問的應用正在啓動還沒有就緒時,會返回該錯誤信息。遇到這種錯誤,請稍後執行 |
* 當客戶端請求AWS服務時,若處於該場景將以該錯誤碼返回到ResponseObject數據結構 |
771 | 應用正在關閉(App Stoping) 當訪問的應用正在關閉時,會返回該錯誤信息。遇到這種錯誤,請不要再重複請求,應用將被關閉 |
* 當客戶端請求AWS服務時,若處於該場景將以該錯誤碼返回到ResponseObject數據結構 |
772 | 應用脫機(App Offline) 當應用處於就緒但依賴的應用未安裝或暫停後,會返回該錯誤信息,若是該應用未被受權或訂閱也會處於772狀態。遇到這種錯誤,排出錯誤後再啓動該應用 |
* 當客戶端請求AWS服務時,若處於該場景將以該錯誤碼返回到ResponseObject數據結構 |
773 | 應用已卸載(App Uninstall) 當應用已經被卸載後,會返回該錯誤信息。遇到這種錯誤能夠忽略,或訪問應用管理,將卸載的應用還原 |
* 當客戶端請求AWS服務時,若處於該場景將以該錯誤碼返回到ResponseObject數據結構 |
774 | 應用出錯暫停(App Failed) 當應用啓動失敗後,會返回該錯誤信息。遇到這種錯誤,請檢查該應用的日誌,排出錯誤後再啓動該應用 |
* 當客戶端請求AWS服務時,若處於該場景將以該錯誤碼返回到ResponseObject數據結構 |
800 | 許可配額限制(Quota Limit) 當資源配額超過許可限制時,會返回該錯誤信息。例如:超過許可的註冊用戶數 |
AWSQuotaException * 當客戶端請求並超過許可證容許的最大併發返回到ResponseObject中 |
AWSException
及其子類,能夠經過getAPIErrorCode()
在Java代碼中獲取ResponseObject
結構的errorCode
讀取
AWS平臺提供的異常對象都是uncheck
類型,開發者能夠根據處理的須要進行捕獲,若是開發者很是明確的要拋出這些異常,那麼能夠不對其處理。
除AWSAPIException
外,全部AWS內部異常的父類都是AWSExceptione
,常見異常以下:
Exception | 說明 |
---|---|
AWSAPIException | API調用異常(uncheck) |
AWSException | AWS平臺異常(如下均內部使用,uncheck)【通用】 |
AWSClassLoaderException | 類加載異常 |
AWSEngineException | 引擎內部異常(流程、表單、報表等,見該類常量) |
BPMNDefException | BPMN定義異常(設計階段) |
BPMNError | BPMN規範要求捕獲的異常拋出(運行階段) |
AWSDataAccessException | 數據操做異常。如數據庫操做、JSON數據操做 |
AWSIllegalArgumentException | 參數校驗異常【通用】 |
AppStoreServiceException | 訪問AWS企業應用商店異常 |
雖然AWS平臺定義了不少異常對象,可是對於應用開發者,只須要熟練掌握如下幾個,便可知足大部分開發場景的須要:
//參數合法性異常 throw new AWSIllegalArgumentException("參數1", AWSIllegalArgumentException.FORMAT,"參數必須是0-9數字"); throw new AWSIllegalArgumentException("參數1", AWSIllegalArgumentException.EMPT); throw new AWSIllegalArgumentException("參數1不能爲空"); //操做被拒絕 throw new AWSForbiddenException("流程已經掛起,操做被拒絕"); throw new AWSForbiddenException("ctx類型不當,應給定begin()返回的上下文對象"); //對象不存在 throw new AWSObjectNotFindException("App文件不存在[" + appFile.getPath() + "]"); throw new AWSObjectNotFindException("流程定義未找到。processDefinitionId:" + processDefinitionId);
當異常被AWS MVC頂層框架捕獲後,會根據cmd請求類型處理成客戶端可以理解的文檔格式。
請求類型 | 格式 |
---|---|
./w | HTML Document |
./jd | JSON Document |
./xd | XML Document |
當發生底層Java異常或其餘非AWSException
異常時,AWS MVC將該異常封裝成500
錯誤。
捕獲的異常被記錄至AWS logs目錄下
error.log
(單一部署)error-%AWS節點名%.log
(集羣部署)
AWS MVC框架對HTML/JavaScript多語言和Java程序多語言提供了一整套完善的開發方案,如下爲AWS MVC的多語言處理架構。
AWS MVC每次接收到用戶請求時,在會話對象(UserContext.getLanguage()
)提供了該用戶的界面語言信息,AWS MVC爲應用提供了兩種常看法決方案:
經過SDK.getAppAPI().i18nValue()
得到指定用戶界面的多語言資源配置
SDK.getAppAPI().i18NValue("com.actionsoft.apps.poc.api", me, "info1")
在HTML頁面或JavaScript中出現的多語言標籤,使用<I18N#變量名
>替代,其中變量名爲多語言資源配置Item
的Key
。
<!doctype html> <html> <head> <meta charset="UTF-8"> <title><I18n#PageTitle></title> <script> var var1 = "<I18n#Var1>"; var var2 = "<I18N#Var2>"; alert(var1); alert(var2); </script> </head> <body> Hi,<I18n#PageTitle> </body> </html>
遵循AWS PaaS對App的資源定義規範,每一個AWS應用的多語言資源配置文件被存放在應用安裝目錄/i18n/
下。
該目錄容許存在1個或多個符合Schema規範的xml文件,建議爲本身的應用建立一個名爲resource.xml
的資源配置文件。
項 | 說明 |
---|---|
item/key | 多語言資源名,同個App下不容許重複 |
item/cn | 中文簡體 |
item/en | 英文 |
item/big5 | 中文繁體 |
item/%lang% | 其餘擴展的語言名 |
resource.xml示例
<locale-config> <lang> <item key="info1"> <cn><![CDATA[這是中文簡體語言]]></cn> <en><![CDATA[This is the English language]]></en> <big5><![CDATA[這是中文繁體語言]]></big5> </item> <item key="PageTitle"> <cn><![CDATA[這是標題]]></cn> <en><![CDATA[This is Title]]></en> <big5><![CDATA[這是標題]]></big5> </item> <item key="Var1"> <cn><![CDATA[這是變量1]]></cn> <en><![CDATA[This is Var1]]></en> <big5><![CDATA[這是變量1]]></big5> </item> <item key="Var2"> <cn><![CDATA[這是變量2]]></cn> <en><![CDATA[This is Var2]]></en> <big5><![CDATA[這是變量2]]></big5> </item> </lang> </locale-config>
建議訪問AWS企業應用商店,安裝「多語言管理工具
」。
該工具提供了可視化的多語言配置工具,可以極大提升翻譯人員的工做效率。
默認AWS PaaS只提供了中文簡體、英文和中文繁體三種界面語言,能夠安裝「多語言管理工具
」擴展更多種語言。
如下代碼打印出當前AWS PaaS支持的語言集
List<LanguageModel> langs = SDK.getPlatformAPI().getlanguages();
for (LanguageModel lang : langs) { System.out.println(lang.getName()); }
對於跨國企業/組織或長期國際差旅時,用戶須要根據工做地點的時區得到與當地時間一致的日期信息,並遵照當地的節假日和企業工做時間要求。
在AWS MVC框架中,時區主要解決符合用戶當地時間的日期顯示;工做日曆主要解決對員工有效工做時間的計算,如流程執行效率,並提供API來處理業務需求,如差旅請假時長計算。
AWS MVC是一個開放的編程架構,你能夠方便的將本身須要的工具包加入到本身的App中使用:
apps/%appId%/
下可在你的程序中直接使用AWS PaaS自帶的一些第三方開源類庫,這些Jar文件存放在AWS安裝目錄的bin/lib
和bin/jdbc
下。
類庫 | 說明 |
---|---|
commons-* | Apache提供的若干工具類 |
barcode4j | 條形碼生成 |
cajo | RMI工具類 |
csv | CSV數據處理工具 |
xalan/... | XML數據處理 |
json-lib | JSON數據處理 |
poi | Office文件處理 |
httpclient | HTTP客戶端 |
itext | PDF處理 |
sigar | 系統性能監控 |
log4j | Java日誌處理系統 |
cxf | Web服務處理框架 |
... | ... |
這些組件所有基於JQuery和JQueryMobile底層框架封裝,使用這些UI有助於開發的應用界面與AWS其餘應用保持一致的交互習慣。詳細說明參見AWS UI章節
AWS PaaS做爲App運行的容器環境和資源平臺,爲App開發者提供了豐富的API,這些API能夠直接在你的Java程序中使用。
對於API詳細說明及用法,參見aws-api-doc(一個Java API Doc)。
類 | 說明 |
---|---|
SDK | SDK API的總入口 |
ActionWeb | Web(View)請求處理的父類 |
ModelBean | 業務實體對象父類 |
DaoObject | DAO對象父類 |
ResponseObject | 返回JSON、XML結構化數據,如操做狀態、業務數據 |
UserContext | 用戶會話,得到用戶會話串、登陸IP、語言、設備類型、用戶組織等 |
AppAPI | 多語言處理、跨應用的ASLP調用、應用日誌 |
ORGAPI | 訪問組織結構相關接口 |
PermAPI | 訪問AWS權限相關接口 |
PortalAPI | 訪問或構建門戶應用相關接口 |
RuleAPI | 規則處理接口 |
DCAPI | 文件處理接口 |
類 | 說明 |
---|---|
PlatformAPI | 查詢平臺及服務狀態接口 |
ConfAPI | 查詢平臺經常使用配置參數接口 |
SLAAPI | 監控告警接口 |
類 | 說明 |
---|---|
ProcessAPI | 流程實例控制接口 |
TaskAPI | 任務實例控制接口 |
ProcessExecuteQuery | 引擎執行結果查詢接口 |
ProcessQueryAPI | 流程實例查詢接口 |
TaskQueryAPI | 任務查詢接口 |
HistoryTaskQueryAPI | 歷史任務查詢接口 |
DelegationAPI | 任務委託/代理接口 |
RepositoryAPI | 模型資源庫訪問接口 |
BOAPI | BO操做接口 |
BOQueryAPI | BO查詢接口 |
類 | 說明 |
---|---|
ValueListener | 取值類監聽器父類 |
ExecuteListener | 執行類監聽器父類 |
InterruptListener | 中斷類監聽器父類 |
爲統一PaaS用戶的交互體驗(UX)和界面展現(UI),AWS MVC框架爲開發者提供了一套基於JQuery封裝的JavaScript UI組件庫。目前這個UI庫仍處在完善中,若是加強了用戶體驗或封裝了新的UI類型,歡迎你的貢獻!請郵件聯繫liujx@actionsoft.com.cn
瞭解每一個AWS UI組件的文檔、示例,可本地啓動AWS服務後,在瀏覽器輸入如下url訪問。
http://localhost:8088/portal/commons/js/jquery/demo/index.html
如下代碼可將JQuery、AWS基本UI加入到你的頁面中。對於部分專用UI,請參見相關示例引入特定的資源
<link rel="stylesheet" type="text/css" href="../commons/css/awsui.css"> <script type="text/javascript" src="../commons/js/jquery/scripts/jquery.js"></script> <script type="text/javascript" src="../commons/js/awsui.js"></script>
爲規範App開發者對專業變量的命名和識別,在這裏給出一個詞彙表參考。
項 | 命名參考 |
---|---|
存儲模型ID | boDefId |
表單模型ID | formDefId |
表單子表模型ID | formItemDefId |
流程模型ID | processDefId |
節點模型ID | 通用:activityDefId 特定:userTaskDefId、serviceTaskDefId.. |
報表模型ID | reportDefId |
DW模型ID | dwDefId |
各類Context對象 | 如UserContext、TaskBehaviorContext... 建議:單獨出現時命名變量爲ctx或context,同時出現多個不一樣類型的Context時,使用userContext、taskContext區分 |
登陸帳戶名 | uid、uids(多個),對應ORGUSER的USERID字段 |
單位ID | companyId |
部門ID | departmentId |
角色ID | roleId |
小組ID | teamId |
小組成員ID | teamMemberId |
項 | 命名參考 |
---|---|
流程實例ID | 建議processInstId,可使用processInstanceId |
流程實例對象 | 建議processInst,可使用processInstance |
任務實例ID | 建議taskInstId,可使用taskId、taskInstanceId |
任務實例對象 | 通用:建議taskInst,可使用task、taskInstance 特定:建議historyTaskInst,可使用historyTask、historyTaskInstance |
BO表ID | boId |
BO表與流程實例綁定 | 通用:bindId 特定:純流程驅動場景下,也可以使用processInstId |
應用的安裝、部署和運行由AWS PaaS自動化完成,但在開發階段須要開發者瞭解這些資源結構。
Web層是指部署在Web Server
(如Tomcat)的資源。AWS PaaS爲每一個App分配了獨立的目錄,被稱爲Web層根資源根目錄。
你能夠在這個目錄中規劃本身的js、css等資源結構。
//存放Web參數解析配置 %AWS-HOME%/webserver/webapps/portal/apps/%appId%/action.xml //存放css %AWS-HOME%/webserver/webapps/portal/apps/%appId%/css/ //存放js %AWS-HOME%/webserver/webapps/portal/apps/%appId%/js/ //存放圖片 %AWS-HOME%/webserver/webapps/portal/apps/%appId%/img/ //存放jsp程序(*不容許jsp直連數據庫的開發模式,使用MVC cmd開發) %AWS-HOME%/webserver/webapps/portal/apps/%appId%/jsp/ //自定義 %AWS-HOME%/webserver/webapps/portal/apps/%appId%/.../
%AWS-HOME%
是AWS PaaS的安裝根目錄%appId%
是應用的Id名App層是指部署在AWS Server
的資源。AWS PaaS爲每一個App分配了獨立的目錄,並經過安裝、卸載庫進行管理。
在開發的應用在容器倉庫裏處於install
狀態,與MVC編程相關的目錄資源以下
//存放App的配置描述 %AWS-HOME%/apps/install/%appId%/manifest.xml //存放App的LOGO %AWS-HOME%/apps/install/%appId%/icon16.png %AWS-HOME%/apps/install/%appId%/icon64.png %AWS-HOME%/apps/install/%appId%/icon96.png //存放程序編譯的jar文件和第三方類庫 %AWS-HOME%/apps/install/%appId%/lib/ //存放HTML模版 %AWS-HOME%/apps/install/%appId%/template/page/ //存放多語言資源 %AWS-HOME%/apps/install/%appId%/i18n/resource.xml
AWS MVC的開發者能夠根據本身的編程習慣選擇開發工具。
當安裝了AWS PaaS開發環境後,會爲開發者提供一個專有的開發工具。該工具基於Eclipse IDE封裝,提供了專有的擴展插件,可以更直觀、高效的進行AWS App開發。
//開發工具根目錄 %AWS-HOME%/developer/
使用AWS Developer的優勢
SVN
代碼版本管理對於熟悉AWS PaaS和App應用資源配置結構的開發者,也能夠直接使用Eclipse完成全部的任務目標。
Java普通工程
Java Build Path>Libraries
下建立aws_lib
庫,增長如下資源 %AWS-HOME%/bin/lib/*.jar(含子目錄) %AWS-HOME%/bin/jdbc/*.jar
aws-infrastructure-common.jar
的StartUp
com.actionsoft.bpms.server.AWSServer.StartUp
Working directory
目錄 %AWS-HOME%/bin
在你的團隊正式開發應用前,應得到應用開發者證書(ISV)。證書文件路徑以下
%AWS-HOME%/apps/developer.csr
微信企業號框架基於AWS MVC框架,將請求根據請求類型(URL跳轉、消息/事件)交由不一樣的Servlet處理,再根據請求的映射規則分發給相應的後端邏輯控制器進行處理。
上圖中的三個Servlet(AWS Web Server / 通常請求Servlet,WS Web Server /重定向Servlet,WS Web Server /回調Servlet),後端處理控制
(AWS App Server / Controller)和微信企業號管理平臺
是微信企業號的核心通訊框架,AWS微信App是開發者實現業務邏輯的區域,主要元素描述以下:
項 | 說明 |
---|---|
AWS Web Server | 安裝有AWS Portal的標準Servlet容器,例如:Tomcat、WebLogic |
AWS App Server | 安裝有AWS Server的應用服務器,全部的業務邏輯在這裏處理 |
通常請求Servlet | 接收URL跳轉請求,收到請求後會檢查是否帶有包含用戶認證信息的Cookie,若是包含則封裝後轉發給後端控制器,若不包含則構造微信OAuth驗證連接,重定向到下面的重定向Servlet |
重定向Servlet | 處理微信OAuth驗證請求,封裝後轉發給後端控制器,最終交由微信管理平臺處理並返回驗證結果。若是驗證經過,將驗證信息寫入Cookie,最後重定向到原始URL |
回調Servlet | 微信企業號應用的回調地址指向此處。處理微信消息/事件請求,封裝後轉發給後端控制器,再由微信管理平臺轉發到指定的AWS微信App處理請求 |
後端處理控制器 | 經過註解攔截到方法,綁定邏輯處理程序 |
微信企業號管理平臺 | 管理微信企業號應用,可爲企業號應用設置、綁定菜單和指定處理消息/事件的AWS 微信App |
AWS微信App | 實現業務邏輯,通常包含H5頁面(View視圖組裝,Model/Dao/Cache模型,Template模板),和消息/事件處理實現類。 |
下表說明了對該文檔所作出的重要更改。
類型 | 說明 | 修改日期 |
---|---|---|
首次發佈 | 這是AWS MVC框架參考指南的首次發佈 | 2015年01月22日 |