BackEnd/JSP

16장. HTML5와 제이쿼리

제이드Jade 2022. 2. 24. 13:42

16.1 HTML5 주요 개념

HTML5 : HTML의 최신 버전

- 기존 HTML4에서는 지원하지 않는 동영상이나 오디오 기능 그리고 지리 위치 정보 등을 지원

- 플러그인을 따로 설치하지 않아도 화려한 그래픽 효과 구현 가능

- 운영체제에 상관없이 모바일환경에서도 기능 구현 가능

- 여러가지 기능

기능  설명 
Web Form  입력 형태를 보다 다양하게 제공 
Video  동영상 재생을 위한 API 제공 
Audio  음악 재생을 위한 API를 제공 
Offline Web  인터넷 연결이 되지 않은 상태에서도 정상적인 기능을 지원하는 API 제공 
Web DataBase  표준 SQL을 사용해 데이터를 저장할 수 있는 기능을 제공 
Web Storage  웹 애플리케이션에서 데이터를 저장할 수 있는 기능을 제공 
Canvas  2차원 그래픽 그리기객체에 대한 각종 효과를 주는 기능을 제공 
SVG  XML 기반 2차원 벡터 그래픽을 표현하기 위한 SVG 언어를 지원 
Geolocation  디바이스의 지리적 위치 정보를 가져오는 기능 제공 
Web Worker  웹 애플리케이션을 위한 스레드 기능 제공 
Web Socket  웹 애플리케이션과 서버 간의 양방향 통신 기능을 제공 
CSS3  웹 애플리케이션의 다양한 스타일 및 효과를 나타내기 위한 CSS3 제공 

 

16.2 HTML 시멘틱 웹을 위한 구성 요소

시멘틱 웹 : 기계가 이해할 수 있고 처리할 수 있는 웹 콘텐츠를 만드는 것

- HTML4에서는 <div>태그에 CSS를 적용, HTML5에서는 다양한 태그로 제공

- HTML5에 추가된 여러가지 태그

태그  설명 
<header>  머리말을 나타내는 태그 
<hgroup>  제목과 부제목을 묶는 태그 
<nav>  메뉴 부분을 나타내는 태그 
<section>  제목별로 나눌 수 있는 태그 
<article>  개별 콘텐츠를 나타내는 태그 
<aside>  왼쪽 또는 오른쪽에 위치하는 사이드 바를 나타내는 태그 
<footer>  하단의 정보를 표시하는 태그 

 

 

 

~<section>태그를 이용해 제목을 표시하는 실습~

- 레이아웃이 위 그림처럼 제대로 표시되려면 각 태그에 CSS를 적용해야 함(head에 css코드 작성)

<body>
 <header>
 	<h1>HTML5 강좌를 시작합니다.</h1>
 </header>
 <nav>
  <ul>
   <li>1.개념익히기</li>
   <l1>2.문법익히기</l1>
   <li>3.실전응용하기</li>
  </ul>
 </nav>
 <aside>
  사이드 메뉴
 </aside>
 <section>
 	<article>
 		<h1> 첫 번째 강좌 제목</h1>
 		<p> 첫 번째 강좌 내용</p>
 	</article>
 	<article>
 		<h1> 두 번째 강좌 제목</h1>
 		<p> 두 번째 강좌 내용</p>
 	</article>
 	<article>
		<h1> 세 번째 강좌 제목</h1>
		<p> 세 번째 강좌 내용</p>
 	</article>
 </section>
 <aside>
 	퀵메뉴
 </aside>
 <footer>
 	프로그래밍 강의 Copyright All right reserved.
 </footer>
</body>

 

 

16.3 제이쿼리 주요 개념

제이쿼리 : 화면의 동적 기능을 자바스크립트보다 좀 더 쉽고 편리하게 개발할 수 있게 해주는 자바스크립트 기반 라이브러리.

: 여러 가지 효과나 이벤트를 간단한 함수 호출만으로 빠르게 개발 가능

 

