JSP/SERVLET
2018.02.19 / 01:08

AJAX, JSON, JSP ¸¦ »ç¿ëÇÑ Ã¤Æà ÇÁ·Î±×·¥ÀÇ

µðÆÌ
Ãßõ ¼ö 238

°³¿ä
µ¥ÀÌÅͺ£À̽º¿Í ¿¬µ¿ÇÏÁö ¾Ê°í ¼­¹öÃøÀÇ 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

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    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 []