무작정 개발.Vlog

[Spring 2.5] 게시판 CRUD 만들기

by 무작정 개발
반응형
2022.03.23(62일 차)

 

이번에는 Spring2.5  게시판 제작에 대해 정리할 것이다.

Spring은 2.5 버전을 쓰고, TomCat은 8.5, 그리고 OracleDB와 iBatis를 써서 만들 것이다.

 

 

 

스프링 게시판
스프링 게시판

위의 게시판을 만들 것인데 기존에 했던 JSP, Servlet, Struts, Struts2와 다른 점이 없는 게시판이다.

기능도 이전과 같으니 자세한 것은 이전 게시판 제작 글을 참고하면 좋겠다.

 


 

스프링 2.5를 이용해서 게시판 만들기

 

 

1. DB 테이블 생성하기

  • sbbs라는 이름으로 테이블을 만들 것이다.
create table sbbs(
boardNum number(9) not null,
name varchar2(20) not NULL,
pwd varchar2(10),
email varchar2(50),
subject  varchar2(50) not NULL,
content varchar2(4000) not NULL,
ipAddr  varchar2(20) not NULL,
hitCount  number(9) not NULL,
created DATE,
constraint pk_bbs_boardNum PRIMARY KEY(boardNum));

sbbs 테이블 확인
sbbs 테이블 확인

테이블을 만들었으면 칼럼명에 오타가 없는지 혹은 잘 만들어졌는지 select 해서 확인해본다.

 

 

2. BoardCommand 클래스 생성

  • 스프링의 DTO 역할
  • 게시판에서 사용할 변수를 선언
package com.bbs;
//스프링의 DTO
public class BoardCommand {
	
	private int listNum;//일련번호
	
	private int boardNum;//여기부터 hitCount까지는 테이블에있는것
	private String subject;
	private String name;
	private String email;
	private String pwd;
	private String content;
	private String ipAddr;
	private String created;
	private int hitCount;
	
	private String mode;
	private String pageNum;
    
    // getter/setter 생성
    
}

 

 

3. JSP 페이지 생성

  • created.jsp(게시글 생성/게시글 수정/) , article.jsp(게시글 조회 페이지), list.jsp(게시글 리스트 조회 페이지)
  • created.jsp페이지는 게시글 생성과 수정이 거의 비슷해서 <c:if>를 써서 2가지 역할을 할 수 있게 만들 것이다.

created.jsp - (게시글 생성/게시글 수정)

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
	request.setCharacterEncoding("UTF-8");
	String cp = request.getContextPath();
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>게 시 판(Spring2.5)</title>

<link rel="stylesheet" type="text/css" href="<%=cp%>/board/css/style.css"/>
<link rel="stylesheet" type="text/css" href="<%=cp%>/board/css/created.css"/>

<script type="text/javascript" src="<%=cp%>/board/js/util.js"></script>
<script type="text/javascript">

	function sendIt(){
		
		var f = document.myForm;
		
		str = f.subject.value;
		str = str.trim();
		if(!str){
			alert("\n제목을 입력하세요.");
			f.subject.focus();
			return;
		}
		f.subject.value = str;
		
		str = f.name.value;
		str = str.trim();
		if(!str){
			alert("\n이름을 입력하세요.");
			f.name.focus();
			return;
		}		
		
		/* if(!isValidKorean(str)){
			alert("\n이름을 정확히 입력하세요.");
			f.name.focus()
			return;
		} */		
		f.name.value = str;
		
		if(f.email.value){
			if(!isValidEmail(f.email.value)){
				alert("\n정상적인 E-Mail을 입력하세요.");
				f.email.focus();
				return;
			}
		}
		
		str = f.content.value;
		str = str.trim();
		if(!str){
			alert("\n내용을 입력하세요.");
			f.content.focus();
			return;
		}
		f.content.value = str;
		
		str = f.pwd.value;
		str = str.trim();
		if(!str){
			alert("\n패스워드를 입력하세요.");
			f.pwd.focus();
			return;
		}
		f.pwd.value = str;
		
		if (f.mode.value=="insert") {
			f.action = "<%=cp%>/bbs/created.action";
		}else{
			f.action = "<%=cp%>/bbs/updated.action";
		}
		
		f.submit();
		
	}