<제이쿼리의 주요 특징>

  • CSS 선택자를 사용해 각 HTML 태그에 접근해서 작업하기 때문에 명료하면서 읽기 쉬운 형태로 표현 가능
  • 메서드 체인 방식으로 수행하므로 여러 개의 동작(기능)이 한 줄로 나열되어 코드가 불필요하기 반복되는 것을 피할 수 있음
  • 많은 플러그인을 제공
  • 크로스 브라우징을 제공해 브라우저 종류에 상관 없이 동일하기 기능을 수행

 

<제이쿼리를 사용하는 방법 2가지>

방법1) www.jquery.com 에서 라이브러리 다운

방법2) 네트워크로 CDN 호스트를 설정해서 사용(jsp에서 코드 한줄 추가)

 

<HTML이나 JSP에서 제이쿼리 CDN 호스트를 설정하는 방법>

<script src="http://code.jquery.com/jquery-2.2.1(혹은 latest).min.js"></script>

 

 

16.4 제이쿼리의 여러 가지 기능

- 제이쿼리는 HTML 객체(DOM-Document Object Model)를 탐색하는 방법으로 CSS 선택지를 이용

<제이쿼리의 여러 가지 선택자>

선택자 종류  선택자 표현 방법  설명 
All selector  $("*")  모든 DOM을 선택 
ID selector  $("#id")  해당되는 id를 가지는 DOM을 선택 
Element selector  $("elementName")  해당되는 이름을 가지는 DOM을 선택 (ex. div)
class selector  $(".className")  CSS 중 해당되는 클래스 이름을 가지는 DOM을 선택
Multiple selector   $("selector1,selector2,selector3,......selectorN")  해당되는 선택자를 가지는 모든 DOM을 선택

 

~제이쿼리 선택자 사용 실습~

1) id 선택자로 태그에 접근하기

ex1)

<script src="http://code.jquery.com/jquery-latest.min.js"></script> <!-- 방법2로 제이쿼리 사용 -->
<script type="text/javascript">
	$(document).ready(function() {
		alert($("#unique2").html()); 
	}); 
</script> <!-- document에 DOM이 로드되는 이벤트 처리 함수 -->
<!-- 페이지 로드 시 id가 unique2인 태그를 검색한 후 html() 메서드를 이용해 태그의 값('제이쿼리 입니다!')을 가져옴 -->
</head>
<body>
<div class="class1">안녕하세요.</div>
<div id="unique2">제이쿼리입니다!</div>
<div id="unique3">
	<p>제이쿼리는 아주 쉽습니다!!</p>
</div>

ex2)

..
	function addHtml(){
		$("#article").html('안녕하세요'+'<br>');
	}
</script> <!-- html메서드 인자 값을 태그 값으로 설정 -->
</head>
<body>
<div>
	<p id="article"></p>
</div>
<input type="button" value="추가하기" onClick="addHtml()"/>

ex3)

..
function fn_process(){
		var value=$("#t_input").val();
		$('#t_output').val(value);
	}
</script> <!-- .val() : 입력 값 -->
..
<input type="text" id="t_input"/>
<input type="button" value="입력하기" onClick="fn_process()"/><br><br>
결과:<br>
<div>
	<input type="text" id="t_output" disabled/>
</div> <!-- disabled: 입력불가 -->

ex3 실행결과

 

2) 클래스 선택자로 태그에 접근하기

..
	function addImage(){
		$(".class1").html("<img src='../image/duke.png' width=200>");
	}
</script>
</head>
<body>
<div class="class1"></div>
<div class="class1"></div>
<input type="button" value="이미지 추가하기" onClick="addImage()"/>

 

3) 태그에 직접 접근하기

..
	function addImage(){
		$("div").html("<img src='../image/duke.png' width=200>");
	}
</script>
</head>
<body>
<div></div>
<div></div>
<input type="button" value="이미지 추가하기" onClick="addImage()"/>

 

16.5 제이쿼리 Ajax 기능

