JSP

부트캠프56일차(jqeury이용한DB연결 , XML분석 , model2의 시,구,동 설정)

동곤일상 2025. 4. 22. 17:51
반응형

1)jquery이용해 DB연결

1-1) 간단한로그인폼

1-2) 아이디중복버튼 기능 추가

1-3) 아이디 리스트추출(자동완성)

1-4) ajax를 이용해 XML문서분석

1-5) JSON방식 이용한 조회

 

2) model2Study 프로젝트로 넘어가기

2-1)  ajaxController 및 select 구현 (태그선택시 txt파일의 모든 시를가져옴)

2-2)  구군 , 동리 선택창 구현 (집에와서곰곰히생각해보니 떠오름 난이도높음)

 


1) jqeury이용해 DB와연결

1-1) 간단한 로그인폼

 

ex08_login.html

<!DOCTYPE html>
<!-- 
	1. 로그인버튼 클릭시 ID,PASS값을 ex08_login.jsp 페이지로전송
	2.ex08_login.jsp 
		-member테이블을 읽어 id,pass검증
		-일치 : 반갑습니다 name 님
		-불일치 : 없는정보입니다
 -->
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>

</head>
<body>
<form name="f">
	아이디 : <input type="text" id="id">
	<input type="button" value="아이디중복" id="btn"><br>
	비밀번호:<input type="password" id="pass"><br>
	<input type="submit" value="로그인" id="loginbtn"><br>
</form>
<div id="message"></div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script> <!-- jquery사용을위해  -->
<script type="text/javascript">
$(function(){
	$("#loginbtn").click(function(){
		//파라미터설정
		let param = {id:$("#id").val() , pass:$("#pass").val()}
		$.ajax({
			url:"ex08_login.jsp",
			type:"POST",
			data:param,//파라미터전달 
			success : function(data){ //정상응답완료
				$("#message").html(data)
			},
			error:function(e){//에러
				alert("서버오류:"+e.status)
			}
		})
		return false; //폼 제출막기위해(페이지 리로드 방지)
	})
})
	
</script>
</body>
</html>

JSTL.zip
0.38MB
mariadb-java-client-3.5.1.jar
0.70MB

(해당jar파일들이 있어야 실행가능함 WEB_INF/lib/에넣자)

 

ex08_login.jsp

<sql:setDataSource var="변수명"  driver="드라이버" url="주소" user password/>

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><!--c태그 사용위해-->
<%@taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %><!--sql태그사용위해-->
<!-- database Connection객체 -->
<sql:setDataSource var="conn" driver="org.mariadb.jdbc.Driver"
	url="jdbc:mariadb://localhost:3306/gdjdb"
	user="gduser" password="1234"/>
<!-- SQL 문장 실행 -->
<!-- rs : select구문실행결과(레코드정보) -->
<sql:query var="rs" dataSource="${conn}" >
select * from member where id=? and pass=?
<sql:param>${param.id}</sql:param><!-- 1번째 '?'  -->
<sql:param>${param.pass}</sql:param><!-- 2번째 '?'  -->
</sql:query>
<c:if test="${!empty rs.rows}"> <!-- rs.rows : 조회된결과들 -->
	<h1>반갑습니다 ${rs.rows[0].name}님</h1>
</c:if>

<c:if test="${empty rs.rows}">
	<h1><font color="red">아이디or비번이 틀려요</font></h1>
</c:if>

 

 

1-2) 아이디중복버튼 기능 추가

(ex08_login.html의 script부분에추가)

$("#btn").click(function(){

		if($("#id").val()==""){
			$("#message").html("아이디를 입력하세요");
			return;
		}
		//파라미터설정
		let param = {id:$("#id").val()}
		$.ajax({
			url:"ex08_iddup.jsp",
			type:"POST",
			data:param,//파라미터전달 
			success : function(data){ //정상응답완료
				$("#message").html(data)
				if($("#result").is(".find")){
					$("#id").val(""); 
                    //result의 id가find(존재하는ID) id입력창초기화
				}
			},
			error:function(e){//에러
				alert("서버오류:"+e.status)
			}
		})
		return false; //폼 제출막기위해(페이지 리로드 방지)
	})

 

