IT_Note



bbs.BoardController.java


Model을 메소드 인자로 사용하여 모델설정 역할. req.setAttribute("이름",값)

package com.sp.bbs;


@Controller("bbs.boardController")

public class BoardController {

@Autowired

private BoardService service;

@Autowired

private MyUtil myUtil;

//@RequestMapping 어노테이션을 사용할 경우, MultiActionController와 같이 한 개의 컨트롤러에서 다수의 요청을 처리.

//@RequestMapping의 value형태의 url이 들어오면 해당 method를 호출한다.

@RequestMapping(value="/bbs/created",method=RequestMethod.GET)

public String createdForm(Model model) throws Exception {

model.addAttribute("mode","created");

return "bbs/created";

}

@RequestMapping(value="/bbs/created", method=RequestMethod.POST)

public String createdSubmit(Board dto, HttpServletRequest req)throws Exception{

dto.setIpAddr(req.getRemoteAddr());

service.insertBoard(dto);

return "redirect:/bbs/list";

}

}



DB에 데이터를 저장하기 위한 bbsMapper.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="bbs">


<insert id="insertBoard" parameterType="com.sp.bbs.Board">

INSERT INTO bbs (num, name, pwd, subject, content, ipAddr) VALUES(

bbs_seq.NEXTVAL, #{name},#{pwd},#{subject},#{content},#{ipAddr})

</insert>


</mapper>



휴.......이제 서버 실행 후 게시글을 작성해서 db에 들어가는지 확인 해 보자.


아마 들어갈 것임 




- com/sp/bbs/Board.java ( DTO 클래스 )


public class Board {

private int listNum, num;

private String name,pwd,subject,content,ipAddr,created;

private int hitCount;

getter setter 작성.



- com/sp/bbs/BoardService.java -  인터페이스 작성

package com.sp.bbs;


import java.util.List;

import java.util.Map;


public interface BoardService {

public int insertBoard(Board dto);

    public List<Board> listBoard(Map<String, Object> map);

    public int dataCount(Map<String, Object> map);

    public Board readBoard(int num);

    public int updateHitCount(int num);

    public Board preReadBoard(Map<String,Object> map);

    public Board nextReadBoard(Map<String,Object> map);

    public int updateBoard(Board dto);

    public int deleteBoard(int num);

}


- com/sp/bbs/BoardServiceImpl.java - 인터페이스 구현. 클래스

어노테이션 빼먹지 않도록 주의한다.


@Autowired 타입에 의한 의존관계 자동설정


동일한 타입이 둘 이상인 경우

@Autowired 

@Qualifier("bbs.boardService")


import java.util.List;

import java.util.Map;


import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;


import com.sp.common.dao.CommonDAO;


@Service("bbs.boardService")

public class BoardServiceImpl implements BoardService {


 @Autowired

 private CommonDAO dao;


@Override

public int insertBoard(Board dto) {

int result=0;

try {

//최대값을 이용하여 게시물 번호를 작성하는 경우

//int maxNum = dao.getIntValue("bbs.numMax")

//dto.setNum(maxNum+1);

result=dao.insertData("bbs.insertBoard", dto);

} catch (Exception e) {

// TODO: handle exception

}

return result;

}

//기타 클래스 생략 //

}


//commondao의 insertdate를 사용.


- 사용자생성 - 오라클 DB

--1 사용자를 생성한다 이름은 board1으로.비번은 java$!

CREATE USER board1 IDENTIFIED BY "java$!";


--2 사용자에게 CONN 및 테이블스페이스를 사용할 권한 부여

GRANT CONNECT, RESOURCE TO board1;


--3 테이블스페이스 변경

ALTER USER board1 DEFAULT TABLESPACE USERS;


--4 

ALTER USER board1 TEMPORARY TABLESPACE TEMP;


- 테이블생성


게시판 테이블이름은 bbs로. 

ip주소와 비밀번호를 이용하는 비회원제 게시판이다.

여러가지 방법이 있겠지만 일단 가장 기초적으로 ㄱㄱ

CREATE TABLE bbs (

num NUMBER NOT NULL

,name VARCHAR2(30) NOT NULL 

,pwd VARCHAR2(50)

,subject VARCHAR2(255) NOT NULL  

,content VARCHAR2(4000) NOT NULL

,ipAddr VARCHAR2(50) NOT NULL

,hitCount NUMBER DEFAULT 0

,created DATE DEFAULT SYSDATE

,CONSTRAINT pk_bbs_num PRIMARY KEY(num)

);


- 시퀀스 생성


기본키 num값을 위한 시퀀스 설정

시퀀스이름은 bbs_seq로.

1씩증가하며 1부터 시작한다.

CREATE SEQUENCE bbs_seq

INCREMENT BY 1

START WITH 1

NOMAXVALUE NOCYCLE NOCACHE;

SELECT * FROM seq;


참고

NOMAXVALUE : 오름차순 최대 10의 27승 까지, 내림차순 -1 까지 생성됨.

NOCACHE : 시퀀스를 메모리에 할당하여 사용하지 않음.

NOCYCLE : 해당 시퀀스가 최대값에 도달해도 다시 생성하지 않는다.[DEFAULT]





myutil.java - 페이징 처리 , 바로가기페이지 구현 등.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
package com.sp.common;
 
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
import org.springframework.stereotype.Service;
 
@Service("myUtil")
public class MyUtil {
    //********************************************
    // 총페이지 수 구하기
    public int pageCount(int numPerPage, int dataCount) {
        int pageCount=0;
        
        if(dataCount > 0) {
            if(dataCount % numPerPage == 0)
                pageCount=dataCount/numPerPage;
            else
                pageCount=dataCount/numPerPage+1;
        }
        
        return pageCount;
    }
    
    //********************************************
    // 페이징(paging) 처리(GET 방식)
    public String paging(int current_page, int total_page, String list_url) {
        StringBuffer sb=new StringBuffer();
        
        int numPerBlock=10;
        int currentPageSetup;
        int n, page;
        
        if(current_page<1 || total_page < 1)
            return "";
        
        if(list_url.indexOf("?")!=-1)
            list_url+="&";
        else
            list_url+="?";
        
        // currentPageSetup : 표시할첫페이지-1
        currentPageSetup=(current_page/numPerBlock)*numPerBlock;
        if(current_page%numPerBlock==0)
            currentPageSetup=currentPageSetup-numPerBlock;
 
        sb.append("<style type='text/css'>");
        sb.append("#paginate {clear:both;font:12px 돋움,Dotum,굴림,Gulim,AppleGothic;padding:15px 0px 0px 0px;text-align:center;height:28px;white-space:nowrap;}");
        sb.append("#paginate a {border:1px solid #ccc;height:28px;color:#000000;text-decoration:none;padding:4px 7px 4px 7px;margin-left:3px;line-height:normal;vertical-align:middle;outline:none; select-dummy: expression(this.hideFocus=true);}");
        sb.append("#paginate a:hover, a:active {border:1px solid #ccc;color:#6771ff;vertical-align:middle; line-height:normal;}");
        sb.append("#paginate .curBox {border:1px solid #e28d8d; background: #fff; color:#cb3536; font-weight:bold;height:28px;padding:4px 7px 4px 7px;margin-left:3px;line-height:normal;vertical-align:middle;}");
        sb.append("#paginate .numBox {border:1px solid #ccc;height:28px;font-weight:bold;text-decoration:none;padding:4px 7px 4px 7px;margin-left:3px;line-height:normal;vertical-align:middle;}");
        sb.append("</style>");
        
        sb.append("<div id='paginate'>");
        // 처음페이지, 이전(10페이지 전)
        n=current_page-numPerBlock;
        if(total_page > numPerBlock && currentPageSetup > 0) {
            sb.append("<a href='"+list_url+"page=1'>처음</a>");
            sb.append("<a href='"+list_url+"page="+n+"'>이전</a>");
        }
        
        // 바로가기
        page=currentPageSetup+1;
        while(page<=total_page && page <=(currentPageSetup+numPerBlock)) {
            if(page==current_page) {
                sb.append("<span class='curBox'>"+page+"</span>");
            } else {
                sb.append("<a href='"+list_url+"page="+page+"' class='numBox'>"+page+"</a>");
            }
            page++;
        }
        
        // 다음(10페이지 후), 마지막페이지
        n=current_page+numPerBlock;
        if(n>total_page) n=total_page;
        if(total_page-currentPageSetup>numPerBlock) {
            sb.append("<a href='"+list_url+"page="+n+"'>다음</a>");
            sb.append("<a href='"+list_url+"page="+total_page+"'>끝</a>");
        }
        sb.append("</div>");
    
        return sb.toString();
    }
 
    //********************************************
    // javascript 페이지 처리(javascript listPage() 함수 호출)
    public String paging(int current_page, int total_page) {
        if(current_page < 1 || total_page < 1)
            return "";
 
        int numPerBlock = 10;   // 리스트에 나타낼 페이지 수
        int currentPageSetUp;
        int n;
        int page;
        StringBuffer sb=new StringBuffer();
        
        // 표시할 첫 페이지
        currentPageSetUp = (current_page / numPerBlock) * numPerBlock;
        if (current_page % numPerBlock == 0)
            currentPageSetUp = currentPageSetUp - numPerBlock;
 
        sb.append("<style type='text/css'>");
        sb.append("#paginate {clear:both;font:12px 돋움,Dotum,굴림,Gulim,AppleGothic;padding:15px 0px 0px 0px;text-align:center;height:28px;white-space:nowrap;}");
        sb.append("#paginate a {border:1px solid #ccc;height:28px;color:#000000;text-decoration:none;padding:4px 7px 4px 7px;margin-left:3px;line-height:normal;vertical-align:middle;outline:none; select-dummy: expression(this.hideFocus=true);}");
        sb.append("#paginate a:hover, a:active {border:1px solid #ccc;color:#6771ff;vertical-align:middle; line-height:normal;}");
        sb.append("#paginate .curBox {border:1px solid #e28d8d; background: #fff; color:#cb3536; font-weight:bold;height:28px;padding:4px 7px 4px 7px;margin-left:3px;line-height:normal;vertical-align:middle;}");
        sb.append("#paginate .numBox {border:1px solid #ccc;height:28px;font-weight:bold;text-decoration:none;padding:4px 7px 4px 7px;margin-left:3px;line-height:normal;vertical-align:middle;}");
        sb.append("</style>");
        
        sb.append("<div id='paginate'>");
        
        // 처음페이지, 이전(10페이지 전)
        n = current_page - numPerBlock;
        if ((total_page > numPerBlock) && (currentPageSetUp > 0)) {
            sb.append("<a onclick='listPage(1);'>처음</a>");
            sb.append("<a onclick='listPage("+n+");'>이전</a>");
        }
 
        // 바로가기 페이지 구현
        page = currentPageSetUp + 1;
        while((page <= total_page) && (page <= currentPageSetUp + numPerBlock)) {
           if(page == current_page) {
               sb.append("<span class='curBox'>"+page+"</span>");
           } else {
               sb.append("<a onclick='listPage("+page+");' class='numBox'>"+page+"</a>");
           }
           page++;
        }
 
        // 다음(10페이지 후), 마지막 페이지
        n = current_page + numPerBlock;
        if(n>total_page) n=total_page;
        if (total_page - currentPageSetUp > numPerBlock) {
            sb.append("<a onclick='listPage("+n+");'>다음</a>");
            sb.append("<a onclick='listPage("+total_page+");'>끝</a>");
        }
        sb.append("</div>");
 
        return sb.toString();
    }
 
    //********************************************
    // javascript 페이지 처리(javascript 지정 함수 호출, methodName:호출할 스크립트 함수명)
    public String pagingMethod(int current_page, int total_page, String methodName) {
        if(current_page < 1 || total_page < 1)
            return "";
 
        int numPerBlock = 10;   // 리스트에 나타낼 페이지 수
        int currentPageSetUp;
        int n;
        int page;
        StringBuffer sb=new StringBuffer();
        
        // 표시할 첫 페이지
        currentPageSetUp = (current_page / numPerBlock) * numPerBlock;
        if (current_page % numPerBlock == 0)
            currentPageSetUp = currentPageSetUp - numPerBlock;
 
        sb.append("<style type='text/css'>");
        sb.append("#paginate {clear:both;font:12px 돋움,Dotum,굴림,Gulim,AppleGothic;padding:15px 0px 0px 0px;text-align:center;height:28px;white-space:nowrap;}");
        sb.append("#paginate a {border:1px solid #ccc;height:28px;color:#000000;text-decoration:none;padding:4px 7px 4px 7px;margin-left:3px;line-height:normal;vertical-align:middle;outline:none; select-dummy: expression(this.hideFocus=true);}");
        sb.append("#paginate a:hover, a:active {border:1px solid #ccc;color:#6771ff;vertical-align:middle; line-height:normal;}");
        sb.append("#paginate .curBox {border:1px solid #e28d8d; background: #fff; color:#cb3536; font-weight:bold;height:28px;padding:4px 7px 4px 7px;margin-left:3px;line-height:normal;vertical-align:middle;}");
        sb.append("#paginate .numBox {border:1px solid #ccc;height:28px;font-weight:bold;text-decoration:none;padding:4px 7px 4px 7px;margin-left:3px;line-height:normal;vertical-align:middle;}");
        sb.append("</style>");
        
        sb.append("<div id='paginate'>");
        
        // 처음페이지, 이전(10페이지 전)
        n = current_page - numPerBlock;
        if ((total_page > numPerBlock) && (currentPageSetUp > 0)) {
            sb.append("<a onclick='"+methodName+"(1);'>처음</a>");
            sb.append("<a onclick='"+methodName+"("+n+");'>이전</a>");
        }
 
        // 바로가기 페이지 구현
        page = currentPageSetUp + 1;
        while((page <= total_page) && (page <= currentPageSetUp + numPerBlock)) {
           if(page == current_page) {
               sb.append("<span class='curBox'>"+page+"</span>");
           } else {
               sb.append("<a onclick='"+methodName+"("+page+");' class='numBox'>"+page+"</a>");
           }
           page++;
        }
 
        // 다음(10페이지 후), 마지막 페이지
        n = current_page + numPerBlock;
        if(n>total_page) n=total_page;
        if (total_page - currentPageSetUp > numPerBlock) {
            sb.append("<a onclick='"+methodName+"("+n+");'>다음</a>");
            sb.append("<a onclick='"+methodName+"("+total_page+");'>끝</a>");
        }
        sb.append("</div>");
 
        return sb.toString();
    }
 
    //********************************************
    // HTML 태그 제거
    public String removeHtmlTag(String str) {
        if(str==null||str.length()==0)
            return "";
 
        String regex="<(/)?([a-zA-Z]*)(\\s[a-zA-Z]*=[^>]*)?(\\s)*(/)?>";
        String result=str.replaceAll(regex, "");
        return result;
    }
 
    //********************************************
    // HTML 문서의 img 태그 src 속성값 추출 
    public List<String> getImgSrc(String html) {
        List<String> result = new ArrayList<String>();
        
        if(html==null||html.length()==0)
            return result;
 
        String regex="<img[^>]*src=[\"']?([^>\"']+)[\"']?[^>]*>";
        Pattern nonValidPattern = Pattern.compile(regex);
 
        Matcher matcher = nonValidPattern.matcher(html);
        while (matcher.find()) {
            result.add(matcher.group(1));
        }
        return result;
    }
    
    //********************************************
    // 특수문자를 HTML 문자로 변경
    public String escape(String str) {
        if(str==null||str.length()==0)
            return "";
        
        StringBuilder builder = new StringBuilder((int)(str.length() * 1.2f));
 
        for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);
            switch (c) {
            case '<':
                builder.append("&lt;");
                break;
            case '>':
                builder.append("&gt;");
                break;
            case '&':
                builder.append("&amp;");
                break;
            case '\"':
                builder.append("&quot;");
                break;
            default:
                builder.append(c);
            }
        }
        return builder.toString();
    }
 
    //********************************************
    // 특수문자를 HTML 문자로 변경 및 엔터를 <br>로 변경 
     public String htmlSymbols(String str) {
        if(str==null||str.length()==0)
            return "";
 
         str=str.replaceAll("&""&amp;");
         str=str.replaceAll("\"""&quot;");
         str=str.replaceAll(">""&gt;");
         str=str.replaceAll("<""&lt;");
         
         str=str.replaceAll(" ""&nbsp;");
         str=str.replaceAll("\n""<br>");
         
         return str;
     }
 
    //********************************************
     // 문자열의 내용중 원하는 문자열을 다른 문자열로 변환
     // String str = replaceAll(str, "\n", "<br>"); // 엔터를 <br>로 변환
     public String replaceAll(String str, String oldStr, String newStr) throws Exception {
         if(str == null)
             return "";
 
         Pattern p = Pattern.compile(oldStr);
         
         // 입력 문자열과 함께 매쳐 클래스 생성
         Matcher m = p.matcher(str);
 
         StringBuffer sb = new StringBuffer();
         // 패턴과 일치하는 문자열을 newStr 로 교체해가며 새로운 문자열을 만든다.
         while(m.find()) {
             m.appendReplacement(sb, newStr);
         }
 
         // 나머지 부분을 새로운 문자열 끝에 덫 붙인다.
         m.appendTail(sb);
 
         return sb.toString();
     }
 
    //********************************************
     // E-Mail 검사
     public boolean isValidEmail(String email) {
         if (email==nullreturn false;
         boolean b = Pattern.matches(
             "[\\w\\~\\-\\.]+@[\\w\\~\\-]+(\\.[\\w\\~\\-]+)+"
             email.trim());
         return b;
     }
 
    //********************************************
     // NULL 인 경우 ""로 
     public String checkNull(String str) {
         String strTmp;
         if (str == null)
             strTmp = "";
         else
             strTmp = str;
         return strTmp;
     }
}
 




공용으로 쓰일 dao클래스를 작성한다


CommonDAO.java  - 인터페이스

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package com.sp.common.dao;
 
import java.util.List;
import java.util.Map;
 
public interface CommonDAO {
    public int insertData(String id, Object value) throws Exception;
    
    public int updateData(String id, Object pData) throws Exception;
    public int updateData(String id, Map<String, Object> map) throws Exception;
    
    public int deleteData(String id, Map<String, Object> map) throws Exception;
    public int deleteData(String id, Object value) throws Exception;
    public int deleteAll(String id) throws Exception;
    
    public int getIntValue(String id, Map<String, Object> map) throws Exception;
    public int getIntValue(String id, Object value) throws Exception;
    public int getIntValue(String id) throws Exception;
    
    public <T> List<T> getListData(String id, Map<String, Object> map) throws Exception;
    public <T> List<T> getListData(String id, Object value) throws Exception;
    public <T> List<T> getListData(String id) throws Exception;
    
    public <T> T getReadData(String id) throws Exception;
    public <T> T getReadData(String id, Object value) throws Exception;
    public <T> T getReadData(String id, Map<String, Object> map) throws Exception;
    
    // INSERT, UPDATE, DELETE 프로시져(IN)
    public void callUpdateProcedure(String id, Object value) throws Exception;
    
    // SELECT(OUT)
    public <T> Map<String, T> callSelectOneProcedureMap(String id, Map<String, T> map) throws Exception;
    public <T> Map<String, T> callSelectListProcedureMap(String id, Map<String, T> map) throws Exception;
}
 

update delete 등 공용으로 자주 쓰이게 될 클래될 클래스


MybatisDaoImpl.java 


Colored By Color Scripter

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
package com.sp.common.dao;
 
import java.util.List;
import java.util.Map;
 
import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
 
@Repository("dao")
public class MyBatisDaoImpl implements CommonDAO {
    @Autowired
    private SqlSession sqlSession;
    
/*    
    public void setSqlSessionTemplate(SqlSession sqlSession) {
        this.sqlSession = sqlSession;
    }
*/
    
    // ******************************************************************
    // 데이터 추가
    public int insertData(String id, Object value) throws Exception {
        int result = 0;
 
        try {
            result = sqlSession.insert(id, value);
        } catch (Exception e) {
            System.out.println(e.toString());
            
            throw e;
        } finally {
        }
        return result;
    }
    
    // ******************************************************************
    // 데이터 수정
    public int updateData(String id, Object value) throws Exception {
        int result = 0;
        
        try {
               result = sqlSession.update(id, value);
        } catch (Exception e) {
            System.out.println(e.toString());
            
            throw e;
        }
        
        return result;
    }
    public int updateData(String id, Map<String, Object> map) throws Exception {
        int result = 0;
        
        try {
               result = sqlSession.update(id, map);
        } catch (Exception e) {
            System.out.println(e.toString());
            
            throw e;
        }
        
        return result;
    }
    
    // ******************************************************************
    // 데이터 삭제
    public int deleteData(String id, Map<String, Object> map) throws Exception {
        int result = 0;
 
        try {
            result = sqlSession.delete(id, map);
        } catch (Exception e) {
            System.out.println(e.toString());
            
            throw e;
        }
 
        return result;
    }
    public int deleteData(String id, Object value) throws Exception {
        int result = 0;
        
        try {
            result = sqlSession.delete(id, value);
        } catch (Exception e) {
            System.out.println(e.toString());
            
            throw e;
        }
 
        return result;
    }
    public int deleteAll(String id) throws Exception {
        int result = 0;
        
        try {
            result = sqlSession.delete(id);
        } catch (Exception e) {
            System.out.println(e.toString());
            
            throw e;
        }
 
        return result;
    }
 
    // ******************************************************************
    // 레 코드 수 / 최대 값 구하기
    public int getIntValue(String id, Map<String, Object> map) throws Exception {
        int num = 0;
 
        try {
            num = ((Integer)sqlSession.selectOne(id, map)).intValue();
        } catch (Exception e) {
            System.out.println(e.toString());
            
            throw e;
        }        
 
        return num;
    }
    public int getIntValue(String id, Object value) throws Exception {
        int num = 0;
        
        try {
            num = ((Integer)sqlSession.selectOne(id, value)).intValue();
        } catch (Exception e) {
            System.out.println(e.toString());
            
            throw e;
        }        
        
        return num;
    }
    public int getIntValue(String id) throws Exception {
        int num = 0;
        try {
            num = ((Integer)sqlSession.selectOne(id)).intValue();
        } catch (Exception e) {
            System.out.println(e.toString());
            
            throw e;
        }        
        return num;
    }
    
    // ******************************************************************
    // 테이블의 하나 이상의 레코드를 SELECT
    public <T> List<T> getListData(String id, Map<String, Object> map) throws Exception {
        List<T> list = null;
        try {
            list = sqlSession.selectList(id, map);
        } catch (Exception e) {
            System.out.println(e.toString());
            
            throw e;
        }        
        return list;
    }
    public <T> List<T> getListData(String id, Object value) throws Exception {
        List<T> list = null;
        try {
            list = sqlSession.selectList(id, value);
        } catch (Exception e) {
            System.out.println(e.toString());
            
            throw e;
        }        
        return list;
    
    }
    public <T> List<T> getListData(String id) throws Exception {
        List<T> list = null;
        try {
            list = sqlSession.selectList(id);
        } catch (Exception e) {
            System.out.println(e.toString());
            
            throw e;
        }        
        return list;
    }
    
    // ******************************************************************
    // 테이블의 하나의 레코드를 SELECT
    public <T> T getReadData(String id) throws Exception {
        try {
            return  sqlSession.selectOne(id);
        } catch (Exception e) {
            System.out.println(e.toString());
            
            throw e;
        }        
    }
    public <T> T getReadData(String id, Object value) throws Exception {
        try {
            return  sqlSession.selectOne(id, value);
        } catch (Exception e) {
            System.out.println(e.toString());
            
            throw e;
        }        
    }
    public <T> T getReadData(String id, Map<String, Object> map) throws Exception {
        try {
            return  sqlSession.selectOne(id, map);
        } catch (Exception e) {
            System.out.println(e.toString());
            
            throw e;
        }        
    }
    
    // ******************************************************************
    // 프로시져
    // INSERT, UPDATE, DELETE
    @Override
    public void callUpdateProcedure(String id, Object value) throws Exception{
        try {
            sqlSession.update(id, value);
        } catch (Exception e) {
            System.out.println(e.toString());
            
            throw e;
        }
    }
 
    // SELECT : OUT 파라미터가 SYS_REFCURSOR 이외의 하나의 레코드(INTEGER 등)
    @Override
    public <T> Map<String, T> callSelectOneProcedureMap(String id, Map<String, T> map) throws Exception{
        try {
            // select procedure 결과는 map로 리턴한다.
            sqlSession.selectOne(id, map);
            return map;
        } catch (Exception e) {
            System.out.println(e.toString());
        }
        
        return map;
    }
    
    // SELECT : OUT 파라미터가 SYS_REFCURSOR(하나 또는 하나 이상의 레코드)
    public <T> Map<String, T> callSelectListProcedureMap(String id, Map<String, T> map) throws Exception{
        try {
            // select procedure 결과는 map로 리턴한다.
            sqlSession.selectList(id, map);
            return map;
        } catch (Exception e) {
            System.out.println(e.toString());
        }
        
        return map;
    }
}
 



WEB-INF/mybatis/jdbc.properties   

jdbc오라클 환경 설정 파일. txt파일.

##jdbc.driverClass=oracle.jdbc.driver.OracleDriver
##jdbc.url=jdbc:oracle:thin:@127.0.0.1:1521:ORCL
jdbc.driverClass=net.sf.log4jdbc.DriverSpy
jdbc.url=jdbc:log4jdbc:oracle:thin:@127.0.0.1:1521:xe
jdbc.username=board1
jdbc.password=java$!


mybatis-config.xml    - mybatis환경설정 xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "HTTP://mybatis.org/dtd/mybatis-3-config.dtd">


<configuration>

<settings>

<setting name="cacheEnabled" value="false" />

<setting name="useGeneratedKeys" value="true" />

<setting name="defaultExecutorType" value="REUSE" />

</settings>

<!-- 별명 -->

    <typeAliases>

         <typeAlias alias="hashMap" type="java.util.HashMap" />

         <typeAlias alias="map" type="java.util.Map" />

    </typeAliases>

 

<!--

<mappers>

<mapper resource="mybatis/mapper/tempMapper.xml" />

</mappers>

-->


<mappers>

<mapper resource="mybatis/mapper/bbsMapper.xml" />

</mappers>

</configuration>




mybatis-context.xml  -  mybatis 객체 생성을 위한 xml

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:aop="http://www.springframework.org/schema/aop"

xmlns:tx="http://www.springframework.org/schema/tx"

xmlns:context="http://www.springframework.org/schema/context"

xmlns:p="http://www.springframework.org/schema/p"

xmlns:jdbc="http://www.springframework.org/schema/jdbc"

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd

http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd

http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd

http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">

<property name="locations">

<value>/WEB-INF/mybatis/jdbc.properties</value>

</property>

</bean>


    <!-- DBCP를 위한 DataSource 객체 -->

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">

<property name="driverClassName" value="${jdbc.driverClass}"/>

<property name="url" value="${jdbc.url}"/>

<property name="username" value="${jdbc.username}"/>

<property name="password" value="${jdbc.password}"/>

  <property name="maxActive" value="10" />

  <property name="maxIdle" value="3" />

  <property name="maxWait" value="10000" />

  <property name="defaultAutoCommit" value="true" />   <!--  기본:true  -->

</bean>

<!--  SqlSessionFactoryBean : SqlSessionTemplate 객체를 얻는다. -->

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" lazy-init="true">

<property name="dataSource" ref="dataSource" />

<property name="configLocation" value="/WEB-INF/mybatis/mybatis-config.xml"/>

         <property name="mapperLocations" value="/WEB-INF/mybatis/mapper/*.xml" />

<!-- 

<property name="mapperLocations" value="classpath:com/think/mapper/**/*.xml" />

-->

         <!-- 

         <property name="transactionFactory">

                <bean class="org.apache.ibatis.transaction.managed.ManagedTransactionFactory" />

          </property>

           -->

</bean>


<!-- SqlSessionTemplate : MyBatis SQL method 호출 및 관리, 예외처리 담당 -->

    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">

           <constructor-arg index="0" ref="sqlSessionFactory" />

    </bean>


    <!-- 트랜잭션관리자. -->

    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

        <property name="dataSource" ref="dataSource" />

    </bean>


<!-- 트랜잭션과 관련된 작업(트랜잭션시작, 커및, 롤백등) -->

    <bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">

         <property name="transactionManager" ref="transactionManager" />

    </bean>

     

</beans>



bbsMapper.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="bbs">


</mapper>




스프링 환경 설정파일


mvc-config.xml 설정


자세한설명은 추후.

<?xml version="1.0" encoding="UTF-8"?>


<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:mvc="http://www.springframework.org/schema/mvc"

xmlns:aop="http://www.springframework.org/schema/aop"

xmlns:context="http://www.springframework.org/schema/context"

xmlns:p="http://www.springframework.org/schema/p"

xmlns:util="http://www.springframework.org/schema/util"

xmlns:task="http://www.springframework.org/schema/task"

xsi:schemaLocation="

   http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd

   http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd

http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd

http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd

http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd

        http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd">


    <mvc:annotation-driven />


    <!-- / 매핑에서 정적 리소스(html, css, js등)를 처리할수있도록 설정  -->

<mvc:default-servlet-handler/>


<context:component-scan base-package="com.sp" />


<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">

<property name="order" value="1" />

<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />

<property name="prefix" value="/WEB-INF/view/" />

<property name="suffix" value=".jsp" />

</bean>

<!-- 

<mvc:view-resolvers>

<mvc:jsp prefix="/WEB-INF/view/" />

</mvc:view-resolvers>

 -->


</beans>






application-config.xml 

 스프링에서 공통적으로 사용되는 객체를 생성하기 위한 xml


<?xml version="1.0" encoding="UTF-8"?>


<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:context="http://www.springframework.org/schema/context"

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd

http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    

    <!-- 마이바티스 설정 파일 import ★-->

    <import resource="/../../mybatis/mybatis-context.xml"/>


</beans>



web.xml


<?xml version="1.0" encoding="ISO-8859-1"?>

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

         xmlns="http://java.sun.com/xml/ns/javaee"

         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee

http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"

         id="WebApp_ID" version="2.5">


    <display-name>board1</display-name>

    

   <!--

- Location of the XML file that defines the root application context.

- Applied by ContextLoaderListener.

-->

<!-- 공통으로 사용될 빈 환경설정 파일 -->

    <context-param>

        <param-name>contextConfigLocation</param-name>

        <param-value>classpath:spring/application-config.xml</param-value>

    </context-param>


<!-- ContextLoaderListener : 서로다른 DispatcherServlet이 공통으로 사용될 빈 설정 -->

    <listener>

        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

    </listener>

    

    

    <!--

- Servlet that dispatches request to registered handlers (Controller implementations).

DispatcherSErvlet등록 및 스프링 컨트롤러의 환결설정 파일

-->

    <servlet>

        <servlet-name>dispatcherServlet</servlet-name>

        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

        <init-param>

            <param-name>contextConfigLocation</param-name>

            <param-value>/WEB-INF/mvc-config.xml</param-value>

        </init-param>

        <load-on-startup>1</load-on-startup>

    </servlet>


    <servlet-mapping>

        <servlet-name>dispatcherServlet</servlet-name>

        <url-pattern>/</url-pattern>

    </servlet-mapping>

    

    <!-- ★ 인코딩필터 -->


<filter>

<filter-name>encodingFilter</filter-name>

<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>

<init-param>

<param-name>encoding</param-name>

<param-value>UTF-8</param-value>

</init-param>

</filter>

<filter-mapping>

<filter-name>encodingFilter</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

</web-app>







pom.xml


pom.xml파일은 jstl, 스프링, 마이바티스, 오라클 등의 디펜던시를 설정한다.


대부분의 오픈 소스 라이브러리는 중앙 저장소에서 제공하지만 일부 라이브러리는 별도의 메이븐 원격 저장소를 통하여 제공한다. ( 오라클 등)


이처럼 중앙 저장소에서 제공하지 않는 라이브러리가 있으면 repository 엘리먼트에서 id, name, url값을 설정한다. id,name은임의의 값을 사용하며

url은 원격 저장소의 url을 설정한다.


http://mvnrepository.com

https://maven-repository.com

위 사이트에서 등록할 라이브러리를 입력 후 검색 해서 해당 라이브러리으 디펜던시를 pom.xml에 추가한다.


그렇게 작성된 pom.xml 이다 (2017.04.11)

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

  <modelVersion>4.0.0</modelVersion>

  <groupId>org.springframework.samples</groupId>

  <artifactId>sp</artifactId>

  <version>0.0.1-SNAPSHOT</version>

  <packaging>war</packaging>

  

    <properties>

<!-- Generic properties -->

<java.version>1.8</java.version>

<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

<!-- Web -->

<jsp.version>2.2</jsp.version>

<jstl.version>1.2</jstl.version>

<servlet.version>3.1.0</servlet.version>


<!-- Spring -->

<spring-framework.version>4.3.6.RELEASE</spring-framework.version>

<org.aspectj-version>1.6.10</org.aspectj-version>

<!-- Logging -->

<logback.version>1.0.13</logback.version>

<slf4j.version>1.7.23</slf4j.version>


<!-- Test -->

<junit.version>4.12</junit.version>


<!-- mybatis -->

<mybatis.version>3.4.2</mybatis.version>

<mybatis-spring.version>1.3.1</mybatis-spring.version>


<!-- commons -->

<commons-dbcp.version>1.4</commons-dbcp.version>

<commons-pool.version>1.6</commons-pool.version>

<commons-fileupload.version>1.3.1</commons-fileupload.version>

<commons-io.version>2.4</commons-io.version>


<!-- tiles -->

<tiles.version>3.0.7</tiles.version>


<!-- spring-security -->

<spring-security.version>4.2.1.RELEASE</spring-security.version>


</properties>

    <repositories>

    <!-- DBMS를 위한 레포지토리(ojdbc6.jar : 11g) -->

        <repository>

            <id>datanucleus.org</id>

            <url>http://www.datanucleus.org/downloads/maven2/</url>

        </repository>

        

        <!-- jai_codec/jai_code 레포지토리 -->

        <repository>

       <id>geotools</id>

       <url>http://download.osgeo.org/webdav/geotools/</url>

       </repository>

    </repositories>

<dependencies>

<!-- Spring MVC -->

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-webmvc</artifactId>

<version>${spring-framework.version}</version>

</dependency>

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-context</artifactId>

<version>${spring-framework.version}</version>

<exclusions>

<!-- Exclude Commons Logging in favor of SLF4j -->

<exclusion>

<groupId>commons-logging</groupId>

<artifactId>commons-logging</artifactId>

 </exclusion>

</exclusions>

</dependency>


<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-websocket</artifactId>

<version>${spring-framework.version}</version>

</dependency>


<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-messaging</artifactId>

<version>${spring-framework.version}</version>

</dependency>

<!-- AspectJ -->

<dependency>

<groupId>org.aspectj</groupId>

<artifactId>aspectjrt</artifactId>

<version>${org.aspectj-version}</version>

</dependency>


         <!-- AspectJ Weaver -->

<dependency>

<groupId>org.aspectj</groupId>

<artifactId>aspectjweaver</artifactId>

<version>1.6.8</version>

</dependency>


<!-- @Inject -->

<dependency>

<groupId>javax.inject</groupId>

<artifactId>javax.inject</artifactId>

<version>1</version>

</dependency>

<!-- Other Web dependencies -->

<dependency>

<groupId>javax.servlet</groupId>

<artifactId>jstl</artifactId>

<version>${jstl.version}</version>

</dependency>

<dependency>

<groupId>javax.servlet</groupId>

<artifactId>javax.servlet-api</artifactId>

<version>${servlet.version}</version>

<scope>provided</scope>

</dependency>

<dependency>

<groupId>javax.servlet.jsp</groupId>

<artifactId>jsp-api</artifactId>

<version>${jsp.version}</version>

<scope>provided</scope>

</dependency>

<!-- Spring and Transactions -->

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-tx</artifactId>

<version>${spring-framework.version}</version>

</dependency>


<!-- Logging with SLF4J & LogBack -->

<dependency>

<groupId>org.slf4j</groupId>

<artifactId>slf4j-api</artifactId>

<version>${slf4j.version}</version>

<scope>compile</scope>

</dependency>

<dependency>

<groupId>org.slf4j</groupId>

<artifactId>jcl-over-slf4j</artifactId>

<version>${slf4j.version}</version>

<scope>runtime</scope>

</dependency>

<dependency>

<groupId>org.slf4j</groupId>

<artifactId>slf4j-log4j12</artifactId>

<version>${slf4j.version}</version>

<scope>runtime</scope>

</dependency>

<dependency>

<groupId>log4j</groupId>

<artifactId>log4j</artifactId>

<version>1.2.17</version>

<exclusions>

<exclusion>

<groupId>javax.mail</groupId>

<artifactId>mail</artifactId>

</exclusion>

<exclusion>

<groupId>javax.jms</groupId>

<artifactId>jms</artifactId>

</exclusion>

<exclusion>

<groupId>com.sun.jdmk</groupId>

<artifactId>jmxtools</artifactId>

</exclusion>

<exclusion>

<groupId>com.sun.jmx</groupId>

<artifactId>jmxri</artifactId>

</exclusion>

</exclusions>

<scope>runtime</scope>

</dependency>

<dependency>

<groupId>ch.qos.logback</groupId>

<artifactId>logback-classic</artifactId>

<version>${logback.version}</version>

<scope>runtime</scope>

</dependency>


        <!-- spring-jdbc  -->

        <dependency>

            <groupId>org.springframework</groupId>

            <artifactId>spring-jdbc</artifactId>

            <version>${spring-framework.version}</version>

        </dependency>


        <!-- spring-websocket  -->

        <dependency>

            <groupId>org.springframework</groupId>

            <artifactId>spring-websocket</artifactId>

            <version>${spring-framework.version}</version>

        </dependency>


        <!-- javax.websocket  -->

        <dependency>

            <groupId>javax.websocket</groupId>

            <artifactId>javax.websocket-api</artifactId>

            <version>1.1</version>

        </dependency>


        <!-- oracle ojdbc6.jar  -->

        <dependency>

            <groupId>oracle</groupId>

            <artifactId>ojdbc6</artifactId>

            <version>11.2.0.3</version>

        </dependency>


       <!-- DBCP/POLL  -->

       <dependency>

            <groupId>commons-dbcp</groupId>

            <artifactId>commons-dbcp</artifactId>

            <version>${commons-dbcp.version}</version>

       </dependency>

       <dependency>

            <groupId>commons-pool</groupId>

            <artifactId>commons-pool</artifactId>

            <version>${commons-pool.version}</version>

       </dependency>


        <!-- Mybatis  -->

         <dependency>

            <groupId>org.mybatis</groupId>

            <artifactId>mybatis</artifactId>

            <version>${mybatis.version}</version>

        </dependency>

        

        <!-- MyBatis spring  -->

         <dependency>

            <groupId>org.mybatis</groupId>

            <artifactId>mybatis-spring</artifactId>

            <version>${mybatis-spring.version}</version>

        </dependency>


    <!-- 마이바티스 쿼리 출력용 -->

        <dependency>

           <groupId>com.googlecode.log4jdbc</groupId>

           <artifactId>log4jdbc</artifactId>

           <version>1.2</version>

        </dependency>     


<!-- Tiles  -->

        <dependency>

            <groupId>org.apache.tiles</groupId>

            <artifactId>tiles-extras</artifactId>

            <version>${tiles.version}</version>

         </dependency>


<!-- 기타 commons  -->

        <dependency>

    <groupId>commons-fileupload</groupId>

    <artifactId>commons-fileupload</artifactId>

    <version>${commons-fileupload.version}</version>

    </dependency>

    <dependency>

    <groupId>commons-io</groupId>

    <artifactId>commons-io</artifactId>

    <version>${commons-io.version}</version>

    </dependency>


        <!-- spring security -->

        <dependency>

            <groupId>org.springframework.security</groupId>

            <artifactId>spring-security-core</artifactId>

            <version>${spring-security.version}</version>

        </dependency>

        <dependency>

            <groupId>org.springframework.security</groupId>

            <artifactId>spring-security-web</artifactId>

            <version>${spring-security.version}</version>

        </dependency>

        <dependency>

            <groupId>org.springframework.security</groupId>

            <artifactId>spring-security-config</artifactId>

            <version>${spring-security.version}</version>

        </dependency>


<!-- jackson -->

        <dependency>

            <groupId>com.fasterxml.jackson.core</groupId>

            <artifactId>jackson-core</artifactId>

            <version>2.7.4</version>

        </dependency>

        <dependency>

            <groupId>com.fasterxml.jackson.core</groupId>

            <artifactId>jackson-databind</artifactId>

            <version>2.7.4</version>

        </dependency>

        <dependency>

            <groupId>com.fasterxml.jackson.core</groupId>

            <artifactId>jackson-annotations</artifactId>

            <version>2.7.4</version>

        </dependency>


<!-- JSON -->

<dependency>

            <groupId>net.sf.json-lib</groupId>

            <artifactId>json-lib</artifactId>

            <version>2.4</version>

            <classifier>jdk15</classifier>

        </dependency>

        

        <!-- JAI(Java Advanced Imaging) : 이미지편집기능 -->

<dependency>

  <groupId>javax.media</groupId>

  <artifactId>jai_codec</artifactId>

  <version>1.1.3</version>

</dependency>


<dependency>

   <groupId>javax.media</groupId>

   <artifactId>jai_core</artifactId>

   <version>1.1.3</version>

</dependency>


<!-- Test Artifacts -->

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-test</artifactId>

<version>${spring-framework.version}</version>

<scope>test</scope>

</dependency>

<dependency>

<groupId>junit</groupId>

<artifactId>junit</artifactId>

<version>${junit.version}</version>

<scope>test</scope>

</dependency>


</dependencies>

</project>




미리 URL과 파라미터를 설정해 주자.

만들기 전 철저한 구성을 해두어야 차후 실수할 일이 적다.


게시글 리스트

URL : cp/bbs/list.do

JSP : [/WEB-INF/views]/bbs/list.jsp


글 쓰기 폼

URL : cp/bbs/created.do

JSP : [/WEB-INF/views]/bbs/created.jsp


글 저장 -> 게시글 리스트로 리다이렉트

URL : cp/bbs/created.do


글 보기

URL : cp/bbs/article.do

JSP : [/WEB-INF/views]/bbs/article.jsp


글 수정 폼

URL : cp/bbs/update.do

JSP : [/WEB-INF/views]/bbs/created.jsp


글 수정 완료 -> 게시글 리스트로 리다이렉트

URL : cp/bbs/update.do


글삭제 -> 게시글 리스트로 리다이렉트

URL : cp/bbs/delete.do


-------------------------------------

파라미터


1. 게시글리스트 


페이징처리와 검색등등 복잡하다,, 리스트가 가장 까다로움.


게시물 리스트 -> 글쓰기버튼클릭 -> 글쓰기 폼

게시물 리스트 -> 글제목 클릭  글번호,페이지번호[,검색키,검색값]  -> 글보기 

게시물 리스트 -> 페이지번호 클릭 - 페이지번호[,검색키,검색값] -> 게시글리스트

게시물 리스트 -> 검색버튼 검색키,검색값 -> 게시글리스트


- 넘겨받은 파라미터 

[페이지번호] [검색키,검색값] 

- 프로그램작성 

파라미터로 넘어온 페이지번호 받기. 넘어온 페이지가 없으면 1페이지.
파라미터로 넘어온 검색키,검색값 받기 검색키와 검색값이 존재하면서 get방식으로 넘어온 경우 디코딩.
전체 데이터개수, 전체 페이지수 구하기
전체 페이지보다 표시할 페이지가 큰 경우 표시페이지를 전체 페이지로 변경
테이블에서 가져올 시작과 끝 위치 구하기
테이블에서 게시물 리스트 가져오기
검색 값이 존재하는 경우 검색 값을 인코딩 [get 방식 전송에서 사용하기 위해] 
페이징처리
포워딩할 jsp에 넘길 값 설정 [request.setAttribute["이름",값];]
게시물리스트, 페이징, 현페이지, 전체개수[,검색키,검색값]등
리스트jsp로 포워딩

------------------------------------

2. 글 쓰기 폼


글 쓰기 폼 -> 등록하기 폼-제목,글쓴이,내용,패스워드  -> 글 저장

글 쓰기 폼 -> 취소버튼 -> 게시글 리스트



- 프로그램작성 

포워딩 할 페이지에 넘길 작업 구분값을 설정
 request.setAttribute["mode","created"]

글쓰기 jsp로 포워딩

-----------------------------------

3. 글 저장 

- 넘겨 받은 파라미터
 제목, 이름, 내용, 패스워드

- 프로그램작성

파라미터로 넘어온 제목,이름,내용,패스워드 넘겨받기
[ 파라미터로 넘어온 값을 받는 방법은 프레임워크에 따라 다르다]

ipAddr - ip주소 request.getRemoteAddr()

데이터를 테이블에 저장하기

게시물 리스트 페이지로 리다이렉트

--------------------------------

4. 글보기



글 보기 -> 리스트버튼 페이지번호 [,검색키,검색값]  -> 게시글 리스트

글 보기 -> 이전글,다음글 클릭 글번호[이전 또는 다음글],페이지번호[,검색키,검색값]  -> 글 보기

글 보기 -> 수정버튼 글번호,페이지번호 ->글 수정 폼

글 보기 -> 글 삭제 버튼 글번호, 페이지번호 -> 글 삭제



- 넘겨 받은 파라미터

글번호, 페이지번호, [검색키,검색값] 

- 프로그램 작성

파라미터로 넘어온 글번호 페이지번호 받기
파라미터로 넘어온 검색키,검색값 받기 검색키와 검색값이 존재하면서 get방식으로 넘어온 경우 디코딩
테이블에 해당 게시물의 조회수를 증가한다 [ 테이블의 자료를 update ]
해당 게시물을 테이블에서 가져 온다.
해당 게시물이 없으면 리스트로 리다이렉트 한다 [파라미터 : page ]
글 내용[content]의 엔터를 <br>로 변경한다
해당 게시물의 이전글과 다음글을 테이블에서 가져온다.[ 글번호,제목 등]
검색값이 있으면 검색값을 인코딩 한다.
포워딩 할 jsp에 넘길 값 설정 해당 게시물,이전글,다음글,페이지번호 [,검색키,검색값] 등
글 보기 jsp로 포워딩 


---------------------------------------

5. 글 수정 폼



글 수정 폼 -> 수정하기버튼  폼 - 제목,글쓴이,내용,패스워드,글번호,페이지번호 -> 글 수정 완료

글 수정 폼 -> 취소버튼 페이지번호 -> 게시글 리스트


-넘겨받은 파라미터

 글번호, 페이지번호


-프로그램 작성

파라미터로 넘어온 글번호,페이지번호 넘겨받기

해당게시물을 테이블에서 가져온다

해당 게시물이 없으면 리스트로 리다이렉트 한다. [파라미터 : page ]

포워딩할 jsp로 넘길 값 설정 해당 게시물, 페이지번호, 작업구분 [mode : update]

글 수정 JSP로 포워딩

-----------------------------------------------

6. 글 수정 완료

- 넘겨 받은 파리미터

 제목,이름,내용,패스워드,글번호,페이지번호


- 프로그램 작성

파라미터로 넘어온 제목, 이름, 내용,패스워드, 글번호, 페이지번호 넘겨 받기

테이블의 해당 게시물을 수정한다.

글 리스트로 리다이렉트 한다. [파라미터 : page]


----------------------------------------------------


7. 글 삭제

- 넘겨 받은 파라미터 

 글번호, 페이지번호


- 프로그램 작성

파라미터로 넘어온 글번호, 페이지번호 넘겨 받기

테이블의 해당 게시물을 삭제한다.

글 리스트로 리다이렉트 한다. [ 파라미터 : page]