AJAX, JSON, JSP ¸¦ »ç¿ëÇÑ Ã¤Æà ÇÁ·Î±×·¥ÀÇ
°³¿ä
µ¥ÀÌÅͺ£À̽º¿Í ¿¬µ¿ÇÏÁö ¾Ê°í ¼¹öÃøÀÇ Vector°´Ã¼¿¡ ÀÌ¿ëÀÚÀÇ ¸Þ½ÃÁö¸¦ ¼ø¼´ë·Î ÀúÀåÇÏ¸é¼ ¸Þ½ÃÁö¿¡ ¼ø¹øÀ» ÁöÁ¤ÇÏ¿© ¼³Á¤ÇØ µÐ´Ù. Ŭ¶óÀ̾ðÆ®´Â AJAX¿Í ŸÀ̸Ӹ¦ ÀÌ¿ëÇÏ¿© 2Ãʸ¶´Ù JSP¿¡ ¿äûÀ» Çϰųª ¸Þ½ÃÁö¸¦ ÀÔ·ÂÇÏ°í ¿£Å͸¦ Ãļ ¿äûÀ» ÇÒ ¼ö ÀÖ´Ù. Ŭ¶óÀ̾ðÆ®°¡ ¿äûÇÒ ¶§´Â ¼¹öÃø¿¡¼ ¸Þ½ÃÁö¸¦ Àü´ÞÇÒ ¶§ Àü´ÞÇß´ø ¸Þ½ÃÁö ID¸¦ ´Ù½Ã Àü¼ÛÇÏ¿© ÇöÀç Ŭ¶óÀ̾ðÆ®°¡ °¡Áö°í ÀÖ´Â ¸Þ½ÃÁö¿Í ¼¹ö¿¡ ÀÖ´Â ¸Þ½ÃÁö°¡ ¾ó¸¶³ª Â÷ÀÌ°¡ ÀÖ´ÂÁö È®ÀÎÇÒ ¼ö ÀÖ´Ù. ¼¹ö´Â Ŭ¶óÀ̾ðÆ®¿¡¼ Àü¼ÛµÈ Ŭ¶óÀ̾ðÆ®ÃøÀÇ ÇöÀç ¸Þ½ÃÁö ID¸¦ È®ÀÎÇÏ¿© ±× ÀÌÈÄÀÇ ¸Þ½ÃÁö¸¦ ¸ðµÎ ¼±ÅÃÇÏ¿© ÇØ´ç Ŭ¶óÀ̾ðÆ®¿¡°Ô Àü¼ÛÇÒ ¼ö ÀÖ´Ù.
Ŭ¶óÀ̾ðÆ®¿Í ¼¹ö°£ÀÇ ¸Þ½ÃÁö´Â JSON¹è¿À» ¹®ÀÚ¿(jsonObj.toJSONString())·Î Ç¥ÇöÇÏ¿© ÅؽºÆ® »óÅ·ΠÀü¼ÛÇÏ°í ±× ÅؽºÆ®¸¦ ¹ÞÀº ¼¹ö³ª Ŭ¶óÀ̾ðÆ®´Â ´Ù½Ã JSON °´Ã¼·Î º¯È¯ÇÏ¿© Æí¸®ÇÏ°Ô ¼Ó¼ºÀ» ÃßÃâÇÒ ¼ö ÀÖ´Ù.
Ŭ¶óÀ̾ðÆ®°¡ ¼¹ö·Î Àü¼ÛÇÏ´Â ¸Þ½ÃÁö´Â JSONObject ÀÇ ¹®ÀÚ¿ Ç¥ÇöÀÌ°í, ¼¹öÃø¿¡¼ Ŭ¶óÀ̾ðÆ®ÃøÀ¸·Î ÀÀ´äÇÏ´Â ¸Þ½ÃÁö´Â JSONArrayÀÇ ¹®ÀÚ¿ Ç¥ÇöÀÌ´Ù. XML¹®¼ ¾È¿¡ JSON¹®ÀÚ¿À» Æ÷ÇÔÇÒ ¶§ <![CDATA[ JSON String ]]> Ç¥ÇöÀ» »ç¿ëÇß´Ù.
Ŭ¶óÀ̾ðÆ® Ãø¿¡¼ JSON°´Ã¼¸¦ ÅؽºÆ® Ç¥ÇöÀ¸·Î ÃßÃâÇϱâ À§Çؼ json2.js ¸¦ »ç¿ëÇÏ°í, ¼¹öÃø¿¡¼ JSON¹®ÀÚ¿À» ÆĽÌÇÒ ¸ñÀûÀ¸·Î json-simple ¶óÀ̺귯¸®¸¦ »ç¿ëÇß´Ù. xhr.js´Â XMLHttpRequest°´Ã¼¸¦ »ý¼ºÇϱâ À§ÇÑ ÀÚ¹Ù½ºÅ©¸³Æ® ÇÔ¼ö¸¦ Á¤ÀÇÇß´Ù.
¼¹öÃø¿¡¼ Vector¿¡ ÀÌ¿ëÀÚÀÇ ¸Þ½ÃÁö¸¦ ÀúÀåÇÒ ¶§ ÃÖ´ë 100°³¸¸ ÀúÀåÇÏ°í ±× ÀÌ»óÀÇ ¸Þ½ÃÁö°¡ µé¾î¿À¸é ¿À·¡µÈ ¸Þ½ÃÁöºÎÅÍ »èÁ¦ÇÏ´Â ¹æ¹ýÀ» »ç¿ëÇÏ¿© ¸Þ½ÃÁö°¡ ¹«ÇÑÁ¤ ¸Þ¸ð¸®¸¦ Â÷ÁöÇÏ´Â À§Ç輺À» ¹æÁöÇÏ·Á°í Çß´Ù. Áß¿äÇÑ ¸Þ½ÃÁöÀÏ °æ¿ì¿¡´Â ±×³É ¸Þ½ÃÁö¸¦ »èÁ¦ÇÒ °ÍÀÌ ¾Æ´Ï¶ó DB¿¡ ¹é¾÷ÇØ µÎ°í Vector¿¡¼´Â »èÁ¦ÇÏ´Â ¹æ¹ýÀ¸·Î º¸¿ÏÇÒ ¼ö ÀÖ´Ù°í »ý°¢ÇÑ´Ù.
json2.js xhr.js json_simple-1.1.jar
chat_client.html
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>AJAX Chat Client</title>
<style>
#chat_msg { font-family: fantasy; }
</style>
<script type="text/javascript" src="xhr.js"></script>
<script type="text/javascript" src="json2.js"></script>
<script type="text/javascript">
var getReq = createRequest();
var sendReq = createRequest();
var msgid = 0;
var timerId = 0;
/* ¸Þ½ÃÁöÀԷ¶õ¿¡ ÀÔ·ÂµÈ ¸Þ½ÃÁö¸¦ JSON¹®ÀÚ¿·Î º¯È¯ÇÏ¿© ¼¹ö·Î Àü¼Û*/
function send(){
var sm = form1.send_msg.value;
if(sm==''){
alert("ÀÔ·ÂÇÑ ¸Þ½ÃÁö°¡ ¾ø½À´Ï´Ù");
form1.send_msg.focus();
return;
}
var url = "chat_server.jsp";
sendReq.open("POST", url, true);
sendReq.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
sendReq.onreadystatechange = sendResultHandler;
var jobj = {};
jobj.msgid=msgid;
jobj.content=sm;
var params = jobj.toJSONString();
clearTimeout(timerId);
sendReq.send("msg="+params);
form1.send_msg.value='';
}
/* ¸Þ½ÃÁöÀÔ·ÂÈÄ ¿£ÅÍÅ°¸¦ Ä£ °æ¿ì ÆûÀÇ Àü¼ÛÀ» ¸·°í send()È£Ãâ */
function keyDownHandler(e){
if(window.event.keyCode==13) {
if(window.event) event.returnValue = false;
else e.preventDefault();
send();
}
}
/* ÇÁ·Î±×·¥ ½ÃÀ۽à 2ÃÊÈÄ¿¡ getChatText()È£ÃâÇÏ¿© ¼¹ö»óÀÇ ÃÖ±Ù ¸Þ½ÃÁö ID¸¦ °¡Á®¿È*/
function onLoadHandler(){
form1.send_msg.focus();
timerId = window.setTimeout("getChatText()", 2000);
}
/* ÁÖ±âÀûÀ¸·Î È£ÃâµÇ¾î »õ·Î¿î ¸Þ½ÃÁö¸¦ °¡Á®¿È */
function getChatText(){
var jsonObj = {};
jsonObj.msgid=msgid;
var url = "chat_server.jsp?msg="+jsonObj.toJSONString();
getReq.open("GET", url, true);
getReq.onreadystatechange = msgReceivedHandler;
getReq.send(null);
}
/* getChatText()À¸·Î ¿äû°á°ú·Î ¼¹öÃø ÀÀ´äÀÌ µµÂøÇßÀ» ¶§ µ¥ÀÌÅÍ Ã³¸®*/
function msgReceivedHandler(){
if(getReq.readyState==4 && getReq.status==200){
var xmlDoc = getReq.responseXML;
var jsonStr = null;
if(xmlDoc!=null){
try{
jsonStr = xmlDoc.documentElement.firstChild.nodeValue;
}catch(xmlDocNull){/*alert(jsonStr); */}
}
if(jsonStr!=null && jsonStr.length!=0) {
var jsonArray = eval('('+jsonStr+')');
var jsonObj = null;
for(var i=0;i<jsonArray.length;i++){
jsonObj = jsonArray[i];
if(jsonObj.content==null)break;
var div = document.getElementById("chat_msg");
div.innerHTML += jsonObj.userId+": "+jsonObj.content+"<br/>";
div.scrollTop = div.scrollHeight;
}
msgid = jsonObj.msgid;
}
timerId = setTimeout("getChatText()",2000);
}
}
/* ¸Þ½ÃÁöÀÔ·Â ÈÄ ¿£Åͳª ¹öÆ°À» ´·¯¼ send()¸Þ¼ÒµåÀÇ ¿äû°á°ú */
function sendResultHandler(){
if(sendReq.readyState==4 && sendReq.status==200){
clearTimeout(timerId);
getChatText();
}
}
</script>
<style type="text/css">
#chat_msg {
width:99%; height:99%; overflow: auto;
background-color: #eeeeee; text-align: left;
font-size: 9pt;
margin-bottom: 20px;
}
div.outer {
background-color:#dddddd;
border-color 1px solid black;
width:460px; height:400px;
text-align: center;
}
input.chatbox { width:340px; }
</style>
</head>
<body onLoad="onLoadHandler();"><br/><br/><center>
<div class="outer">
<div id="chat_msg"></div>
<form name="form1">
¸Þ½ÃÁö <input class="chatbox" type="text" name="send_msg" onKeyDown="keyDownHandler(event);"/>
<input type="button" value="Àü ¼Û" onClick="send();"/>
</form>
</div>
</center>
</body>
</html>
chat_server.jsp
<?xml version="1.0" encoding="utf-8"?>
<%@page import="java.util.*"%>
<%@page import="chat.*"%>
<%@ page contentType="text/xml; charset=utf-8" pageEncoding="EUC-KR"%>
<jsp:useBean id="chatMgr" class="chat.ChatMgr" scope="session">
<jsp:setProperty name="chatMgr" property="servletContext" value="<%=application%>"/>
</jsp:useBean>
<jsp:setProperty name="chatMgr" property="request" value="<%=request%>"/>
<%
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache");
%>
<msgs>
<![CDATA[${sessionScope.chatMgr.resMsg}]]>
</msgs>
ChatMgr.java
package chat;
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import org.json.simple.*;
public class ChatMgr {
private static Vector<MsgBean> msgList;
//private int lastMsgId;
private HttpServletRequest request;
private ServletContext servletContext;
public ChatMgr() {}
public void setServletContext(ServletContext servletContext) {
this.servletContext = servletContext;
synchronized(servletContext){
if(servletContext.getAttribute("msgList") == null){
msgList = new Vector<MsgBean>();
MsgBean mb = new MsgBean(1,"äÆÃÀÌ ½ÃÀ۵Ǿú½À´Ï´Ù","Admin");
msgList.add(mb);
servletContext.setAttribute("msgList", msgList);
}
}
msgList = (Vector<MsgBean>)servletContext.getAttribute("msgList");
}
public String getResMsg(){
String msg = request.getParameter("msg");
String jarrStr = null;
if(msg!=null && !msg.equals("")) {
long userLast = this.addMsg(msg);
if(userLast>=0) {
try{
jarrStr = this.getMsgAfterLast(msg);
}catch(Exception e){e.printStackTrace();}
}
}
return jarrStr;
}
/** JSON ¹®ÀÚ¿À» ¹Þ¾Æ¼ MsgBean¿¡ ÀúÀåÇÏ°í MsgBeanÀº Vector¿¡ ÀúÀå
* @param msg: ÀÌ¿ëÀÚ°¡ Àü´ÞÇÑ ¸Þ½ÃÁö·Î¼ JSON ¹®ÀÚ¿
* @return ÀÌ¿ëÀÚȸ鿡 Ãâ·ÂµÈ ¸¶Áö¸· ¸Þ½ÃÁö ¹øÈ£¸¦ ¸®ÅÏÇÑ´Ù.
* ¸¸¾à msg¿¡ °ªÀÌ ¾øÀ¸¸é -1À» ¸®ÅÏÇÑ´Ù
*/
public long addMsg(String msg){
if(msg==null || msg.equals("")) return -1;
JSONObject jobj = (JSONObject)JSONValue.parse(msg);
long userLast = (Long)jobj.get("msgid");
String content = (String)jobj.get("content");
if(content==null || content.equals("")) return userLast;
String ip = request.getRemoteAddr();
/*100°³ ±îÁö¸¸ ¸Þ½ÃÁö¸¦ ÀúÀåÇÏ°í ÃÊ°úÇÒ °æ¿ì ¿À·¡µÈ ¸Þ½ÃÁö¸¦ »èÁ¦ÇÑ´Ù */
synchronized(servletContext){
while(msgList.size()>=100){
msgList.remove(0);
}
}
HttpSession session = request.getSession();
String userId = (String)session.getAttribute("userId");
if(userId==null) userId = ip; // ·Î±×ÀÎÇÏÁö ¾Ê¾Ò´Ù¸é IPÁÖ¼Ò·Î ´ë½Å
synchronized(servletContext){
int msgid = msgList.get(msgList.size()-1).getMsgid()+1;
msgList.add(new MsgBean(msgid,content,ip,userId));
}
return userLast;
}
/**
* ÀÌ¿ëÀÚÀÇ È¸é¿¡ Ãâ·ÂµÈ ¸¶Áö¸· ¸Þ½ÃÁö ¹øÈ£¸¦ ¹Þ¾Æ¼ ±× ÀÌÈÄÀÇ ¸Þ½ÃÁö¸¦
* JSON¹®ÀÚ¿ ¹è¿·Î ¸®ÅÏÇÑ´Ù
* @param userLast
* @return
*/
public String getMsgAfterLast(String msg){
if(msgList.size()==0) return null;
JSONObject usrObj = (JSONObject)JSONValue.parse(msg);
long userLast = (Long)usrObj.get("msgid");
/* äÆÿ¡ Á¢¼ÓÇÏ¿© ù ¿äûÀÎ °æ¿ì
* °¡Àå ÃÖ±ÙÀÇ ¸Þ½ÃÁö ID¸¦ ºê¶ó¿ìÀú¿¡ Àü¼ÛÇÑ´Ù
*/
if(userLast==0) {
JSONArray jarr = new JSONArray();
JSONObject jobj = new JSONObject();
jobj.put("msgid", msgList.get(msgList.size()-1).getMsgid());
//jobj.put("content", msgList.get(msgList.size()-1).getContent());
//jobj.put("ip", request.getRemoteAddr());
jarr.add(jobj);
return jarr.toJSONString();
}
String jsonStr = "";
JSONArray jarr = new JSONArray();
long i = 0;
for(i=msgId2Index(userLast)+1;i<msgList.size();i++){
MsgBean mb = (MsgBean)msgList.get((int)i);
JSONObject jobj = new JSONObject();
jobj.put("msgid",mb.getMsgid());
jobj.put("content",mb.getContent());
jobj.put("userId", mb.getUserId());
jarr.add(jobj);
}
if(jarr.size()==0) return null;
else return jarr.toJSONString();
}
private int msgId2Index(long msgid){
int topId = this.msgList.get(0).getMsgid();
int dif = (int)(msgid - topId);
return dif;
}
public void setRequest(HttpServletRequest request) {
try {
request.setCharacterEncoding("utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
this.request = request;
}
public Vector<MsgBean> getMsgList() {
return msgList;
}
}
MsgBean.java
package chat;
public class MsgBean {
private int msgid;
private String content;
private String ip;
private String userId;
public MsgBean() {}
public MsgBean(int msgid, String content, String ip) {
this.msgid = msgid;
this.content = content;
this.ip = ip;
}
public MsgBean(int msgid, String content, String ip, String userId) {
this.msgid = msgid;
this.content = content;
this.ip = ip;
this.userId = userId;
}
public int getMsgid() {
return msgid;
}
public String getContent() {
return content;
}
public void setMsgid(int msgid) {
this.msgid = msgid;
}
public void setContent(String content) {
this.content = content;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
}
chatLogin.jsp
pageEncoding="EUC-KR"%>
<%
request.setCharacterEncoding("euc-kr");
String userId = request.getParameter("userId");
if(userId!=null && !userId.equals("")){
session.setAttribute("userId", userId);
response.sendRedirect("chat_client.html");
}
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>·Î±×ÀÎ</title>
<style>
div{border:1px solid blue;
padding: 20px 20px 20px; text-align: center;
vertical-align:middle;
width:300px; height:100px;
font-family: cursive;
}
</style>
</head>
<body>
<br/><br/><center>
<h3>ž°ñ äÆù濡 ¿À½Å°ÍÀ» ȯ¿µÇÕ´Ï´Ù<br/>
äÆÿ¡ Âü¿©Çϱâ À§Çؼ´Â ¾Æ·¡ÀÇ ÆûÀ» ÀÛ¼ºÇØ¾ß ÇÕ´Ï´Ù</h3>
<div>
<form name="form1" method="post" action="chatLogin.jsp"
onSubmit="return form1.userId.value!=''? return true: false;">
äÆÿ¡ »ç¿ëÇÒ ´Ð³×ÀÓ(Nick Name)<br/>
<input type="text" name="userId" />
<input type="submit" value="·Î±×ÀÎ"/>
</form>
</div>
</center>
</body>
</html>
Ãâó: http://micropilot.tistory.com/1721 []