
JSON (JavaScript Object Notation)是一种轻量级的数据交换格式。它便于人类读写,也易于机器分析和生成。它基于标准的ECMA-262第三版(1999年12月)的JavaScript编程语言的一个子集。
JSON是一种完全独立于语言的文本格式,但是它使用对于C家族语言(包括C、C++、C#、Java、JavaScript、Perl、Python等)的编程人员来说非常熟悉的约定。这些特性使得JSON成为理想的数据交换语言。
JSON基于两种结构:
这些都是通用的数据结构。几乎所有的现代编程语言都以某种形式对它们提供支持。可与编程语言进行交换的数据格式也基于这些结构是很合理的。
JSON-RPC是一种轻量级的远程过程调用协议,它允许从Javascript进行客户-服务器交互。通用机制包含两个建立数据连接的对等体。在连接 的生存期内,对等体可以调用另一个对等体所提供的方法。要调用远程方法,就要发送请求。请求必须使用应答进行响应,除非该请求是一个通知。
这有什么好处呢?使用JSON-RPC,可以创建定制的Java对象,并可通过Javascript和Ajax实现对其方法的完全访问。此外,这些对象在会话的整个生存期中都将存留!
这需要两个库:需要驻留在服务器应用程序上的jsonrpc.jar以及jsonrpc.js,该JavaScript库应下载到客户端。
JSON-RPC-Java在构建时就考虑了安全性,并利用了J2EE现有的身份验证和会话管理特性。在应用程序自己的身份验证机制检查之后,对象才被 导出到特定的客户端,这意味着只有通过身份验证的客户端才可以调用它们有权访问的对象上的方法。可以使用JSON-RPC-Java中的回调挂钩,以便利 用JAAS确保只能使用已验证用户所拥有的权限来调用方法。
不支持使用循环引用对对象进行编组。一旦检测到循环引用,就会抛出异常。
(上面的定义来自于http://json.org。)
首先要将jsonrpc.jar下载到应用程序的APP-INF/lib目录下。该库包含了一个捕捉和处理Ajax动作的servlet。
接下来要在web.xml文件文件中配置该servlet。为此,打开web.xml(在Portal Project的WEB-INF文件夹下),找到<servlet>标签的开始处,并在第一个标签前插入一个新的标签:
<servlet>
<servlet-name>com.metaparadigm.jsonrpc.JSONRPCServlet</servlet-name>
<servlet-class>com.metaparadigm.jsonrpc.JSONRPCServlet</servlet-class>
</servlet>
现在到<servlet-mapping>标签的开始处,并在第一个标签前插入一个新的标签:
<servlet-mapping>
<servlet-name>com.metaparadigm.jsonrpc.JSONRPCServlet</servlet-name>
<url-pattern>/JSON-RPC</url-pattern>
</servlet-mapping>
接下来是要将jsonrpc.js库包含到jsp中。这将链接到一个文本文件。复制该文本并将其 粘贴到项目中一个新的JavaScript文件中,可以称之为jsonrpc.js。要确保将库导入到所有希望在其中使用jsonrpc的页面中,这可通 过在jsp的<HEAD>部分添加下面的代码行来实现:
<script type="text/javascript" src="/path/to/jsonrpc.js"</>
为了让客户端与服务器通信,需要使用<jsp:useBean>标签创建一个bridge。将下属代码行放在接近JSP顶部的某处:
<jsp:useBean id="JSONRPCBridge" scope="session"
class="com.metaparadigm.jsonrpc.JSONRPCBridge" />
然后使用该bridge注册一个对象。该对象可以是一个普通Java对象,也可以是您自己创建的对象。
<% JSONRPCBridge.registerObject("myObject",
new com.package.myobjects.MyObject()); %>
另一种替代方案是,为了与页面流通信,可以让页面流初始化一个对象,传递所需的数据,并通过页面流上的一个getter方法使该对象对JSP可用。然后在JSP上执行getData,以将该对象放在JSONRPC可以获取的pageContext上:
<netui-data:getData resultId="myObject"
value="{pageFlow.myObject}" />
<% JSONRPCBridge.registerObject("myObject",
pageContext.getAttribute("myObject")); %>
在创建一个希望用于保存会话的对象时,要确保只运行该代码一次。可以在会话的作用域内访问该对象的方法,允许您随心所欲地对其进行读写,但是如果再次使用相同的名称注册该对象,就将丢失该对象的初始实例!
在访问一个可用的页面流时,这可能不是那么重要。但是如果希望保存数据,那么要确保该代码不会运行第二次。
首先要声明一个JSONRpcClient对象的实例,将servlet的位置传递给它。确保路径正确的最佳方法是以如下方式使用ApplicationHelper.getWebAppName(request) servlet:
<script type=text/javascript language=javascript>
var jsonrpc = new
JSONRpcClient("/<%=ApplicationHelper.getWebAppName(request)%>/JSON-RPC");
</script>
这需要进行一次导入。但是它会询问您是否愿意进行导入,确保选择com.bea.p13n.management.ApplicationHelper选项。
刚刚创建的jsonrpc对象现在是到服务器的bridge的实例了。使用前面注册的对象的名称来访问其方法。例如,如果myObject对象有一个setName(String name)方法,就可以使用:
jsonrpc.myObject.setName(“Vince”);
可以注册多个方法并访问它们。如果我注册了另一个方法,myOtherObject,就可以使用:
jsonrpc.myOtherObject.setSomething(“Something”);
我发现并不是基本Java对象的所有方法都受支持。虽然String对象的使用似乎是最简单的例子,但是甚至连尝试访问字符串的值都没有结果。我的例子使用了一个使用<netui-data:getData>标签从一个可用的页面流检索得到的字符串。
在我的JavaScript中,我试图使用下述简单代码显示该字符串的内容:
alert(jsonrpc.myString);
返回不确定的结果。使用下面的代码也得到同样的结果。
alert(jsonrpc.myString.toString());
但是,下面代码却运行得很好:
alert(jsonrpc.myString.trim());
这就是我最终使用的。
评论列表