이제 마지막으로 댓글 처리를 해 보도록 하겠습니다. 전체적인 프로그램의 흐름이나 처리 내용은 게시판 입력과 거의 동일합니다. 단지, 다른점이 하나 있다면 댓글이 저장될 때 자신의 원본글의 serial 번호를 pSerial 컬럼에 저장해야 한다는 것입니다. 그렇게 저장되어야 계층형 쿼리를 사용하여 목록을 나열할 때 이상이 없이 나열 됩니다.
이점을 염두해 두고 프로세스를 이해해 주시기 바랍니다.
1. 사용자가 상세보기(view.jsp) 페이지에서 댓글 달기 버튼을 클릭합니다.
2. 자바스크립트(board.js)에 의해서 댓글폼 화면이 실행됩니다.
// 댓글 버튼 클릭시
if($id('btnRepl') != null){
let btn = $id('btnRepl');
btn.onclick = function(){
let frm = $id('frmInput');
frm.action = url + 'repl.jsp';
frm.submit();
}
}
3. 댓글 달기(repl.jsp)에서 댓글 저장 버튼을 클릭합니다.
...
<div id='btnZone'>
<input type='button' value='저장' id='btnReplR' />
...
</div>
...
4. 댓글 저장 버튼이 클릭되면 file_upload.js 스크립트에서 파일을 업로드할 정보와 저장할 내용을 가지고 result.jsp 페이지를 호출합니다. 이부분은 입력, 수정, 삭제 부분과 동일합니다. 단지, 다른점은 파라미터 job=replR이 전달되는 것입니다.
<script>
upload.start('frmInput' , 'btnAttach', 'btnReplR', 'attachList',
'./board/result.jsp?job=replR')
</script>
5. result.jsp 에서 생성된 BoardController는 job=replR을 전달받기 때문에 이해 해당하는 BoardDao의 repl() 메서드를 호출하여 댓글 저장 작업을 하게 됩니다.
public class BoardController {
...
public BoardController(HttpServletRequest req, HttpServletResponse resp) {
this.req = req;
this.resp = resp;
dao = new BoardDao();
String job = "";
//요청 정보에 따른 url 얻어오기
job = req.getParameter("job");
if(job != null) {
switch(job) {
...
case "replR" : replR();break;
}
}
}
public void replR() {
String msg = dao.repl(req);
req.setAttribute("msg", msg);
}
...
}
6. BoardDao의 repl()메서드에서는 댓글을 테이블에 저장하고, 첨부파일과 첨부파일 정보를 첨부파일 테이블에 저장한 후 그 결과를 다시 result.jsp에 전달하는 것으로 댓글의 처리 과정이 종료됩니다.
public class BoardDao {
...
public String repl(HttpServletRequest req) {
String msg = "댓글이 작성되었습니다.";
BoardVo vo = null;
List<AttVo> list = null;
int cnt = 0;
try {
FileUpload upload = new FileUpload(req);
upload.uploading();
vo = (BoardVo) req.getAttribute("vo");
list = (List<AttVo>)req.getAttribute("attList");
conn.setAutoCommit(false);
sql = " insert into board(serial, mdate, pserial, worker, pwd, subject, content, hit) "
+ " values(seq_board.nextval, sysdate, ?, ?, ?, ?, ?, 0 ) ";
ps = conn.prepareStatement(sql);
ps.setInt(1, vo.getSerial());
ps.setString(2, vo.getWorker());
ps.setString(3, vo.getPwd());
ps.setString(4, vo.getSubject());
ps.setString(5, vo.getContent());
cnt = ps.executeUpdate();
if(cnt<1) throw new Exception("댓글 저장중 오류 발생");
//첨부파일 정보 저장
for(AttVo att : list) {
sql = " insert into boardAtt(serial, pserial, oriAttFile, attFile) "
+ " values(seq_boardAtt.nextval, seq_board.currval, ?, ?) ";
ps = conn.prepareStatement(sql);
ps.setString(1, att.getOriAttFile());
ps.setString(2, att.getAttFile());
cnt = ps.executeUpdate();
if(cnt<1) throw new Exception("첨부파일 정보 저장중 오류 발생");
}
conn.commit();
}catch(Exception ex) {
ex.printStackTrace();
msg = ex.toString();
if(list !=null && list.size()>0) {
deleteFile(list);
}
conn.rollback();
}finally {
req.setAttribute("msg", msg);
return msg;
}
}
...
}
이것으로 댓글 처리에 대한 포스팅을 마치도록 하겠습니다.
[관련 동영상-게시물 댓글 달기(묵음)]
'프로젝트 > 자바 빈과 JSP만을 사용한 게시판 만들기' 카테고리의 다른 글
20장 후기 및 배포 파일정보 (0) | 2020.05.14 |
---|---|
18장 삭제 처리 (0) | 2020.05.10 |
17장 수정 처리 (0) | 2020.05.10 |
16장 상세보기및 파일 다운로드 (0) | 2020.05.10 |
15장 게시물 입력폼 만들기 (0) | 2020.05.10 |