#SSJS
標記為 #SSJS · 7 篇文章
- 從 SSJS 跑 @Formula:session.evaluate 的回傳、限制,與「不能改文件」這件事
你已經有一段 Formula 邏輯——一個 @DbLookup、一段 @Name 格式化——不想在 SSJS 裡重寫一遍。session.evaluate() 讓你直接從 SSJS 跑一段 Formula 字串、把結果拿回來。但它有幾個利角:回傳的是 java.util.Vector(不是純量),公式引用到欄位時要用兩參數版把 document 傳進去,UI 類的 @functions(@Command/@Prompt/@PickList…)在裡面不能用,而且它不能改文件、只能算出結果。這篇整理 session.evaluate 的兩種寫法、回傳與限制,以及要改文件時該怎麼把結果寫回去。
2026.10.05 - XPages managed bean:給 SSJS 一個真正的 Java 物件,像 database 一樣直接用
SSJS 寫在 script library 裡當膠水很方便,但邏輯一多就難維護——沒有真正的型別、難測試、塞進 scope 還有序列化問題。managed bean 讓你在 faces-config.xml 宣告一個 Java class,它就變成 SSJS 與 EL 裡的一個頂層變數,用起來跟 database、session 一樣——bean.method()、#{bean.prop}。這篇講 managed bean 怎麼宣告(name/class/scope 三元素)、class 的三個要件(no-arg 建構子、get/set、Serializable)、scope 的生命週期,以及邏輯什麼時候該從 SSJS 搬進 bean。
2026.10.03 - partial refresh vs partial execution:XPages 的 JSF 六階段,為什麼只刷一塊卻整頁重算
你在 XPages 按一個按鈕,結果一個八竿子打不著的欄位驗證器跳出來擋你——因為預設情況下,整頁都跑了一輪 JSF 生命週期,不只你按的那塊。XPages 有兩個各自獨立的「partial」旋鈕:partial refresh(refreshMode/refreshId)管的是 client 端回傳哪塊 HTML,partial execution(execMode/execId)管的才是 server 端跑哪些元件的生命週期。這篇用 JSF 六階段講清楚兩者差別、為什麼只做 partial refresh 整頁還是在 server 重算,以及 partial execution 怎麼把 server 工作縮到一塊。
2026.10.01 - sessionAsSigner:XPages 用簽章者身分提權,簽章算誰、會踩什麼雷
XPages 給你三個全域 session:session 是當前使用者、sessionAsSigner 是 XPage 的簽章者、sessionAsSignerWithFullAccess 是簽章者再加 full access。用它讓使用者做他 ACL 上做不到的事(寫受限 DB、繞 Readers)很方便,但「簽章者到底算誰」是逐個 design element 算的——script library 用它自己的簽章者,不是 XPage 的,混簽就提權不一致。這篇講三個 session 的身分差別、簽章者怎麼認定,以及 setConvertMime、full access 那幾個會咬人的雷。
2026.09.28 - XPages 四個 scope:各活多久、該放什麼、什麼會爆
XPages 有 requestScope/viewScope/sessionScope/applicationScope 四個 scope,壽命從「一個請求」到「整個應用」差很多。挑錯 scope,值會莫名消失或跨使用者互相汙染;而最會咬人的是——scope 會被序列化寫到磁碟,把 NotesDocument、NotesView 或 SSJS function 塞進去,遲早噴 NotSerializableException。這篇講清楚四個 scope 各活多久、名稱怎麼由窄到寬解析、什麼能放什麼不能放,以及該存 UNID/view 名而不是物件本身。
2026.09.27 - Domino IQ 逾時的 Java 解法:LLMReq.completionStream,以及 XPages SSJS 怎麼調用它
昨天那篇用 LotusScript 的 CompletionStream 突破了 Domino IQ 的 5 分鐘逾時;如果你的程式是 Java(agent、bean)或 XPages(SSJS),撞到的是同一個逾時。這篇給 Java 版:LLMReq.completionStream 搭配 CompletionStreamCallback 介面(回傳 Continue/Stop 控制串流),以及一個關鍵事實——SSJS 沒有原生的 LLM class,但 SSJS 的 session 就是 lotus.domino.Session,所以你可以直接調用 Java API,或把串流包成 Java class 再從 SSJS 引用。附三種語言一張對照表。
2026.09.06 - XPages/SSJS:直接用 java.util.Vector 操作多值欄位
LotusScript 沒有 removeElementAt、刪一個多值元素得重建陣列;SSJS 剛好相反——它跑在 Java 上,多值欄位讀進來就是一個 java.util.Vector,addElement/removeElementAt/insertElementAt 整套 API 現成可用,改完用 replaceItemValue 寫回。這篇拆解怎麼用 Vector 操作多值、倒著刪的原理、以及兩個一定會踩的雷(空欄位的 [""]、getValue 的型別)。
2026.08.12