ex08_iddup.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
<!-- database Connection객체 -->
<sql:setDataSource var="conn" driver="org.mariadb.jdbc.Driver"
	url="jdbc:mariadb://localhost:3306/gdjdb"
	user="gduser" password="1234"/>
<sql:query var="rs" dataSource="${conn}" >
select * from member where id=?
<sql:param>${param.id}</sql:param><%--1번째 '?' --%> 
</sql:query>
<c:if test="${empty rs.rows}"> <%-- rs.rows : 조회된결과들 --%>
	<h1 id="result" class="notfound">회원가입이 가능한 아이디입니다.</h1>
</c:if>

<c:if test="${!empty rs.rows}">
	<h1 id="result" class="find"><font color="red">존재하는 아이디입니다</font></h1>
</c:if>

 


1-3)  아이디 리스트추출(자동완성)

ex09_auto.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style type="text/css">
	.listbox{
		position:relative; left: 10px;
		margin: 10px;  width:200px;
		background-color:black; color:white;
		border: 2px solid white;
	}
	.namelist{
		margin:0px; padding:0px; list-style: none;
	}
	.hover{
		background-color: white; color: black;
		font-weight: bold;
	}
</style>
</head>
<body>
<span>사용자 아이디</span>
<input type="text" name="id" id="id">
<div class="listbox"><div class="namelist"></div></div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script> <!-- jquery사용을위해  -->
<script type="text/javascript">
$(function(){
	$(".listbox").hide();
	$("#id").keyup(function(){
		let data = "id="+$("#id").val();
		$.ajax({
			url :"ex09_idlist.jsp",
			type:"POST",
			data:data,
			success: function(html){
				$(".listbox").show()
				$(".namelist").html(html)
				//li에마우스를 가져다대면
				$("li").hover(function(){
					$(this).addClass("hover")
				},function(){
					$(this).removeClass("hover")
				})
				$("li").click(function(){
					$("#id").val($(this).text())//id입력창에 클릭한 문자가들어감
					$(".listbox").hide();//아이디리스트는 숨겨짐
				})
			},
			error:function(e){
				alert("서버오류 : "+e.status);
			}
		})

	})
})
</script>


</body>
</html>

 

ex09_idlist.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
<sql:setDataSource var="conn" driver="org.mariadb.jdbc.Driver"
	url="jdbc:mariadb://localhost:3306/gdjdb"
	user="gduser" password="1234"/>
<sql:query var="rs" dataSource="${conn}">
select id from member where id like?
<sql:param>${param.id}%</sql:param>
</sql:query>	
<ul>
<c:forEach var="data" items="${rs.rows}">
	<li>${data.id}</li>
</c:forEach>
</ul>

 

 

 


1-4) ajax를 이용해 XML문서분석

 

ex10_xml.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ajax이용해 xml문서 분석</title>
</head>
<body>
<button id="btn">XML연습</button>
<div id="person"></div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<script type="text/javascript">
$(function(){
	$("#btn").click(function(){
		$.ajax("ex10_person.xml",{
			success:function(data){ 
			//$(data).find("person") : data의 person하위 태그들(배열로리턴)
				$(data).find("person").each(function(){ 
					//$(this) 현재 person태그
				name="<li>"+$(this).find("name").text()+"</li>"
				gen="<li>"+$(this).find("gender").text()+"</li>"
				part="<li>"+$(this).find("part").text()+"</li>"
				$("#person").append("<ul>"+name+gen+part+"</ul>")
				})
			}
		})
	})
})
</script>
</body>
</html>

 

ex10_person.xml

<people> <!-- 루트태그 : 1개만존재 -->
  <person>
     <name>홍길동</name><gender>남자</gender><part>기타</part>
  </person>
  <person>
     <name>김길순</name><gender>여자</gender><part>드럼</part>
  </person>
  <person>
     <name>박길수</name><gender>남자</gender><part>보컬</part>
  </person>
</people>

해당구조로만들어짐

 

 

 


