- Sample_SQL.xml 파일 코드(이전에 정상 작동함)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "<http://mybatis.org/dtd/mybatis-3-mapper.dtd>">
<mapper namespace="sample">
<select id="selectBoardList" parameterType="hashmap" resultType="hashmap">
<include refid="common.pagingPre"/>
<![CDATA[
SELECT
ROW_NUMBER() OVER (ORDER BY IDX DESC) RNUM,
IDX,
TITLE,
HIT_CNT,
CREA_DTM
FROM
TB_BOARD
WHERE
DEL_GB = 'N'
]]>
<include refid="common.pagingPost"/>
</select>
<insert id="insertBoard" parameterType="hashmap" useGeneratedKeys="true" keyProperty="IDX">
<selectKey keyProperty="IDX" resultType="string" order="BEFORE">
SELECT SEQ_TB_BOARD_IDX.NEXTVAL FROM DUAL
</selectKey>
<![CDATA[
INSERT INTO TB_BOARD
(
IDX,
TITLE,
CONTENTS,
HIT_CNT,
DEL_GB,
CREA_DTM,
CREA_ID
)
VALUES
(
#{IDX},
#{TITLE,jdbcType=VARCHAR},
#{CONTENTS,jdbcType=VARCHAR},
0,
'N',
SYSDATE,
'Admin'
)
]]>
</insert>
<!-- <update id="updateHitCnt" parameterType="hashmap">
<![CDATA[
UPDATE TB_BOARD
SET
HIT_CNT = NVL(HIT_CNT,0)+1
WHERE
IDX=#{IDX]
]]>
</update> --><!-- HIT_CNT 가 null일경우, 두번째 반환 -->
<update id="updateHitCnt" parameterType="hashmap">
<![CDATA[
UPDATE TB_BOARD
SET HIT_CNT = HIT_CNT + 1
WHERE IDX=#{IDX}
]]>
</update>
<select id="selectBoardDetail" parameterType="hashmap" resultType="hashmap">
<![CDATA[
SELECT
IDX,
HIT_CNT,
CREA_ID,
CREA_DTM,
TITLE,
CONTENTS
FROM
TB_BOARD
WHERE
IDX=#{IDX}
]]>
</select>
<select id="boardUpdate" parameterType="hashmap" resultType="hashmap">
<!-- <![CDATA[
UPDATE TB_BOARD
SET
TITLE = #{TITLE},
CONTENTS = #{CONTENTS}
WHERE
IDX = #{IDX}
]]> -->
<![CDATA[
SELECT
IDX,
HIT_CNT,
CREA_ID,
CREA_DTM,
TITLE,
CONTENTS
FROM
TB_BOARD
WHERE IDX=#{IDX}
]]>
</select>
<update id="updateBoard" parameterType="hashmap">
<![CDATA[
UPDATE TB_BOARD
SET TITLE=#{TITLE},
CONTENTS=#{CONTENTS}
WHERE
IDX=#{IDX}
]]>
</update>
<delete id="deleteBoard" parameterType="hashmap">
<!-- <![CDATA[
DELETE FROM
TB_BOARD
WHERE IDX=#{IDX}
]]> -->
<![CDATA[
UPDATE TB_BOARD
SET DEL_GB = 'Y'
WHERE IDX=#{IDX}
]]>
</delete>
<insert id="insertFile" parameterType="hashmap">
<![CDATA[
INSERT INTO TB_FILE
(
IDX,
BOARD_IDX,
ORIGINAL_FILE_NAME,
STORED_FILE_NAME,
FILE_SIZE,
CREA_ID
)
VALUES
(
SEQ_TB_FILE_IDX.NEXTVAL,
#{BOARD_IDX},
#{ORIGINAL_FILE_NAME},
#{STORED_FILE_NAME},
#{FILE_SIZE},
'Admin'
)
]]>
</insert>
<select id="selectFileList" parameterType="hashmap" resultType="hashmap">
<![CDATA[
SELECT
IDX,
ORIGINAL_FILE_NAME,
ROUND(FILE_SIZE/1024,1) AS FILE_SIZE
FROM
TB_FILE
WHERE
BOARD_IDX=#{IDX}
AND DEL_GB='N'
]]>
</select>
<update id="deleteFileList" parameterType="hashmap">
<![CDATA[
UPDATE TB_FILE SET
DEL_GB='Y'
WHERE
BOARD_IDX=#{IDX}
]]>
</update>
<update id="updateFile" parameterType="hashmap">
<![CDATA[
UPDATE TB_FILE SET
DEL_GB='N'
WHERE
IDX=#{FILE_IDX}
]]>
</update>
<!-- <![CDATA...요건 혹시모를 쿼리문에 <,> 등의 기호가 들어갈때를 대비하여 씀 -->
</mapper>
- 정상 작동하는 cotroller 코드(SampleController.java)
package first.sample.controller;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import com.fasterxml.jackson.annotation.JsonCreator.Mode;
import egovframework.rte.ptl.mvc.tags.ui.pagination.PaginationInfo;
import first.common.common.CommandMap;
import first.sample.service.SampleService;
@Controller
public class SampleController
{
Logger log = Logger.getLogger(this.getClass()); //로그 찍고
@Resource(name="sampleService")
private SampleService sampleService; //샘플서비스 선언하고
@RequestMapping(value="/sample/openBoardSearch.do")
public ModelAndView openBoardSearch(CommandMap commandMap) throws Exception
{
ModelAndView mv = new ModelAndView("/sample/boardSearch");
return mv;
}
@RequestMapping(value="/sample/openBoardList.do") //경로 맵핑해주고~
public ModelAndView openBoardList(CommandMap commandMap, HttpSession session) throws Exception
{ //모델뷰 만들고 openSampleBoardList 메서드 만들고
String userId = String.valueOf(session.getAttribute("userId"));
log.debug(userId);
ModelAndView mv = null;
if(userId != null && userId.isEmpty()) {
mv = new ModelAndView("redirect:/member/login.do"); //모델뷰 객체 선언뒤 jsp파일 지정
}else {
mv = new ModelAndView("/sample/boardList"); //모델뷰 객체 선언뒤 jsp파일 지정
Map<String, Object> resultMap = sampleService.selectBoardList(commandMap.getMap());
//List<Map<String, Object>> list = sampleService.selectBoardList(commandMap);
//앞에서 샘플서비스 선언한것 뒤에 selectBoardList라는 메서드 만들고
//mv.addObject("list", list); //앞에서 실행 다하고 list에 담긴건 list라고 선언하고
mv.addObject("paginationInfo", (PaginationInfo)resultMap.get("paginationInfo"));
mv.addObject("list", resultMap.get("result"));
System.out.println("========JRebel Test============");
log.debug("======JRebel Test2======");
}
return mv;
}
@RequestMapping(value="/sample/testMapArgumentResolver.do")
public ModelAndView testMapArgumentResolver(CommandMap commandMap, HttpSession session) throws Exception
{
ModelAndView mv = new ModelAndView("");
if(commandMap.isEmpty() == false)
{
Iterator<Entry<String,Object>> iterator = commandMap.getMap().entrySet().iterator();
Entry<String,Object> entry = null;
while(iterator.hasNext())
{
entry = iterator.next();
log.debug("key :"+entry.getKey()+", value :"+entry.getValue());
}
}
return mv;
}
@RequestMapping(value="/sample/openBoardWrite.do")
public ModelAndView openBoardWrite(CommandMap commandMap, HttpSession session) throws Exception
{
ModelAndView mv = new ModelAndView("/sample/boardWrite"); //JSP 파일 지정
System.out.println("========JRebel Test============");
return mv;
}
@RequestMapping(value="/sample/Test.do")
public ModelAndView Test(CommandMap commandMap) throws Exception
{
ModelAndView mv = new ModelAndView("/sample/Test"); //JSP 파일 지정
System.out.println("========Test Test============");
return mv;
}
@RequestMapping(value="/sample/kk.do")
public ModelAndView kk(CommandMap commandMap) throws Exception
{
ModelAndView mv = new ModelAndView("/sample/kk"); //JSP 파일 지정
System.out.println("========kk Test============");
return mv;
}
@RequestMapping(value="/sample/insertBoard.do")
public ModelAndView insertBoard(CommandMap commandMap, HttpServletRequest request, HttpSession session) throws Exception
{
ModelAndView mv = new ModelAndView("redirect:/sample/openBoardList.do");
sampleService.insertBoard(commandMap.getMap(), request);
return mv;
}
@RequestMapping(value="/sample/openBoardDetail.do")
public ModelAndView openBoardDetail(CommandMap commandMap, HttpSession session) throws Exception
{
ModelAndView mv = new ModelAndView("/sample/boardDetail");
Map<String,Object> map = sampleService.selectBoardDetail(commandMap.getMap());
mv.addObject("map", map.get("map"));
mv.addObject("list", map.get("list")); //요건 첨부파일 목록 부를때 쓸거임
return mv;
}
@RequestMapping(value="/sample/openBoardUpdate.do") //수정디테일화면
public ModelAndView openBoardUpdate(CommandMap commandMap, HttpSession session) throws Exception
{
ModelAndView mv = new ModelAndView("/sample/boardUpdate");
Map<String, Object> map = sampleService.boardUpdate(commandMap.getMap());
mv.addObject("map", map.get("map")); //내용
mv.addObject("list", map.get("list")); //첨부파일
return mv;
}
@RequestMapping(value="/sample/updateBoard.do") //수정하기 누르는~~ 혹은 저장하기 누르는~~
public ModelAndView updateBoard(CommandMap commandMap, HttpServletRequest request, HttpSession session) throws Exception
{
ModelAndView mv = new ModelAndView("redirect:/sample/openBoardDetail.do");
sampleService.updateBoard(commandMap.getMap(), request);
mv.addObject("IDX", commandMap.get("IDX"));
return mv;
}
@RequestMapping(value="/sample/deleteBoard.do")
public ModelAndView deleteBoard(CommandMap commandMap, HttpSession session) throws Exception
{
ModelAndView mv = new ModelAndView("redirect:/sample/openBoardList.do");
sampleService.deleteBoard(commandMap.getMap());
return mv;
}
}
package first.sample.service;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
public interface SampleService {
Map<String, Object> selectBoardList(Map<String, Object> map) throws Exception;
void insertBoard(Map<String, Object> map, HttpServletRequest request) throws Exception;
Map<String, Object> selectBoardDetail(Map<String, Object> map) throws Exception;
Map<String, Object> boardUpdate(Map<String, Object> map) throws Exception;
void updateBoard(Map<String, Object> map, HttpServletRequest request) throws Exception;
void deleteBoard(Map<String, Object> map) throws Exception;
}
package first.sample.dao;
import java.util.List;
import java.util.Map;
import org.springframework.stereotype.Repository;
import first.common.dao.AbstractDAO;
@Repository("sampleDAO") //@Repository DAO선언시 주로 사용
public class SampleDAO extends AbstractDAO //오 요건 extends로 상속 받았으니 그대로 쓰면됨
{
@SuppressWarnings("unchecked") //에러 경고문 필요없음
public Map<String, Object> selectBoardList(Map<String, Object> map) throws Exception
{
//return (List<Map<String, Object>>) selectList("sample.selectBoardList", map);
//첫번째 인자값이 쿼리 이름 -> sample.selectBoardList
return (Map<String, Object>) selectPagingList("sample.selectBoardList", map);
}
public void insertBoard(Map<String, Object> map) throws Exception
{
insert("sample.insertBoard", map);
}
public void insertFile(Map<String, Object> map) throws Exception
{
insert("sample.insertFile", map);
}
/*public void updateHitCnt(Map<String, Object> map) throws Exception
{
update("sample.updateHitCnt", map);
}*/
@SuppressWarnings("unchecked")
public Map<String, Object> selectBoardDetail(Map<String, Object> map) throws Exception{
return (Map<String, Object>) selectOne("sample.selectBoardDetail", map);
}
@SuppressWarnings("unchecked")
public List<Map<String, Object>> selectFileList(Map<String, Object> map) throws Exception
{
return (List<Map<String, Object>>) selectList("sample.selectFileList", map);
}
@SuppressWarnings("unchecked")
public Map<String, Object> boardUpdate(Map<String, Object> map) throws Exception
{
return (Map<String, Object>) selectOne("sample.boardUpdate", map);
}
public void updateBoard(Map<String, Object> map) throws Exception
{
update("sample.updateBoard", map);
}
public void deleteBoard(Map<String, Object> map) throws Exception
{
delete("sample.deleteBoard", map);
}
public void updateHitCnt(Map<String, Object> map)
{
update("sample.updateHitCnt", map);
}
public void deleteFileList(Map<String, Object> map)
{
update("sample.deleteFileList", map);
}
public void updateFile(Map<String, Object> map)
{
update("sample.updateFile", map);
}
}
- SampleServiceImpl 이전 정상 작동 코드
package first.sample.service;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import first.common.util.FileUtils;
import first.sample.dao.SampleDAO;
@Service("sampleService")
public class SampleServiceImpl implements SampleService //인터페이스 상속시 implements
{ //SampleSeriveImpl 클래스 선언하는데 SampleSerive
Logger log = Logger.getLogger(this.getClass()); //로그 한번 찍어주고
@Resource(name="fileUtils")
private FileUtils fileUtils;
@Resource(name="sampleDAO")
private SampleDAO sampleDAO; //SampleDAO 선언해주고
@Override //implements로 상속 받았으니 @Override로 재 정의해줌(SampleService에서 정의한놈)
public Map<String, Object> selectBoardList(Map<String, Object> map) throws Exception {
return sampleDAO.selectBoardList(map);
}
@Override
public void insertBoard(Map<String, Object> map, HttpServletRequest request) throws Exception
{
sampleDAO.insertBoard(map);
List<Map<String, Object>> list = fileUtils.parseInsertFileInfo(map, request);
for(int i=0,size=list.size();i<size;i++)
{
sampleDAO.insertFile(list.get(i));
}
MultipartHttpServletRequest multipartHttpServletRequest = (MultipartHttpServletRequest)request;
Iterator<String> iterator = multipartHttpServletRequest.getFileNames();
MultipartFile multipartFile = null;
while(iterator.hasNext())
{
multipartFile = multipartHttpServletRequest.getFile(iterator.next());
if(multipartFile.isEmpty() == false)
{
log.debug("--------------file start------------");
log.debug("name :" + multipartFile.getName());
log.debug("filename :" + multipartFile.getOriginalFilename());
log.debug("size :" + multipartFile.getSize());
log.debug("--------------file end--------------\\n");
}
}
}
@Override
public Map<String, Object> selectBoardDetail(Map<String, Object> map) throws Exception
{
sampleDAO.updateHitCnt(map);
Map<String, Object> resultMap = new HashMap<String, Object>();
Map<String, Object> tempMap = sampleDAO.selectBoardDetail(map);
resultMap.put("map", tempMap);
List<Map<String, Object>> list = sampleDAO.selectFileList(map);
resultMap.put("list", list);
return resultMap;
}
@Override
public Map<String, Object> boardUpdate(Map<String, Object> map) throws Exception
{
Map<String, Object> resultMap = new HashMap<String, Object>();
Map<String, Object> tempMap = sampleDAO.boardUpdate(map);
resultMap.put("map", tempMap);
List<Map<String, Object>> list = sampleDAO.selectFileList(map);
resultMap.put("list", list);
return resultMap;
}
@Override
public void updateBoard(Map<String, Object> map, HttpServletRequest request) throws Exception
{
sampleDAO.updateBoard(map); //기존 글만 수정(업데이트)
sampleDAO.deleteFileList(map); // (DEL_GB = 'Y') 로 처리하는 부분
List<Map<String, Object>> list = fileUtils.parseInsertFileInfo(map, request);
Map<String, Object> tempMap = null;
for(int i=0,size=list.size();i<size;i++)
{
tempMap = list.get(i);
if(tempMap.get("IS_NEW").equals("Y"))
{
sampleDAO.insertFile(tempMap);
}else{
sampleDAO.updateFile(tempMap);
}
}
}
@Override
public void deleteBoard(Map<String, Object> map) throws Exception {
sampleDAO.deleteBoard(map);
}
}
- boardList.jsp 이전 정상 작동 코드
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!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>Insert title here</title>
<%@ taglib prefix="c" uri="<http://java.sun.com/jsp/jstl/core>" %>
<%@ taglib prefix="fn" uri="<http://java.sun.com/jsp/jstl/functions>" %>
<%@ include file ="/WEB-INF/include/include-header.jspf" %>
</head>
<body>
<h2>게시판 목록</h2>
<table class="board_list">
<colgroup>
<col width="10%"/>
<col width="*"/>
<col width="15%"/>
<col width="20%"/>
</colgroup>
<thead>
<tr>
<th scope="col">글번호</th>
<th scope="col">제목</th>
<th scope="col">조회수</th>
<th scope="col">작성일</th>
</tr>
</thead>
<tbody>
<c:choose>
<c:when test="${fn:length(list) > 0}"> <!-- boolean -->
<c:forEach items="${list }" var="row" varStatus="status">
<tr>
<td>${row.IDX }</td>
<td class="title">
<a href="#this" name="title">${row.TITLE }</a>
<input type="hidden" id="IDX" value="${row.IDX }">
</td>
<td>${row.HIT_CNT }</td>
<td>${row.CREA_DTM }</td>
</tr>
</c:forEach>
</c:when>
<c:otherwise>
<tr>
<td colspan="4">조회된 결과가 없습니다.</td>
</tr>
</c:otherwise>
</c:choose>
</tbody>
</table>
<c:if test="${not empty paginationInfo }">
<ui:pagination paginationInfo = "${paginationInfo }" type="text" jsFunction="fn_search"/>
</c:if>
<input type="hidden" id="currentPageNo" name="currentPageNo"/>
<br/>
<a href="#this" class="btn" id="write">글쓰기</a>
<%@ include file="/WEB-INF/include/include-body.jspf" %>
<script type="text/javascript">
$(document).ready(function(){
$("#write").on("click", function(e){ //글쓰기 버튼
e.preventDefault();
fn_openBoardWrite();
});
$("a[name='title']").on("click", function(e){ //제목
e.preventDefault();
fn_openBoardDetail($(this)); //$(this)의미 : jQuery <a 태그의미
});
$("#bb").
});
function fn_openBoardWrite(){
var comSubmit = new ComSubmit();
comSubmit.setUrl("<c:url value='/sample/openBoardWrite.do' />");
comSubmit.submit();
}
function fn_openBoardDetail(obj){
var comSubmit = new ComSubmit();
comSubmit.setUrl("<c:url value='/sample/openBoardDetail.do' />");
comSubmit.addParam("IDX", obj.parent().find("#IDX").val()); // key와 value값
comSubmit.submit();
}
function fn_search(pageNo)
{
var comSubmit = new ComSubmit();
comSubmit.setUrl("<c:url value='/sample/openBoardList.do'/>");
comSubmit.addParam("currentPageNo", pageNo);
comSubmit.submit();
}
</script>
</body>
</html>