[JAVA+Taglib+Oracle 게시판] 06. 수정, 삭제 구현

    반응형

    아까 작성하였던 contentView.jsp에서 수정하기와 삭제하기를 활성화해보겠다.

     

    1. 뷰페이지 경로 설정

     

    contentView.jsp를 수정해준다.

    수정하기를 클릭하면 submit이 되고 삭제버튼을 누르면, /delete?bNO=1처럼 url이 변경된다.

    이를 컨트롤러에서 조정해주면 된다.

    또한 글번호는 input hidden으로 해줘서 submit이 되었을 때 글번호를 HttpServletRequest에 잘 저장되도록 한다.

     

    contentView.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>글내용 보기</title>
    </head>
    <body>
    		<div align="center">
    			<h2>글내용 확인</h2>
    			<hr width="500" color="green" />
    			<table width="500" cellpadding="0" cellspacing="0" border="1">
    			<form action="modify" method="post">
    			<!-- 값을 보내기 위해 No.는 히든값으로 숨겨둠 -->
    			<input type="hidden" name="bNo" value="${contentView.bNo }" />
    		
    			<tr>
    				<td>번호</td>
    				<td>${contentView.bNo}</td>
    			</tr>
    			<tr>
    				<td>조회수</td>
    				<td>${contentView.bHit}</td>
    			</tr>
    						<tr>
    				<td>작성자</td>
    				<td><input type="text" name="bName" value="${contentView.bName }"></td>
    			</tr>
    						<tr>
    				<td>제목</td>
    				<td><input type="text" name="bSubject" value="${contentView.bSubject}"></td>
    			</tr>
    						<tr>
    				<td>내용</td>
    				<td><textarea rows = "10" name="bContent">${contentView.bContent}</textarea></td>
    			</tr>
    			<tr>
    				<td colspan="2" align="center"><input type="submit" value="수정하기" />
    								&nbsp;&nbsp;&nbsp;<a href="list">목록보기</a>
    								&nbsp;&nbsp;&nbsp;<a href="delete?bNo=${contentView.bNo}">삭제</a>
    								&nbsp;&nbsp;&nbsp;<a href="#">답변</a>
    				</td>
    			</tr>
    			
    			
    			</form>
    			
    			
    			</table>
    			
    			
    		</div>
    		</body>
    </html>

     

    2. 컨트롤러 설정

    BController.java에 리퀘스트맵핑 modify와 delete를 추가한다.

    둘다 리턴은 리다이렉트 list로 해준다.

     

    BController.java

    @RequestMapping(value="/modify", method=RequestMethod.POST)
    	//@RequestMapping("/modify")
    	public String modify(HttpServletRequest request, Model model) {
    		System.out.println("-----modify() 호출");
    		
    		model.addAttribute("request", request);//model에 글제목, 글내용 들의 정보 주입
    		//System.out.println(request);
    		
    		cmd = new ModifyCmd();
    		cmd.service(model);
    		
    		return "redirect:list";
    	}
    	
    	
    	@RequestMapping("/delete")
    	public String delete(HttpServletRequest request, Model model) {
    		System.out.println("------delete() 호출------");
    		
    		model.addAttribute("request", request);//model에 글제목, 글내용 들의 정보 주입
    		cmd = new DeleteCmd();
    		cmd.service(model);
    		
    		
    		return "redirect:list";
    	}

     

    3. command 클래스 설정

    위 컨트롤러에서 메소드를 정의 해줬으므로 bbsCommand패키지에 ModifyCmd.java와 DeleteCmd.java 두 파일을 생성한다.

    자바파일은 앞이 대문자로 시작해주는 것에 주의한다.

     

    modify와 delete 모두 비슷하다.

    받아온 모델을 맵으로 바꾸고 그맵을 HttpServletRequest로 형변환 한뒤 그 안의 bName, bContent 같은 정보를 꺼내어 String으로 저장해준다.

     

    그리고 그 객체들을 파라미터로 하여 bDAO의 메소드를 실행시킨다.

    bDAO의 메소드는 Cmd 코드를 작성한 뒤 작성해준다.

     

    아래 코드를 복사붙여넣기 하자.

     

    ModifyCmd.java

    package com.spring.bbsCommand;
    
    import java.util.Map;
    
    import javax.servlet.http.HttpServletRequest;
    
    import org.springframework.ui.Model;
    
    import com.spring.bbsDAO.BDAO;
    
    public class ModifyCmd implements Bcmd {
    
    	@Override
    	public void service(Model model) {
    		Map<String, Object> map = model.asMap(); //model을 맵형태로 변환
    		HttpServletRequest request = (HttpServletRequest) map.get("request");
    		//HttpServeltRequest 작동원리
    		//사용자가 input에 값을 입력하고 submit을 한다. -> input값의 내용들이 HttpServletRequest에 저장이 된다.
    		//서블릿리퀘스트에 저장된 내용을 request.getParameter()와 model.addAttribute()로 view에 뿌려줄 수 있다.
    		
    		//
    		String bNo = request.getParameter("bNo");
    		String bName = request.getParameter("bName");
    		String bSubject = request.getParameter("bSubject");
    		String bContent = request.getParameter("bContent");
    		
    		BDAO bDAO = new BDAO();
    		bDAO.modify(bNo, bName, bSubject, bContent); //위에서 정의한 파라미터를 넣어줌
    		
    	}
    }
    

     

     

    DeleteCmd.java

    package com.spring.bbsCommand;
    
    import java.util.Map;
    
    import javax.servlet.http.HttpServletRequest;
    
    import org.springframework.ui.Model;
    
    import com.spring.bbsDAO.BDAO;
    
    public class DeleteCmd implements Bcmd {
    
    	@Override
    	public void service(Model model) {
    		
    		Map<String, Object> map = model.asMap();
    		HttpServletRequest request = (HttpServletRequest)map.get("request");
    		
    		String bNo = request.getParameter("bNo");
    		BDAO bDAO = new BDAO();
    		bDAO.delete(bNo);
    	}
    	
    }
    

     

    4. DAO 설정

    이번 챕터의 하이라이트이다.

     

    BDAO에서 쿼리문을 실행시켜주는 메소드를 만든다. 다행히도 이번포스팅에서는 VO 패키지는 건들지 않는다.

    DAO 설정 또한 전 챕터처럼 connection과 preparedStatement를 사용한다.

     

    매우 많은 오타를 유발하므로 복사 붙여넣기 또는 crtl+T를 활용하는 것을 추천한다.

     

    아래 코드를 BDAO.java에 추가한다.

     

    //modify 메소드
    	public void modify(String bNo, String bName, String bSubject, String bContent) {
    		
    		//커넥션과 프리페어드스테이트먼트를 초기에 null로 설정
    		Connection connection = null;
    		PreparedStatement preparedStatement = null;
    		
    		try {
    			connection = dataSource.getConnection();
    			System.out.println("커넥션 확보!! -----------");
    			
    			String sql = "update mvc_bbs set bName=?, bSubject=?, bContent=? where bNo=?";
    			preparedStatement = connection.prepareStatement(sql);//프리페어드스테이트먼트에 접속
    			
    			//물음표가 4개이므로 1에서 4까지 setString 해줌
    			preparedStatement.setString(1, bName);
    			preparedStatement.setString(2, bSubject);
    			preparedStatement.setString(3, bContent);
    			preparedStatement.setInt(4, Integer.parseInt(bNo));
    			
    			int n = preparedStatement.executeUpdate();//추후 사용
    			
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} finally {
    			try {
    				//자원반납
    				if(preparedStatement != null) preparedStatement.close();
    				if(connection != null) connection.close();
    				
    			} catch (Exception e2){
    				e2.printStackTrace();
    			}
    		}
    	}//modify()
    	
    	
    	//delete 메소드
    	public void delete(String bNo) {
    		Connection connection  = null;
    		PreparedStatement preparedStatement = null;
    		try {
    			connection = dataSource.getConnection();
    			
    			String sql = "delete from mvc_bbs where bNo = ?";
    			System.out.println("asdasd");
    			preparedStatement = connection.prepareStatement(sql);
    			preparedStatement.setInt(1, Integer.parseInt(bNo));
    			
    			int n = preparedStatement.executeUpdate();//추후 사용
    			
    			
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} finally {
    			try {
    				if(preparedStatement != null) preparedStatement.close();
    				if(connection != null) connection.close();				
    			} catch (Exception e2) {
    				e2.printStackTrace();
    			}
    		}
    	}

     

     

    코딩은 이제 끝났다.

    내용보기에서 삭제 버튼을 누르면 삭제된 뒤 list페이지로 리다이렉트 된다.

    참고 이 delete query문은 현업에선 거의 안쓰이고, 대신에 안보이게 숨긴다. 

     

    예를 들어 1번글을 삭제한다고 할 때, delete from mvc_bbs where bNo=1 << 이렇게 쓰지 않고,

    use 열 하나를 추가한다.

    그리고 update mvc_bbs set use='N' where bNo=1 로 지정하여 리스트에는 use가 N인 행은 보이지 않게 한다.

     

    다음으로 수정을 해보자.

    아래는 1번 글이다.

     

     

    저 내용 부분에 '11111111111111'을 적은 뒤 수정하기 버튼을 누르면 리스트페이지로 나가지고,

    다시 들어오면 아래와 같이 수정되어 있는 것을 볼 수 있다.

     

    하지만 실제 게시판에는 저런 식으로 수정되는 것이 아니라 처음에는 read만 되게끔했다가 수정버튼을 누르면 수정할 수 있게 바뀐다.

     

    그리고 수정 확인을 누르면 반영되면서 다시 read only상태로 바뀐다. 이것은 jquery나 자바스크립트로 textarea 속성을 클릭할 때 바꿔주게 만들면 된다.

     

    예를 들어 수정하기를 누르면 readonly="true", 수정이 끝난 뒤 확인버튼을 누르면 readonly="false"가 되는 식으로 하면 된다.

     

     

    수정, 삭제까지 한 부분은 아래 파일에 올려 놓았다.

    springBBS 수정과 삭제까지.zip
    0.07MB

     

     

     

    이로써 기본적인 CRUD 기능은 끝났다.

     

    다음 챕터에서는 댓글달기 기능을 해본다.

     

     

     

    반응형

    댓글