Ajax : Asynchronous Javascript(비동기 자바스크립트) + XML

      : 자바스크립트를 사용한 비동기 통신, 즉 클라이언트와 서버 간의 XML이나 JSON 데이터를 주고받는 기술

- 페이지 이동 없이 데이터 처리가 가능, 서버의 처리를 기다리지 않고 비동기 요청이 가능하다.

 

- 기존 웹페이지 ) 서버에 요청 -> 서버에서 결과를 처리 + HTML 태그를 클라이언트의 브라우저에 전송

                      즉, 전송하여 다른 페이지를 보여주는 것임 => 페이지 이동 발생

Ajax로 페이지 처리) 서버에서 처리 + 다시 XML이나 JSON으로 원래 요청 페이지로 전송 => 페이지 이동 X

 

 

제이쿼리 Ajax 사용법

$.ajax({ 속성: 값 })

 

<제이쿼리 Ajax 기능 관련 속성들>

속성  설명 
type  통신 타입을 설정( post 또는 get 방식으로 선택) 
url  요청할 url을 설정 
async  비동기식으로 처리할지의 여부를 설정(false인 경우 비동기로 처리) 
data  서버에 요청할 때 보낼 매개변수 설정 
dataType  응답 받을 데이터 타입을 설정(XML, TEXT, HTML, JSON 등) 
success  요청 및 응답에 성공했을 때 처리 구문을 설정 
error  요청 및 응답에 실패했을 때 처리 구문 설정 
complete  모든 작업을 마친 후 처리 구문 설정 

따라서

