//Google AdSense

https://sethlee.tistory.com/3

 

AJAX 를 동기(Sync) 방식으로 사용하기

안녕하세요 용재형 입니다. 이번 포스팅은 AJAX 를 동기(Sync) 방식으로 사용하기 입니다. Ajax는 Asynchronous Javascript And XML 의 약자로, 일반적으로 클라이언트와 서버측의 데이터 전송 및 처리를 비��

sethlee.tistory.com

↑참고

 

ajax를 통해 비동기적으로 데이터를 주고받는 경우 그 데이터 수신이 완료될 때 까지 기다리지 않고 다른 작업을 진행하게 된다.

만약 ajax를 통신이 끝나고 모든 데이터를 받아 처리한 뒤에 다른 작업이 진행되길 원한다면 async: false 하여 동기화 하면 된다~ 

 

async가 아니라  sync니까 ajax가 아니라 sjax가 되는건가 ??

 

 

get방식으로 전송한 데이터를 alert 창에 넣고싶었다!

 

location.href로 받아온 uri에서 '?키=값'을 가져오는 일은 수월했다

하지만 값에 띄어쓰기가 있어 '등록된+정보가+없습니다.' 와 같은 식으로 추출되었다.

 

replace를 통해 +를 공백으로 치환하는 작업을 자동으로 하기 위해

match 함수를 사용하려고 하였는데 match는 정규식을 인식하기 때문인지 +를 문자열로 받아주질 않았다..

 

 

그래서 정규표현식을 사용해버리기로 했다~