</script>
</head>
<body>
<div id="bbs">
	<div id="bbs_title">
		게 시 판(Spring2.5)
	</div>
	<form action="" method="post" name="myForm">
	<div id="bbsCreated">
		<div class="bbsCreated_bottomLine">
			<dl>
				<dt>제&nbsp;&nbsp;&nbsp;&nbsp;목</dt>
				<dd>
				<input type="text" name="subject" value="${dto.subject }" size="60" 
				maxlength="100" class="boxTF"/>
				</dd>
			</dl>		
		</div>
		<div class="bbsCreated_bottomLine">
			<dl>
				<dt>작성자</dt>
				<dd>
				<input type="text" name="name" value="${dto.name }" size="35" 
				maxlength="20" class="boxTF"/>
				</dd>
			</dl>		
		</div>
		<div class="bbsCreated_bottomLine">
			<dl>
				<dt>E-Mail</dt>
				<dd>
				<input type="text" name="email" value="${dto.email }" size="35" 
				maxlength="50" class="boxTF"/>
				</dd>
			</dl>		
		</div>
		<div id="bbsCreated_content">
			<dl>
				<dt>내&nbsp;&nbsp;&nbsp;&nbsp;용</dt>
				<dd>
				<textarea rows="12" cols="63" name="content"
				class="boxTA">${dto.content }</textarea>
				</dd>
			</dl>
		</div>	
		<div class="bbsCreated_noLine">
			<dl>
				<dt>패스워드</dt>
				<dd>
				<input type="password" name="pwd" value="${dto.pwd }" size="35" 
				maxlength="7" class="boxTF"/>
				&nbsp;(게시물 수정 및 삭제시 필요!!)
				</dd>
			</dl>		
		</div>	
	</div>
	<div id="bbsCreated_footer">
		<input type="hidden" name="pageNum" value="${pageNum }"/>
		<input type="hidden" name="mode" value="${mode }"/>
		
		<c:if test="${mode=='insert' }">
			<input type="button" value=" 등록하기 " class="btn2" onclick="sendIt();"/>
			<input type="reset" value=" 다시입력 " class="btn2" 
			onclick="document.myForm.subject.focus();"/>
			<input type="button" value=" 작성취소 " class="btn2" 
			onclick="javascript:location.href='<%=cp%>/bbs/list.action';"/>
		</c:if>
		
		<c:if test="${mode=='update' }">
		<input type="hidden" name="boardNum" value="${dto.boardNum }"/>
		<input type="button" value=" 수정하기 " class="btn2" onclick="sendIt();"/>
		<input type="button" value=" 수정취소 " class="btn2" 
		onclick="javascript:location.href='<%=cp%>/bbs/list.action?pageNum=${pageNum }';"/>
		</c:if>
	</div>
	
	</form>

</div>

</body>
</html>

 

list.jsp - (게시글 리스트 조회 페이지)

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
	request.setCharacterEncoding("UTF-8");
	String cp = request.getContextPath();
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>게 시 판 (Spring2.5)</title>

<link rel="stylesheet" type="text/css" href="<%=cp%>/board/css/style.css"/>
<link rel="stylesheet" type="text/css" href="<%=cp%>/board/css/list.css"/>

<script type="text/javascript">

	function searchData() {
		
		var f = document.searchForm;
		
		f.action = "<%=cp%>/bbs/list.action";
		f.submit();
	}
	
</script>

</head>
<body>

