2013년 11월 13일 수요일

[AJAX학원, AJAX교육, AJAX/jQUERY]struts Ajax 자동완성기능(1)-김길재

[AJAX학원, AJAX교육, AJAX/jQUERY]struts Ajax 자동완성기능(1)-김길재

자동완성 기능을 구현해 보았습니다.
Controller로 Struts2를 사용하였으니 관련된 부분은
제가 Struts란에 올린 게시물을 확인하시기 바랍니다.

/**************************************************************
              ajax.js
**************************************************************/

var AutoComplete = {
       
        xmlHttp : null,
       
        /*
        * XMLHttp객체생성
        */
        getXMLHttpRequest: function() {
               
                //인터넷 익스플로러일 경우
                if(window.ActiveXObject){
               
                          try{
                                  return new ActiveXObject("Msxml2.XMLHTTP");
                          }catch(e){
                         
                                  try{
                                          return new ActiveXObject("Microsoft.XMLHTTP");
                                  }catch(e1){
                                          return null;
                                }
                               
                        }
                       
                }
                //다른 브라우저일 경우
                else if(window.XMLHttpRequest){
                        return new XMLHttpRequest();
                }
                //브라우저 식별 실패
                else{
                        return null;
                }
        },
       
        /*
        * XMLHttp Request를 서버로
        */
        ContentLoader: function(url, execFunction) {
               
                xmlHttp = this.getXMLHttpRequest();
                xmlHttp.onreadystatechange = execFunction;
                xmlHttp.open("POST", url, true); // url의 주소를 GET방식으로 열 준비를 한다.
                xmlHttp.send(); //서버에 전송한다.
                               
        },
       
        /*
        * XMLHttp Response가 서버로 부터 온전한 상태로 왔는지 확인
        */
        getState: function() {
               
                if(xmlHttp.readyState == 4){ //데이터의 전부를 받은 상태

                        if(xmlHttp.status == 200){//요청 성공
                       
                                  return true;
                                 
                          }else{
                         
                                  return false;
                        }
                       
                }
       
        }
       
}       

/**************************************************************
              AutoComplete.jsp
**************************************************************/

<%@ page contentType="text/html; charset=EUC-KR"%>

<html>
<head>
<title>autoComplete</title>
<script type="text/javascript" src="/common/ajax.js"></script>
<script>
       
        var div;
        var table;
        var text;
       
        /*
        * 변수값 초기화
        */
        function onLoad(){
       
                div = document.getElementById("autoCompleteDiv");
                table = document.getElementById("autoCompleteTable");
                text = document.getElementById("autoCompleteText");
               
        }
       
        /*
        * 조회
        */
        function listAutoComplete(){
               
                if(text.value != ""){
               
                        if(event.keyCode != 229){
                               
                               
                                var url = "/ajax/autoComplete.action?word=" + text.value;
                               
                                AutoComplete.ContentLoader(url, viewTitleList);
                       
                        }
                       
                }else{
               
                        clearTitleList();
               
                }
       
        }
       
        /*
        * 테이블을 DHTML로 작성
        */
        function viewTitleList(){
               
                clearTitleList();
               
                if(AutoComplete.getState()){ //데이터의 전부를 받은 상태
               
                        var tr, td;
                        var words = xmlHttp.responseXML.getElementsByTagName("word");
                        var size = words.length;
                       
                        for(var i = 0 ; i < size ; i++){
                       
                                tr = table.insertRow();
                                tr.style.width = "100%";
                                           
                                td = tr.insertCell();
                        td.style.width = "100%";
                        td.style.cursor = "hand";

                        td.innerText = words[i].firstChild.nodeValue;
                                           
                                td.onclick = function() { wordClick(this);}; 
                        td.onmouseover = function() { mouseOver(this);}; 
                                td.onmouseout = function() { mouseout(this);}; 
                               
                        }       
                       
                }
                               
        }
       
        /*
        * 테이블의 목록을 초기화
        */
        function clearTitleList(){
               
                var ind = table.rows.length;
        for (var i = ind - 1; i >= 0 ; i--) {
               
            table.deleteRow(i);
           
        }
       
        }
       
        /*
        * 클릭시
        */
        function wordClick(oTd){
       
                text.value = oTd.innerText;
       
        }
       
        /*
        * 마우스오버
        */
        function mouseOver(td){
               
                td.style.background= "#CBE7BA";
       
        }
       
        /*
        * 마우스아웃
        */
        function mouseout(td){
               
                td.style.background= "#FFFFFF";
       
        }
       
</script>
</head>
<body onLoad="onLoad()">
<input type="text" id="autoCompleteText" style="width:200px" autocomplete="off" onkeyup="javascript:listAutoComplete()"><br>
<div id="autoCompleteDiv" style="position:absolute; width:200px; height:180px; scrolling:yes; overflow-y:auto;">
        <table id="autoCompleteTable" style="width:100%"></table>
</div>
</body>
</html>


/**************************************************************
                            struts.xml
**************************************************************/

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>

        <constant name="struts.enable.DynamicMethodInvocation" value="true" />
        <constant name="struts.devMode" value="true" />


        <include file="ajax.xml" />