//로그인 실패시 alert ()
		
		var message = null;
		//uri에서 get방식으로 넘긴 값 추출
		var uri = decodeURI(location.href);
		var get = uri.substr(uri.indexOf('?')+1);
		if(uri != get){
			message = get.substr(get.indexOf('=')+1);
		};
		//.을 제외한 특수문자 정규식
		var regExp = /[\{\}\[\]\/?,;:|\)*~`!^\-+<>@\#$%&\\\=\(\'\"]/gi;
		if(regExp.test(message)){
			//.을 제외한 특수문자를 공백으로 치환
			message = message.replace(regExp,' ');
		};
		//추출한 값이 null이 아닐 경우 alert창 출력
		if(message != null){
				alert(message);
		};

test를 통해 .을 제외한 특수문자 정규식과 message의 문자열과 비교해 특수문자 여부를 파악하고

message에 특수문자가 있다면 정규식에 기술한 특수문자들을 공백으로 바꾸는 식을 만들었다!

 

결과는 성공~

정규식 참고!

https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/%EC%A0%95%EA%B7%9C%EC%8B%9D

 

정규 표현식

정규 표현식은 문자열에 나타는 특정 문자 조합과 대응시키기 위해 사용되는 패턴입니다. 자바스크립트에서, 정규 표현식 또한 객체입니다.  이 패턴들은 RegExp의 exec 메소드와 test 메소드  ,��

developer.mozilla.org

 

실습1. 부트스트랩을 활용하여 회원가입폼을 작성하고 유효성 검사를 하여라.
폼필드: 아이디, 회원명, 패스워드, 패스워드확인, 이메일, 주소, 휴대전화번호

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">

<link href="<%=request.getContextPath()%>/resource/bootstrap-3.3.2-dist/css/bootstrap.min.css" rel="stylesheet">
<link href="<%=request.getContextPath()%>/resource/bootstrap-3.3.2-dist/css/bootstrap-theme.min.css" rel="stylesheet">
<link href="<%=request.getContextPath()%>/resource/css/join.css" rel="stylesheet">

<!-- IE8 에서 HTML5 요소와 미디어 쿼리를 위한 HTML5 shim 와 Respond.js -->
<!-- WARNING: Respond.js 는 당신이 file:// 을 통해 페이지를 볼 때는 동작하지 않습니다. -->
<!--[if lt IE 9]>
	<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
	<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<![endif]-->

<title>회원가입</title>

<script src="<%=request.getContextPath()%>/resource/js/jquery-3.4.1.min.js"></script>
<script type="text/javascript">
	$(function() {
		$('#joinBtn').click(function() {
			
			var userId = $('#userId');
			var userName = $('#userName');
			var userPw = $('#userPw');
			var pwCon = $('#pwCon');
			var userEmail = $('#userEmail');
			var address = $('#address');
			var phone = $('#phone');
			
			if(userId.val() == ''){
				alert('아이디를 입력해주세요.')
				userId.focus();
				return;
			}
			if(userName.val() == ''){
				alert('회원명을 입력해주세요.')
				userName.focus();
				return;
			}
			if(userPw.val() == ''){
				alert('패스워드를 입력해주세요.')
				userPw.focus();
				return;
			}
			if(pwCon.val() == ''){
				alert('패스워드확인을 입력해주세요.')
				pwCon.focus();
				return;
			}
			if(userPw.val() != pwCon.val()){
				alert('패스워드가 일치하지 않습니다.')
				userPw.val('');
				pwCon.val('');
				pw.focus();
				return;
			}
			if(userEmail.val() == ''){
				alert('이메일을 입력해주세요.')
				userEmail.focus();
				return;
			}
			if(address.val() == ''){
				alert('주소를 입력해주세요.')
				address.focus();
				return;
			}
			if(phone.val() == ''){
				alert('휴대전화번호를 입력해주세요.')
				phone.focus();
				return;
			}
			$('#join').submit();
		});
	});
</script>
</head>
<body>
	<!--
		실습1. 부트스트랩을 활용하여 회원가입폼을 작성하고 유효성 검사를 하여라.
			폼필드: 아이디, 회원명, 패스워드, 패스워드확인, 이메일, 주소, 휴대전화번호
	  -->
	  
<div class="container-fluid" >
	<div class="join-title"><h1>JOIN</h1></div>
	<div class="row">
		<div class="col-sm-6 col-sm-offset-3">
			<div class="panel panel-default">
				<div class="panel-body">
					<form id="join" action="<%=request.getContextPath()%>/join.jsp" method="post">
						<div class="form-group">
							<label for="userId">아이디</label>
							<input type="text" id="userId" name="userId" class="form-control" placeholder="아이디">
						</div>
						<div class="form-group">
							<label for="userName">회원명</label>
							<input type="text" id="userName" name="userName" class="form-control" placeholder="회원명">
						</div>
						<div class="form-group">
							<label for="userPw">패스워드</label>
							<input type="password" id="userPw" name="userPw" class="form-control" placeholder="패스워드">
						</div>
						<div class="form-group">
							<label for="pwCon">패스워드확인</label>
							<input type="password" id="pwCon" name="pwCon" class="form-control" placeholder="패스워드확인">
						</div>
						<div class="form-group">
							<label for="userEmail">이메일</label>
							<input type="text" id="userEmail" name="userEmail" class="form-control" placeholder="이메일">
						</div>
						<div class="form-group">
							<label for="address">주소</label>
							<input type="text" id="address" name="address" class="form-control" placeholder="주소">
						</div>
						<div class="form-group">
							<label for="phone">휴대전화번호</label>
							<input type="text" id="phone" name="phone" class="form-control" placeholder="휴대전화번호">
						</div>
						<button type="button" id="joinBtn" class="btn btn-info btn-lg btn-block">JOIN</button>
					</form>
				</div>
			</div>
		</div>
	</div>
	<div class="row">
		<div class="footer-text">
			ksmart.or.kr 한국스마트정보교육원 35기
		</div>
	</div>
</div>

<script src="<%=request.getContextPath()%>/resource/bootstrap-3.3.2-dist/js/bootstrap.min.js"></script>
</body>
</html>
@charset "UTF-8";
body{background-color: #64D6FF;}
.join-title{text-align: center; margin-top: 40px; margin-bottom: 25px; color: #ffffff;}
.footer-text{text-align: center; color: #ffffff;}

<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">

<title>부트스트랩 프레임워크</title>

<!-- 부트스트랩  -->
<link href="./resource/bootstrap-3.3.2-dist/css/bootstrap.min.css" rel="stylesheet">
<link href="./resource/bootstrap-3.3.2-dist/css/bootstrap-theme.min.css" rel="stylesheet">
<script src="./resource/js/jquery-3.4.1.min.js"></script>

<!-- IE8 에서 HTML5 요소와 미디어 쿼리를 위한 HTML5 shim 와 Respond.js -->
<!-- WARNING: Respond.js 는 당신이 file:// 을 통해 페이지를 볼 때는 동작하지 않습니다. -->
<!--[if lt IE 9]>
	<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
	<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<![endif]-->

</head>
<body>
	<h1>그리드 시스템</h1>
	<div>
		<사용방법> <br>
		 1) .container-fluid 혹은 .container 상위 태그에 클래스 지정<br>
		 2) 그 하위에 .row 클래스 지정 (clear css 속성 동일 - float 해제)<br>
		 3) 그리드 시스템 클래스 지정<br>
		  - 그리드 시스템의 클래스 처음 시작은 .col 클래스로 시작된다.<br>
		  - 디바이스 크기를 지정하는 접두사가 붙는다.<br>
		   예) .col-xs-*, .col-sm-*, .col-md-*, .col-lg-* <br>
		  - 디바이스 크기 접두사 뒤에 12열 기준으로 열정렬 숫자를 나열한다.<br>
		   예) .col-xs-2, .col-sm-3, .col-md-5, .col-lg-1<br>
		 4) row 클래스는 1행 기준점 마다 지정해야한다.<br>
		 5) 디바이스 크기를 지정하는 접두사<br>
		  - xs : 최소 사이즈 모바일<br>
		  - sm : 탭 <br>
		  - md : 데스크탑 중간<br>
		  - lg : 데스크탑 최대<br>
		 6) 그리드 시스템 클래스는 디바이스 크기 별로 중복 적용이 가능하다.<br>
		  예) (1개의 태그에 클래스 적용) class="col-lg-6 col-md-4 col-xs-12"<br>
		    : lg 크기일 경우 6열로 정렬, md 크기일 경우 4열로 정렬, xs 크기일 경우 12열로 정렬
	</div>
	
	<h1>반응형 유틸리티</h1>
	<div>
		디바이스 크기에 따라 그리드 시스템 적용 대상을 보이거나 안보이게 할 수 있다.<br>
		(작은 기기에서 안보여야 할 영역을 감출 수 있다.)		
	</div>
	
	
	<h1>그리드 시스템 적용</h1>
	<div class="container-fluid">
		<div class="row">
			<div class="col-lg-3 col-md-6 col-xs-12"> <!-- sm없을 경우 md사이즈로 적용됨 -->
				<p class="bg-danger">1</p>
			</div>
			<div class="col-lg-3 col-md-6 col-xs-12">
				<p class="bg-warning">2</p>
			</div>
			<div class="col-lg-3 col-md-6 col-xs-12 hidden-xs hidden-sm">
				<p class="bg-success">3</p>
			</div>
			<div class="col-lg-3 col-md-6 col-xs-12 hidden-xs">
				<p class="bg-info">4</p>
			</div>
		</div>
	</div>
<script src="./resource/bootstrap-3.3.2-dist/js/bootstrap.min.js"></script>
</body>
</html>

 

http://bootstrapk.com/getting-started/#template

<!DOCTYPE html>
<html lang="ko">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1"> <!-- viewport :: 반응형 웹이 되도록 하는 중요 키워드-->
    <!-- 위 3개의 메타 태그는 *반드시* head 태그의 처음에 와야합니다; 어떤 다른 콘텐츠들은 반드시 이 태그들 *다음에* 와야 합니다 -->
    <title>부트스트랩 101 템플릿</title>

    <!-- 부트스트랩 -->
    <link href="css/bootstrap.min.css" rel="stylesheet">

    <!-- IE8 에서 HTML5 요소와 미디어 쿼리를 위한 HTML5 shim 와 Respond.js -->
    <!-- WARNING: Respond.js 는 당신이 file:// 을 통해 페이지를 볼 때는 동작하지 않습니다. -->
    <!--[if lt IE 9]>
      <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
      <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
  </head>
  <body>
    <h1>Hello, world!</h1>

    <!-- jQuery (부트스트랩의 자바스크립트 플러그인을 위해 필요합니다) -->
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
    <!-- 모든 컴파일된 플러그인을 포함합니다 (아래), 원하지 않는다면 필요한 각각의 파일을 포함하세요 -->
    <script src="js/bootstrap.min.js"></script>
  </body>
</html>

 

<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">

<title>부트스트랩 프레임워크</title>

<!-- 부트스트랩  -->
<link href="./resource/bootstrap-3.3.2-dist/css/bootstrap.min.css" rel="stylesheet">
<link href="./resource/bootstrap-3.3.2-dist/css/bootstrap-theme.min.css" rel="stylesheet">
<script src="./resource/js/jquery-3.4.1.min.js"></script>

<!-- IE8 에서 HTML5 요소와 미디어 쿼리를 위한 HTML5 shim 와 Respond.js -->
<!-- WARNING: Respond.js 는 당신이 file:// 을 통해 페이지를 볼 때는 동작하지 않습니다. -->
<!--[if lt IE 9]>
	<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
	<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<![endif]-->

</head>
<body>
	<h1>아이콘</h1>
	<div>
		콤포넌트에 소개된 아이콘의 클래스를 유지하면 아이콘이 출력된다.
	</div>
	<button type="button" class="btn btn-info" >
		<span class="glyphicon glyphicon-asterisk" ></span>
	</button>
	
	<a href="http://naver.com/" class="btn btn-success" >
		<span class="glyphicon glyphicon-tower" ></span>
	</a>
		
	<i class="glyphicon glyphicon-leaf"></i>
	
	<h1>드롭다운</h1>
	<div class="dropdown">
		<button class="btn btn-warning dropdown-toggle" type="button" id="dropdownMenu1" data-toggle="dropdown">
			Dropdown
			<span class="caret"></span>
		</button>
		<ul class="dropdown-menu">
			<li role="presentation"><a href="#">유니스야 </a></li>
			<li role="presentation" class="divider"></li>
			<li role="presentation"><a href="#">카레 먹고싶어</a></li>
			<li role="presentation" class="divider"></li>
			<li role="presentation"><a href="#">다은이</a></li>
			<li role="presentation"><a href="#">바부..</a></li>
		</ul>
	</div>
	
	<h1>버튼그룹</h1>
	<div class="btn-group">
		<button type="button" class="btn btn-danger">Left</button>
		<button type="button" class="btn btn-success">Middle</button>
		<button type="button" class="btn btn-info">Right</button>
	</div>
	<div class="btn-group btn-group-lg">
		<button type="button" class="btn btn-danger">Left</button>
		<button type="button" class="btn btn-success">Middle</button>
		<button type="button" class="btn btn-info">Right</button>
	</div>
	
	<h1>크기를 알리는 클래스 접두사</h1>
	<div>
		대략적으로 크기를 지정할 수 있는 클래스 옵션이 있으며, 대표 클래스 다음 대표클래스-* 형태로 클래스를 지정하여 크기를 조절할 수 있다.
		<br>
		예) btn btn-lg
		<br>
		크기 종류
		<br>
		대표클래스-xs < 대표클래스-sm < 대표클래스-md < 대표클래스-lg	
	</div>
	<button type="button" class="btn btn-info btn-xs" >
		<span class="glyphicon glyphicon-asterisk" ></span>
	</button>
	<button type="button" class="btn btn-info btn-sm" >
		<span class="glyphicon glyphicon-asterisk" ></span>
	</button>
	<button type="button" class="btn btn-info btn-md" >
		<span class="glyphicon glyphicon-asterisk" ></span>
	</button> 
	<button type="button" class="btn btn-info btn-lg" >
		<span class="glyphicon glyphicon-asterisk" ></span>
	</button>
	
	<h1>양쪽 정렬 버튼</h1>
	<div>부모의 태그 가로 사이즈 100% 지정하여 정렬</div>
	<div class="btn-group btn-group-justified" role="group" aria-label="...">
		<div class="btn-group" role="group">
			<button type="button" class="btn btn-default">Left</button>
		</div>
		<div class="btn-group" role="group">
			<button type="button" class="btn btn-default">Middle</button>
		</div>
		<div class="btn-group" role="group">
			<button type="button" class="btn btn-default">Right</button>
		</div>
	</div>
	
	<h1>색상을 표기하는 클래스 접두사</h1>
	<div>
		색상을 표기할 때 '대표클래스-*' 형태로 사용 가능하며 	대략적으로 테마별 옵션은 아래의 6가지 옵션으로 지정하여 쓰도록 하고 있다.
		<br>
		대표클래스-default<br>
		대표클래스-danger<br>
		대표클래스-warning<br>
		대표클래스-success<br>
		대표클래스-info<br>
		대표클래스-primary<br>
	</div>
	<button type="button" class="btn btn-default">default</button>
	<button type="button" class="btn btn-danger">danger</button>
	<button type="button" class="btn btn-warning">warning</button>
	<button type="button" class="btn btn-success">success</button>
	<button type="button" class="btn btn-info">info</button>
	<button type="button" class="btn btn-primary">primary</button>
	
	<h1>폼 태그 기본 클래스</h1>
	<div>기본적으로 폼태그에 들어가는 클래스가 있다.<br> 
		form-control : 부모의 가로 사이즈를 기준으로 100% 정렬 
	</div>
	<input type="text" class="form-control">
	<select class="form-control">
		<option> :: 선택 :: </option>
	</select>
	<textarea class="form-control"></textarea>
	
	<h1>입력 그룹</h1>
	<div class="input-group">
		<span class="input-group-addon" id="basic-addon1">@</span>
		<input type="text" class="form-control" placeholder="Username">
	</div>
	
	<div class="input-group">
		<span class="input-group-addon" id="basic-addon1">
			<input type="checkbox"> 체크하기
		</span>
		<input type="text" class="form-control" placeholder="Username">
	</div>
	
	<div class="input-group">
		<input type="text" class="form-control" placeholder="Username">
		<span class="input-group-btn">
			<button type="button" class="btn btn-warning">버튼</button>
		</span>
	</div>
	
	
	<h1>active 클래스</h1>
	<div>
		active는 현재 위치 혹은 강조를 표기하는(활성화) 클래스이다.
	</div>
	
	<h1>탭</h1>
	<ul class="nav nav-tabs">
	  <li class="active"><a href="#">Home</a></li>
	  <li class="active"><a href="#">Profile</a></li>
	  <li><a href="#">Messages</a></li>
	</ul>

	<h1>네비게이션 바</h1>	
	<div>
		- nav 태그에 navbar 대표 클래스가 있어야 하며, navbar-* 접두사로 색상 변경이 가능하다.
		<br>
		- navbar-header 클래스는 브랜드(로고)와 반응형에 관련된 메뉴 아이콘의 요소가 들어있다.
		<br>
		- collapse navbar-collapse 클래스는 실제 보이는 메뉴를 나열할 수 있다.
	</div>
	<nav class="navbar navbar-inverse">
	  <div class="container-fluid">
	    <!-- Brand and toggle get grouped for better mobile display -->
	    <div class="navbar-header">
	      <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-navbar">
	        <span class="sr-only">Toggle navigation</span>
	        <span class="icon-bar"></span>
	        <span class="icon-bar"></span>
	        <span class="icon-bar"></span>
	      </button>
	      <a class="navbar-brand" href="#">Brand</a>
	    </div>
	
	    <!-- Collect the nav links, forms, and other content for toggling -->
	    <div class="collapse navbar-collapse" id="bs-navbar">
	      <ul class="nav navbar-nav navbar-left">
	        <li><a href="#">Link</a></li>
	        <li><a href="#">Zelda</a></li>
	        <li><a href="#">WolfLink</a></li>
	      </ul>
	    </div><!-- /.navbar-collapse -->
	  </div><!-- /.container-fluid -->
	</nav>	
	
	<h1>data-target 속성</h1>
	<div>
		버튼 태그에 data-target 속성이 존재할 경우 이벤트를 발동시킬 대상을 말하는 것이며, data-target에 명시된 대상은 존재해야 한다.
		<br>
		ex) data-target="선택자" : 선택자와 일치하는 타겟이 있어야 함.
	</div>

	<h1>라벨</h1>
	<div>
		인라인 속성 태그를 기준으로 사용 가능하며, 주로 span 태그에 적용한다.
		<br>
		라벨에도 색상기준 접두사로 옵션을 붙여 사용할 수 있다.
		<br>
		대표 클래스 : label
		<br>
		색상옵션 : label-*
		<br>
		* : default, danger, warning, success, info, primary 
	</div>
	
	<span class="label label-default">default</span>
	<span class="label label-danger">danger</span>
	<span class="label label-warning">warning</span>
	<span class="label label-success">success</span>
	<span class="label label-info">info</span>
	<span class="label label-primary">primary</span>
	
	<h1>뱃지</h1>
	<span class="badge badge-default">default</span>
	
	<h1>alert</h1>
	<div>
		알림을 텍스트로 표현할 때<br>
		대표 클래스 alert <br>
		옵션 클래스 alert-*<br>
		* : danger, warning, success, info<br><br>
	</div>
		<span class="alert alert-danger">danger</span>
		<span class="alert alert-warning">warning</span>
		<span class="alert alert-success">success</span>
		<span class="alert alert-info">info</span>
	
	<h1>패널</h1>
	<div>
		대표 클래스 panel <br>
		옵션 클래스 panel-* <br>
		* : default, danger, warning, success, info, primary
				
		panel 클래스의 하위 태그<br>
		panel-heading, panel-body, panel-footer 클래스를 가진 태그로 이루어져 있다.<br>
	</div>
	<div class = "panel panel-default">
		<div class="panel-heading">heading</div>
		<div class="panel-body">body</div>
		<div class="panel-footer">footer</div>
	</div>
	<div class = "panel panel-danger">
		<div class="panel-heading">heading</div>
		<div class="panel-body">body</div>
	</div>
		<div class = "panel panel-warning">
	<div class="panel-heading">heading</div>
		<div class="panel-body">body</div>
	</div>
	<div class = "panel panel-success">
		<div class="panel-heading">heading</div>
		<div class="panel-body">body</div>
	</div>
	<div class = "panel panel-info">
		<div class="panel-heading">heading</div>
		<div class="panel-body">body</div>
	</div>
	<div class = "panel panel-primary">
		<div class="panel-heading">heading</div>
		<div class="panel-body">body</div>
	</div>
	
	<h1>모달</h1>
	<div>
		레이어 팝업 - 레이아웃을 설정하고 css 조정으로 팝업 효과가 보이도록 만드는 콤포넌트
	</div>
	<!-- Button trigger modal -->
	<button type="button" class="btn btn-info btn-lg" data-toggle="modal" data-target="#myModal">
	  Launch demo modal
	</button>
	
	<!-- Modal -->
	<div class="modal fade" id="myModal">
	  <div class="modal-dialog">
	    <div class="modal-content">
	      <div class="modal-header">
	        <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
	        <h4 class="modal-title" id="myModalLabel">Modal title</h4>
	      </div>
	      <div class="modal-body">
	        ...
	      </div>
	      <div class="modal-footer">
	        <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
	        <button type="button" class="btn btn-info">Save changes</button>
	      </div>
	    </div>
	  </div>
	</div>
	
	<h1>pull-left, pull-right</h1>
	<div>
		인라인 요소 처럼 텍스트 등을 정렬할 때 사용
	</div>
	<h1>
		pull-left테스트
		<small class="pull-left">pull-left</small>
	</h1>
	<h1>
		pull-right테스트
		<small class="pull-right">pull-right</small>
	</h1>	
	
	<h1></h1>
<script src="./resource/bootstrap-3.3.2-dist/js/bootstrap.min.js"></script>
</body>
</html>

ajaxEx01.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>유효성 검사 + ajax 아이디 중복 검사</title>
<script type="text/javascript" src="<%=request.getContextPath()%>/resource/js/jquery-3.4.1.min.js"></script>
<script type="text/javascript">
	/*
		제출실습1. '성명, 아이디, 패스워드, 패스워드 확인, 이메일, 성별'을
		유효성 검사를 하는 코드를 작성하고, 아이디는 아이디 중복검사를 하도록 하여라.
		(아이디 중복검사 ajax : 중복검사하는 jsp 페이지는 직접 만들고 작성하시오.)
	*/
	$(function() {
		$('#btn').click(function() {
			var valName = $('#name').val();
			var valId = $('#id').val();
			var valPass = $('#pass').val();
			var valCPass = $('#cPass').val();
			var valEmail = $('#email').val();
			var idCheck = $('#idCheck').attr('idCheck');
			
			if(valName == null || valName == undefined || valName == ""){ alert('성명을 입력해주세요.'); $('#name').focus(); return;} 
			if(valId == null || valId == undefined || valId == ""){ alert('아이디를 입력해주세요.'); $('#id').focus();  return;}
			if(idCheck == "" || idCheck == "N"){alert('아이디 중복확인를 해주세요'); $('#idCheck').focus(); return;}
			if(valPass == null || valPass == undefined || valPass == ""){ alert('패스워드을 입력해주세요.'); $('#pass').focus(); return;} 
			if(valCPass == null || valCPass == undefined || valCPass == ""){ alert('패스워드 확인을 입력해주세요.'); $('#cPass').focus(); return;} 
			if(valPass != valCPass){ alert('패스워드와 패스워드 확인이 같지 않습니다.'); $('#pass').val(""); $('#cPass').val(""); $('#pass').focus(); return;}
			if(valEmail == null || valEmail == undefined || valEmail == ""){ alert('이메일을 입력해주세요.'); $('#email').focus(); return;}
			if(!$('.gender').prop('checked')){ alert('성별을 체크해주세요.'); $('.gender')[0].focus(); return;}
			$('#login').submit();
		});
		
		$('#idCheck').click(function(){

				var valId = $('#id').val();	
				
				var request = $.ajax({
					url: "<%=request.getContextPath() %>/idcheck.jsp", //통신할 url
					method: "POST", //통신할 메서드 타입
					data: { id : valId }, //전송할 데이타
					dataType: "json"
				});	 
				
				request.done(function( data ) {
					console.log(data.result)
					if(data.result == 'Y'){
						$('#idCheck').attr('idCheck','Y');
						alert('사용 가능한 아이디입니다.');
					} else{
						$('#idCheck').attr('idCheck','N');
						alert('사용할 수 없는 아이디입니다.');
					}	
				});	 
				request.fail(function( jqXHR, textStatus ) {
				  alert( "Request failed: " + textStatus );
				});			
				
			});		
	})
	
</script>
</head>
<body>

	<form action="#" method="post" id="login">
		<table>
			<tr><td>성명</td><td><input type="text" id="name"></td><td></td></tr>
			<tr><td>아이디</td><td><input type="text" id="id"></td><td><button type="button" idCheck="" id="idCheck">아이디 중복확인</button></td></tr>
			<tr><td>패스워드</td><td><input type="password" id="pass"></td><td></td></tr>
			<tr><td>패스워드 확인</td><td><input type="password" id="cPass"></td><td></td></tr>
			<tr><td>이메일</td><td><input type="text" id="email"></td><td></td></tr>
			<tr><td>성별</td><td>남 <input type="radio" class="gender" name="gender" value="남">	여  <input type="radio" class="gender" name="gender" value="여"> </td><td></td></tr>
			<tr><td></td><td></td><td><button type="button" id="btn">회원가입</button></td><tr>
		</table>
	</form>
</body>
</html>

idcheck.jsp

<%@ page language="java" contentType="application/json; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="com.google.gson.Gson" %>
<%@ page import="java.util.*" %>
<%
/*
 	id001, id002, id003은 데이터베이스 조회 하에 존재하는 아이디라고 가정한다.
*/

Gson gson = new Gson();
Map map = new HashMap();

String id = request.getParameter("id");

if( !"".equals(id) && id != null){
	if("id001".equals(id) || "id002".equals(id) || "id003".equals(id)){
		map.put("result", "N");
	} else {
		map.put("result", "Y");}
}
String result = gson.toJson(map);
out.print(result);
%>

 


<풀이>

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>유효성 검사 + ajax 아이디 중복 검사</title>
<style type="text/css">
	.input-group{margin-bottom: 10px;}
	.input-group label { 
		color: #424242; 
		font-size: 15px; 
		padding-right: 10px; 
	}
</style>
<script type="text/javascript" src="<%=request.getContextPath() %>/resource/js/jquery-3.4.1.min.js"></script>
<script type="text/javascript">
	/*
		제출실습1. '성명, 아이디, 패스워드, 패스워드 확인, 이메일, 성별' 을
		유효성 검사를 하는 코드를 작성하고, 아이디는 아이디 중복검사를 하도록하여라.
		(아이디 중복검사 ajax : 중복검사하는 jsp 페이지는 직접 만들고 작성하시오.)			
	*/
	$(function(){
		
		/************************************************
		아이디 중복 체크 함수
		작성자 : 홍길동
		작성일 : 2020-04-08
		'아이디 중복검사', '회원가입' 버튼클릭시 같은 코드로 
		확인하도록 하기위해서 함수로 별도 제작
		2곳에서 사용하고 비동기화로 체크가 동시에 불가능하여
		동기화로  ajax 통신하도록 설정
		*************************************************/		
		var userIdCheck = function(){
			
			var userId = $('[name="userId"]').val();
			var getCheckData;
			
			//ajax 동기화
			var request = $.ajax({
				url: "ajaxIdCheck.jsp", //통신할 url
				method: "POST", //통신할 메서드 타입
				data: { userId : userId }, //전송할 데이타
				dataType: "json",
				async : false //동기화시키기
			});	 
			request.done(function( data ) {
				if(data != undefined && data != ''){
					//동기화임으로 getCheckData에 결과값 받아
					//아래 코드에서 처리 가능
					getCheckData = data;
				}
			});	 
			request.fail(function( jqXHR, textStatus ) {
			  alert( "Request failed: " + textStatus );
			});
			
			//동기화 방식으로 하여 결과값을 받아 올수 있어
			//getCheckData 데이타 체크
			if(getCheckData == undefined || getCheckData.result == 'Y'){
				alert('사용할 수 없는 아이디 입니다.');
				$('[name="idCheck"]').val('N');
				return true;
			}else{
				$('[name="idCheck"]').val('Y');
			}
			return false;
		}
		
		/************************************************
		유효성 검사 함수
		작성자 : 홍길동
		작성일 : 2020-04-08
		반복되는 작업을 최소화 하기위해서 함수로 유효성 검사 제작
		함수 리턴값이 true 일경우 에러  
		!!객체에 담긴 키 정의 내역
		1) target : 체크 대상
		2) compareTarget : 체크 대상의 값과 비교 할 대상 - 값이 있을 경우 target과 비교
		3) lenTarget : 데이타 갯수 체크 대상 - 값이 존재할 경우 length가 0이면 안됨
		4) msg : 에러 발생시 출력할 문구
		*************************************************/			
		var valueChecks = function(checkObj){
				
			var target = checkObj.target; //값 체크 대상
			var compareTarget = checkObj.compareTarget; //값과 일치 비교 대상
			var lenTarget = checkObj.lenTarget; //데이타 갯수 
			var msg = checkObj.msg; //에러 발생시 문구
			var isCheck = false; //정상일 경우 false 에러일경우 true 반환
						
			if(target != undefined){
				if(compareTarget != undefined){
					if(target.val() != compareTarget.val()){						
						alert(msg);
						compareTarget.val('')
						compareTarget.focus();
						isCheck = true;
					}
				}else if(lenTarget != undefined){
					if(lenTarget.length == 0){
						alert(msg);
						target.eq(0).focus();
						isCheck = true;
					}
				}else{
					if(target.val() == ''){						
						alert(msg);
						target.focus();
						isCheck = true;
					}						
				}
			}else{
				isCheck = true;
			}
			
			return isCheck;
		}
		
		//회원가입 클릭 이벤트
		$('#joinBtn').click(function(){	
			if(valueChecks({target : $('[name="userName"]'), 	msg : '회원명을 입력해주세요.'})) return;
			if(valueChecks({target : $('[name="userId"]'), 		msg : '회원아이디를 입력해주세요.'})) return;						
			if(valueChecks({target : $('[name="userPw"]'), 		msg : '패스워드를 입력해주세요.'})) return;			
			if(valueChecks({target : $('[name="userPw"]'), 		msg : '패스워드가 틀립니다.', compareTarget : $('[name="userPwCheck"]')})) return;
			if(valueChecks({target : $('[name="userEmail"]'), 	msg : '이메일을 입력해주세요.'})) return;
			if(valueChecks({target : $('[name="userGender"]'), 	msg : '성별을 입력해주세요.', lenTarget : $('[name="userGender"]:checked')})) return;
			if(valueChecks({target : $('[name="idCheck"]'), 	msg : '아아디 중복검사를 실행 해주세요.'})) return;	
			if(userIdCheck()) return;	//아이디 중복 검사 한번더 실시		
			$('#joinFrom').submit();
			
		});
		//아이디 중복검사 클릭 이벤트
		$('#userIdCheck').click(function(){
			if(!userIdCheck()){
				alert('사용할 수 있는 아이디 입니다.');
			}
		});
				
	});
</script>
</head>
<body>
	<form id="joinFrom" action="./ajaxEx01.jsp" method="post">
	
		<input type="hidden" name="idCheck">
		
		<div class="input-group">
			<label>회원명 </label>
			<input type="text" name="userName">
		</div>
		<div class="input-group">
			<label>아이디 </label>
			<input type="text" name="userId">
			<button type="button" id="userIdCheck">아이디 중복 검사</button>
			<div id="userIdMsg"></div>
		</div>
		<div class="input-group">
			<label>패스워드 </label>
			<input type="password" name="userPw">
		</div>
		<div class="input-group">
			<label>패스워드 확인 </label>
			<input type="password" name="userPwCheck">
		</div>
		<div class="input-group">
			<label>이메일 </label>
			<input type="text" name="userEmail">
		</div>
		<div class="input-group">
			<label>			
				<input type="radio" name="userGender" value="남">
				남
			</label>
			<label>			
				<input type="radio" name="userGender" value="여">
				여
			</label>
		</div>
		
		<button type="button" id="joinBtn"> 회원가입 </button>
	</form>
</body>
</html>

 

<%@ page language="java" contentType="application/json; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="com.google.gson.Gson" %>
<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %>
<%
	/*
		데이타 베이스에서 조회하였다는 가정하에
		아래 데이타 나열.
		나열된 데이타는 이미 존재하는 아이디
		id001, id002, id003
	*/	
	String userId = request.getParameter("userId");
	//Gson 인스턴스화(객체화)
	Gson gson = new Gson();		
	//Map을 객체화 하기
	Map map = new HashMap();
	if(
		   "id001".equals(userId) 
		|| "id002".equals(userId) 
		|| "id003".equals(userId)
		|| "".equals(userId)
		|| userId == null
	){		
		map.put("result", "Y");
	}else{
		map.put("result", "N");
	}
	String result = gson.toJson(map);
	out.print(result);
%>

 

'JavaScript' 카테고리의 다른 글

[BootStrap] grid / responsive-utilities  (0) 2020.04.08
[BootStrap] components / modals  (0) 2020.04.08
[JQuery] ajax 실습  (0) 2020.04.07
[JQuery + Ajax] html, json call / gson  (0) 2020.03.31

ajaxSearchData.jsp

<%@ page language="java" contentType="application/json; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="com.google.gson.Gson" %>
<%@ page import="java.util.*" %>
<%
	/*
		배열 선언시 배열의 크기를 지정 후에 선언(인스턴스화)이 가능하다.
		혹은 배열 선언 동시에 값을 지정하여 선언(인스턴스화)해야한다.
	*/
/* 	// String[] str = new String[배열크기];
	String[] str1 = new String[10];
	//인덱스로 접근하여 배열에 값을 삽입 
	str1[0] = "홍길동";
	
	//값이 있는 상태로 배열 선언
	String[] str2 = new String[]{"홍길동"}; */

	Map stepMap = null;

	
	String step = request.getParameter("step");
	String searchData = request.getParameter("searchData");
	
	if("1".equals(step)){
		stepMap = new HashMap();
		stepMap.put("정보기술",new String[]{"정보기술전략","정보기술개발"});
		stepMap.put("통신기술",new String[]{"유선통신구축","무선통신구축"});
		stepMap.put("방송기술",new String[]{"방송제작기술","방송플랫폼기술"});
	}
	if ("2".equals(step)){
		stepMap = new HashMap();
		stepMap.put("정보기술전략",new String[]{"SW아키텍처","응용SW엔지니어링"});
		stepMap.put("정보기술개발",new String[]{"IT시스템관리","IT기술교육"});
		stepMap.put("유선통신구축",new String[]{"교환시스템구축","구내통신구축"});
		stepMap.put("무선통신구축",new String[]{"무선통신시스템구축","전송시스템구축"});
		stepMap.put("방송제작기술",new String[]{"중계방송","방송품질관리"});
		stepMap.put("방송플랫폼기술",new String[]{"라디오방송","지상파TV방송"});
	}
	//맵 객체가 생성 되었다면
	if (stepMap != null){
		Gson gson = new Gson();
		//맵이 객체화 되면서 담긴 데이터를 Map 클래스의 get 메서드로 조회하여 Json으로 출력
		String json = gson.toJson(stepMap.get(searchData));
		out.print(json);
	} else { //객체 생성이 되지 않았다면
		out.print("{}");
	}
		

	
%>

내가 만든 야매 화면

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"> 
<title>ajax 실습</title>
<script type="text/javascript" src="<%=request.getContextPath()%>/resource/js/jquery-3.4.1.min.js"></script>
<script type="text/javascript">
	/*  
		예제 경로 : https://ncs.go.kr/unity/th03/ncsSearchMain.do
		실습 1. ajax를 활용하여 select 태그로 위의 예제 경로 처럼 중, 소, 세분류의 데이터가 출력되도록 하여라.
				호출 경로 : ajaxSearchData.jsp
	*/
$(function() {
	$('#midSelect').change(function() {
		var step = 1;
		
		var searchData = $(this).val()[0];
		console.log(step);
		console.log(searchData);
		
		var request = $.ajax({
			  url: "<%=request.getContextPath()%>/ajaxSearchData.jsp", //통신 할 url
			  method: "POST", // 통신할 메서드 타입
			  data : {step : step , searchData : searchData},
			  dataType: "json" //전송받은 데이터를 변화시킬 컨텐츠 타입	
		});
		
		request.done(function(data) {
			var txt = "";	
			console.log(data);
			for (var i =0; i < data.length ; i++){
				txt += '<option value="'
				txt += data[i]
				txt += '">'
				txt += data[i]
				txt += '</option>'
			}
			console.log(txt);
			$('#smallSelect').html(txt);
			$('#tinySelect').html("");
		})
		request.fail(function( jqXHR, textStatus ) {
		  alert( "Request failed: " + textStatus );
		});
	});
	
	$('#smallSelect').change(function() {
		var step = 2;		
		var searchData = $(this).val()[0];
		console.log(step);
		console.log(searchData);		
		var request = $.ajax({
			  url: "<%=request.getContextPath()%>/ajaxSearchData.jsp", //통신 할 url
			  method: "POST", // 통신할 메서드 타입
			  data : {step : step , searchData : searchData},
			  dataType: "json" //전송받은 데이터를 변화시킬 컨텐츠 타입	
		});
		
		request.done(function(data) {
			var txt = "";	
			console.log(data);
			
			for (var i =0; i < data.length ; i++){
				txt += '<option value="'
				txt += data[i]
				txt += '">'
				txt += data[i]
				txt += '</option>'
			}
			console.log(txt);
			$('#tinySelect').html(txt);
		})	
		request.fail(function( jqXHR, textStatus ) {
		  alert( "Request failed: " + textStatus );
		});
	});
})
	
</script>

</head>
<body>
	<!-- select 태그에 multiple 속성이 추가될 경우 option 태그의 내용이 펼쳐진 상태로 선택을할 수 있으며, 다중 선택도 가능하게 된다. -->
	<select multiple="multiple" id="midSelect">
		<option value="정보기술">정보기술</option>
		<option value="통신기술">통신기술</option>
		<option value="방송기술">방송기술</option>
	</select>
	<select multiple="multiple" id="smallSelect">
	</select>
	<select multiple="multiple" id="tinySelect">
	</select>
</body>
</html>

풀이

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ajax 실습</title>
<script type="text/javascript" src="<%=request.getContextPath() %>/resource/js/jquery-3.4.1.min.js"></script>
<script type="text/javascript">
	/*
		//예제 경로 : https://www.ncs.go.kr/unity/th03/ncsSearchMain.do
		실습1. 위의 예제 경로 처럼 중분류, 소분류, 세분류의 데이타가
		select 테그에 데이타가 출력되도록 하여라.(ajax활용)
		호출경로 : ajaxSearchData.jsp
	*/
	$(function(){
		$('#step1, #step2').change(function(){
			
			var searchData = $(this).val();
			var step = $(this).attr('data-step');	
			
			console.log(searchData, step);
						
			var request = $.ajax({
				url: "<%=request.getContextPath() %>/ajaxSearchData.jsp", //통신할 url
				method: "POST", //통신할 메서드 타입
				data: { searchData : searchData[0], step : step }, //전송할 데이타
				dataType: "json" 
			});	 
			
			request.done(function( data ) {
				
				if(data.length != undefined){
					var html = '';
					for(var i=0; i < data.length; i++){
						html += '<option value="' +data[i]+ '">';
						html += data[i];
						html += '</option>';
					}
					if(step == '1'){
						$('#step2').html(html);
					}else{
						$('#step3').html(html);
					}
				}				
			});	 
			request.fail(function( jqXHR, textStatus ) {
			  alert( "Request failed: " + textStatus );
			});
		});
	});
</script>
</head>
<body>
	<!-- 
		select 테그에  multiple 속성이 추가 될경우 option 테그의 내용이 펼쳐진 상태로
		선택을 할 수 있으며, 다중 선택도 가능하게 된다.
	-->
	<select multiple="multiple" id="step1" data-step="1">
		<option value="정보기술">정보기술</option>
		<option value="통신기술">통신기술</option>
		<option value="방송기술">방송기술</option>
	</select>
	<select multiple="multiple" id="step2" data-step="2">
	</select>
	<select multiple="multiple" id="step3" data-step="3">
	</select>
</body>
</html>

 

코드가 더러워서 그렇지 야매도 꽤 잘 굴러갔음~

Ajax : 비동기 방식의 Javascript와 XML

reload 없이 data를 주고받는다.

 

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<script type="text/javascript" src="./resource/js/jquery-3.4.1.min.js"></script>
<script type="text/javascript">

	var request = $.ajax({
	  url: "script.php", //통신 할 url
	  method: "POST", // 통신할 메서드 타입
	  data: { id : '' }, //전송할 데이터
	  dataType: "html" //전송받은 데이터를 변화시킬 컨텐츠 타입
	  /*  
	  	tataType 
	  	html(text/html), sjon (application/jason),xml (text/xml), text (text/palin)
	  */
	});
	 
	//정상적으로 통신이 완료되었을 경우 실행되는 메서드
	//인수값인 함수를 실행시켜준다 (콜백함수)
	request.done(function( data ) {
	 consolo.log.( data );
	});
	 //에러 발생시 실행되는 메서드
	request.fail(function( jqXHR, textStatus ) {
	  alert( "Request failed: " + textStatus );
	});
	
	/*  
		웹(브라우저)에서 표현할 수 있는 콘텐츠 타입
		1) text/html
			html을 표현하는 타입
		2) text/xml
			xml을 표현하는 타입
			(외부 자원 관리 데이터로 저장 혹은 외부와 통신하기 위한 타입)
		3) text/plain
			텍스트를 표기하는 타입
		4) application/json 
			json을 표현하는 타입
		포맷터 : {"키" : "값"} 형태로 이루어진 문자열
		
	*/
</script>
<title>콘텐츠 삽입</title>
</head>
<body>

</body>
</html>

Ajax Html Call

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<script type="text/javascript" src="./resource/js/jquery-3.4.1.min.js"></script>
<script type="text/javascript">
	$(function() {
	
		
		$('#ajaxCall').click(function() {
			var num = $('#num').val()
			var request = $.ajax({
				  url: "ajaxHtmlCall.jsp", //통신 할 url
				  method: "POST", // 통신할 메서드 타입
				  data: { len : num }, //전송할 데이터
				  dataType: "html" //전송받은 데이터를 변화시킬 컨텐츠 타입	
			});
			
			request.done(function(data) {
				console.log(data);
				if(data != undefined && data != ''){
					$('#ajaxResult').html(data);
				}
			});

			request.fail(function( jqXHR, textStatus ) {
			  alert( "Request failed: " + textStatus );
			});
		});
	})
</script>
<title>Insert title here</title>
</head>
<body>
<input type="number" id="num" placeholder="출력갯수">
<button type="button" id="ajaxCall">호출</button>
<div id="ajaxResult">호출 버튼을 클릭하세요</div>
</body>
</html>

ajaxHtmlCall.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.util.ArrayList" %>
<%
	//len 키 값으로 ajax02.html 에서 값 전송하여 받기
	String len = request.getParameter("len");
	int num = 0;
	//len 값이 null과 공백이 아니라면
	if(len != null && !"".equals(len.trim())){ // nullPointException을 피하기 위해 변수를 메서드 안에서 쓰기
	 num = Integer.parseInt(len);
	 }
%>
<!DOCTYPE html>
<style>
	td{border : 1px solid #000;}
</style>
<table>
	<tbody>
	<%
		for(int i = 0 ; i < num ; i ++){
			%>
		<tr>
			<td>안녕하세요 <%= i %></td>
		</tr>
			<%
		}
	%>

	</tbody>
</table>

Ajax Json Call

<%@ page language="java" contentType="application/json; charset=UTF-8"
    pageEncoding="UTF-8"%>
{"name":"홍길동", "age": 25, "array" : ["전주","익산"]}

브라우저에서만 이렇게 보일 뿐 통신에서는 문제 없다.


 

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<script type="text/javascript" src="./resource/js/jquery-3.4.1.min.js"></script>
<script type="text/javascript">
	$(function() {
	
		
		$('#ajaxCall').click(function() {
			var request = $.ajax({
				  url: "ajaxJsonCall.jsp", //통신 할 url
				  method: "POST", // 통신할 메서드 타입
				 // data: { len : num }, //전송할 데이터
				  dataType: "json" //전송받은 데이터를 변화시킬 컨텐츠 타입	
			});
			
			request.done(function(data) {
				if(data != undefined && data != ''){
					console.log(data);
					$('#ajaxResult').val(data.name)
				}
			});

			request.fail(function( jqXHR, textStatus ) {
			  alert( "Request failed: " + textStatus );
			});
		});
	})
</script>
<title>Insert title here</title>
</head>
<body>
<button type="button" id="ajaxCall">호출</button>
<input type="text" id="ajaxResult" readonly="readonly" placeholder="회원명">
</body>
</html>

ajaxJsonCall.jsp

<%@ page language="java" contentType="application/json; charset=UTF-8"
    pageEncoding="UTF-8"%>
{"name":"홍길동", "age": 25, "array" : ["전주","익산"]}


자바스크립트의 보안 정책

자바스크립트에서 ajax() 메서드로는 서로 다른 도메인의 데이터를 전송할 수 없고 교차 도메인을 허용하지 않는다.


gson

json구조를 띄는 직렬화된 데이터를 JAVA의 객체로 역직렬화, 직렬화 해주는 자바 라이브러리

<%@ page language="java" contentType="application/json; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import ="com.google.gson.Gson" %>
<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %>
<%
	//Gson 인스턴스화(객체화)
	Gson gson = new Gson();

	//Map 객채화
	Map map = new HashMap();
	//put 메서드를 활용하여 값을 저장할 수 있다.
	map.put("name","홍길동");
	map.put("age",25);
	map.put("array",new String[]{"전주","익산"});

	//toJson 메서드를 활용하여 키와 값이 있는 객체를 json 방식으로 출력
	String json = gson.toJson(map);
	out.println(json);
%> 


ajaxJsonCall 실습 

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ajax를 활용하여 아이디 중복검사</title>
<style type="text/css">
	.err{border: 1px solid #ff0000;}
	.ek{border: 1px solid #000000;}
</style>
<script type="text/javascript" src="./resource/js/jquery-3.4.1.min.js"></script>
<script type="text/javascript">
	/*  
		tlftmq3. #idCheckBtn 클릭시 #memberId 값을 가지고 
		ajaxIdCheck.jsp에 ajax를 활용하여 통신하고 아이디 중복 검사를 하여라.
		아이디가 이미 존재한다면 #memberId의 클래스를 .err로 변경하고
		존재하지 않는다면 .ok로 변경하여라.
	*/
$(function() {
	$('#idCheckBtn').click(function() {
		
		var wId = $('#memberId').val()
		
		var request = $.ajax({
			  url: "ajaxIdCheck.jsp", //통신 할 url
			  method: "POST", // 통신할 메서드 타입
			  data: { id : wId }, //전송할 데이터
			  dataType: "json" //전송받은 데이터를 변화시킬 컨텐츠 타입	
		});
		
		request.done(function(data) {
			if(data != undefined && data !='')}
				if(data.result == "Y"){
					$('#memberId').attr("class","err")
				}else if(data.result == "N"){
					$('#memberId').attr("class","ok")
				}else if(data.result == "A"){
					$('#memberId').attr("class","err")
					alert('아이디를 입력해주세요.');
				}
			}
		});

		request.fail(function( jqXHR, textStatus ) {
		  alert( "Request failed: " + textStatus );
		});
	});
})
	
</script>
</head>
<body>
	<input type="text" id="memberId" class="ok">
	<button type="button" id="idCheckBtn">아이디 중복 확인</button>
</body>
</html>
<%@ page language="java" contentType="application/json; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import ="com.google.gson.Gson" %>
<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %>
<%
/*  
	데이타베이스에서 조회한다는 가정하에 아래 데이터나열
	(나열된 데이터는 이미 존재하는 아이디 id001, id002, id003)
*/
	//Gson 인스턴스화(객체화)
	Gson gson = new Gson();
	
	//Map 객채화
	Map map = new HashMap();

	String id = request.getParameter("id");
	

	
	if(!"".equals(id)){
		if("id001".equals(id)){
			map.put("result","Y");
		}else if("id002".equals(id)){
			map.put("result","Y");
		}else if("id003".equals(id)){
			map.put("result","Y");
		}else{
			map.put("result","N");
		}
	}else if("".equals(id) || id == null){
		map.put("result","A");
	}
	
	String result = gson.toJson(map);
	out.print(result);

%>

 

객체 편집 메서드 실습 1

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>객체 편집 메서드</title>
<script type="text/javascript" src="./resource/js/jquery-3.4.1.min.js"></script>
<script type="text/javascript">
	/*  
		실습1. #add1 선택시 addList 객체를 조회하여 1차 지역과 일치하는 2차 지역목록을 #add2에 출력하여라.
	*/
	//실제 데이터베이스에서 조회한다는 가정 하에 데이터를 정리
	var addList = {
			'전주' : ['덕진구', '완산구']
			,'군산' : ['개사길	', '거사길']
			,'익산' : ['고봉로', '고현로']			
	}
	
	//addList['']
	
/*	$(function() {
		$('#add1').change(function() {
			var a = $(this).val();
			$('#add2').find('option').remove();
			$('#add2').append('<option value=""> :: 지역을 선택해 주세요. :: </option>');
			for( var i = 0; i <addList[a].length ; i++){
			$('#add2').append('<option value="'+addList[a][i]+'">'+addList[a][i]+'</option>');
			}
		})
	})
*/
	
	$(function() {
		$('#add1').change(function() {
			var add = $(this).val();
			var addArray = addList[add];
			var html = '<option value=""> :: 2차 지역을 선택해 주세요. :: </option>';
			for( var i = 0; i < addArray.length ; i++){
			html += '<option value="'+ addArray[i] +'">'+ addArray[i]+'</option>';
			}
			$('#add2').html(html);
		})
	})
	
</script>
</head>
<body>
	<select id="add1">
		<option value=""> :: 지역 선택 :: </option>
		<option value="전주"> 전주 </option>
		<option value="군산"> 군산 </option>
		<option value="익산"> 익산 </option>
	</select>
	<select id="add2">
		<option value=""> :: 지역을 선택해 주세요. :: </option>
	</select>
</body>
</html>

객체 편집 메서드 실습 2

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>객체 편집 메서드 2</title>
<script type="text/javascript" src="./resource/js/jquery-3.4.1.min.js"></script>
<script type="text/javascript">
	/*  
		실습2. .choice1 클릭시 choice2List 객체의 키와 일치하는 교수를 #choice2Wrap에 체크박스로 뿌려주고
		#choice2Wrap 내에 생성된 교수를 클릭시 choice3List 객체를 조회하여
		해당 교수가 담당하는 교과목을  #choice3Wrap에 체크박스로 뿌려주시오.
	*/
	$(function() {
		$('.choice1').click(function () {
			console.log($(this).val(),"<--클릭선택value");
			var val = $(this).val();
			var array = choice2List[val];
			console.log( array ,"<--교수");
			var html = '';
			for(var i = 0 ; i <array.length ; i++){
				console.log(array[i]);
				html += '<label><input type="checkbox" class="choice2" name="choice2" value ="' +array[i]+'">'+array[i]+'</label>'
			}
			$('#choice2Wrap').html(html);
		})
	})
	//.choice2 동적 바인딩
	$(document).on('click','.choice2', function(){
		var html = '';
		$('.choice2:checked').each(function() {
			var choice = $(this).val();
			console.log(choice, '교수선택')
			var array =  choice3List[choice];
			for(var i=0; i <array.length; i++){
				html += '<label><input type="checkbox" class="choice3" name="choice3" value ="' +array[i]+'">'+array[i]+'</label>'
			}		
		})
		$('#choice3Wrap').html(html);
	})
		
	var choice2List = {
			'9' : ['9급 홍길동', '9급 고길동']
			,'7' : ['7급 이순신', '7급 유관순']
	}
	var choice3List = {
			'9급 홍길동' : ['국어', '영어']
			,'9급 고길동' : ['국사', '토익']
			,'7급 이순신' : ['과학', '국사']
			,'7급 유관순' : ['수학', '일어']
	}
</script>
</head>
<body>


	<div>
		<h1>급수 선택</h1>
		<label>
			<input type="radio" name="choice1" class="choice1" value="9"> 9급
		</label>
		<label>
			<input type="radio" name="choice1" class="choice1" value="7"> 7급
		</label>
	</div>
	<div>
		<h1>교수 선택</h1>
		<div id="choice2Wrap"></div>
	</div>
	<div>
		<h1>과목 선택</h1>
		<div id="choice3Wrap"></div>
	</div>
	
</body>
</html>

제이쿼리 객체 탐색기 및 탐색기 메서드 활용 실습

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>제이쿼리 객체 탐색기 및 탐색기 메서드 활용</title>
<script type="text/javascript" src="./resource/js/jquery-3.4.1.min.js"></script>
<script type="text/javascript">
	/*
		실습1. 아래의 html 객체들이 있다.  
		#sum 버튼 클릭시 .num의 값을 가지고와 합산하고
		그 결과값을 #text에 삽입하여라.
		(.del 클릭시 .num-wrap 가 제거 되어야함)
		-- 추가 설명 메서드
		객체.val() <-- value라는 속성을 가진 html 객체의 값을 가지고 오거나 삽입한다.
		객체.text() <-- 선택된 객체의 텍스트 요소를 가지고 오거나 삽입한다.
	*/
	
$(function(){
		
		//input box 에 숫자만 입력되도록 하는 jquery
		$('input').keyup(function(){
			var inputVal = $(this).val();
			$(this).val(inputVal.replace(/[^0-9]/gi,'')); //정규식
		})
	
	    $('#sum').click(function(){
	    	var sig = 0;
	    	$('.num').each(function(){
	    		if($(this).val() == ''){
	    		}else{
	    			sig += parseInt($(this).val());
	    			/* Number함수 : 값이 없을 경우 0 반환 
	    			parseInt : 값이 없을 경우 NaN, undefined 반환 */
	    		}
	        })
	        $('#text').text(sig);
	    })
        
	    $('.del').click(function(){
	       	$(this).parents('.num-wrap').remove();
	    })
	    	    
	})
	

</script>
</head>
<body>
	<div class="num-wrap">
		<input type="text" class="num"> 
		<button type="button" class="del">제거</button>
	</div>
	<div class="num-wrap">
		<input type="text" class="num"> 
		<button type="button" class="del">제거</button>
	</div>
	<div class="num-wrap">
		<input type="text" class="num"> 
		<button type="button" class="del">제거</button>
	</div>
	<h1>
		계산결과
	</h1>
	<div id="text"> 계산하기를 클릭해주세요.</div>
	<button type="button" id="sum">계산하기</button>
</body>
</html>

https://tyson.tistory.com/119


속성 조작 메서드

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="./resource/js/jquery-3.4.1.min.js"></script>
<script type="text/javascript">
	/*  
		<속성 조작 메서드>
		 :	선택된 객체의 속성값을 가지고 오거나 변경이 가능한 메서드
		 
		<Parsing> ((cf. 형변환)) 
		 :	서로 다른 데이터를 변환하는 작업
		 	- parser :	서로 다른 테이터를 변환하는 대상 혹은 도구 (플러그인, api(메서드)) 
		 
			1)	$('선택자').html()
				 :	선택된 객체의 html요소를 가지고 오거나 삽입
				ex)	$('body').html();	선택된 객체의 자식 html 요소 가지고 오기
					$('body').html('<h1>안녕하세요</h1>');	선택된 객체에 값 삽입
			
			2) 	$('선택자').text()
				 :	선택된 객체의 하위 요소의 text를 가지고 오거나 삽입
				ex)	$('body').text();	body의 하위 텍스트 전체 가지고 오기
					$('body').text('안녕하세요');	body의 하위 텍스트 전체 가지고 오기
					
		***	3)	$('선택자').attr()
				 :	선택된 객체의 속성을 가지고 오거나 삽입한다.
				 	웹표준에 존재하지 않는 속성도 삽입하거나 가지고 올 수 있다.
				ex) $('body').attr('myName');	body에 myName 이라는 속성의 값을 가지고 온다.
				 	 $('body').attr('myName', '홍길동');	body에 myName 이라는 속성을 생성하고 속성 myName의 값으로 홍길동을 삽입한다.

			4)	$('선택자').removeAttr('속성명')
				 :	선택된 객체의 인수값에 해당되는 속성을 제거한다.
				ex) $('body').removeAttr('myName'); body에 myName이라는 속성을 제거
				 	 
			5)	$('선택자').prop()
				 :	선택된 객체의 상태속성을 확인하거나 변경한다. ('checked', 'selected', 'hidden' 등)
				ex) $('body').prop('hidden', true); body 태그의 상태를 hidden으로 변경
				 	 $('body').prop('hidden', false); body 태그의 상태를 hidden 해제
				 	 $('body').prop('hidden'); body 태그의 상태 중 hidden의 상태값을 true / false로 가지고 온다.
				 
			6)	$('선택자').val() 
				 :	선택된 객체의 value 속성값을 가지고 오거나 변경한다.
				ex) $('input').val(); input 태그의 value속성의 값을 가지고 온다.
				 	 $('input').val('홍길동'); input 태그의 value속성의 값을 '홍길동'으로 변경한다.
			
	 	 	7)	$('선택자').css()
	 	 		 :	선택된 객체의 css 속성을 적용 혹은 값을 가지고 온다.
	 	 		ex) $('body').css('border', '1px solid #ff0000'); body에 border라는 css속성 1px solid #ff0099을 적용
	 	 		 	 $('body').css('border'); body에 적용된 css속성 border 값을 가지고 오기
	 	 		 	 
	 	 		ex2) 다중으로 css 속성 적용하기
	 	 		 		$('body').css({
	 	 		 			'border':'1px solid #ff0000',
	 	 		 			'padding':'5px'	
	 	 		 		})	
	 	 		 	 
	 	 	8)	$('선택자').addClass('클래스명')
	 	 		 :	선택된 객체에 클래스를 추가 삽입
	 	 		ex) $('body').addClass('syntaxhighlighter'); body에 클래스 속성의 값에 syntaxhighlighter를 추가한다.
	 	 		 
 	 		9)	$('선택자').removeClass('클래스명')
 	 			 :	선택된 객체에 인수값에 해당하는 클래스를 제거
 	 			ex) $('body').removeClass('syntaxhighlighter'); body의 클래스 속성에  syntaxhighlighter 값이 있다면 syntaxhighlighter 제거
 	 			
 	 		10)	$('선택자').('클래스명')
 	 			 :	
 	 			ex)
 	 				 
	*/
</script>
</head>
<body>

</body>
</html>

속성 조작 메서드 실습 css, addClass, removeClass

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>속성 조작 메서드 실습 css, addClass, removeClass</title>
<script type="text/javascript" src="./resource/js/jquery-3.4.1.min.js"></script>
<script type="text/javascript">
	$(function(){
		$('#bodyBorderChange').click(function(){
			if($('body').is('.r-border')){
				$('body').removeClass('r-border').addClass('b-border');
			} else {
				$('body').removeClass('b-border').addClass('r-border');
			}
		})
	})
</script>

<style type="text/css">
	.r-border{
		border: 1px solid #ff0000; 	
	}
	.b-border{
		border: 1px solid #0000ff;
	}
	</style>
</head>
<body class="r-border">
	<!--
		실습3. #bodyBorderChange 클릭시 .r-border와 .b-border가 토글되게 하라.
		addClass, removeClass, is, attr
		(is 메서드는 상태속성 및 아이디, 클래스를 확인할 수 있다. ex) $('body').is('.r-border'); >> true/false )
	  -->
	<button type="button" id="bodyBorderChange">바디 보더 변경</button>
</body>
</html>

제이쿼리 css 메서드 활용 실습

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>제이쿼리 css 메서드 활용</title>
<style type="text/css">
	body{padding: 0;}
	ul{padding: 10px; margin: 0;}
	ul, li{list-style-type: none;}
	li{width: 100px; height: 100px; border: 1px dashed #000; padding: 1px; margin: 0;}
</style>
<script type="text/javascript" src="./resource/js/jquery-3.4.1.min.js"></script>
<script type="text/javascript">
	/*
		실습4. #alignStart 버튼 클릭시 li테그를 왼쪽 정렬되게 하여라.
		(row 형태로 존재하는 li를 col 형태로 재정렬)
	*/
	
	$(function(){
		$('#alignStart').click(function(){
			$('li').css('float','left')
		})
	})
</script>
</head>
<body>
	<ul>
		<li>1</li>
		<li>2</li>
		<li>3</li>
		<li>4</li>
	</ul>
	<button type="button" id="alignStart">정렬하기</button>
</body>
</html>

 


객체 편집 메서드

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>객체 편집 메서드</title>
<script type="text/javascript" src="./resource/js/jquery-3.4.1.min.js"></script>
<script type="text/javascript">
	/*  
		<객체 편집 메서드>
		 : 선택한 객체의 옵션 (메서드에 위치 옵션 포함) 위치에 html 요소를 삽입
		 
		 1)	$('선택자').before('html 요소')
		 	 :	선택한 대상의 이전 위치에 html 삽입
	
		2) 	$('선택자').after('html 요소')
		 	 :	선택한 대상의 이전 위치에 html 삽입
			
	***	3)	$('선택자').append('html 요소')	
			 :	선택한 대상의 자식요소 제일 끝에 html 삽입
			
	***	4)	$('선택자').prepend('html 요소')	
			 :	선택한 대상의 자식요소 제일 처음에 html 삽입

		5) 	$('선택자').clone()
	 	 :	선택한 대상을 복제한다.
	 	 
	*/
	
	$(function(){
		$('#beforeAfterBtn').click(function(){
			$('#center').before('<div>이전</div>')
			$('#center').after('<div>다음</div>')
		})
		
		$('#appendBtn').click(function(){
			var len = $('#addTr').find('tr').length;
			$('#addTr').append('<tr><td> 마지막' + len + ' </td></tr>')
		})
		$('#prependBtn').click(function(){
			var len = $('#addTr').find('tr').length;
			$('#addTr').prepend('<tr><td> 처음' + len + ' </td></tr>')
		})
		
		$('#cloneBtn').click(function(){
			//clone 변수에 #cloneTarget을 복제한다.
			var clone = $('#cloneTarget').clone();
			console.log(clone,'<<clone');
			//clone() 메서드로 복제시 clone변수에 담긴 객체를 조회할 수 있다.
			clone.find('h2').text('안녕하세요2');
			console.log(clone.html(),'<<clone.html()')
			$('#cloneCopy').html(clone.html());
		})
	})
</script>
</head>
<body>
	<h1> before after </h1>
	<div id="center">
		중앙
	</div>
	<button type="button" id="beforeAfterBtn">다음과 이전 html 삽입</button>
	
	<h1> append prepend</h1>
	<table>
		<tbody id="addTr">
			<tr><td> 중앙 </td></tr>
		</tbody>
	</table>
	<button type="button" id="appendBtn">append</button>
	<button type="button" id="prependBtn">prepend</button>
	
	<div id="cloneTarget">
		<h2>안녕하세요.</h2>
	</div>
	<div id="cloneCopy"></div>
	<button type="button" id="cloneBtn">복제</button>
	
</body>
</html>

동적바인딩

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>동적 바인딩</title>
<script type="text/javascript" src="./resource/js/jquery-3.4.1.min.js"></script>
<script type="text/javascript">
	/*
		<동적 바인딩>
		 :	html 실행 순서에 따라 dom 객체가 생성되기 때문에 이벤트 실행 완료 이후에 생성되는 html 에는 이벤트를 걸 수 없다.
		 	때문에 동적으로 이벤트를 걸거나 객체 생성시에  이벤트를 걸어야 한다. 
	*/

 		$(document).on('click','.add',function() {
			var clone = $(this).parent().clone();
			$('body').append(clone);
		})
		$(document).on('click','.del',function() {
			$(this).parent().remove();
		})
	
</script>
</head>
<body>
	<div class="btn-wrap">
		<button type="button" class="add">생성</button>
		<button type="button" class="del">제거</button>
	</div>
</body>
</html>

객체 조작 메서드 활용 실습

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>객체 조작 메서드 활용 실습</title>
<script type="text/javascript" src="./resource/js/jquery-3.4.1.min.js"></script>
<script type="text/javascript">
	/*  
		실습5. .file-add 클릭시 파일을 더 추가할 수 있는 폼을 추가하고 .file-del 클릭시 파일을 첨부할 수 있는 폼을 제거하여라.
			파일 추가 최대 갯수는 5개이고 1개 최소 1개는 존재해야한다. 
	*/
	
	$(document).on('click','.file-add',function(){
		console.log($('.file-add').parent().length)
		if($('.file-add').parent().length <= 5){
		var clone = $(this).parent().clone();
		$('#file-warp').append(clone);
		}
	})
	$(document).on('click','.file-del',function(){
		console.log($('.file-del').parent().length)
		if($('.file-del').parent().length > 1){
	
		$(this).parent().remove();
		}
	})
	
	
</script>
</head>
<body>
	<div id="file-warp">
		<div class="file-group">
			<input type="file">
			<button type="button" class="file-add">파일 추가</button>
			<button type="button" class="file-del">파일 제거</button>
		</div>
	
	</div>

</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>객체 조작 메서드 활용 실습</title>
<script type="text/javascript" src="./resource/js/jquery-3.4.1.min.js"></script>
<script type="text/javascript">
	/*  
		실습5. .file-add 클릭시 파일을 더 추가할 수 있는 폼을 추가하고 .file-del 클릭시 파일을 첨부할 수 있는 폼을 제거하여라.
			파일 추가 최대 갯수는 5개이고 1개 최소 1개는 존재해야한다. 
	*/
	
	$(document).on('click','.file-add',function(){
		var len = $('.file-group').length;
        if(len<5){
          var clone = $(this).parent().clone();
          clone.find('input').val('');
          $('#file-warp').append(clone);
        } else {
        	alert('더 이상 추가할 수 없습니다.')
        }
	})
	$(document).on('click','.file-del',function(){
    	var len = $('.file-group').length;
        if(len>1){
		$(this).parent().remove();
        } else {
        	alert('더 이상 삭제할 수 없습니다.')
        }
	})
	
	
</script>
</head>
<body>
	<div id="file-warp">
		<div class="file-group">
			<input type="file">
			<button type="button" class="file-add">파일 추가</button>
			<button type="button" class="file-del">파일 제거</button>
		</div>
	
	</div>

</body>
</html>

 

+ Recent posts