<div id="bbsList">

	<div id="bbsList_title">
		게 시 판 (Spring2.5)
	</div>
	<div id="bbsList_header">
		<div id="leftHeader">
		<form action="" method="post" name="searchForm">
			<select name="searchKey" class="selectField">
				<option value="subject">제목</option>
				<option value="name">작성자</option>
				<option value="content">내용</option>
			</select>
			<input type="text" name="searchValue" class="textField"/>
			<input type="button" value=" 검 색 " class="btn2" onclick="searchData();"/>		
		</form>				
		</div>
		<div id="rightHeader">
			<input type="button" value=" 글올리기 " class="btn2" 
			onclick="javascript:location.href='<%=cp%>/bbs/created.action';"/>			
		</div>	
	</div>
	<div id="bbsList_list">
		<div id="title">
			<dl>
				<dt class="num">번호</dt>
				<dt class="subject">제목</dt>
				<dt class="name">작성자</dt>
				<dt class="created">작성일</dt>
				<dt class="hitCount">조회수</dt>
			</dl>
		</div>
		<div id="lists">
		<c:forEach var="dto" items="${lists }">
			<dl>
				<dd class="num">1</dd>
				<dd class="subject">
				<a href="${urlArticle }&boardNum=${dto.boardNum}">${dto.subject }</a>
				</dd>
				<dd class="name">${dto.name }</dd>
				<dd class="created">${dto.created }</dd>
				<dd class="hitCount">${dto.hitCount }</dd>
			</dl>
		</c:forEach>
		</div>
		<div id="footer">
			<p>
			<c:if test="${totalDataCount!=0 }">
				${pageIndexList }
			</c:if>
			<c:if test="${totalDataCount==0 }">
				등록된 게시물이 없습니다.
			</c:if>
			</p>
		</div>
		
	</div>
	
</div>

</body>
</html>

 

article.jsp - (게시글 조회 페이지)

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
	request.setCharacterEncoding("UTF-8");
	String cp = request.getContextPath();
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>게 시 판</title>

<link rel="stylesheet" type="text/css" href="<%=cp%>/board/css/style.css"/>
<link rel="stylesheet" type="text/css" href="<%=cp%>/board/css/article.css"/>

<script type="text/javascript">

	function updateData(){
		var boardNum = "${dto.boardNum}";
		var param = "${params}";
		var params = "?boardNum=" + boardNum + "&" + param;
		var url = "<%=cp%>/bbs/updated.action" + params;
		
		location.replace(url);
	}
	
	function deleteData(){
		var boardNum = "${dto.boardNum}";
		var param = "${params}";
		var params = "?boardNum=" + boardNum + "&" + param;
		var url = "<%=cp%>/bbs/deleted.action" + params;
		
		location.replace(url);
	}

</script>

</head>
<body>

<div id="bbs">
	
	<div id="bbs_title">
		게 시 판 (Spring 2.5)
	</div>
	<div id="bbsArticle">
		
		<div id="bbsArticle_header">
			${dto.subject }
		</div>
		
		<div class="bbsArticle_bottomLine">
			<dl>
				<dt>작성자</dt>
				<dd>
				${dto.name }
				<c:if test="${!empty dto.email }">
					(<a href="mailto:${dto.email }">${dto.email }</a>)
				</c:if>
				</dd>
				<dt>줄수</dt>
				<dd>${lineSu }</dd>
			</dl>		
		</div>
		
		<div class="bbsArticle_bottomLine">
			<dl>
				<dt>등록일</dt>
				<dd>${dto.created }</dd>
				<dt>조회수</dt>
				<dd>${dto.hitCount }</dd>
			</dl>		
		</div>
		
		<div id="bbsArticle_content">
			<table width="600" border="0">
			<tr>
				<td style="padding-left: 20px 80px 20px 62px;" 
				valign="top" height="200">
				${dto.content }
				</td>
			</tr>			
			</table>
		</div>
		
		<div class="bbsArticle_bottomLine">
		이전글 : 
		<c:if test="${!empty preSubject }">
			<a href="<%=cp%>/bbs/article.action?${params}&boardNum=${preBoardNum}">
			${preSubject }
			</a>
		</c:if>
		</div>
		
		<div class="bbsArticle_noLine">
		다음글 : 
		<c:if test="${!empty nextSubject }">
			<a href="<%=cp%>/bbs/article.action?${params}&boardNum=${nextBoardNum}">
			${nextSubject }
			</a>
		</c:if>
		</div>
		
		
	</div>
	
	<div class="bbsArticle_noLine" style="text-align: right">
	From : ${dto.ipAddr }
	</div>
	
	<div id="bbsArticle_footer">
		<div id="leftFooter">
			<input type="button" value=" 수정 " class="btn2" onclick="updateData();"/>
			<input type="button" value=" 삭제 " class="btn2" onclick="deleteData();"/>
		</div>
		<div id="rightFooter">
			<input type="button" value=" 리스트 " class="btn2" onclick="javascript:location.href='<%=cp%>/bbs/list.action?${params }';"/>
		</div>	
	</div>
	
