Backend

08월 27일 화 | JSP 05 - JSP CRUD 게시판 삭제, 수정

구라미 2019. 8. 27. 14:39

성적테이블 CRUD

어제에 이어서 간단한 CRUD 게시판 만들기를 이어서 한다.

디렉토리 구조는 아래와 같다.

 

 

 

 

데이터 삭제하기

생성했던 데이터(행)을 삭제하는 jsp

 

1) 수정/삭제 링크만들기

우선 목록페이지와 상세페이지에 수정/삭제 링크를 추가하였다.

 

 

그다음

<a href="sungjukUpdate.jsp?sno=<%=rs.getInt("sno")%>" class="modify">[수정]</a>
<a href="sungjukDel.jsp?sno=<%=rs.getInt("sno")%>" class="delete">[삭제]</a>

수정과 삭제링크에 기본키가 되는 sno의 번호값을 받아와서 생성되는 jsp 링크를 연결해준다.

 

 

 

2) 삭제기능 만들기

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ include file="common.jsp" %>

<!DOCTYPE html">
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" type="text/css" href="../css/style.css">
<title>성적삭제</title>
</head>
<body>

<%
int sno = Integer.parseInt(request.getParameter("sno"));

try{
	
	Class.forName("oracle.jdbc.OracleDriver");
	Connection con = DriverManager.getConnection
	("jdbc:oracle:thin:@//localhost:1521/xe","java0514","1234");
		
	StringBuilder sql = new StringBuilder();
	sql.append(" DELETE FROM sungjuk ");
	sql.append(" WHERE sno=? ");
	
	PreparedStatement pstmt = null;
	pstmt = con.prepareStatement(sql.toString());
	pstmt.setInt(1, sno);
	
	int cnt = pstmt.executeUpdate();
	if(cnt==0){
		out.println("<p>성적 삭제 실패!</p>");
		out.println("<p><a href='javascript:history.back()'>돌아가기</a></p>");
	} else{
		out.println("<script>");
		out.println(" alert('성적이 삭제되었습니다.'); ");
		out.println(" location.href='sungjukList.jsp'; ");
		out.println("</script>");
	}
	
	
}catch(Exception e){
	out.println("실패" +e);
}

%>

</body>
</html>

 

 

 

데이터 수정하기

생성했던 데이터를 수정하기

데이터 수정하기는 데이터조회 + 데이터수정 + 수정된 데이터전송 으로 이루어진다.

이 두가지 파일로 해결할 것이다.

 

1) sungjukUpdate.jsp

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ include file="common.jsp" %>

<!DOCTYPE html">
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" type="text/css" href="../css/style.css">
<title>성적 수정</title>
</head>
<body>
	<h1>성적 수정하기</h1>
	<p>
	 <a href="sungjukForm.jsp">[성적쓰기]</a>
	 <a href="sungjukList.jsp">[성적목록]</a>
	</p>
	
	<%
	int sno = Integer.parseInt(request.getParameter("sno"));
		
	try {
		
		//고정적인 내용이므로 dbopen이라는 클래스를 만들어서 사용한다.
		Class.forName("oracle.jdbc.OracleDriver");
		Connection con = DriverManager.getConnection
		("jdbc:oracle:thin:@//localhost:1521/xe","java0514","1234");
		
		
		StringBuilder sql = new StringBuilder();
		sql.append(" SELECT sno,uname,kor,eng,mat,addr ");
		sql.append(" FROM sungjuk ");
		sql.append(" WHERE sno=? ");
		
		PreparedStatement pstmt = null;
		pstmt = con.prepareStatement(sql.toString());				
		// ?순서와 ?에 들어갈 자료형 주의
		pstmt.setInt(1, sno);
		
		
		ResultSet rs = null; //					
		rs=pstmt.executeQuery(); //SELECT문에서 사용한다. SELECT한 테이블이 담김.
		//cursor는 불러온 값 가장 처음것을 가리킴
		//cursor : 가리키는 값
		if(rs.next()){ //cursor가 존재하는지?
			%>
				<form method="post" action="sungjukUpdateProc.jsp">
				<table>
				<tr>
					<th>번호</th>
					<td>
					  <input type="hidden" name="sno" value=<%=rs.getInt("sno")%>>					  
					</td>
				</tr>
				<tr>
					<th>이름</th>
					<td>
					  <input type="text" name="uname" maxlength="20" value=<%=rs.getString("uname")%> required autofocus>
					</td>
				</tr>
				
				<tr>
					<th>국어</th>
					<td>
					  <input type="number" name="kor" size="5" value=<%=rs.getInt("kor")%> min="0" max="100" placeholder="점수를 입력하세요">
					</td>
				</tr>
				
				<tr>
					<th>영어</th>
					<td>
					  <input type="number" name="eng" size="5" value=<%=rs.getInt("eng")%> min="0" max="100" placeholder="점수를 입력하세요">
					</td>
				</tr>
				
				
				<tr>
					<th>수학</th>
					<td>
					  <input type="number" name="mat" size="5" value=<%=rs.getInt("mat")%> min="0" max="100" placeholder="점수를 입력하세요">
					</td>
				</tr>
				
				<tr>
					<th>주소</th>
					<td>
					
					<% 
						String addr = rs.getString("addr");						
					%>
					
					  <select name="addr">
					  	<option value="Seoul" <%if(addr.equals("Seoul")){out.print("selected");} %>>서울</option>
					  	<option value="Jeju" <%if(addr.equals("Jeju")){out.print("selected");} %>>제주</option>
					  	<option value="Busan" <%if(addr.equals("Busan")){out.print("selected");} %>>부산</option>
					  	<option value="Suwon" <%if(addr.equals("Suwon")){out.print("selected");} %>>수원</option>
					  </select>
					</td>
				</tr>
				
				<tr>
					<td colspan="2" align="center" class="bottom">
					<input type="submit" value="수정" class="submit">
					<input type="reset" value="취소" class="reset">
				</tr>
				
				</table>
				
				</form>	
						
			<%
			
		}else{
			out.println("<tr>");
			out.println("<td>자료없음</td>");
			out.println("</tr>");
		}
		
		
	} catch (Exception e) {
		
	}
	
	
	%>