$.ajax({

	type: "post/get"
	async: "true/false"
	url : "요청URL"
    data : {서버로 전송할 데이터(파라미터)}
    dataType : "서버에서 전송받을 데이터 형식"
    
    success:{//정상 응답시}.
    error: function(xhr, status, error){//오류 발생 시},
    complete: function(data, textStatus){//작업 완료 시}

})

 

~제이쿼리 Ajax 사용하기 실습~

ajax1.html

<script  src="http://code.jquery.com/jquery-latest.min.js"></script>
<script type="text/javascript">
	function fn_process(){
		$.ajax({
			type:"get",
			async:false, //동기식
			url:"http://localhost:8090/pro16/ajaxTest1",//전송할 서블릿
			data: {param: "Hello, jquery"},
			dataType:"text", //응답 데이터를 텍스트로 지정
			success: function(data,textStatus){//data : 응답받은 값
				$('#message').append(data);
			},
			error: function(data, textStatus){
				alert("에러가 발생했습니다.");
			},
			complete: function(data, textStatus){
				alert("작업을 완료했습니다.");
			}
		})
		
	}
</script>
</head>
<body>
 <input type="button" value="전송하기" onClick="fn_process()"/><br><br>
 <div id="message"></div>
</body>

- AjaxTest1.java

..
String param=(String) request.getParameter("param"); //ajax로 전송된 매개변수를 가져 옴(data)
System.out.println(param);
PrintWriter writer=response.getWriter();
writer.print("안녕하세요! 서버입니다.");

 

- XML 데이터 연동하기

<!-- ajax2.html -->
function fn_process(){
		$.ajax({
			type:"post",
			async:false, //동기식
			url:"http://localhost:8090/pro16/ajaxTest2",
			dataType:"xml", //응답 데이터를 텍스트로 지정
			success: function(info,textStatus){//info : 응답받은 값
				$(info).find("book").each(function(){
					var title=$(this).find("title").text(); //전송된 XML 데이터에서 엘리먼트 이름으로 데이터 가져옴
					var writer=$(this).find("writer").text();
					var image=$(this).find("image").text();
					$('#bookInfo').append(
						"<p>"+title+"</p>"+
						"<p>"+writer+"</p>"+
						"<img src="+image+"/>"
					);
				});
			},
...


            
  <!-- AjaxTest2.java -->
  ...
  result="<main><book>"+
		         "<title><![CDATA[초보자를 위한 자바 프로그래밍]]></title>" +
		         "<writer><![CDATA[인포북스 저 | 이병승]]></writer>" +                             
		         "<image><![CDATA[http://localhost:8090/pro16/image/image1.jpg]]></image>"+
		      "</book>"+
		      "<book>"+
		         "<title><![CDATA[모두의 파이썬]]></title>" +
		         "<writer><![CDATA[길벗 저 | 이승찬]]></writer>" +                 
		        "<image><![CDATA[http://localhost:8090/pro16/image/image2.jpg]]></image>"+
		      "</book></main>";
		System.out.println(result);
		writer.print(result);
        ...

 

~ID 중복 여부 확인하기 실습~

- MemberServlet.java

...
String id=(String)request.getParameter("id");
		MemberDAO dao=new MemberDAO();
		boolean overlappedID=dao.overlappedID(id);
		if(overlappedID==true) {
			writer.print("not_usable");
		}else
			writer.print("usable");
	}

- MemberDAO.java 는 decode()~where id=? 를 이용해서 id가 존재하면 true를 반환하게 작성

 

- ajax3.html

<script type="text/javascript">
	function fn_process(){
		var _id=$('#t_id').val();
		if (_id==''){
			alert("ID를 입력하세요.");
			return;
		}
		
		$.ajax({
			type:"post",
			async:true,
			url:"http://localhost:8090/pro16/mem",
			dataType:"text",
			data:{id:_id},
			success: function(data,textStatus){
				if(data=='usable'){
					$('#message').text("사용할 수 있는 ID입니다.");
					$('#btn_duplicate').prop("disabled",true); //버튼 못누르게 하기
				}else{
					$('#message').text("사용할 수 없는 ID입니다.");
				}
			},

 

 

16.6 제이쿼리에서 JSON 사용하기

- 기존에 pc브라우저와 서버 통신할 때 XML과 JSON을 많이 사용하는데, XML로 연동할 경우 내부적으로 여러 단계의 처리 과정을 거치게 되므로 단순한 JSON으로 데이터를 많이 주고 받는다.

- JSON : name/value 쌍으로 이루어진 데이터 객체를 전달하기 위해 인간이 읽을 수 있는 텍스트를 사용하는 개방형 표준 데이터 형식

          : 비동기 브라우저/서버 통신(Ajax)을 위해 XML을 대체하는 데이터 전송 형식 중 하나

- JSON에서 사용하는 기본 자료형

  • 수 : 정수/실수(고정,부동소수점)
  • 문자열 : 문자열, 제어문자(\)
  • 배열 : 대괄호로 나타냄 (ex. "name":["홍길동","이순신","임꺽정"])
  • 객체 : 중괄호{}로 둘러싸서 표현 (ex { "name":"홍길동", "age":16, "weight":67)

JSON객체들을 요소로 가지는 배열 ex)

"members" : [
 {"name" : "홍길동" , "age":22, "gender": "남", "nick": "날샌돌이"},
 {"name" : "손흥민" , "age":30, "gender": "남", "nick": "탱크"},
 {"name" : "김연아" , "age":24, "gender": "여", "nick": "갈치"},
]

 

 

~JSON의 자료형 사용 실습~

...
	$(function(){
		$("#checkJson").click(function(){
			var jsonStr = '{"name":["홍길동", "이순신", "임꺽정"]}'; //객체의 name:name, value:배열 
			var jsonInfo = JSON.parse(jsonStr); //JSON형식으로 파싱
			var output="회원 이름<br>";
			output+="======<br>";
			for(var i in jsonInfo.name){ //배열을 돌리면 i는 인덱스(cf. 객체를 돌리면 i는 name)
				output+=jsonInfo.name[i]+"<br>";
			}
			$('#output').html(output);
		});
	});
...

 

~ 객체 자료형 ~

	$(function(){
		$("#checkJson").click(function(){
			var jsonStr = '{"name":"홍길동","age":12,"gender":"남자","nickname":"날쌘돌이"}';
			var output="회원 정보<br>";
			output+="======<br>";
			output+="이름 : "+jsonInfo.name+"<br>";
			output+="나이 : "+jsonInfo.age+"<br>";
			output+="성별 : "+jsonInfo.gender+"<br>";
			output+="별명 : "+jsonInfo.nickname+"<br>";
			$('#output').html(output);
		});
	});

~ 객체의 속성 중에 객체의 배열을 값으로 가지는 실습~

$(function(){
    $("#checkJson").click(function(){
        var jsonStr = '{"members":[{"name":"박지성","age":25,"gender":"남자","nickname":"날쌘돌이"},'
            +'{"name":"손흥민","age":31,"gender":"남자","nickname":"탱크"},'
            +'{"name":"홍길동","age":12,"gender":"남자","nickname":"홍당무"}]}';
        var output="회원 정보<br>";
        var jsonInfo=JSON.parse(jsonStr);
        output+="======<br>";
        for(var i in jsonInfo.members){
            output+="이름 : "+jsonInfo.members[i].name+"<br>";
            output+="나이 : "+jsonInfo.members[i].age+"<br>";
            output+="성별 : "+jsonInfo.members[i].gender+"<br>";
            output+="별명 : "+jsonInfo.members[i].nickname+"<br><br>";
        }
        $('#output').html(output);
    });
});

 

 

<Ajax 이용해 서버와 JSON 데이터 주고받기>

- 서블릿에서 JSON을 사용하려면 JSON 라이브러리를 설치해야 함

 ㄴ https://code.google.com/archive/p/json-simple/downloads 접속 > json-simple-1.1.1.jar 다운 > lib에 붙여넣기

- jsp에서 ajax로 json 스트링을 보내주면 서블릿에서 json으로 파싱

 

~ JSP에서 제이쿼리 Ajax 기능을 이용해 서블릿으로 JSON 데이터를 전송 실습~

 

-json5.jsp

<c:set var="contextPath" value="${pageContext.request.contextPath }"/>
...
function(){
	$('#checkJson').click(function(){
		var _jsonInfo='{"name":"박지성","age":25,"gender":"남자","nickname":"날쌘돌이"}';
		$.ajax({
			type:"post",
			async:false,
			url:"${contextPath}/json",
			data : {jsonInfo: _jsonInfo},
			success:function(data,textStatus){},
			error: function(data,textStatus){
				alert("에러가 발생하였습니다.");
			},
			complete: function(data,textStatus){}
		});
	});
	});

 

JsonServlet.java

..
String jsonInfo=request.getParameter("jsonInfo"); //문자열로 전송된 JSON 데이터를 가져옴
		try {
			JSONParser jsonParser=new JSONParser(); //JSON으로 파싱할 JSONParser 객체
			JSONObject jsonObject=(JSONObject) jsonParser.parse(jsonInfo); //JSON 데이터 파싱
			System.out.println(jsonObject.get("name"));
			System.out.println(jsonObject.get("age"));
			System.out.println(jsonObject.get("gender"));
			System.out.println(jsonObject.get("nickname"));
..

 

 

~ 반대로 서블릿에서 웹페이지로 JSON을 보내는 실습~

-json6.jsp

$(function(){
	$('#checkJson').click(function(){
		$.ajax({
			type:"post",
			async:false,
			url:"${contextPath}/json2",
			success:function(data,textStatus){
				var jsonInfo=JSON.parse(data);
				var memberInfo="회원 정보<br>";
				memberInfo+="=========<br>"
				for(i in jsonInfo.members){
					memberInfo+="이름 : "+jsonInfo.members[i].name+"<br>";
					memberInfo+="나이 : "+jsonInfo.members[i].age+"<br>";
					memberInfo+="성별 : "+jsonInfo.members[i].gender+"<br>";
					memberInfo+="별명 : "+jsonInfo.members[i].nickname+"<br><br><br>";
				}
				$('#output').html(memberInfo);
			},
			error: function(data,textStatus){
				alert("에러가 발생하였습니다.");
			},
			complete: function(data,textStatus){}
		});
	});
	});

-JsonServlet2.java

JSONObject totalObject=new JSONObject();
		
		JSONArray membersArray = new JSONArray();
		
		JSONObject memberInfo=new JSONObject();
		memberInfo.put("name","박지성");
		memberInfo.put("age","41");
		memberInfo.put("gender","남성");
		memberInfo.put("nickname", "날쌘돌이");
		membersArray.add(memberInfo);
		
		memberInfo=new JSONObject();
		memberInfo.put("name","김연아");
		memberInfo.put("age","31");
		memberInfo.put("gender","여성");
		memberInfo.put("nickname", "연느");
		membersArray.add(memberInfo);
		
		totalObject.put("members",membersArray);
        
		String jsonInfo=totalObject.toJSONString();
		writer.print(jsonInfo);

 

 

~ 여러 개의 배열을 JSON으로 전달하는 예제 ~

-.jsp

$(function(){
$('#checkJson').click(function(){
    $.ajax({
        type:"post",
        async:false,
        url:"${contextPath}/json3",
        success:function(data,textStatus){
            var jsonInfo=JSON.parse(data);
            var memberInfo="회원 정보<br>";
            memberInfo+="=========<br>";
            for(var i in jsonInfo.members){
                memberInfo+="이름 : "+jsonInfo.members[i].name+"<br>";
                memberInfo+="나이 : "+jsonInfo.members[i].age+"<br>";
                memberInfo+="성별 : "+jsonInfo.members[i].gender+"<br>";
                memberInfo+="별명 : "+jsonInfo.members[i].nickname+"<br><br><br>";
            }

            var booksInfo="책 정보<br>";
            booksInfo+="=======<br>";
            for(var i in jsonInfo.books){
                booksInfo+="제목 : "+jsonInfo.books[i].title+"<br>";
                booksInfo+="저자 : "+jsonInfo.books[i].writer+"<br>";
                booksInfo+="가격 : "+jsonInfo.books[i].price+"원 <br>";
                booksInfo+="장르 : "+jsonInfo.books[i].genre+"<br>";
                booksInfo+="<img src="+jsonInfo.books[i].image+" /><br><br><br>";
            }
            $('#output').html(memberInfo+"<br>"+booksInfo);
        },
        ..

-.java

JSONObject totalObject=new JSONObject();
		
		JSONArray membersArray = new JSONArray();
		
		JSONObject memberInfo=new JSONObject();
		memberInfo.put("name","박지성");
		memberInfo.put("age","41");
		memberInfo.put("gender","남성");
		memberInfo.put("nickname", "날쌘돌이");
		membersArray.add(memberInfo);
		
		memberInfo=new JSONObject();
		memberInfo.put("name","김연아");
		memberInfo.put("age","31");
		memberInfo.put("gender","여성");
		memberInfo.put("nickname", "연느");
		membersArray.add(memberInfo);
		
		totalObject.put("members",membersArray);
		
		JSONArray bookArray=new JSONArray();
		JSONObject bookInfo=new JSONObject();
		bookInfo.put("title", "초보자를 위한 자바 프로그래밍");
		bookInfo.put("writer", "이병승");
		bookInfo.put("price", "30000");
		bookInfo.put("genre", "IT");
		bookInfo.put("image", "http://localhost:8090/pro16/image/image1.jpg");
		bookArray.add(bookInfo);
		
		bookInfo=new JSONObject();
		bookInfo.put("title", "모두의 파이썬");
		bookInfo.put("writer", "이승찬");
		bookInfo.put("price", "12000");
		bookInfo.put("genre", "IT");
		bookInfo.put("image", "http://localhost:8090/pro16/image/image2.jpg");
		bookArray.add(bookInfo);
		
		totalObject.put("books",bookArray);
		
		String jsonInfo=totalObject.toJSONString();
		System.out.print(jsonInfo);
		writer.print(jsonInfo);