傳統 HTML/HTTP 模式缺乏狀態、組件有限、瀏覽器不一致。RIA(Rich Internet Applications)結合 C/S 易用性與 B/S 部署優勢。主流三強:
安裝順序:JDK → Tomcat → OpenLaszlo → Eclipse WTP → Laszlo IDE(透過 Update Manager 安裝 laszloIDE.zip)。
工單管理系統 (WOM):員工提交維修工單,維護人員查看/更新/關閉。
建立 fms 專案,配置 Tomcat 5.0 運行時(必須指向 JDK 而非 JRE,因 JSP 需編譯器)。
public class WorkOrderService {
public WorkOrder[] findAllWorkOrders() { ... }
public int createWorkOrder(String contact, String phone, String email,
String description, String building, String floor, int severity) { ... }
public Building[] getBuildings() { ... } // 返回類型化陣列而非 List
}
DTO (WorkOrder, Building, Floor) 必須有無參構造函數供 XML 封送使用。
右鍵類別 → New → Web Service → 勾選「Generate proxy、Test、Monitor」 → 發布為 SOAP 服務。Eclipse 自動生成 WSDL、測試客戶端、TCP/IP 監視器。
Export → WAR file → 複製 fms.war 至 <OpenLaszlo>/Server/tomcat-5.0.24/webapps → 啟動 LPS。
index.lzx:主頁,含 Logo、<splash/> 進度條、引入 menu.lzx。menu.lzx:<dataset> 定義導航資料,<tree> 組件綁定資料,onactivate 事件跳轉頁面。createWork.lzx:工單表單,<combobox> 綁定樓宇/樓層資料集,<edittext> 輸入欄位,<slider> 嚴重度,<button> 提交。viewWork.lzx:<grid> 顯示工單列表,<gridcolumn> 含狀態下拉框、備註多行輸入框。<combobox id="bl" onselect="getFloors(this.getValue())">
<textlistitem datapath="location:/locations[1]/building" text="$path{'@name'}" value="$path{'@id'}"/>
</combobox>
<script>
function getFloors(bl) {
fl = 'location:/locations[1]/building[@id=\''+bl+'\']/floor';
this.fl_id.setAttribute('datapath', fl);
}
</script>
<dataset name="location"/>
<soap name="WorkOrderService" wsdl="https://localhost:8080/fms/wsdl/WorkOrderService.wsdl" autoload="true">
<remotecall name="getBuildings" funcname="getBuildings" dataobject="location">
<method event="ondata" args="value">debug.write(location.serialize());</method>
</remotecall>
<method event="onload">WorkOrderService.getBuildings.invoke();</method>
<method event="onerror" args="error">debug.write('error:', error);</method>
</soap>
serialize() 可將返回的原始 XML 格式化輸出至偵錯視窗,輔助理解數據結構(如 getBuildingsReturn 包裝器)。
<remotecall name="createWorkOrder" funcname="createWorkOrder">
<param value="${contact.text}"/>
<param value="${phone.text}"/>
<param value="${email.text}"/>
<param value="${description.text}"/>
<param value="${bl.text}"/>
<param value="${fl.text}"/>
<param value="${severity.value}"/>
<method event="ondata" args="value">debug.write('New ID = ' + value);</method>
</remotecall>
<button onclick="WorkOrderService.createWorkOrder.invoke()"/>
參數順序必須與 WSDL 定義一致。OpenLaszlo 要求服務至少返回一個值,不可為 void。
<canvas debug="true"> 開啟偵錯視窗。debug.write("msg") 輸出日誌。Run As → Laszlo Application 即時預覽。File → Export → Laszlo WAR File → 選擇專案與輸出路徑。WAR 包含所有依賴(JAR、組件、DTD、CSS、Flash/HTML),可部署至任意 Java Web 容器。
OpenLaszlo 提供了開源、標準化、工具化的 RIA 開發路徑: