var data = eval('[{"title":"测试标题","name":"张三","address":"大连"},{"title":"测试标题123","name":"张三123","address":"大连123"}];');
var o = eval(data);//将json字符串转换成js对象
for (var i in o) {//循环json对象数组
for (var key in o[i]) {//循环json对象中的属性和值
alert("field:" + key + ", value:" + o[i][key]);
}
}
http://antwerkz.com/glassfish-web-sockets-sample/
1 /*
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
3 *
4 * Copyright (c) 2010-2011 Oracle and/or its affiliates. All rights reserved.
5 *
6 * The contents of this file are subject to the terms of either the GNU
7 * General Public License Version 2 only ("GPL") or the Common Development
8 * and Distribution License("CDDL") (collectively, the "License"). You
9 * may not use this file except in compliance with the License. You can
10 * obtain a copy of the License at
11 * https://glassfish.dev.java.net/public/CDDL+GPL_1_1.html
12 * or packager/legal/LICENSE.txt. See the License for the specific
13 * language governing permissions and limitations under the License.
14 *
15 * When distributing the software, include this License Header Notice in each
16 * file and include the License file at packager/legal/LICENSE.txt.
17 *
18 * GPL Classpath Exception:
19 * Oracle designates this particular file as subject to the "Classpath"
20 * exception as provided by Oracle in the GPL Version 2 section of the License
21 * file that accompanied this code.
22 *
23 * Modifications:
24 * If applicable, add the following below the License Header, with the fields
25 * enclosed by brackets [] replaced by your own identifying information:
26 * "Portions Copyright [year] [name of copyright owner]"
27 *
28 * Contributor(s):
29 * If you wish your version of this file to be governed by only the CDDL or
30 * only the GPL Version 2, indicate your decision by adding "[Contributor]
31 * elects to include this software in this distribution under the [CDDL or GPL
32 * Version 2] license." If you don't indicate a single choice of license, a
33 * recipient has the option to distribute your version of this file under
34 * either the CDDL, the GPL Version 2 or to extend the choice of license to
35 * its licensees as provided above. However, if you add GPL Version 2 code
36 * and therefore, elected the GPL Version 2 license, then the option applies
37 * only if the new code is made subject to such option by the copyright
38 * holder.
39 */
40
41 package com.sun.grizzly.samples.websockets;
42
43 import com.sun.grizzly.tcp.Request;
44 import com.sun.grizzly.websockets.ProtocolHandler;
45 import com.sun.grizzly.websockets.WebSocket;
46 import com.sun.grizzly.websockets.WebSocketApplication;
47 import com.sun.grizzly.websockets.WebSocketException;
48 import com.sun.grizzly.websockets.WebSocketListener;
49
50 public class ChatApplication extends WebSocketApplication {
51 @Override
52 public WebSocket createWebSocket(ProtocolHandler protocolHandler, WebSocketListener... listeners) {
53 return new ChatWebSocket(protocolHandler, listeners);
54 }
55
56 @Override
57 public boolean isApplicationRequest(Request request) { //判断是否websocket应用
58 final String uri = request.requestURI().toString();
59 return uri.endsWith("/chat");
60 }
61
62 @Override
63 public void onMessage(WebSocket socket, String text) { //收到从客户端来的消息 ,WebSocket socket, String text已经实例化
64 if (text.startsWith("login:")) {
65 login((ChatWebSocket) socket, text);
66 } else {
67 broadcast(((ChatWebSocket) socket).getUser() + " : " + text); //消息处理消耗方式
68 }
69 }
70
71 private void broadcast(String text) { / //将消息广播
72 WebSocketsServlet.logger.info("Broadcasting : " + text);
73 for (WebSocket webSocket : getWebSockets()) { // WebSocketApplication类下面的方法:protected Set<WebSocket>getWebSockets() Returns a set of WebSocket
s, registered with the application. The returned set is unmodifiable, the possible modifications may cause exceptions.
74 if (!webSocket.isConnected()) {
75 continue;
76 }
77 try {
78 send((ChatWebSocket) webSocket, text);
79 } catch (WebSocketException e) {
80 e.printStackTrace();
81 WebSocketsServlet.logger.info("Removing chat client: " + e.getMessage());
82 webSocket.close();
83 }
84 }
85 }
86
87 private void login(ChatWebSocket socket, String frame) {
88 if (socket.getUser() == null) {
89 WebSocketsServlet.logger.info("ChatApplication.login");
90 socket.setUser(frame.split(":")[1].trim()); //刚登陆,设置ChatWebSocket的用户名字,自己定义的类,并在所有socket广播
91 broadcast(socket.getUser() + " has joined the chat.");
92 }
93 }
94
95 public void send(ChatWebSocket webSocket, String data) {
96 webSocket.send(toJsonp(webSocket.getUser(), data));//send(String data) Write the data to the socket. //将消息发给客户端,每个websocket都发送一份。
97 }
98
99 private String toJsonp(String name, String message) {
100 return "window.parent.app.update({ name: \"" + escape(name) + "\", message: \"" + escape(message) + "\" });\n";
101 }
102
103 private String escape(String orig) {
104 StringBuilder buffer = new StringBuilder(orig.length());
105
106 for (int i = 0; i < orig.length(); i++) {
107 char c = orig.charAt(i);
108 switch (c) {
109 case '\b':
110 buffer.append("\\b");
111 break;
112 case '\f':
113 buffer.append("\\f");
114 break;
115 case '\n':
116 buffer.append("<br />");
117 break;
118 case '\r':
119 // ignore
120 break;
121 case '\t':
122 buffer.append("\\t");
123 break;
124 case '\'':
125 buffer.append("\\'");
126 break;
127 case '\"':
128 buffer.append("\\\"");
129 break;
130 case '\\':
131 buffer.append("\\\\");
132 break;
133 case '<':
134 buffer.append("<");
135 break;
136 case '>':
137 buffer.append(">");
138 break;
139 case '&':
140 buffer.append("&");
141 break;
142 default:
143 buffer.append(c);
144 }
145 }
146
147 return buffer.toString();
148 }
149}
41package com.sun.grizzly.samples.websockets;
42
43import com.sun.grizzly.websockets.DefaultWebSocket;
44import com.sun.grizzly.websockets.ProtocolHandler;
45import com.sun.grizzly.websockets.WebSocketListener;
46
47public class ChatWebSocket extends DefaultWebSocket {
48 private String user;
49
50 public ChatWebSocket(ProtocolHandler handler, WebSocketListener[] listeners) {
51 super(handler, listeners);
52 }
53
54 public String getUser() {
55 return user;
56 }
57
58 public void setUser(String user) {
59 this.user = user;
60 }
61}
41package com.sun.grizzly.samples.websockets;
42
43import com.sun.grizzly.websockets.WebSocketEngine;
44
45import javax.servlet.ServletConfig;
46import javax.servlet.ServletException;
47import javax.servlet.http.HttpServlet;
48import java.util.logging.Logger;
49
50public class WebSocketsServlet extends HttpServlet {
51 static final Logger logger = Logger.getLogger(WebSocketEngine.WEBSOCKET);
52 private final ChatApplication app = new ChatApplication();
53
54 @Override
55 public void init(ServletConfig config) throws ServletException {
56 WebSocketEngine.getEngine().register(app);
///生命周期函数 init(ServletConfig config) Called by the servlet container to indicate to a servlet that the servlet is being placed into service.
java.lang.Object javax.servlet.GenericServlet 里面init()
ava.lang.Object javax.servlet.GenericServlet
javax.servlet.http.HttpServlet/
void init() A convenience method which can be overridden so that there's no need to call super.init(config).
void init(ServletConfig config) Called by the servlet container to indicate to a servlet that the servlet is being placed into service.
-
Called by the servlet container to indicate to a servlet that the servlet is being placed into service. See
Servlet#init
.This implementation stores the
ServletConfig
object it receives from the servlet container for later use. When overriding this form of the method, callsuper.init(config)
. -
-
Parameters:
-
config
- theServletConfig
object that contains configutation information for this servlet
Throws:
-
ServletException
- if an exception occurs that interrupts the servlet's normal operation
See Also:
-
UnavailableException
-
http://docs.oracle.com/javaee/6/api/
57 }
58
59 @Override
60 public void destroy() {
61 WebSocketEngine.getEngine().unregister(app);
62 }
63}
客户端代码:
That does it for the server side. On the client side we have the usual mix of HTML and javascript. I don't want to go in to
depth on most of that but I do want to take a look at one particular piece. In application.js, we have this code:
var app = {
url: 'ws://localhost:8080/grizzly-websockets-chat/chat',
initialize: function() { //初始化函数
if ("WebSocket" in window) {// ?
$('login-name').focus(); // jQuery 事件 - focus() 方法,当输入框获得焦点时
app.listen(); // 见下面自己定义的函数
} else {
$('missing-sockets').style.display = 'inherit';
$('login-name').style.display = 'none';
$('login-button').style.display = 'none';
$('display').style.display = 'none';
}
},
listen: function() {
$('websockets-frame').src = app.url + '?' + count;
count ++;
},
login: function() { //用户登录
name = $F('login-name');
if (! name.length > 0) {
$('system-message').style.color = 'red';
$('login-name').focus();
return;
}
$('system-message').style.color = '#2d2b3d';
$('system-message').innerHTML = name + ':'; //
$('login-button').disabled = true;
$('login-form').style.display = 'none';
$('message-form').style.display = '';
websocket = new WebSocket(app.url); //见上面自己定义的url
websocket.onopen = function() {
// Web Socket is connected. You can send data by send() method
websocket.send('login:' + name); //发给服务器侧
};
websocket.onmessage = function (evt) { //当接受到服务器侧的消息时触发此事件
eval(evt.data); ///见备注,将数据由json格式转换为js对象格式
$('message').disabled = false;
$('post-button').disabled = false;
$('message').focus();
$('message').value = '';
};
websocket.onclose = function() { ///关闭时触发此事件
var p = document.createElement('p');
p.innerHTML = name + ': has left the chat';
$('display').appendChild(p);
new Fx.Scroll('display').down();
};
},
post: function() { //发送消息的函数代码
var message = $F('message');
if (!message > 0) {
return;
}
$('message').disabled = true;
$('post-button').disabled = true;
websocket.send(message); //发送消息
},
update: function(data) { //更新显示
if (data) {
var p = document.createElement('p');
p.innerHTML = data.name + ': ' + data.message;
$('display').appendChild(p);
new Fx.Scroll('display').down();
}
}
};
备注;
jquery 关于eval 取字符串