CRUD within JSP
Print List(connected from 0802)
<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 속성에 부여
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(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) {
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) {
e.printStackTrace();
} finally {
db.dbClose(pstmt, conn);
}
}
- DTO 클래스 전체를 인자 값으로 받음
- 그곳의 멤버 변수를 sql update 명령문에 입력, 실행하는 메서드
- 저장된 데이터를 수정(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">
<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를 수정하고 리스트 파일로 이동