CRUD within JSP

<body>
	<button type="button" onclick="location.href='insertForm.jsp'">데이터추가</button>
	 <br>
	 <table>
		 <tr>
		 	<th>번호</th>
		 	<th>이름</th>
		 	<th>주소</th>
		 	<th>날짜</th>
		 	<th>편집</th>
		 </tr>
		 <%
			for(int i=0;i<list.size();i++)
			{
				SinsangDto dto=list.get(i);
				%>
				<tr>
					<td><%=i+1 %></td>
					<td><%=dto.getName() %></td>
					<td><%=dto.getAddr() %></td>
					<td><%=dto.getSdate() %></td>
					<td><button type="button"
					onclick="location.href='updateForm.jsp?num=<%=dto.getNum()%>'">수정</button>
					<button type="button"
					onclick="funcdel(<%=dto.getNum()%>)">삭제</button></td>
				</tr>
			<%}
		%>
	 </table>
	 <script>
			function funcdel(num){
				if(confirm("정말 삭제하시겠습니까?")
				{
					 alert("삭제되었습니다");
					 location.href="delete.jsp?num="+num;
				}
				else
					 alert("삭제 취소되었습니다");
	 </script>
</body>
  • 리스트 파일에서 ‘수정’ 버튼 클릭 시 지정한 url(updateForm.jsp)로 넘어감
  • 지정 url로 넘어갈 때 ? 뒤에 함께 넘겨주는 변수와 변수 값을 지정 가능
  • ‘삭제’ 버튼 클릭 시 확인 창을, 삭제 완료 혹은 취소 후에는 경고 창을 띄워주는 함수를 작성해 삭제 버튼의 onclick 속성에 부여

DAO Supplement(Extra Methods)

//하나의 데이터 조회
	public SinsangDto getData(String num) {
		
		SinsangDto dto=new SinsangDto();
		
		Connection conn=db.getConnection();
		PreparedStatement pstmt=null;
		ResultSet rs=null;
		
		String sql="select * from sinsang where num=?";
		
		try {
			pstmt=conn.prepareStatement(sql);
			
			pstmt.setString(1, num);		
			rs=pstmt.executeQuery();
			
			//하나의 데이터 조회시 if
			if(rs.next())
			{
				dto.setNum(rs.getString("num"));
				dto.setName(rs.getString("name"));
				dto.setAddr(rs.getString("addr"));
				dto.setSdate(rs.getTimestamp("sdate"));
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			db.dbClose(rs, pstmt, conn);
		}
		
		return dto;
	}
  • 하나의 데이터(멤버 변수)를 조회 후 받기 위해 return 값을 멤버 변수 전체를 포함하는 DTO로 설정(여러개의 멤버 변수 데이터를 받기 위해서는 각 DTO를 모두 담은 List)
  • sql 명령문에 시퀀스 값을 where절에 넣음으로써 하나의 데이터(행) 값만 출력
  • next() : 실행된 sql문을 한 행씩 읽고 가져오며, 읽을 행이 있으면 true를, 없으면 false를 반환
  • getString() : Oracle 테이블의 정확한 컬럼 명을 인자 값으로 하여 데이터(행) 값을 문자열로 출력하며, next()를 만나면 다음 행의 데이터를 출력
  • getTimestamp() : getString()과 같은 기능이지만 Date 타입의 자료를 반환
  • 즉 적절한 시퀀스에 해당하는 하나의 멤버 변수 데이터를 반환하는 메서드
//수정..이름 주소 수정
	public void updateSinsang(SinsangDto dto) {
		
		Connection conn=db.getConnection();
		PreparedStatement pstmt=null;
		
		String sql="update sinsang set name=?,addr=? where num=?";
		
		try {
			pstmt=conn.prepareStatement(sql);
			
			pstmt.setString(1, dto.getName());
			pstmt.setString(2, dto.getAddr());
			pstmt.setString(3, dto.getNum());
			pstmt.executeUpdate();
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			db.dbClose(pstmt, conn);
		}
	}
  • DTO 클래스 전체를 인자 값으로 받음
  • 그곳의 멤버 변수를 sql update 명령문에 입력, 실행하는 메서드

Update Form(jsp)

  • 저장된 데이터를 수정(update)하기 위해서는 insert와 유사한 과정이 필요하므로 본 파일의 형태는 대체로 insert form 파일과 유사
<%
	String num=request.getParameter("num");
	SinsangDao dao=new SinsangDao();
	SinsangDto dto=dao.getData(num);
%>
  • 리스트 파일에서 ‘수정’ 버튼 클릭 시 ? 주소를 통해 넘겨준 값을 getParameter() 함수로 받음
  • DAO의 getData() 메서드(적절한 시퀀스에 해당하는 멤버 변수 값 반환)에 원하는 시퀀스 값을 입력하여 반환된 멤버 변수 값을 DTO에 전달
<body>
	<form action="updateAction.jsp" method="post">
	
	<!-- hidden은 위치상관없다 form안에만 있으면 됨 -->
	<input type="hidden" name="num" value="<%=num %>">
		<table class="table table-bordered" style="width: 400px;">
			<tr>
				<th>이름</th>
				<td>
					<input type="text" name="name" style="width: 150px"
					value="<%=dto.getName()%>">
				</td>
			</tr>
			<tr>
				<th>주소</th>
				<td>
					<input type="text" name="addr" style="width: 250px"
					value="<%=dto.getAddr()%>">
				</td>
			</tr>
			<tr>
				<td colspan="2" align="center">
					<input type="submit" value="수정" class="btn btn-warning">
					<input type="button" value="목록" onclick="location.href='list.jsp'"
					 class="btn btn-success">
				</td>
			</tr>
		</table>
	</form>
</body>
  • update를 위해 넘겨줄 input 값으로 num이 필요하지만 수정(입력) 혹은 확인할 필요 없음
  • 따라서 input하되(<input>) type을 hidden으로 설정해 브라우저에 나타나지 않게 함
  • hidden input 값은 보이지 않더라도 submit되어야 하므로 <form> 태그 내에 위치해야 함
  • 수정할 데이터 입력 툴에는 기존에 저장된 데이터 값을 default 값으로 입력하기 위해 value 속성(초기 값 입력)을 DTO에서 받아옴
  • 현재 DTO의 멤버 변수 값은, DAO의 getData() 메서드에서 해당 시퀀스 값으로 반환 받은 행 데이터 값인 상태
  • 수정 데이터를 입력 후 ‘수정’ 버튼을 클릭 시 action 속성 값(insertAction.jsp)으로 submit되며, ‘목록’ 버튼 클릭 시 변경 없이 지정 url(list.jsp)로 이동

Update Action(jsp)

<body>
	<%
	//데이터를 읽어서 dto에 넣기
	String num=request.getParameter("num");
	String name=request.getParameter("name");
	String addr=request.getParameter("addr");
	
	SinsangDto dto=new SinsangDto();
	dto.setNum(num);
	dto.setName(name);
	dto.setAddr(addr);
	
	//update호출
	SinsangDao dao=new SinsangDao();
	dao.updateSinsang(dto);
	
	//목록으로 이동
	response.sendRedirect("list.jsp");
	%>
</body>
  • update form에서 입력 받은 데이터를 getParameter() 메서드로 받아옴
  • 받아온 데이터를 DTO의 멤버 변수에 대입
  • 변경된 DTO 클래스 멤버 변수를 DAO의 update 메서드(sql 명령문을 통해 DB의 데이터 변경)에 전달
  • response.sendRedirect() 메서드를 통해 다시 리스트 파일로 이동
  • 즉 update form에서 입력 받은 데이터로 DB를 수정하고 리스트 파일로 이동
profile
초보개발자

0개의 댓글