[java, web, jsp] Servlet/JSP에서 Ajax 사용

 

 

 

Ajax(Asynchronous Javascript XML)

비동기 통신. 클라이언트 - 서버 간에 XML 또는 JSON 데이터를 주고 받는 기술이다.

페이지 이동 없이 데이터 처리가 가능하다. 새로 고침 없이 화면이 변한다!

제이쿼리 - Ajax 사용법

$.ajax({

  type:'post or get',
  async:'true or false',
  url:'요청할 url',
  data:{서버로 전송할 데이터},
  dataType: '서버에서 전송받을 데이터 형식',
  success: {
      //정상 요청, 응답 시 처리 작업
  },
  error : function(xhr,status,error) {
      //오류 발생 시 처리
  },
  complete:function(data,textStatus) {
      //작업 완료 후 처리
  }
});
속성 설명
type 통신 타입을 설정
url 요청할 url
async 비동기로 할 거냐 말 거냐
data 서버에 요청할 때 보낼 매개변수 설정
dataType 응답 받을 데이터 타입(XML,JSON,TEXT,HTML 등)
success 요청/응답에 성공했을 때 처리할 구문
error 요청/응답에 실패했을 때 처리할 구문
complete 작업을 마친 후에 처리할 구문

Ajax를 이용해서 ID 중복 체크 해보기

  1. 화면에서 입력 받은 id를 ajax통신을 이용해서 데이터를 서버로 보낸다.
  2. 서버는 DB와 연결해서 입력 받은 ID가 존재하는지, 존재하지 않는지 여부를 확인 할 수 있는 쿼리문을 전송한다.
-- mysql  
select if(count(\*)=1, 'true', 'false') as result 
from t\_member 
where id = '검사할 아이디'
  1. 결과가 true라면, 존재, false라면 존재하지 않는 것이다. 결과를 다시 클라이언트로 전송한다.

  2. 결과 데이터를 해석(true or false)해서, 화면에 메세지를 띄운다.

MemberVO.java

public class MemberVO {
    private String id;
    private String pwd;
    private String name;
    private String email;
    private Date regdate;
    ... getter setter 생략
}

MemberDAO.java
DataSource관련된 정보는 이곳 참고

public class MemberDAO {
    private Connection con;
    private PreparedStatement pstmt;
    private DataSource ds;

    //DataSource 초기화
    public MemberDAO() {
        try {
            Context context = new InitialContext();
            Context envContext = (Context) context.lookup("java:/comp/env");
            ds = (DataSource) envContext.lookup("jdbc/mysql");
        } catch (NamingException e) {
            e.printStackTrace();
        }

    } //MemberDAO()

    public boolean idCheck(String id) {
        if(id == null || id.length() == 0) throw new NullPointerException("아이디가 없습니다.");
        System.out.println("id : " + id);

        final String SQL = "select if(count(*)=1, 'true', 'false') as result"
                + " from t_member"
                +" where id = ?";
        System.out.println("SQL : " + SQL);

        try {
            //DB연결 - 쿼리 등록 - '?'에 값 매핑 - 쿼리 전송 - 결과
            con = ds.getConnection();
            pstmt = con.prepareStatement(SQL);
            pstmt.setString(1, id);

            ResultSet rs = pstmt.executeQuery();

            //'result'라는 컬럼의 값을 받아온다.
            rs.next();
            String result = rs.getString(1);
            System.out.println("result : " +result);

            return Boolean.parseBoolean(result);

        } catch (SQLException e) {
            e.printStackTrace();
        }
        return false;
    }

LoginCheck.java

@WebServlet("/loginCheck")
public class LoginCheck extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html; charset=utf-8");

        MemberDAO dao = new MemberDAO();
        String id = request.getParameter("id");
        PrintWriter out = response.getWriter();

        boolean checkID = dao.idCheck(id);

        if(checkID) {
            out.print("not-usable");
        } else {
            out.print("usable");
        }
    }
}

idCheck.html

...
<form method='post'>
    <input type='text' id='id' name='id' placeholder='아이디를 입력하세요...' >
    <input type='submit' id='checkBtn' value='중복확인' >