ex11_xml.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>XML11</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
</head>
<body>
<button id="allbtn">전체 구</button>
<button onclick="stateprint('east')">동구</button>
<button  onclick="stateprint('west')">서구</button>
<button  onclick="stateprint('south')">남구</button>
<button  onclick="stateprint('north')">북구</button>
<div id="state"></div>
<script type="text/javascript">
$(function(){
	$("#allbtn").click(function(){
	$("#state").html(""); //div태그 내용제거
	$.ajax("ex11_address.xml",{
		success: function(data){
		$("#state").append("<ul>");
		//$(data).find("state") : state태그목록들(배열)
		$(data).find("state").each(function(){
				//모든state를 순회함
			$("#state").append("<li>"+$(this).text()+"</li>")
		})
		$("#state").append("</ul>")
		},
		error: function(e){
			alert("서버오류 : "+e.status);
		}
	})
		
	})
})
function stateprint(x){
	$("#state").html(""); //div태그초기화
	
	$.ajax("ex11_address.xml",{
		success:function(data){
				$("#state").append("<ul>");
				$(data).find(x).find("state").each(function(){
						//state태그 내의 모든 텍스트를 모두 순회
					$("#state").append("<li>"+$(this).text()+"</li>")
				})
				$("#state").append("</ul>")
				},
				error: function(e){
					alert("서버오류 : "+e.status);
				}
		})
	}
</script>

</body>
</html>

ex11_address.xml

<status>
<north>
	<state>강북구</state><state>노원구</state><state>도봉구</state>
</north>
<south>
	<state>강남구</state><state>서초구</state><state>관악구</state>
	<state>금천구</state>
</south>
<east>
	<state>강동구</state><state>송파구</state><state>성동구</state>
	<state>광진구</state>
</east>
<west>
	<state>강서구</state><state>구로구</state><state>양천구</state>
</west>
</status>

 

 


1-5) JSON방식 이용한 조회

 

ex12_json.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSON연습</title>
</head>
<body>
<button id="btn">JSON연습</button>
<div id="result"></div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<script type="text/javascript">
$(function(){
	$("#btn").click(function(){
		$.ajax({
			url:"ex12_person.jsp",
			success:function(data){
				let person = JSON.parse(data)
				//person(배열)를 모두 순회함
				$.each(person,function(i,item){
					$("#result").append("<ul>")
					$("#result").append("<li>"+item.name+"</li>")
					$("#result").append("<li>"+item.gender+"</li>")
					$("#result").append("<li>"+item.part+"</li>")
					$("#result").append("</ul>")
				})
			}
		})
	})

})
</script>


</body>
</html>

 

ex12_person.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
[
  {"name":"홍길동","gender":"남자","part":"기타"},
  {"name":"김길순","gender":"여자","part":"드럼"},
  {"name":"박길수","gender":"남자","part":"보컬"}
]

 

 

 


2) model2Study 프로젝트로 넘어가기

 

sido.txt
0.72MB

해당파일을

/model2Study/src/main/webapp/file/sido.txt

 

 

새로바뀐 jar파일(controller동작을 위해)

mskimrequest (1).jar
0.00MB

 

 

layout.jsp에 추가해야할 내용들

<footer class="footer">
		<div>
			<span id="si"> 
			<select name="si" onchange="getText('si')">
				<option value="">시,도를 선택하세요</option>
			</select>
			</span>
			<span id="gu"> 
			<select name="gu" onchange="getText('gu')">
				<option value="">구군 선택하세요</option>
			</select>
			</span>
			<span id="dong"> 
			<select name="dong" onchange="getText('dong')">
				<option value="">동리를 선택하세요</option>
			</select>
			</span>
		</div>
		.......
	</footer>
	<script type="text/javascript">
	$(function(){
		let divid;
		let si;
		$.ajax({
			url : "${path}/ajax/select",
			success: function(data){
//data : ["서울특별시","경기도",.....]
                console.log(data)
				let arr = JSON.parse(data)
				$.each(arr,function(i,item){
			//item : 서울특별시
					$("select[name=si]").append(function(){
						return "<option>"+item+"</option>"	
					})
				})
			},
			error:function(e){
				alert("서버오류 : "+e.status)
			}
		})
	})

	</script>

2-1) ajaxController 및 select 구현

main/java/controller/AjaxController

package controller;

import java.io.BufferedReader;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.Set;

import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import gdu.mskim.MskimRequestMapping;
import gdu.mskim.RequestMapping;

@WebServlet(urlPatterns = {"/ajax/*"},
initParams = { @WebInitParam(name = "view", value = "/view/") })

public class AjaxController extends MskimRequestMapping {