</struts>

/**************************************************************
                            ajax.xml
**************************************************************/
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
        "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>

        <package name="ajax" namespace="/ajax" extends="struts-default">
 
                <global-results>
                        <result name="Exception">/exception.jsp</result>
                </global-results>

                <global-exception-mappings>
                        <exception-mapping exception="java.lang.Exception"
                                result="Exception" />
                </global-exception-mappings>


                <action name="*" method="{1}" class="web.ajax.AjaxAction">
                        <interceptor-ref name="servlet-config" />
                        <interceptor-ref name="exception" />
                        <result name="searchTitleList_success">/ajax/AutoComplete.jsp</result>
                </action>

                <action name="defaultAction">
                        <result>/WrongAction.jsp</result>
                </action>

        </package>
</struts>

/**************************************************************
                            AjaxAction.java
**************************************************************/
package web.ajax;

import javax.servlet.ServletContext;
import javax.servlet.http.*;

import org.apache.log4j.Logger;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.interceptor.*;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import com.opensymphony.xwork2.ActionSupport;


/**
 * Base Action class for the Tutorial package.
 */
public class AjaxAction extends ActionSupport implements ServletRequestAware, ServletResponseAware {
       
        private HttpServletRequest request;
        private HttpServletResponse response;
    private Logger logger = Logger.getLogger(this.getClass());

   
    /**
        * test1
        * @throws Exception
        */
    public String autoComplete() throws Exception {
               
            try{
                   
                    logger.info("autoComplete start");
                   
                    // request를 가져온다.
                    ServletContext servletContext = ServletActionContext.getServletContext();
                    WebApplicationContext wac = WebApplicationContextUtils.getWebApplicationContext(servletContext);
                   
                   
                   
                    String[] wordArr = {"acrobat",
                                                "adobe",
                                                "bmw",
                                                "brave",
                                                "cbs",
                                                "cnn",
                                                "heaven",
                                                "html",
                                                "kbs",
                                                "key",
                                                "net",
                                                "news",
                                                "queen",
                                                "quick",
                                                "soup",
                                                "super",
                                                "ufo",
                                                "usb",
                                                "work",
                                                "wow",
                                                "zebra",
                                                "zenith"};
                    StringBuffer xmlStr = new StringBuffer("");
                    boolean isTitleExist = false;
                   
                    //실제업무에서는 비지니스 레이어에서 XML String을 구현한다.
                    //String xmlStr = ajax.getAutoCompleteTitleList(boardVO);
                   
                    xmlStr.append("<?xml version="1.0" encoding="EUC-KR"?>");
                    xmlStr.append("<words>");
                   
                    for(int i = 0;  i < wordArr.length ; i++){
                           
                            if(wordArr[i].indexOf(request.getParameter("word")) != -1){
                                   
                                    xmlStr.append("<word>");
                                    xmlStr.append(wordArr[i]);
                                    xmlStr.append("</word>");
                                    isTitleExist = true;
                            }
                           
                    }
                    xmlStr.append("</words>");
                    //logger.info("request.getParameter("title") : " + request.getParameter("title"));
                    logger.info("xmlStr.toString() : " + xmlStr.toString());
                   
                    if(isTitleExist){
                           
                            response.setContentType("text/xml");
                        response.setHeader("Cache-Control", "no-cache");

                        response.getWriter().write(xmlStr.toString());
                           
                    }else{
                           
                            response.setStatus(HttpServletResponse.SC_NO_CONTENT);
                           
                    }
                           
                    logger.info("forward :" + request.getParameter("forward"));
                    logger.info("autoComplete end");
                   
                    return null;
                   
            }catch(Exception e){
                       
                        logger.info("Error : " + e.toString());
                        e.printStackTrace();
                        throw e;
                       
                }
               
       
    }
   
 
        public void setServletRequest(HttpServletRequest request) {
        this.request = request;
    }
        public void setServletResponse(HttpServletResponse response) {
                this.response = response;
        }
       
}



[개강임박강좌, 오프라인교육장에 오시면 보다 자세히 배울 수 있습니다.]

오라클자바커뮤니티에서 운영하는 개발자 전문교육 ,개인80%환급(
www.onjprogramming.co.kr)

[주간]
  [11/18]Spring3.X, MyBatis, Hibernate실무과정
  [11/18]iPhone 하이브리드 앱 개발 실무과정
  [11/20]SQL초보에서실전전문가까지
  [11/20]안드로이드개발자과정


[평일야간]
  [11/19]iPhone하이브리드앱개발실무과정
  [11/19]안드로이드개발자과정
  [11/21]JAVA&WEB프레임워자실무과정
  [11/21]Spring3.X, MyBatis, Hibernate실무과정
  [11/27]SQL초보에서실전전문가까지

[주말]
  [11/16]JAVA&WEB프레임워크실무과정
  [11/16]웹퍼블리싱 마스터
  [11/23]SQL초보에서전문가까지
  [11/23]C#,ASP.NET마스터
  [11/30]PL/SQL,오라클힌트,SQL튜닝,사례연구
  [11/31]Spring3.X,MyBatis,Hibernate실무과정

댓글 없음:

댓글 쓰기