</form>
<div id='message'></div>
<script
  src="https://code.jquery.com/jquery-3.5.1.min.js"
  integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0="
  crossorigin="anonymous"></script>

<script>
    $('#checkBtn').on("click", (e) => {
        const id = $('#id').val();
        e.preventDefault()
        console.log('btn click')
        if(id.length === 0 || id === null) return alert("아이디를 입력하세요")

        $.ajax({
            type:'post',
            async:false, //false가 기본값임 - 비동기
            url:'http://localhost:8080/loginCheck',
            dataType:'text',
            data:{id:id},
            success: function(data, textStatus) {
                if(data === 'usable') {
                    $('#message').text('사용할 수 있는 ID입니다.')      
                    $('#checkBtn').prop('disabled', true) // 사용할 수 있는 ID면 버튼을 비활성화 시킨다.
                } else {
                    $('#message').text('이미 사용 중인 아이디입니다.')
                }
            },
            error:function (data, textStatus) {
                console.log('error');
            }
        })    //ajax

    })
</script>
...

JSON

Javascript Object Notation

JSON은 name/vale 쌍으로 이루어진 데이터 객체를 전달할 때 쓰는 개방형 표준 데이터 형식이다. XML은 복잡하기 때문에 이를 대체한다.

JSON 기본 자료형

  • 수 Number

    • 정수
    • 고정소수점 실수
    • 부동소수점 실수
  • 문자열

    • 문자열
    • 제어 문자 \b(백스페이스), \n(개행), \r(캐리지), \t(tab) 등...
  • 배열

    • 배열은 대괄호[ ]로 나타낸다.

      경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
      어린이용이며, 설치가 필요없는 브라우저 게임입니다.
      https://s1004games.com

    • 배열의 각 요소는 기본 자료형이거나 배열 객체다.

    • 각 요소는 쉼표로 구분한다.

      "members":[
        {"name":"김탱","age":22,"nick":"tang"},
        {"name":"이탱","age":26,"nick":"Leetang"},
        {"name":"박통","age":11,"nick":"mimi"}
      ]
  • 객체

    • JSON객체는 중괄호{}로 둘러싸서 표현한다.

    • 쉼표를 사용해서 여러 프로퍼티를 포함할 수 있다.

      {"name":"박통","age":11,"nick":"mimi"}

예제

<input type='submit' id='checkJson' value='OK'>

<div id='output'></div>
<script
  src="https://code.jquery.com/jquery-3.5.1.min.js"
  integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0="
  crossorigin="anonymous"></script>
<script>
$(function() {
    $('#checkJson').on('click', () => {
        const jsonStr = '{"member":[{"name":"김공","age":26,"nick":"kimball"},'
        + '{"name":"이불","age":21,"nick":"FireLee"}]}'
        console.log(jsonStr)
        const jsonInfo = JSON.parse(jsonStr)

        let output = '회원 정보<hr>'

        for(const i in jsonInfo.member) {
            output += '이름 : ' + jsonInfo.member[i].name + '<br>'
            output += '나이 : ' + jsonInfo.member[i].age + '<br>'
            output += '별명 : ' + jsonInfo.member[i].nick + '<hr>'
        }

        $('#output').html(output)
    })
})
</script>

Ajax를 이용해 서버-JSON 데이터 주고 받기

라이브러리를 다운 받는다. 링크

다운 받은 라이브러리를 WEB-INF - lib 폴더에 넣으면 된다.

간단한 제이슨 데이터를 서버에서 화면으로 보내는 예제

Servlet