	@RequestMapping("select")
	public String select(HttpServletRequest request , 
			HttpServletResponse response) {
		BufferedReader fr = null;
		String path = request.getServletContext().getRealPath("/")+ "file/sido.txt";
		try {
			fr = new BufferedReader(new FileReader(path));
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		Set<String> set = new LinkedHashSet<>(); //순서가있는 set
		String data = null;
		try {
			while((data=fr.readLine()) != null) {
				String[] arr = data.split("\\s+"); //공백기준으로나눔
				if(arr.length >= 3) {
					set.add(arr[0].trim()); //제일 앞에 있는정보만(시,도) set에넣음
				}
			}
			fr.close(); //이제fr은사용하지않으므로 닫아준다
		}
		catch(Exception e) {
			e.printStackTrace();
		}
		request.setAttribute("list", new ArrayList<String>(set));
		request.setAttribute("len",set.size());
		return "ajax/select";
	}
}

 

/webapp/view/ajax/select.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%-- /webapp/view/ajax/select.jsp --%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
[
<c:forEach var="s" items="${list}" varStatus="stat">
<%-- varStatus 인덱스번호반환해줌 --%>
"${s}" <c:if test="${stat.count < len}">,</c:if>
<%--len: set의크기 --%>
</c:forEach>
]

 


2-2) 구군 , 동리 선택창 구현

 

변경한 layout.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
<c:set var="path" value="${pageContext.request.contextPath }"></c:set>
<!--..........생략 --------------------->
	<footer class="footer">
		<div>
			<span id="si"> 
			<select name="si" onchange="getText('si')">
				<option value="">시,도를 선택하세요</option>
			</select>
			</span>
			<span id="gu"> 
			<select name="gu" onchange="getText('gu')">
				<option value="">구군 선택하세요</option>
			</select>
			</span>
			<span id="dong"> 
			<select name="dong" >
				<option value="">동리를 선택하세요</option>
			</select>
			</span>
		</div>
<!--..........생략 --------------------->
<script type="text/javascript">
	$(function(){	
		$.ajax({
			url : "${path}/ajax/select",
			success: function(data){
//data : ["서울특별시","경기도",.....]
				let arr = JSON.parse(data)
				$.each(arr,function(i,item){
			//item : 서울특별시
					$("select[name=si]").append(function(){
						return "<option>"+item+"</option>"	
					})
				})
			},
			error:function(e){
				alert("서버오류 : "+e.status)
			}
		})
	}) //여기까지의부분은 모든 시(name='si')를 AJAX를 통해 가져올거임
	
			
		function getText(type) { // 시 or 도를 선택하면 발생하는 함수
			const si = $("select[name=si]").val(); //클릭한 시의 vlaue
			const gu = $("select[name=gu]").val();//클릭한 구의 vlaue
			let url = "";
			let targetSelect;
			
			if (type === "si") {
				if (!si) return;
				url = "${path}/ajax/select?si="+si; //입력받은si의값을 파라미터로갖는 주소
				targetSelect = $("select[name=gu]"); //target을 gu에해당하는 select태그로설정
				// 시를 선택하면 기존 구, 동 초기화
		        $("select[name=gu]").html('<option value="">구군 선택하세요</option>');
		        $("select[name=dong]").html('<option value="">동리를 선택하세요</option>');
		        
			} else if (type === "gu") {
				if (!si || !gu) return;
				url = "${path}/ajax/select?si="+si+"&gu="+gu;
				targetSelect = $("select[name=dong]");
				// 구를 선택하면 기존  동 초기화		  
		        $("select[name=dong]").html('<option value="">동리를 선택하세요</option>');
			} else {
				return;
			}

			$.ajax({ //ajax에 요청을 보낼거임
				url: url, //위 type에의한  url 설정
				success: function(data) {
					const arr = JSON.parse(data); //성공시 JSON방식(배열)으로 데이터를가져옴
					$.each(arr, function(i, item) {
						//해당배열을 순회해서 나온값들을 모두 taget태그하위에 option으로넣는다
						targetSelect.append("<option>"+item+"</option>"	);
					});
				},
				error: function(e) {
					alert("서버 오류 : " + e.status);
				}
			});
		}

	</script>
</body>
</html>

 

변경한 AjaxController의 select매핑부분

package controller;

