2012-03-28 35 views
7

Tôi đã sử dụng nhiều đối tượng JSON trong applicationScope, sessionScope và viewScope để theo dõi dữ liệu liên quan. Viết và đọc những trong SSJS là rất đơn giản: `Làm cách nào để thêm một đối tượng JSON vào một biến có phạm vi trong Java?

//Create a app scope variable 
applicationScope.put("myvarname", {p1:"part 1", p2:"part2"}); 

// read and use the app scope variable ... 
var myvar = applicationScope.get("myvarname"); 
//Work with parts as myvar.p1, myvar.p2, etc... 

Trong đoạn mã Java Tôi đã được viết Tôi đã học được cách đọc các biến này đã được viết bằng SSJS sử dụng gói com.ibm.jscript.std.ObjectObject với mã như thế này:

ObjectObject myvar = (ObjectObject) ExtLibUtil 
     .getApplicationScope().get(dbkey); 
FBSValue localFBS = myvar.get("p1"); 
String myp1 = localFBS.stringValue(); 
localFBS = myvar.get("p2"); 
String myp2 = localFBS.stringValue(); 

Bây giờ, tất nhiên, tôi muốn viết một entry mới sử dụng Bean Java mà sau đó có thể được đọc bởi SSJS và đậu Java khác theo cách tương tự. Tôi quản lý để viết vào phạm vi bằng cách sử dụng một bản đồ và một Hashtable, nhưng những tai nạn logic khi cố gắng đọc bằng cách sử dụng ObjectObject.

Vì vậy, làm thế nào tôi sẽ đi về việc xây dựng một mục mới trong phạm vi bằng cách sử dụng các gói ObjectObject và/hoặc FBSValue? Tôi không thể tìm thấy cách tạo ra một FBSValue mới mà sau đó có thể được thêm vào một ObjectObject. Tôi chắc chắn đó là một điều đơn giản mà một Newbs như tôi đã bỏ qua.

/Newbs

Trả lời

6

Bạn có thể xây dựng một ObjectObject rỗng, cư nó với FBSValues, và chỉ cần đặt nó trực tiếp vào phạm vi bản đồ:

ObjectObject myvar = new ObjectObject(); 
try { 
    myvar.put("p1", FBSUtility.wrap("part 1")); 
    myvar.put("p2", FBSUtility.wrap("part 2")); 
} catch (InterpretException e) { 
    e.printStackTrace(); 
} 
Map<String, Object> applicationScope = ExtLibUtil.getApplicationScope(); 
applicationScope.put("myvarname", myvar); 

Khi lấy nó sau này (như trong ví dụ mà bạn cung cấp), SSJS sẽ xem nó như JSON, Java sẽ thấy nó chính xác như nó được lưu trữ.

Nếu bạn cần lưu trữ phân cấp sâu hơn, bạn có thể đặt các thể hiện của ArrayObject và ObjectObject bên trong ObjectObject ngoài nguyên thủy, vì vậy, giống như JSON, bạn có thể lồng chúng sâu như bạn cần.

Chỉ cần đảm bảo chỉ bao gồm đúng JSON (chuỗi, số, boolean, mảng, đối tượng) nếu bạn sẽ lưu trữ nó ở bất kỳ đâu cao hơn requestScope; cụ thể, FunctionObject không triển khai Serializable, do đó, JSON an toàn để lưu trữ, JavaScript thì không. Nói đúng ra, điều này chỉ trở nên độc hại khi được lưu trữ trong viewScope trong 8.5.2 và 8.5.3 (và thậm chí sau đó, chỉ khi tùy chọn kiên trì của ứng dụng không được đặt để giữ tất cả các trang trong bộ nhớ). Nhưng nếu IBM từng hỗ trợ cluster, thì tất cả các đối tượng được lưu trữ trong sessionScope và applicationScope sẽ cần serializable để cho phép truyền tải trạng thái giữa máy chủ ... vì vậy, vì lợi ích của việc thiết kế trong tương lai, nó là khôn ngoan để giữ điều này nguyên tắc cho bất kỳ thứ gì được lưu trữ lâu hơn thời lượng của một yêu cầu.

+0

Cảm ơn Tim, tôi biết bạn đã có câu trả lời. Công cụ FBS này dường như có rất nhiều công dụng. Vậy "FBS" là gì và nó có thể được ghi chép ở đâu? – Newbs

+1

FBS là viết tắt của "framebuilder script"; trước khi nó là một phần của XPages (và thậm chí trước khi XPages được gọi là XFaces), công cụ SSJS là một phần của FrameBuilder, mà IBM đã mua để sử dụng trong Workplace. Khi nơi làm việc trôi dạt, họ cố gắng xác định những gì có thể được tận dụng để sử dụng ở nơi khác. XFaces rõ ràng đã có một số giá trị, vì vậy họ đã cố gắng thêm nó vào Domino ... và chúng tôi đang ở đây. Không ngạc nhiên, tuy nhiên, FBSValue và hậu duệ của nó không được bao gồm trong thành phần Javadoc: http://public.dhe.ibm.com/software/dw/lotus/Domino-Designer/JavaDocs/XPagesExtAPI/8.5.2/index.html –

Các vấn đề liên quan