</body>
</html>

우선 데이터 내용을 select으로 조회하고

 

 

2) sungjukUpdateProc.jsp

조회한 것을 수정한다.

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ include file="common.jsp" %>
<!DOCTYPE html">
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" type="text/css" href="../css/style.css">
<title>Insert title here</title>
</head>
<body>
<h1>성적 입력 폼</h1>
	<p><a href="sungjukList.jsp">[성적목록]</a></p>


<%
	//한글 인코딩
	request.setCharacterEncoding("UTF-8");
		
	//입력정보 가져와서 변수에 담기	
	int sno = Integer.parseInt(request.getParameter("sno"));
	String uname = request.getParameter("uname").trim();
	int kor = Integer.parseInt(request.getParameter("kor"));
	int eng = Integer.parseInt(request.getParameter("eng"));
	int mat = Integer.parseInt(request.getParameter("mat"));
	String addr = request.getParameter("addr").trim();
		
	//평균구하기
	int aver=(kor+eng+mat)/3;
	
	//출력
	out.println("번호:" + sno + "<br>");
	out.println("이름:" + uname + "<br>");
	out.println("국어:" + kor + "<br>");
	out.println("영어:" + eng + "<br>");
	out.println("수학:" + mat + "<br>");
	out.println("평균:" + aver + "<br>");
	out.println("주소:" + addr + "<br>");
	out.println("요청IP:" + request.getRemoteAddr() + "<br>");
	
	
	
	try{
		//int sno = Integer.parseInt(request.getParameter("sno"));
		//Oracle DB 저장
		Class.forName("oracle.jdbc.OracleDriver");
		Connection con = DriverManager.getConnection
		("jdbc:oracle:thin:@//localhost:1521/xe","java0514","1234");
			
		StringBuilder sql = new StringBuilder();
		sql.append(" UPDATE SUNGJUK ");
		sql.append(" SET UNAME=?, KOR=?, ENG=?, MAT=?, AVER=?, ADDR=? ");
		sql.append(" WHERE SNO = ? ");
		
		// 4) SQL문 변환
		PreparedStatement pstmt = null;
		pstmt = con.prepareStatement(sql.toString());				
		// ?순서와 ?에 들어갈 자료형 주의	
		pstmt.setString(1, uname);
		pstmt.setInt(2, kor);
		pstmt.setInt(3, eng);
		pstmt.setInt(4, mat);
		pstmt.setInt(5, aver);
		pstmt.setString(6, addr);				
		pstmt.setInt(7, sno);				
		
		//실행
		
		int count = pstmt.executeUpdate();
		if(count == 0){
			out.println("<p>성적수정이 실패했습니다.</p>");
			out.println("<p><a href='javascript:history.back()'>다시시도</a></p>");
		}else {
			out.println("<script>");
			out.println("alert('성적수정이 성공하였습니다.');");
			out.println("location.href='sungjukList.jsp';");
			out.println("</script>");
		}		
		
	} catch (Exception e){
		out.print("실패!"+e);
	}

	
	
%>
	<button onclick="javascript:history.back()" >뒤로가기</button>
</body>
</html>

 

거의 맞게 코딩했는데 계속 이부분 때문에

int sno = Integer.parseInt(request.getParameter("sno"));

java.lang.NumberFormatException: null

이 떠서 왜 그런가 했더니, 데이터를 조회할 때 

<input type="hidden" name="sno" value=<%=rs.getInt("sno")%>>

이 부분이 빠져서 sno의 정보를 가져올 수 없었기 때문이었다.

 

 

 

 

 

이렇게 오진우라는 이름이 오상진으로 수정되었다.