import java.io.BufferedReader;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.Set;

import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import gdu.mskim.MskimRequestMapping;
import gdu.mskim.RequestMapping;

@WebServlet(urlPatterns = {"/ajax/*"},
initParams = { @WebInitParam(name = "view", value = "/view/") })

public class AjaxController extends MskimRequestMapping {
	
	@RequestMapping("select")
	public String select(HttpServletRequest request , 
			HttpServletResponse response) {

		String si = request.getParameter("si");
		String gu = request.getParameter("gu");
		
		BufferedReader fr = null;
		String path = request.getServletContext().getRealPath("/")+ "file/sido.txt";
		try {
			fr = new BufferedReader(new FileReader(path));
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		Set<String> set = new LinkedHashSet<>(); //순서가있는 set
		String data = null;
		try {
			while((data=fr.readLine()) != null) {
				String[] arr = data.split("\\s+"); //공백기준으로나눔
				if(arr.length >= 3) { //무조건 시,구,동 정보(3개)가 있어야만 함 
					if(si==null ) {
						//아무것도 선택받지않은상태
							set.add(arr[0].trim()); //제일 앞에 있는정보만(시,도) set에넣음
					}
					else if(si!=null && gu==null && si.equals(arr[0])) {
						//si(시)를 입력받은 상태 구(gu)는 입력X ( 시에 해당하는 동만 set에넣을거임)
						set.add(arr[1].trim()); //제일 앞에 있는정보만(시,도) set에넣음
					}
					else if(si!=null && gu!=null && si.equals(arr[0]) && gu.equals(arr[1])) {
						//시,구를 입력받은 상태 (해당시,구에 해당하는 동리를 set에넣을거임)
						StringBuilder sb = new StringBuilder();
						sb.append(arr[2].trim());
						if(arr.length>3) {
							sb.append(" ");
							sb.append(arr[3].trim()); 
						}
						String dongg = sb.toString();
						
						set.add(dongg);
					}	
				}
			}
			fr.close(); //이제fr은사용하지않으므로 닫아준다
		}
		catch(Exception e) {
			e.printStackTrace();
		}
		request.setAttribute("list", new ArrayList<String>(set));
		request.setAttribute("len",set.size());
		return "ajax/select";
	}
}

try문 부분이 중요해서 밑에다가 보기좋게 내려놓겠음!!!

try {
	while((data=fr.readLine()) != null) {
	 String[] arr = data.split("\\s+"); //공백기준으로나눔
	 if(arr.length >= 3) { //무조건 시구동 정보(3개)가 있어야만 함 
	    if(si==null ) {
		//아무것도 선택받지않은상태
		set.add(arr[0].trim()); //제일 앞에 있는정보만(시,도) set에넣음
        }
        else if(si!=null && gu==null && si.equals(arr[0])) {
        //si(시)를 입력받은 상태 구(gu)는 입력X ( 시에 해당하는 동만 set에넣을거임)
        set.add(arr[1].trim()); //제일 앞에 있는정보만(시,도) set에넣음
        }
        else if(si!=null && gu!=null && si.equals(arr[0]) && gu.equals(arr[1])) {
        //시,구를 입력받은 상태 (해당시,구에 해당하는 동리를 set에넣을거임)
			StringBuilder sb = new StringBuilder();
			sb.append(arr[2].trim());
			if(arr.length>3) {
            sb.append(" ");
            sb.append(arr[3].trim()); 
            }
			String dongg = sb.toString();
						
			set.add(dongg);
        }	
       }
    } //while문종료
    fr.close(); //이제fr은사용하지않으므로 닫아준다
  }
  catch(Exception e) {
  e.printStackTrace();
  }
request.setAttribute("list", new ArrayList<String>(set));
request.setAttribute("len",set.size());
return "ajax/select";

다음과같은 경우 시(도),구(시), 동(리) 의 정보가 3개미만이므로 set에들어가지않음


select.jsp (이부분은 변경없이했음)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%-- /webapp/view/ajax/select.jsp --%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
[
<c:forEach var="s" items="${list}" varStatus="stat">
<%-- varStatus 인덱스번호반환해줌 --%>
"${s}" <c:if test="${stat.count < len}">,</c:if>
<%--len: set의크기 --%>
</c:forEach>
]

 

출력예시