5. 게시물 수정(update)
○ updatd.jsp 파일을 만들지 않고 created.jsp파일만 사용하여 상황에 따라 create/update를 사용
- 주소창에 mode라는 값을 넘겨준다
- mode가 save일 때는 입력 : 시작점 리스트(list.jsp)화면
- mode가 updateok일 때는 수정 : 시작점 게시물(article.jsp)화면
5-1 created 메소드 수정
○ create메소드를 찾아가는 경우
- list화면에서 글 올리기 클릭 시 → mode값을 넘겨주지 않는다(null)
- article화면에서 수정하기 클릭시 → mode값은 update
public ActionForward created(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) throws Exception {
String mode = request.getParameter("mode");
//mode값으로 입력창인지 수정창인지 구분
if(mode==null){//insert
request.setAttribute("mode", "save");
}
else{//update
CommonDAO dao = CommonDAOImpl.getInstance();
int num = Integer.parseInt(request.getParameter("num"));
String pageNum = request.getParameter("pageNum");
String searchKey = request.getParameter("searchKey");
String searchValue = request.getParameter("searchValue");
if(searchValue==null){
searchKey = "subject";
searchValue = "";
}
if(request.getMethod().equalsIgnoreCase("GET"))
searchKey = URLDecoder.decode(searchKey,"UTF-8");
//수정시 필요한 정보 가져오기
BoardForm dto = (BoardForm)dao.getReadData("boardTest.readData", num);
if(dto==null){
return mapping.findForward("list");
}
request.setAttribute("dto", dto);
request.setAttribute("mode", "updateok");
request.setAttribute("pageNum", pageNum);
request.setAttribute("searchKey", searchKey);
request.setAttribute("searchValue", searchValue);
}
return mapping.findForward("created");
}
5-2. created.jsp 수정
① body 부분
○ mode : 이 창이 수정창인지 입력창인지 구분하기 위해 사용
○ 입력 창
- num, pageNum, searchKey, searchValue값이 필요 없다
○ 수정창
- 수정에서는 값이 미리 들어가 있어 value값을 추가
- 수정 후 들어왔던 페이지로 나가기 위해서 num, pageNum, 검색을 했을 경우 searchKey / searchValue값이 필요
→ created메소드에서 request.setAttribute으로 보내준 값
→ hidden값으로 같이 전달
<body>
<div id="bbs">
<div id="bbs_title">
게 시 판(Struts1 + iBatis)
</div>
<form action="" name="myForm" method="post">
<div id="bbsCreated">
<div class="bbsCreated_bottomLine">
<dl>
<dt>제 목</dt>
<dd>
<input type="text" name="subject" size="74" maxlength="100" class="boxTF" value="${dto.subject }"/>
</dd>
</dl>
</div>
<div class="bbsCreated_bottomLine">
<dl>
<dt>작성자</dt>
<dd>
<input type="text" name="name" size="35" maxlength="20" class="boxTF" value="${dto.name }"/>
</dd>
</dl>
</div>
<div class="bbsCreated_bottomLine">
<dl>
<dt>E-Mail</dt>
<dd>
<input type="text" name="email" size="35" maxlength="50" class="boxTF" value="${dto.email }"/>
</dd>
</dl>
</div>
<div id="bbsCreated_content">
<dl>
<dt>내 용</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" size="35" maxlength="7" class="boxTF" value="${dto.pwd }"/>
{게시물 수정 및 삭제시 필요!!!}
</dd>
</dl>
</div>
<div id="bbsCreated_footer">
<input type="hidden" name="method" value="created_ok">
<!-- update일때 필요한 값 -->
<input type="hidden" name="num" value="${dto.num }"/>
<input type="hidden" name="pageNum" value="${pageNum }"/>
<input type="hidden" name="searchKey" value="${searchKey }">
<input type="hidden" name="searchValue" value="${searchValue }">
<!-- 이 창이 create창인지 update창인지 구분하기 위해 사용 -->
<input type="hidden" name="mode" value="${mode }"/>
//mode값으로 수정인지 입력인지 구분하여 버튼을 다르게 보여준다
<c:if test="${mode=='save' }">
<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%>/boardTest.do?method=list';"/>
</c:if>
<c:if test="${mode=='updateok' }">
<input type="button" value="수정하기" class="btn2" onclick="sendIt();"/>
<input type="button" value="수정취소" class="btn2"
onclick="javascript:location.href='<%=cp%>/boardTest.do?method=list&pageNum=${pageNum }
&searchKey=${searchKey }&searchValue=${searchValue }';"/>
</c:if>
</div>
</div>
</form>
</div>
</body>
5-3 created_ok 메소드 수정
○ mode값을 받아 입력과 수정 구분
- mode는 created메소드에서 save/updateok 값으로 넘기기 시작
- 수정은 article에서 mode=update로 넘기기 시작 → created메소드에서 updateok로 변경 후 넘김
○ 입력창
- 입력받은 값을 DB에 넣기만 하면 된다.
○ 수정창
- 필요한 값(num / pageNum / searchKey / searchValue)을 받아서 session에 넣어준다
- session에 넣어주는 이유 : struts-config_boardTest.xml에서는 ${ }를 사용할 수 없기 때문
○ dao는 null로 무조건 초기화 해줘야 한다.
public ActionForward created_ok(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) throws Exception {
CommonDAO dao = CommonDAOImpl.getInstance();
BoardForm f = (BoardForm)form;
String mode = request.getParameter("mode"); //save,updateok
if(mode.equals("save")){//입력
int maxNum=dao.getIntValue("boardTest.maxNum"); //boardTest_sqlMap.xml에 있는 것을 넣어준다
f.setNum(maxNum +1);
f.setIpAddr(request.getRemoteAddr());
dao.insertData("boardTest.insertData", f);//f는 boardForm을 넘겨준다 parameterClass여기안에있는 경로
}else{//수정
String pageNum = request.getParameter("pageNum");
dao.updateData("boardTest.updateData", f);
String searchKey = request.getParameter("searchKey");
String searchValue = request.getParameter("searchValue");
if(searchValue==null){
searchKey = "subject";
searchValue = "";
}
if(request.getMethod().equalsIgnoreCase("GET"))
searchKey = URLDecoder.decode(searchKey,"UTF-8");
HttpSession session = request.getSession();
session.setAttribute("pageNum", pageNum);
session.setAttribute("searchKey", searchKey);
session.setAttribute("searchValue", searchValue);
}
dao=null;
return mapping.findForward("created_ok");
}
5-4 struts-config_boardTest.xml 확인
<action-mappings>
<action path="/boardTest" type="com.boardTest.BoardAction" name="boardTestForm" scope="request" parameter="method">
<forward name="created" path="/boardTest/created.jsp"/>
<forward name="created_ok" redirect="true" path="/boardTest.do?method=list"/>
<forward name="list" path="/boardTest/list.jsp"/>
<forward name="article" path="/boardTest/article.jsp"/>
</action>
</action-mappings>
5-5 list메소드 수정
○ 수정창에서 넘어가는 경우에만 session에 pageNum / searchKey / searchValue 값이 들어있다.
- 입력창에서 들어올 경우
(String)session.getAttribute("pageNum") / ("searchKey") / ("searchValue) 은 null
public ActionForward list(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) throws Exception {
CommonDAO dao = CommonDAOImpl.getInstance();
String cp = request.getContextPath();
MyUtil myUtil = new MyUtil();
int numPerPage = 10;
int totalPage = 0;
int totalDataCount = 0;
String pageNum = request.getParameter("pageNum");
HttpSession session = request.getSession();
if(pageNum==null){
pageNum = (String)session.getAttribute("pageNum");
}
session.removeAttribute("pageNum");
int currentPage = 1;
if(pageNum!=null)
currentPage = Integer.parseInt(pageNum);
String searchKey = request.getParameter("searchKey");
String searchValue = request.getParameter("searchValue");
if(searchValue==null){
searchKey = (String)session.getAttribute("searchKey");
searchValue = (String)session.getAttribute("searchValue");
}
session.removeAttribute("searchKey");
session.removeAttribute("searchValue");
if(searchValue==null){
searchKey = "subject";
searchValue = "";
}
if(request.getMethod().equalsIgnoreCase("GET"))
searchKey = URLDecoder.decode(searchKey,"UTF-8");
//map에 searchKey / searchValue값 넣어서 데이터를 보낸다 → boardTest_sqlMap.xml에서 만든 함수에서 map을 받아서 사용하기 때문
Map<String, Object> hMap = new HashMap<String, Object>();
hMap.put("searchKey", searchKey);
hMap.put("searchValue", searchValue);
//boardTest_sqlMap.xml에서 만든 함수의 id를 id에 작성
totalDataCount = dao.getIntValue("boardTest.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는 총 4개의 데이터가 들어있다
hMap.put("start", start);
hMap.put("end", end);
List<Object> lists = dao.getListData("boardTest.listData", hMap);
String param = "";
String urlArticle = "";
String urlList = "";
if(!searchValue.equals("")){
searchValue = URLEncoder.encode(searchValue, "UTF-8");
param = "&searchKey=" + searchKey;
param+= "&searchValue=" + searchValue;
}
urlList = cp + "/boardTest.do?method=list" + param;
urlArticle = cp + "/boardTest.do?method=article&pageNum=" + currentPage + param;
request.setAttribute("lists", lists);
request.setAttribute("urlArticle", urlArticle);
request.setAttribute("pageNum", currentPage);
request.setAttribute("pageIndexList", myUtil.pageIndexList(currentPage, totalPage, urlList));
request.setAttribute("totalDataCount", totalDataCount);
return mapping.findForward("list");
}
5-6 실행화면
▶주소창에서 mode값 주목
mode=update : 수정
6. 게시물 삭제(delete)
○ 삭제의 시작 : 게시물(article.jsp)화면
○ 삭제는 따로 jsp파일이 필요 없음
6-1 boardTest_sqlMpa.xml 작성
<delete id="deleteData" parameterClass="int">
delete board where num=#num#
</delete>
6-2 BoardAction.java 작성
○ 필요한 값(num / pageNum / searchKey / searchValue)을 받아서 session에 넣어준다
- session에 넣어주는 이유 : struts-config_boardTest.xml에서는 ${ }를 사용할 수 없기 때문
public ActionForward deleted(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) throws Exception {
CommonDAO dao = CommonDAOImpl.getInstance();
String cp = request.getContextPath();
int num = Integer.parseInt(request.getParameter("num"));
String pageNum = request.getParameter("pageNum");
String searchKey = request.getParameter("searchKey");
String searchValue = request.getParameter("searchValue");
dao.deleteData("boardTest.deleteData", num);
HttpSession session = request.getSession();
session.setAttribute("pageNum", pageNum);
session.setAttribute("searchKey", searchKey);
session.setAttribute("searchValue", searchValue);
return mapping.findForward("deleted_ok");
}
6-3 struts-config_boardTest.xml 추가
<action-mappings>
<action path="/boardTest" type="com.boardTest.BoardAction" name="boardTestForm" scope="request" parameter="method">
<forward name="created" path="/boardTest/created.jsp"/>
<forward name="created_ok" redirect="true" path="/boardTest.do?method=list"/>
<forward name="list" path="/boardTest/list.jsp"/>
<forward name="article" path="/boardTest/article.jsp"/>
<forward name="deleted_ok" redirect="true" path="/boardTest.do?method=list"/>
</action>
</action-mappings>
'STUDY > STRUTS' 카테고리의 다른 글
struts2를 이용한 간단한 데이터 전송 (0) | 2019.03.22 |
---|---|
Struct1 + iBatis 게시판(3) (0) | 2019.03.20 |
Struct1 + iBatis 게시판(2) (0) | 2019.03.20 |
Struct1 + iBatis 게시판(1) (0) | 2019.03.20 |
Struct 프로젝트 예제 (0) | 2019.03.18 |
댓글