วิธีดีที่สุดในการให้ข้อมูลจำนวนมากให้ javascript คือรูปแบบ json ไม่เว้นแม้แต่ใน JoGet เพราะถึงแม้จะสามารถดึงข้อมูลจาก input หรือ grid ได้ แต่มันจะถูกบันทึกลง database ไปด้วยแถมดูรก
วิธีที่ดีอีกวิธีคือให้ beanshell ใน section ดึงข้อมูลจาก query แล้วแสดงออกมาใน input ตัวเดียว
BeanShell Create Json
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.sql.DataSource;
import org.joget.apps.app.service.AppUtil;
import org.joget.apps.form.model.Element;
import org.joget.apps.form.model.FormData;
import org.joget.apps.form.model.FormRow;
import org.joget.apps.form.model.FormRowSet;
import org.joget.apps.form.service.FormUtil;
import org.joget.commons.util.LogUtil;
import org.json.simple.JSONObject;
public FormRowSet load (Element element, String username, FormData formData) {
FormRowSet rows = new FormRowSet () ;
Connection con = null;
try {
DataSource ds = (DataSource) AppUtil.getApplicationContext () .getBean ("setupDataSource") ;
con = ds.getConnection () ;
String sql = "SELECT appId, appVersion, name FROM jwdb.app_app WHERE published = 1;";
//LogUtil.info ("BeanShell Create Json", "sql = " + sql) ;
if (!con.isClosed ()) {
PreparedStatement stmt = con.prepareStatement (sql) ;
ResultSet rs = stmt.executeQuery () ;
/* create json */
JSONObject json = new JSONObject () ;
while (rs.next ()) {
JSONObject item = new JSONObject () ;
item.put ("appVersion", rs.getObject ("appVersion")) ;
item.put ("name", rs.getObject ("name")) ;
json.put (rs.getObject ("appId") , item) ;
}
/* add json to input */
FormRow row = new FormRow () ;
rows.add (row) ;
row.put ("json", json.toString ()) ;
}
} catch (Exception e) {
LogUtil.error (getClassName () , e, "BeanShell Create Json") ;
} finally {
try {
if (con != null) {
con.close () ;
}
} catch (SQLException e) {}
}
return rows;
}
return load (element, primaryKey, formData) ;
ตัวอย่างฟอร์ม
BeanShell Create Json
{
"className": "org.joget.apps.form.model.Form",
"properties": {
"noPermissionMessage": "",
"loadBinder": {
"className": "org.joget.apps.form.lib.WorkflowFormBinder",
"properties": {}
},
"name": "BeanShell Create Json",
"description": "",
"postProcessorRunOn": "both",
"permission": {
"className": "",
"properties": {}
},
"id": "BeanShellCreateJson",
"postProcessor": {
"className": "",
"properties": {}
},
"storeBinder": {
"className": "org.joget.apps.form.lib.WorkflowFormBinder",
"properties": {}
},
"tableName": "prototypes"
},
"elements": [
{
"elements": [
{
"elements": [
{
"className": "org.joget.apps.form.lib.TextArea",
"properties": {
"readonly": "",
"validator": {
"className": "",
"properties": {}
},
"workflowVariable": "",
"id": "json",
"label": "JSON",
"placeholder": "",
"rows": "10",
"value": "",
"cols": "100",
"readonlyLabel": ""
}
}
],
"className": "org.joget.apps.form.model.Column",
"properties": {
"width": "100%"
}
}
],
"className": "org.joget.apps.form.model.Section",
"properties": {
"readonly": "",
"loadBinder": {
"className": "org.joget.apps.form.lib.BeanShellFormBinder",
"properties": {
"useAjax": "",
"cacheIdlePause": "120",
"cacheInterval": "",
"script": "import java.sql.Connection;\nimport java.sql.PreparedStatement;\nimport java.sql.ResultSet;\nimport java.sql.SQLException;\nimport javax.sql.DataSource;\nimport org.joget.apps.app.service.AppUtil;\nimport org.joget.apps.form.model.Element;\nimport org.joget.apps.form.model.FormData;\nimport org.joget.apps.form.model.FormRow;\nimport org.joget.apps.form.model.FormRowSet;\nimport org.joget.apps.form.service.FormUtil;\nimport org.joget.commons.util.LogUtil;\nimport org.json.simple.JSONObject;\n\npublic FormRowSet load (Element element, String username, FormData formData) {\n\n FormRowSet rows = new FormRowSet () ;\n\n Connection con = null;\n try {\n DataSource ds = (DataSource) AppUtil.getApplicationContext () .getBean (\"setupDataSource\") ;\n con = ds.getConnection () ;\n\n sql = \"SELECT appId, appVersion, name FROM jwdb.app_app WHERE published = 1;\";\n //LogUtil.info (\"BeanShell Create Json\", \"sql = \" + sql) ;\n\n if (!con.isClosed ()) {\n PreparedStatement stmt = con.prepareStatement (sql) ;\n ResultSet rs = stmt.executeQuery () ;\n\n /* create json */\n JSONObject json = new JSONObject () ;\n while (rs.next ()) {\n JSONObject item = new JSONObject () ;\n\n item.put (\"appVersion\", rs.getObject (\"appVersion\")) ;\n item.put (\"name\", rs.getObject (\"name\")) ;\n\n json.put (rs.getObject (\"appId\") , item) ;\n }\n\n /* add json to input */\n FormRow row = new FormRow () ;\n rows.add (row) ;\n row.put (\"json\", json.toString ()) ;\n }\n\n } catch (Exception e) {\n LogUtil.error (getClassName () , e, \"BeanShell Create Json\") ;\n } finally {\n try {\n if (con != null) {\n con.close () ;\n }\n } catch (SQLException e) {}\n }\n\n return rows;\n}\n\nreturn load (element, primaryKey, formData) ;"
}
},
"permissionReadonly": "",
"permission": {
"className": "",
"properties": {}
},
"comment": "",
"id": "section1",
"label": "BeanShell Create Json",
"storeBinder": {
"className": "",
"properties": {}
},
"readonlyLabel": ""
}
}
]
}