</div>
</body>
</html>

 

 

4. bbs_sqlMap.xml 생성 및 등록하기 (iBatis 세팅)

  • sqlMapConfig, xml에 만든 bbs_sqlMap.xml파일을 등록할 것이다.

bbs_sqlMap.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap
PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-2.dtd">

<sqlMap namespace="bbs">

<select id="boardNumMax" resultClass="int">
	select nvl(max(boardNum),0) from sbbs
</select>

<insert id="insertData" parameterClass="com.bbs.BoardCommand">
	insert into sbbs (boardNum,name,pwd,email,subject,content,
	ipAddr,hitCount,created) values (#boardNum#,#name#,#pwd#,#email#,#subject#,#content#,
	#ipAddr#,0,sysdate)
</insert>

<select id="dataCount" resultClass="int" parameterClass="map">
	select nvl(count(*),0) from sbbs
	where $searchKey$ like '%' || #searchValue# || '%'
</select>

<select id="listData" resultClass="com.bbs.BoardCommand"
	parameterClass="map">
	select * from (
	select rownum rnum, data.* from (
	select boardNum,name,subject,hitCount,
	to_char(created, 'YYYY-MM-DD') created from sbbs
	where $searchKey$ like '%' || #searchValue# || '%'
	order by boardNum desc) data)
<![CDATA[
	where rnum>=#start# and rnum<=#end#
]]>
</select>

<!-- 아티클은 하나의 데이터 가져와야한다. -->
<select id="readData" resultClass="com.bbs.BoardCommand" parameterClass="int">
	select boardNum,name,pwd,email,subject,content,ipAddr,
	hitCount,created from sbbs where boardNum=#boardNum#
</select>

<!-- 이전글 -->
<select id="preReadData" resultClass="com.bbs.BoardCommand" parameterClass="map">
	select rownum,data.* from (
	select boardNum,subject from sbbs
	where ($searchKey$ like '%' || #searchValue# || '%') <!-- searchKey like '%searchValue%' -->
	and (boardNum>#boardNum#) order by boardNum asc) data
	where rownum=1
</select>

<!-- 다음글 -->
<select id="nextReadData" resultClass="com.bbs.BoardCommand" parameterClass="map">
	select rownum,data.* from (
	select boardNum,subject from sbbs
	where ($searchKey$ like '%' || #searchValue# || '%')
<![CDATA[
	and (boardNum<#boardNum#) order by boardNum desc) data
	where rownum=1
]]>
</select>

<!-- 조회수 증가 -->
<update id="updateHitCount" parameterClass="int">
	update sbbs set hitCount=hitCount+1 where boardNum=#boardNum#
</update>

<!-- 수정(update) -->
<update id="updateData" parameterClass="com.bbs.BoardCommand">
	update sbbs set name=#name#,pwd=#pwd#,email=#email#,
	subject=#subject#,content=#content# where boardNum=#boardNum#
</update>

<!-- 삭제(delete) -->
<delete id="deleteData" parameterClass="int">
	delete sbbs where boardNum=#boardNum#
</delete>

</sqlMap>

 

sqlMapConfig.xml에 등록하기

<!-- Config(환경설정파일) -->
<sqlMapConfig>
	<settings
	cacheModelsEnabled="false"	
	useStatementNamespaces="true"/> 
	
	<sqlMap resource="com/util/sqlMap/bbs_sqlMap.xml"/>
	
</sqlMapConfig>

 

5. BoardController 클래스 생성 - (분배기 역할)

  • BoardController 클래스에 있는 메서드 별로 설명을 하면서 정리할 것이다.

 

(1) BoardController 클래스의 created 메서드

@Controller("bbs.boardController")
public class BoardController {
	
	//@Qualifier("com.salMap") 이 두개를 합친게 @Resource이다,
	@Resource(name="dao") //ado라고 이름으로 객체생선한 것을 가져와서
	private CommonDAO dao;// 여기에 넣어라
	
	@Resource(name="myUtil") //MyUtil를 읽어와서 
	private MyUtil myUtil;// = new MyUtil();   / 여기에 넣어라
	
	@RequestMapping(value="/bbs/created.action",method= {RequestMethod.GET,RequestMethod.POST})
	public String created(BoardCommand command,HttpServletRequest request) throws Exception{
		
		//입력창으로 만들어진다
		if (command==null||command.getMode()==null 
				|| command.getMode().equals("")) {
					
			//넘어갈 때 mode를 가져가야 한다.
			request.setAttribute("mode", "insert");
					
			return "board/created";
		}
		//입력을 시키는 코딩을 써준다
		int boardNumMax = dao.getIntValue("bbs.boardNumMax");
				
		command.setBoardNum(boardNumMax + 1);
		command.setIpAddr(request.getRemoteAddr());
			
		dao.insertData("bbs.insertData", command);
				
		return "redirect:/bbs/list.action";//실제주소가 아닌 가상 주소라서 주소 다 써줘야한다
		
	}//end created()

@Controller

BoardClass가 컨트롤러 기능을 할 수있게 @Controller를 써줬다. 그러면 자동으로 맞는 컨트롤러가 선택된다.

@Controller("bbs.boardController") 를 보면 뒤에 ( ) 괄호가 있는 것을 볼 수 있다. 

컨트롤러 어노테이션이 다른 곳에서 중복 실행할 때 충돌이 날 수 있어 구분하기위해 별칭 느낌으로 이름을 지정한다.

 

@Resource

@Resource(name="dao") 
private CommonDAO dao;
	
@Resource(name="myUtil")
private MyUtil myUtil;

@Resource객체를 생성한 것을 가져오는 어노테이션이다.

첫번 째 괄호를 보면 'dao'라는 이름으로 생성된 객체를 가지고와서 하단 private CommonDAO dao에 넣는다.

@Resource는 @Autowired와 @Qualifier을 합친 것과 같은 효과이다.

 

 

@RequestMapping

@RequestMapping(value="/bbs/created.action",method= {RequestMethod.GET,RequestMethod.POST})
public String created(BoardCommand command,HttpServletRequest request) throws Exception{


}

created 메서드에 @RequestMapping을 해주었다.

value = 에 어떤 경로가 오냐에 따라 다른 메서드가 실행되도록 어노테이션을 작성하였다.

스프링에서는 메서드 이름으로 찾는 것이 아닌 @RequestMapping을 보고 찾아와서 메서드가 실행된다.

그리고 GET 방식, POST 방식 둘 다 적어주었다.

 

if (command==null||command.getMode()==null || command.getMode().equals("")) {
					
			//넘어갈 때 mode를 가져가야 한다.
			request.setAttribute("mode", "insert");
					
			return "board/created";
		}
		//입력을 시키는 코딩을 써준다
		int boardNumMax = dao.getIntValue("bbs.boardNumMax");
				
		command.setBoardNum(boardNumMax + 1);
		command.setIpAddr(request.getRemoteAddr());
			
		dao.insertData("bbs.insertData", command);
				
		return "redirect:/bbs/list.action";
        }

그리고 mode에  insert 가지고 created.jsp로 넘어간다. insert를 가지고 가야 created.jsp에서 mode에 따라

입력 페이지, 수정 페이지가 띄워진다. 자세한 건 created.jsp 코드 참고

 

(if문 통과) 정상적으로 실행되면 boardNumMax에 쿼리가 실행된 값을 넣어준다. (쿼리는 xml파일의 sql문 확인)

 

데이터를 다 입력했으면 insertData 쿼리를 실행해서 DB에 값을 저장하고

return 에는 데이터를 입력(DB에 저장) 하기 때문에 redirect로 경로를 지정한다.

 

 

(2) BoardController 클래스의 list, article 메서드

//list는 form을 쓰는게 아니라 get방식으로 넘어온다. post를 지워도 되는데 그냥 써놓는다
	@RequestMapping(value="/bbs/list.action",
			method= {RequestMethod.GET,RequestMethod.POST})
	public String list(HttpServletRequest request) throws Exception{
		
		HttpSession session = request.getSession();
		String cp = request.getContextPath();
		
		int numPerPage = 5; //페이지 5개씩 띄움
		int totalPage = 0;
		int totalDataCount = 0;
		
		String pageNum = request.getParameter("pageNum");
		
		//수정 메서드에서 updateSubmit()에서 보낸 pageNum을  받음
		if(pageNum==null) {
			pageNum = (String)session.getAttribute("pageNum"); //세션으로 올린건 여기서 받는다
		}
		
		session.removeAttribute("pageNum");//받았으면 지운다. 세션을 지워야 나중에 쓸수 있다
		
		int currentPage = 1;
		if(pageNum!=null && !(pageNum.equals(""))) {
			currentPage = Integer.parseInt(pageNum);
		}
		
		String searchKey = request.getParameter("searchKey");
		String searchValue = request.getParameter("searchValue");
		
		if(searchValue==null) {
			searchKey = "subject";
			searchValue = "";
		}
		
		if(request.getMethod().equalsIgnoreCase("GET")) {
			searchValue = URLDecoder.decode(searchValue, "UTF-8");
		}
		
		Map<String, Object> hMap = new HashMap<String, Object>();
		hMap.put("searchKey", searchKey);
		hMap.put("searchValue", searchValue);
		
		totalDataCount = dao.getIntValue("bbs.dataCount", hMap);
		
		if(totalDataCount!=0) {
			totalPage = myUtil.getPageCount(numPerPage, totalDataCount);
		}
		
		if(currentPage>totalPage) {
			currentPage = totalPage;
		}
		
		int start = (currentPage-1)*numPerPage+1;
		int end = currentPage*numPerPage;
		
		hMap.put("start", start);
		hMap.put("end", end);
		
		List<Object> lists = dao.getListData("bbs.listData", hMap); //여기까지하면 리스트를 구함
		
		int listNum,n=0;
		ListIterator<Object> it = lists.listIterator();
		while(it.hasNext()) {
			
			BoardCommand data = (BoardCommand)it.next();
			
			listNum = totalDataCount - (start + n -1);
			data.setListNum(listNum);
			
			n++;
		}
		
		String params = "";
		String urlList = "";
		String urlArticle = "";
		
		if(!searchValue.equals("")) {
			
			searchValue = URLEncoder.encode(searchValue, "UTF-8");
			params = "searchKey=" + searchKey +
					"&searchValue=" + searchValue;
		}
		
		//검색을 안했다면
		if(params.equals("")) {
			
			urlList = cp + "/bbs/list.action";
			urlArticle = cp + "/bbs/article.action?pageNum=" + currentPage;
			
		}else { //null이 아니면
			
			urlList = cp + "/bbs/list.action" + params;
			urlArticle = cp + "/bbs/article.action?pageNum=" + 
					currentPage + "&" + params;
		}
		
		request.setAttribute("lists", lists);
		request.setAttribute("urlArticle", urlArticle);
		request.setAttribute("pageNum", pageNum);
		request.setAttribute("totalPage", totalPage);
		request.setAttribute("totalDataCount", totalDataCount);
		request.setAttribute("pageIndexList", myUtil.pageIndexList(currentPage, totalPage, urlList));
		
		return "board/list"; // 스프링의 포워드
	}
	
	
	@RequestMapping(value="/bbs/article.action",
			method= {RequestMethod.GET, RequestMethod.POST})
	public String article(HttpServletRequest request) throws Exception {
		
		int boardNum = Integer.parseInt(request.getParameter("boardNum"));
		String pageNum = request.getParameter("pageNum");
		
		String searchKey = request.getParameter("searchKey");
		String searchValue = request.getParameter("searchValue");
		
		//4개를 받는다.
		if(searchValue==null) {
			searchKey = "subject";
			searchValue = "";
		}
		
		if(request.getMethod().equalsIgnoreCase("GET")) { //equalsIgnoreCase : 대소문자 상관없이
			searchValue = URLDecoder.decode(searchValue, "UTF-8");
		}
		
		//들어갈때 조회수 증가시킨다.
		dao.updateData("bbs.updateHitCount", boardNum);
		
		BoardCommand dto = (BoardCommand)dao.getReadData("bbs.readData", boardNum);
		
		if(dto==null) {
			return "redirect:/bbs/list.action"; // 스프링의 리다이렉트
		}
		
		int lineSu = dto.getContent().split("\r\n").length;
		
		dto.setContent(dto.getContent().replace("\r\n", "<br/>"));
		
		Map<String, Object> hMap = new HashMap<>();
		hMap.put("searchKey", searchKey);
		hMap.put("searchValue", searchValue);
		hMap.put("boardNum", boardNum);
		
		BoardCommand preReadData = (BoardCommand)dao.getReadData("bbs.preReadData", hMap);
		
		int preBoardNum = 0;
		String preSubject = "";
		
		if(preReadData!=null) {
			preBoardNum = preReadData.getBoardNum();
			preSubject = preReadData.getSubject();
		}
		
		
		BoardCommand nextReadData = (BoardCommand)dao.getReadData("bbs.nextReadData", hMap);
		
		int nextBoardNum = 0;
		String nextSubject = "";
		
		if(nextReadData!=null) {
			nextBoardNum = nextReadData.getBoardNum();
			nextSubject = nextReadData.getSubject();
		}
		
		String params = "pageNum=" + pageNum;
		
		if(!searchValue.equals("")) {
			searchValue = URLEncoder.encode(searchValue, "UTF-8");
			params += "&searchKey=" + searchKey;
			params += "&searchValue=" + searchValue;
		}
		
		request.setAttribute("dto", dto);
		request.setAttribute("preBoardNum", preBoardNum);
		request.setAttribute("preSubject", preSubject);
		request.setAttribute("nextBoardNum", nextBoardNum);
		request.setAttribute("nextSubject", nextSubject);
		request.setAttribute("pageNum", pageNum);
		request.setAttribute("params", params);
		request.setAttribute("lineSu", lineSu);
		
		return "board/article";
		
	}//end article()

list, article 메서드는 페이징 관련이고 이전에 다뤘기 때문에 설명은 생략하겠다.

 

 

(3) BoardController 클래스의 updateForm메서드

  • 수정 페이지(created.jsp)
//수정창을 띄우는것
	@RequestMapping(value="/bbs/updated.action",method= {RequestMethod.GET})
	public String updateForm(HttpServletRequest request) throws Exception{
		
		//article에서 hidden으로 넘긴 값이 넘어오는거
		int boardNum = Integer.parseInt(request.getParameter("boardNum"));
		String pageNum = request.getParameter("pageNum");
			
		BoardCommand dto = (BoardCommand)dao.getReadData("bbs.readData",boardNum);
			
		if(dto==null) {
				return "redirect:/bbs/list.aciton?pageNum=" + pageNum;
		}
			
		//이제 수정창의 띄우고 데이터 넘길 것이다.
		request.setAttribute("dto", dto);
		request.setAttribute("mode", "update");//입력창으로 띄울때 mode는 insert 수정창으로 띄울때 mode는 update
		request.setAttribute("pageNum", pageNum);
			
		return "board/created"; //여기로 데이터 넘긴다.
	}

여기서도 @RequestMapping을 써주었고, GET방식으로 value의 경로가 오면 메서드가 실행된다.

getParameter로 값을 받아주고,

수정을 하면 기존에 작성했던 데이터를 가져와야 하기 때문에 가져와서 dto에 담았다.

dto에 값이 없으면 list로 나가고 기존의 페이징 처리를 유지하기 위해 pageNum을 가져가도록 하였다.

 

 if문을 통과했다면 dto가 값이 있으니 setAttribute로 dto, mode, pageNum을 보내주고,

수정을 하려면 mode 값 update를 가져가야 한다. mode를 update를 가져가면 수정 창이 나온다.

 

 

(4) BoardController 클래스의 updateSubmit메서드

  • 여기서 실제 수정을 한다. 위의 updateForm메서드를 수정 페이지를 띄워주는 역할이다.
//실제로 수정처리를 하는것.
	@RequestMapping(value="/bbs/updated.action",method= {RequestMethod.POST})
	public String updateSubmit(BoardCommand command, HttpServletRequest request) throws Exception{//입력/수정할때는 command
	
		//수정하고 돌아가는값을 session에 올림
		
		dao.updateData("bbs.updateData", command); //데이터 수정해주고
		
		//다시 list로 들어갈려면 pageNum 필요
		
		
		//list()에서 session으로 받음
		
		//방법 1
		/*HttpSession session = request.getSession();
		session.setAttribute("pageNum", command.getPageNum()); //command에서 받은 pageNum을 넘긴다.
		
		return "redirect:/bbs/list.action"; //업데이트 했으니 리다이렉트
*/		
		//위 방법으로 session써도 되고 리다에릭트할때 pageNum을 붙여서도 갈 수 있다.
		//방법 2
		return "redirect:/bbs/list.action?pageNum=" + command.getPageNum(); //업데이트 했으니 리다이렉트
	}

여기서도 @RequestMapping을 써서 Get방식으로 value의 주소가 오면 메서드가 실행된다.

수정한 데이터를 받아야 해서 command을 추가해주었고, 

수정(update)도 redirect를 써주고, 어떤 글을 수정할 것인지 알아야 해서 주소 뒤에 pageNum을 써준다.

 

 

(5) BoardController 클래스의 deleteSubmit메서드

  • 글 삭제하기
@RequestMapping(value="/bbs/deleted.action",method= {RequestMethod.GET})
	public String deleteSubmit(HttpServletRequest request) throws Exception{
	
		int boardNum = Integer.parseInt(request.getParameter("boardNum"));
		String pageNum = request.getParameter("pageNum");
		
		dao.deleteData("bbs.deleteData", boardNum);
		
		
		return "redirect:/bbs/list.action?pageNum=" + pageNum;// 애도 위처럼 2가지 방법 가능
	}
    
}//end boardController클래스

여기서도 getParameter로 boardNum, pageNum을 받아준다.

그리고 boarNum을 가지고 bbs.deleData(삭제 쿼리)를 실행시켜주고

 

삭제 또한 redirect를 써주면서 주소 뒤에 pageNum을 붙여 준다.

 


 

반응형

블로그의 정보

무작정 개발

무작정 개발

활동하기