@WebServlet("/jsonServlet2")
public class JsonServlet2 extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doHandle(request,response);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doHandle(request,response);
    }

    protected void doHandle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");

        PrintWriter out = response.getWriter();

        //배열을 저장할 totalObject
        JSONObject totalObject = new JSONObject();

        //memberInfo JSON 객체를 저장할 배열
        JSONArray memberArray = new JSONArray();
        JSONObject memberInfo = new JSONObject();

        //{"name":"김네임", "age":25, "nick":"하하"}
        memberInfo.put("name", "김네임");
        memberInfo.put("age", 25);
        memberInfo.put("nick", "하하");

        //[{"name":"김네임", "age":25, "nick":"하하"}]
        memberArray.add(memberInfo);

        //"members":[{"name":"김네임", "age":25, "nick":"하하"}]
        totalObject.put("members", memberArray);

        String jsonInfo = totalObject.toJSONString();

        out.print(jsonInfo);
    }
}
...
...
<script>
$(function() {
    $('#checkJson').on('click', () => {
        const jsonInfo = '{"name":"루루","age":25,"nick":"이땅콩"}';
        $.ajax({
            type:'post',
            url:'/jsonServlet2',
            success:function (data, textStatus) {
                console.log('data')
                console.log(data)
                const jsonInfo = JSON.parse(data)
                let memberInfo = '회원 정보 <hr>'

                for(const i in jsonInfo.members) {
                    memberInfo += '이름 : ' + jsonInfo.members[i].name + '<br>'
                    memberInfo += '나이 : ' + jsonInfo.members[i].age + '<br>'
                    memberInfo += '별명 : ' + jsonInfo.members[i].nick + '<hr>'

                    $('#output').html(memberInfo)
                }
            },
            error : function(data,textStatus) {
                console.log('error!!')
            }
        }) //ajax
    }) //checkJson
})
</script>
...

 

[출처] https://velog.io/@cocodori/ServletJSP%EC%97%90%EC%84%9C-Ajax-%EC%82%AC%EC%9A%A9

 

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
186 [Java Web programming] Spring boot(백엔드)와 React.js(프론트엔드)의 만남 - 프론트엔드 졸리운_곰 2021.08.29 138
185 [java][spring][mybatis] [MyBatis] resultType에 넣을 수 있는 값 정리 졸리운_곰 2021.08.17 341
184 [Java Spring web programming][자바 웹 개발] 10+ Free Open Source Projects Using Spring Boot file 졸리운_곰 2021.08.12 76
183 [java 웹 프로그래밍] Spring boot - Thymeleaf 기본 문법 졸리운_곰 2021.08.11 61
182 [Java 웹 프로그래밍] Tutorial: Thymeleaf + Spring file 졸리운_곰 2021.08.10 46
181 [java][spring boot][gradle] GitHub에서 스프링 부트 & Gradle 프로젝트 Import 하기! file 졸리운_곰 2021.08.05 116
180 [java, spring] Get HTTP POST Body in Spring Boot with @RequestBody 졸리운_곰 2021.06.18 55
179 [Java, jsp, jstl] [JSTL] Functions Tag - fn:contains() 사용하기 졸리운_곰 2021.06.09 80
178 [Java, jsp, jstl] [JSTL] List 갯수(size) 구하기 졸리운_곰 2021.06.02 237
177 [java, jsp, jstl] JSTL에서 변수두개사용하기 : jsp jstl list<> 두개를 졸리운_곰 2021.06.02 187
176 [Java Web, JSTL] 반복문 <c:forEach>, <c:forTokens> 졸리운_곰 2021.05.27 66
175 [Java Web] 조건문 <c:if>, <c:choose>, <c:when>, <c:otherwise> 졸리운_곰 2021.05.26 157
174 [java, web dev] forEach를 이용해서 JSTL로 출력하기 졸리운_곰 2021.05.24 102
173 [Java, Web dev] JSTL문법 <c:forEach> c:tag를 이용한 리스트 출력 file 졸리운_곰 2021.05.24 99
172 [Java][Web][Spring] vo 여러개 전달하기. LIST<VO> vo를 list 로 넘기기 / 받기 졸리운_곰 2021.05.20 1974
171 [java web dev, spring, freemaker] freemarker (개념, jsp와 차이, 문법, spring과 연동 설정, 예제) file 졸리운_곰 2021.05.17 72
170 [java web spring] [Spring] web.xml - Filter url 제외시키기 졸리운_곰 2021.05.14 200
169 [Java Web Srping mvc] Spring MVC - home.jsp의 동작원리 file 졸리운_곰 2021.05.14 65
» [java, web, jsp] Servlet/JSP에서 Ajax 사용 file 졸리운_곰 2021.05.13 478
167 [java][JAVA WEB] [JSP] JSTL 사용 방법 - 주요 태그 문법 정리 . file 졸리운_곰 2021.04.22 87
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED