Index: /nextboard/.classpath =================================================================== --- /nextboard/.classpath (revision 3) +++ /nextboard/.classpath (revision 3) @@ -0,0 +1,12 @@ + + + + + + + + + + + + Index: /nextboard/.project =================================================================== --- /nextboard/.project (revision 3) +++ /nextboard/.project (revision 3) @@ -0,0 +1,36 @@ + + + nextboard + + + + + + org.eclipse.wst.jsdt.core.javascriptValidator + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.wst.common.project.facet.core.builder + + + + + org.eclipse.wst.validation.validationbuilder + + + + + + org.eclipse.jem.workbench.JavaEMFNature + org.eclipse.wst.common.modulecore.ModuleCoreNature + org.eclipse.wst.common.project.facet.core.nature + org.eclipse.jdt.core.javanature + org.eclipse.wst.jsdt.core.jsNature + + Index: /nextboard/src/org/springframework/samples/kyuriboard/dao/MemoDao.java =================================================================== --- /nextboard/src/org/springframework/samples/kyuriboard/dao/MemoDao.java (revision 3) +++ /nextboard/src/org/springframework/samples/kyuriboard/dao/MemoDao.java (revision 3) @@ -0,0 +1,66 @@ +/** + * Memo 관련 인터페이스 + */ +package org.springframework.samples.kyuriboard.dao; + +import java.util.List; + +import org.springframework.samples.kyuriboard.domain.Memo; +import org.springframework.dao.DataAccessException; + +/** + * @author DAMI(archy712@naver.com) + * + */ +public interface MemoDao { + + + /** + * 주어진 메모ID로 메모를 반환한다. + * @param memoId 메모ID + * @return Memo 메모 객체 + * @throws DataAccessException + */ + Memo getMemoByMemoId(int memoId) throws DataAccessException; + + + /** + * 주어진 게시판ID로 메모 리스트를 반환한다. + * @param boardId 게시판ID + * @return java.util.List + * @throws DataAccessException + */ + List getMemoListByBoardId(int boardId) throws DataAccessException; + + + /** + * 메모를 입력한다. + * @param memo 메모 객체 + * @throws DataAccessException + */ + void insertMemo(Memo memo) throws DataAccessException; + + + /** + * 메모를 수정한다 + * @param memo 메모 객체 + * @throws DataAccessException + */ + void updateMemo(Memo memo) throws DataAccessException; + + + /** + * 메모를 삭제한다 + * @param memoId 삭제할 메모 ID + * @throws DataAccessException + */ + void deleteMemo(int memoId) throws DataAccessException; + + + /** + * 주어진 게시물ID에 해당하는 메모들을 삭제한다 + * @param boardId 삭제할 게시물 ID + * @throws DataAccessException + */ + void deleteMemoByBoardId(int boardId) throws DataAccessException; +} Index: /nextboard/src/org/springframework/samples/kyuriboard/dao/UserDao.java =================================================================== --- /nextboard/src/org/springframework/samples/kyuriboard/dao/UserDao.java (revision 3) +++ /nextboard/src/org/springframework/samples/kyuriboard/dao/UserDao.java (revision 3) @@ -0,0 +1,62 @@ +/** + * 사용자 관련 인터페이스 + */ +package org.springframework.samples.kyuriboard.dao; + +import java.util.List; + +import org.springframework.dao.DataAccessException; +import org.springframework.samples.kyuriboard.domain.User; + +/** + * @author DAMI(archy712@naver.com) + * + * User 도메인 클래스에 대한 처리 + */ +public interface UserDao { + + + /** + * 주어진 사용자ID로 사용자를 반환한다. + * @param userId 사용자ID + * @return User 사용자 + * @throws DataAccessException + */ + User getUserByUserId(String userId) throws DataAccessException; + + + /** + * 주어진 사용자ID와 비밀번호로 사용자를 반환한다. + * @param userId 사용자ID + * @param passwd 사용자 비밀번호 + * @return User 사용자 + * @throws DataAccessException + */ + User getUserByUserIdAndPasswd(String userId, String passwd) throws DataAccessException; + + + /** + * 주어진 사용자를 입력한다. + * @param user 사용자 + * @throws DataAccessException + */ + void insertUser(User user) throws DataAccessException; + + + /** + * 주어진 사용자를 수정한다. + * @param user 사용자 + * @throws DataAccessException + */ + void updateUser(User user) throws DataAccessException; + + + /** + * 사용자 리스트를 반환한다. + * @return java.util.List 사용자 리스트 + * @throws DataAccessException + */ + List getUserList() throws DataAccessException; + + +} Index: /nextboard/src/org/springframework/samples/kyuriboard/dao/BoardDao.java =================================================================== --- /nextboard/src/org/springframework/samples/kyuriboard/dao/BoardDao.java (revision 3) +++ /nextboard/src/org/springframework/samples/kyuriboard/dao/BoardDao.java (revision 3) @@ -0,0 +1,87 @@ +/** + * Board 객체 관련 Interface + */ +package org.springframework.samples.kyuriboard.dao; + +import java.util.List; + +import org.springframework.dao.DataAccessException; +import org.springframework.samples.kyuriboard.domain.Board; + +/** + * @author DAMI(archy712@naver.com) + * + */ +public interface BoardDao { + + + /** + * 주어진 게시물ID로 게시물 객체를 반환한다. + * @param boardId 게시물ID + * @return Board 게시물 객체 + * @throws DataAccessException + */ + Board getBoardByBoardId(int boardId) throws DataAccessException; + + + /** + * 게시물의 총 리스트를 반환한다. + * @return java.util.List 게시물 총 리스트 + * @throws DataAccessException + */ + List getBoardList() throws DataAccessException; + + + /** + * 주어진 사용자ID에 해당하는 게시물 리스트를 반환한다. + * @param userId 사용자ID + * @return java.util.List 게시물 리스트 + * @throws DataAccessException + */ + List getBoardListByUserId(String userId) throws DataAccessException; + + + /** + * 주어진 사용자명에 해당하는 게시물 리스트를 반환한다. + * @param userName 사용자명 + * @return java.util.List 게시물 리스트 + * @throws DataAccessException + */ + List getBoardListByUserName(String userName) throws DataAccessException; + + + /** + * 주어진 제목에 해당하는 게시물 리스트를 반환한다. + * @param title 게시물 제목 + * @return java.util.List 게시물 리스트 + * @throws DataAccessException + */ + List getBoardListByTitle(String title) throws DataAccessException; + + + /** + * 주어진 게시물을 입력한다. + * @param board 입력할 게시물 객체 + * @throws DataAccessException + */ + void insertBoard(Board board) throws DataAccessException; + + + /** + * 주어진 게시물을 수정한다. + * @param board 수정할 게시물 + * @throws DataAccessException + */ + void updateBoard(Board board) throws DataAccessException; + + + /** + * 주어진 게시물을 삭제한다 + * @param boardId 삭제할 게시물 ID + * @throws DataAccessException + */ + void deleteBoard(int boardId) throws DataAccessException; + + + +} Index: /nextboard/src/org/springframework/samples/kyuriboard/dao/ibatis/SqlMapMemoDao.java =================================================================== --- /nextboard/src/org/springframework/samples/kyuriboard/dao/ibatis/SqlMapMemoDao.java (revision 3) +++ /nextboard/src/org/springframework/samples/kyuriboard/dao/ibatis/SqlMapMemoDao.java (revision 3) @@ -0,0 +1,75 @@ +/** + * + */ +package org.springframework.samples.kyuriboard.dao.ibatis; + +import java.util.List; + +import org.springframework.dao.DataAccessException; +import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport; +import org.springframework.samples.kyuriboard.dao.MemoDao; +import org.springframework.samples.kyuriboard.domain.Memo; + +/** + * @author DAMI(archy712@naver.com) + * + */ +public class SqlMapMemoDao extends SqlMapClientDaoSupport implements MemoDao { + + private SqlMapSequenceDao sequenceDao; + + public void setSequenceDao(SqlMapSequenceDao sequenceDao) { + this.sequenceDao = sequenceDao; + } + + /* (non-Javadoc) + * @see org.springframework.samples.kyuriboard.dao.MemoDao#deleteMemo(int) + */ + public void deleteMemo(int memoId) throws DataAccessException { + // TODO Auto-generated method stub + Object parameterObject = new Integer(memoId); + getSqlMapClientTemplate().delete("deleteMemo", parameterObject); + } + + /* (non-Javadoc) + * @see org.springframework.samples.kyuriboard.dao.MemoDao#getMemoByMemoId(int) + */ + public Memo getMemoByMemoId(int memoId) throws DataAccessException { + // TODO Auto-generated method stub + Object parameterObject = new Integer(memoId); + return (Memo) getSqlMapClientTemplate().queryForObject("getMemoByMemoId", parameterObject); + } + + /* (non-Javadoc) + * @see org.springframework.samples.kyuriboard.dao.MemoDao#getMemoListByBoardId(int) + */ + public List getMemoListByBoardId(int boardId) throws DataAccessException { + // TODO Auto-generated method stub + Object parameterObject = new Integer(boardId); + return getSqlMapClientTemplate().queryForList("getMemoListByBoardId", parameterObject); + } + + /* (non-Javadoc) + * @see org.springframework.samples.kyuriboard.dao.MemoDao#insertMemo(org.springframework.samples.kyuriboard.domain.Memo) + */ + public void insertMemo(Memo memo) throws DataAccessException { + // TODO Auto-generated method stub + memo.setMemoId(this.sequenceDao.getNextId("memoid")); + getSqlMapClientTemplate().insert("insertMemo", memo); + } + + /* (non-Javadoc) + * @see org.springframework.samples.kyuriboard.dao.MemoDao#updateMemo(org.springframework.samples.kyuriboard.domain.Memo) + */ + public void updateMemo(Memo memo) throws DataAccessException { + // TODO Auto-generated method stub + getSqlMapClientTemplate().update("updateMemo", memo); + } + + public void deleteMemoByBoardId(int boardId) throws DataAccessException { + // TODO Auto-generated method stub + Object parameterObject = new Integer(boardId); + getSqlMapClientTemplate().update("deleteMemoByBoardId", parameterObject); + } + +} Index: /nextboard/src/org/springframework/samples/kyuriboard/dao/ibatis/SqlMapUserDao.java =================================================================== --- /nextboard/src/org/springframework/samples/kyuriboard/dao/ibatis/SqlMapUserDao.java (revision 3) +++ /nextboard/src/org/springframework/samples/kyuriboard/dao/ibatis/SqlMapUserDao.java (revision 3) @@ -0,0 +1,63 @@ +/** + * + */ +package org.springframework.samples.kyuriboard.dao.ibatis; + +import java.util.List; + +import org.springframework.dao.DataAccessException; +import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport; +import org.springframework.samples.kyuriboard.dao.UserDao; +import org.springframework.samples.kyuriboard.domain.User; + +/** + * @author DAMI(archy712@naver.com) + * + */ +public class SqlMapUserDao extends SqlMapClientDaoSupport implements UserDao { + + /* (non-Javadoc) + * @see org.springframework.samples.kyuriboard.dao.UserDao#getUserByUserId(java.lang.String) + */ + public User getUserByUserId(String userId) throws DataAccessException { + // TODO Auto-generated method stub + return (User) getSqlMapClientTemplate().queryForObject("getUserByUserId", userId); + } + + /* (non-Javadoc) + * @see org.springframework.samples.kyuriboard.dao.UserDao#getUserByUserIdAndPasswd(java.lang.String, java.lang.String) + */ + public User getUserByUserIdAndPasswd(String userId, String passwd) + throws DataAccessException { + // TODO Auto-generated method stub + User user = new User(); + user.setUserId(userId); + user.setPasswd(passwd); + return (User) getSqlMapClientTemplate().queryForObject("getUserByUserIdAndPasswd", user); + } + + /* (non-Javadoc) + * @see org.springframework.samples.kyuriboard.dao.UserDao#getUserList() + */ + public List getUserList() throws DataAccessException { + // TODO Auto-generated method stub + return getSqlMapClientTemplate().queryForList("getUserList", null); + } + + /* (non-Javadoc) + * @see org.springframework.samples.kyuriboard.dao.UserDao#insertUser(org.springframework.samples.kyuriboard.domain.User) + */ + public void insertUser(User user) throws DataAccessException { + // TODO Auto-generated method stub + getSqlMapClientTemplate().insert("insertUser", user); + } + + /* (non-Javadoc) + * @see org.springframework.samples.kyuriboard.dao.UserDao#updateUser(org.springframework.samples.kyuriboard.domain.User) + */ + public void updateUser(User user) throws DataAccessException { + // TODO Auto-generated method stub + getSqlMapClientTemplate().update("updateUser", user); + } + +} Index: /nextboard/src/org/springframework/samples/kyuriboard/dao/ibatis/maps/Board.xml =================================================================== --- /nextboard/src/org/springframework/samples/kyuriboard/dao/ibatis/maps/Board.xml (revision 3) +++ /nextboard/src/org/springframework/samples/kyuriboard/dao/ibatis/maps/Board.xml (revision 3) @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + INSERT INTO board + (boardid, title, visited, recom, userip, htmlyn, insertdate, content, userid) + VALUES (#boardId#, #title#, #visited#, #recom#, #userIp#, #htmlyn#, sysdate(), #content#, #userId#) + + + + UPDATE board + SET title = #title#, + visited = #visited#, + recom = #recom#, + userip = #userIp#, + htmlyn = #htmlyn#, + insertdate = #insertDate#, + content = #content#, + userid = #userId# + WHERE boardid = #boardId# + + + + DELETE FROM board + WHERE boardid = #value# + + + Index: /nextboard/src/org/springframework/samples/kyuriboard/dao/ibatis/maps/Sequence.xml =================================================================== --- /nextboard/src/org/springframework/samples/kyuriboard/dao/ibatis/maps/Sequence.xml (revision 3) +++ /nextboard/src/org/springframework/samples/kyuriboard/dao/ibatis/maps/Sequence.xml (revision 3) @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + UPDATE sequence + SET nextid = #nextId# + WHERE name = #name# + + + Index: /nextboard/src/org/springframework/samples/kyuriboard/dao/ibatis/maps/Memo.xml =================================================================== --- /nextboard/src/org/springframework/samples/kyuriboard/dao/ibatis/maps/Memo.xml (revision 3) +++ /nextboard/src/org/springframework/samples/kyuriboard/dao/ibatis/maps/Memo.xml (revision 3) @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + INSERT INTO memo + (memoid, boardid, content, insertdate, userid) + VALUES (#memoId#, #boardId#, #content#, sysdate(), #userId#) + + + + UPDATE memo + SET boardid = #boardId#, + content = #content#, + insertdate = #insertDate#, + userid = #userId# + WHERE memoid = #memoId# + + + + DELETE FROM memo + WHERE memoid = #value# + + + + DELETE FROM memo + WHERE boardid = #value# + + + Index: /nextboard/src/org/springframework/samples/kyuriboard/dao/ibatis/maps/User.xml =================================================================== --- /nextboard/src/org/springframework/samples/kyuriboard/dao/ibatis/maps/User.xml (revision 3) +++ /nextboard/src/org/springframework/samples/kyuriboard/dao/ibatis/maps/User.xml (revision 3) @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + INSERT INTO user + (userid, username, passwd, email, insertdate) + VALUES (#userId#, #userName#, #passwd#, #email#, sysdate()) + + + + UPDATE user + SET username = #userName# + , passwd = #passwd# + , email = #email# + WHERE userid = #userId# + + + Index: /nextboard/src/org/springframework/samples/kyuriboard/dao/ibatis/Sequence.java =================================================================== --- /nextboard/src/org/springframework/samples/kyuriboard/dao/ibatis/Sequence.java (revision 3) +++ /nextboard/src/org/springframework/samples/kyuriboard/dao/ibatis/Sequence.java (revision 3) @@ -0,0 +1,76 @@ +/** + * + */ +package org.springframework.samples.kyuriboard.dao.ibatis; + +import java.io.Serializable; + +/** + * @author DAMI(archy712@naver.com) + * + */ +public class Sequence implements Serializable { + + /** + * 직렬화 ID + */ + private static final long serialVersionUID = 1L; + + /** + * 씨퀀스 이름(PK) + */ + private String name; + + /** + * 씨퀀스 번호 + */ + private int nextId; + + /** + * Default 생성자 + * + */ + public Sequence() { + } + + /** + * 인자 생성자 + * @param name 씨퀀스 이름 + * @param nextId 씨퀀스 ID + */ + public Sequence(String name, int nextId) { + this.name = name; + this.nextId = nextId; + } + + /** + * @return the name + */ + public String getName() { + return name; + } + + /** + * @param name the name to set + */ + public void setName(String name) { + this.name = name; + } + + /** + * @return the nextId + */ + public int getNextId() { + return nextId; + } + + /** + * @param nextId the nextId to set + */ + public void setNextId(int nextId) { + this.nextId = nextId; + } + + + +} Index: /nextboard/src/org/springframework/samples/kyuriboard/dao/ibatis/SqlMapBoardDao.java =================================================================== --- /nextboard/src/org/springframework/samples/kyuriboard/dao/ibatis/SqlMapBoardDao.java (revision 3) +++ /nextboard/src/org/springframework/samples/kyuriboard/dao/ibatis/SqlMapBoardDao.java (revision 3) @@ -0,0 +1,95 @@ +/** + * + */ +package org.springframework.samples.kyuriboard.dao.ibatis; + +import java.util.List; + +import org.springframework.dao.DataAccessException; +import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport; +import org.springframework.samples.kyuriboard.dao.BoardDao; +import org.springframework.samples.kyuriboard.domain.Board; + +/** + * @author DAMI(archy712@naver.com) + * + */ +public class SqlMapBoardDao extends SqlMapClientDaoSupport implements BoardDao { + + private SqlMapSequenceDao sequenceDao; + + public void setSequenceDao(SqlMapSequenceDao sequenceDao) { + this.sequenceDao = sequenceDao; + } + + /* (non-Javadoc) + * @see org.springframework.samples.kyuriboard.dao.BoardDao#deleteBoard(int) + */ + public void deleteBoard(int boardId) throws DataAccessException { + // TODO Auto-generated method stub + Object parameterObject = new Integer(boardId); + getSqlMapClientTemplate().delete("deleteBoard", parameterObject); + } + + /* (non-Javadoc) + * @see org.springframework.samples.kyuriboard.dao.BoardDao#getBoardByBoardId(int) + */ + public Board getBoardByBoardId(int boardId) throws DataAccessException { + // TODO Auto-generated method stub + Object parameterObject = new Integer(boardId); + return (Board) getSqlMapClientTemplate().queryForObject("getBoardByBoardId", parameterObject); + } + + /* (non-Javadoc) + * @see org.springframework.samples.kyuriboard.dao.BoardDao#getBoardList() + */ + public List getBoardList() throws DataAccessException { + // TODO Auto-generated method stub + return getSqlMapClientTemplate().queryForList("getBoardList"); + } + + /* (non-Javadoc) + * @see org.springframework.samples.kyuriboard.dao.BoardDao#getBoardListByTitle(java.lang.String) + */ + public List getBoardListByTitle(String title) throws DataAccessException { + // TODO Auto-generated method stub + return getSqlMapClientTemplate().queryForList("getBoardListByTitle", title); + } + + /* (non-Javadoc) + * @see org.springframework.samples.kyuriboard.dao.BoardDao#getBoardListByUserId(java.lang.String) + */ + public List getBoardListByUserId(String userId) throws DataAccessException { + // TODO Auto-generated method stub + return getSqlMapClientTemplate().queryForList("getBoardListByUserId", userId); + } + + /* (non-Javadoc) + * @see org.springframework.samples.kyuriboard.dao.BoardDao#getBoardListByUserName(java.lang.String) + */ + public List getBoardListByUserName(String userName) + throws DataAccessException { + // TODO Auto-generated method stub + return getSqlMapClientTemplate().queryForList("getBoardListByUserName", userName); + } + + /* (non-Javadoc) + * @see org.springframework.samples.kyuriboard.dao.BoardDao#insertBoard(org.springframework.samples.kyuriboard.domain.Board) + */ + public void insertBoard(Board board) throws DataAccessException { + // TODO Auto-generated method stub + board.setBoardId(this.sequenceDao.getNextId("boardid")); + getSqlMapClientTemplate().insert("insertBoard", board); + } + + /* (non-Javadoc) + * @see org.springframework.samples.kyuriboard.dao.BoardDao#updateBoard(org.springframework.samples.kyuriboard.domain.Board) + */ + public void updateBoard(Board board) throws DataAccessException { + // TODO Auto-generated method stub + getSqlMapClientTemplate().update("updateBoard", board); + } + + + +} Index: /nextboard/src/org/springframework/samples/kyuriboard/dao/ibatis/SqlMapSequenceDao.java =================================================================== --- /nextboard/src/org/springframework/samples/kyuriboard/dao/ibatis/SqlMapSequenceDao.java (revision 3) +++ /nextboard/src/org/springframework/samples/kyuriboard/dao/ibatis/SqlMapSequenceDao.java (revision 3) @@ -0,0 +1,33 @@ +/** + * + */ +package org.springframework.samples.kyuriboard.dao.ibatis; + +import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport; +import org.springframework.dao.DataAccessException; +import org.springframework.dao.DataRetrievalFailureException; + +/** + * @author DAMI(archy712@naver.com) + * + */ +public class SqlMapSequenceDao extends SqlMapClientDaoSupport { + + /** + * 씨퀀스의 다음 ID를 얻어오고, 해당 시퀀스의 번호를 1 증가 시킨다. + * @param name 해당 시퀀스 명 + * @return 시퀀스의 증가된 값 + * @throws DataAccessException 해당 시퀀스 Row를 찾을 수 없슴. + */ + public int getNextId(String name) throws DataAccessException { + Sequence sequence = new Sequence(name, -1); + sequence = (Sequence) getSqlMapClientTemplate().queryForObject("getSequence", sequence); + if (sequence == null) { + throw new DataRetrievalFailureException("Could not get next value of sequence [" + name + "] : sequence does not exist"); + } + Object parameterObject = new Sequence(name, sequence.getNextId() + 1); + getSqlMapClientTemplate().update("updateSequence", parameterObject, 1); + return sequence.getNextId(); + } + +} Index: /nextboard/src/org/springframework/samples/kyuriboard/domain/Board.java =================================================================== --- /nextboard/src/org/springframework/samples/kyuriboard/domain/Board.java (revision 3) +++ /nextboard/src/org/springframework/samples/kyuriboard/domain/Board.java (revision 3) @@ -0,0 +1,200 @@ +/** + * + */ +package org.springframework.samples.kyuriboard.domain; + +import java.io.Serializable; +import java.util.Date; + +/** + * @author DAMI(archy712@naver.com) + * + */ +public class Board implements Serializable { + + /** + * 직렬화 ID + */ + private static final long serialVersionUID = 1L; + + /** + * 게시물 ID + */ + private int boardId; + + /** + * 게시물 제목 + */ + private String title; + + /** + * 조회수 + */ + private int visited; + + /** + * 추천수 + */ + private int recom; + + /** + * 글쓴이 IP ADDRESS + */ + private String userIp; + + /** + * 게시물의 HTML 여부(Y : HTML 문법 사용, N : HTML 문법 사용 안함) + */ + private String htmlyn; + + /** + * 게시물 입력일 + */ + private Date insertDate; + + /** + * 게시물 내용 + */ + private String content; + + /** + * 게시물 작성자의 사용자ID + */ + private String userId; + + /** + * @return the boardId + */ + public int getBoardId() { + return boardId; + } + + /** + * @param boardId + * the boardId to set + */ + public void setBoardId(int boardId) { + this.boardId = boardId; + } + + /** + * @return the content + */ + public String getContent() { + return content; + } + + /** + * @param content + * the content to set + */ + public void setContent(String content) { + this.content = content; + } + + /** + * @return the htmlyn + */ + public String getHtmlyn() { + return htmlyn; + } + + /** + * @param htmlyn + * the htmlyn to set + */ + public void setHtmlyn(String htmlyn) { + this.htmlyn = htmlyn; + } + + /** + * @return the insertDate + */ + public Date getInsertDate() { + return insertDate; + } + + /** + * @param insertDate + * the insertDate to set + */ + public void setInsertDate(Date insertDate) { + this.insertDate = insertDate; + } + + /** + * @return the recom + */ + public int getRecom() { + return recom; + } + + /** + * @param recom + * the recom to set + */ + public void setRecom(int recom) { + this.recom = recom; + } + + /** + * @return the title + */ + public String getTitle() { + return title; + } + + /** + * @param title + * the title to set + */ + public void setTitle(String title) { + this.title = title; + } + + /** + * @return the userId + */ + public String getUserId() { + return userId; + } + + /** + * @param userId + * the userId to set + */ + public void setUserId(String userId) { + this.userId = userId; + } + + /** + * @return the userIp + */ + public String getUserIp() { + return userIp; + } + + /** + * @param userIp + * the userIp to set + */ + public void setUserIp(String userIp) { + this.userIp = userIp; + } + + /** + * @return the visited + */ + public int getVisited() { + return visited; + } + + /** + * @param visited + * the visited to set + */ + public void setVisited(int visited) { + this.visited = visited; + } + +} Index: /nextboard/src/org/springframework/samples/kyuriboard/domain/Memo.java =================================================================== --- /nextboard/src/org/springframework/samples/kyuriboard/domain/Memo.java (revision 3) +++ /nextboard/src/org/springframework/samples/kyuriboard/domain/Memo.java (revision 3) @@ -0,0 +1,117 @@ +/** + * + */ +package org.springframework.samples.kyuriboard.domain; + +import java.io.Serializable; +import java.util.Date; + +/** + * @author DAMI(archy712@naver.com) + * + */ +public class Memo implements Serializable { + + /** + * 직렬화 ID + */ + private static final long serialVersionUID = 1L; + + /** + * 메모 ID + */ + private int memoId; + + /** + * 메모가 속한 게시물 ID + */ + private int boardId; + + /** + * 메모 내용 + */ + private String content; + + /** + * 메모 입력일 + */ + private Date insertDate; + + /** + * 메모 작성자 사용자ID + */ + private String userId; + + /** + * @return the boardId + */ + public int getBoardId() { + return boardId; + } + + /** + * @param boardId the boardId to set + */ + public void setBoardId(int boardId) { + this.boardId = boardId; + } + + /** + * @return the content + */ + public String getContent() { + return content; + } + + /** + * @param content the content to set + */ + public void setContent(String content) { + this.content = content; + } + + /** + * @return the insertDate + */ + public Date getInsertDate() { + return insertDate; + } + + /** + * @param insertDate the insertDate to set + */ + public void setInsertDate(Date insertDate) { + this.insertDate = insertDate; + } + + /** + * @return the memoId + */ + public int getMemoId() { + return memoId; + } + + /** + * @param memoId the memoId to set + */ + public void setMemoId(int memoId) { + this.memoId = memoId; + } + + /** + * @return the userId + */ + public String getUserId() { + return userId; + } + + /** + * @param userId the userId to set + */ + public void setUserId(String userId) { + this.userId = userId; + } + + + +} Index: /nextboard/src/org/springframework/samples/kyuriboard/domain/logic/KyuriBoardFacade.java =================================================================== --- /nextboard/src/org/springframework/samples/kyuriboard/domain/logic/KyuriBoardFacade.java (revision 3) +++ /nextboard/src/org/springframework/samples/kyuriboard/domain/logic/KyuriBoardFacade.java (revision 3) @@ -0,0 +1,193 @@ +/** + * + */ +package org.springframework.samples.kyuriboard.domain.logic; + +import java.util.List; + +import org.springframework.dao.DataAccessException; +import org.springframework.samples.kyuriboard.domain.Board; +import org.springframework.samples.kyuriboard.domain.Memo; +import org.springframework.samples.kyuriboard.domain.User; + +/** + * @author DAMI(archy712@naver.com) + * + */ +public interface KyuriBoardFacade { + + // ----------------------------------------------------------- + // Board + // ----------------------------------------------------------- + + /** + * 주어진 게시물ID로 게시물 객체를 반환한다 + * @param boardId 게시물ID + * @return Board 게시물 객체 + * @throws DataAccessException + */ + Board getBoardByBoardId(int boardId) throws DataAccessException; + + + /** + * 게시물의 총 리스트를 반환한다. + * @return java.util.List 게시물 총 리스트 + * @throws DataAccessException + */ + List getBoardList() throws DataAccessException; + + + /** + * 주어진 사용자ID에 해당하는 게시물 리스트를 반환한다. + * @param userId 사용자ID + * @return java.util.List 게시물 리스트 + * @throws DataAccessException + */ + List getBoardListByUserId(String userId) throws DataAccessException; + + + /** + * 주어진 사용자명에 해당하는 게시물 리스트를 반환한다. + * @param userName 사용자명 + * @return java.util.List 게시물 리스트 + * @throws DataAccessException + */ + List getBoardListByUserName(String userName) throws DataAccessException; + + + /** + * 주어진 제목에 해당하는 게시물 리스트를 반환한다. + * @param title 게시물 제목 + * @return java.util.List 게시물 리스트 + * @throws DataAccessException + */ + List getBoardListByTitle(String title) throws DataAccessException; + + + /** + * 주어진 게시물을 입력한다. + * @param board 입력할 게시물 + * @throws DataAccessException + */ + void insertBoard(Board board) throws DataAccessException; + + + /** + * 주어진 게시물을 수정한다. + * @param board 입력할 게시물 + * @throws DataAccessException + */ + void updateBoard(Board board) throws DataAccessException; + + + /** + * 주어진 게시물을 삭제한다. + * @param boardId 삭제할 게시물 ID + * @throws DataAccessException + */ + void deleteBoard(int boardId) throws DataAccessException; + + + // --------------------------------------------------------- + // Memo + // --------------------------------------------------------- + + + /** + * 주어진 메모ID에 해당하는 메모를 반환한다. + * @param memoId 메모ID + * @return Memo 메모 객체 + * @throws DataAccessException + */ + Memo getMemoByMemoId(int memoId) throws DataAccessException; + + + /** + * 주어진 게시물ID에 해당하는 메모 리스트를 반환한다. + * @param boardId 게시물ID + * @return java.util.List 메모 리스트 + * @throws DataAccessException + */ + List getMemoListByBoardId(int boardId) throws DataAccessException; + + + /** + * 주어진 메모를 입력한다. + * @param memo 입력할 메모 + * @throws DataAccessException + */ + void insertMemo(Memo memo) throws DataAccessException; + + + /** + * 주어진 메모를 수정한다. + * @param memo 수정할 메모 + * @throws DataAccessException + */ + void updateMemo(Memo memo) throws DataAccessException; + + + /** + * 주어진 메모ID에 해당하는 메모를 삭제한다. + * @param memoId 삭제할 메모 ID + * @throws DataAccessException + */ + void deleteMemo(int memoId) throws DataAccessException; + + + /** + * 주어진 게시물ID에 해당하는 메모들을 삭제한다. + * @param boardId + * @throws DataAccessException + */ + void deleteMemoByBoardId(int boardId) throws DataAccessException; + + + // --------------------------------------------------------- + // User + // --------------------------------------------------------- + + + /** + * 주어진 사용자ID에 해당하는 사용자를 반환한다. + * @param userId 사용자 ID + * @return User 사용자 + * @throws DataAccessException + */ + User getUserByUserId(String userId) throws DataAccessException; + + + /** + * 주어진 사용자ID와 비밀번호를 만족하는 사용자를 반환한다. + * @param userId 사용자 ID + * @param passwd 사용자 비밀번호 + * @return User 사용자 + * @throws DataAccessException + */ + User getUserByUserIdAndPasswd(String userId, String passwd) throws DataAccessException; + + + /** + * 주어진 사용자를 등록한다. + * @param user 등록할 사용자 + * @throws DataAccessException + */ + void insertUser(User user) throws DataAccessException; + + + /** + * 주어진 사용자를 수정한다. + * @param user 수정할 사용자 + * @throws DataAccessException + */ + void updateUser(User user) throws DataAccessException; + + + /** + * 사용자 리스트를 반환한다. + * @return java.util.List 사용자 리스트 + * @throws DataAccessException + */ + List getUserList() throws DataAccessException; + +} Index: /nextboard/src/org/springframework/samples/kyuriboard/domain/logic/UserValidator.java =================================================================== --- /nextboard/src/org/springframework/samples/kyuriboard/domain/logic/UserValidator.java (revision 3) +++ /nextboard/src/org/springframework/samples/kyuriboard/domain/logic/UserValidator.java (revision 3) @@ -0,0 +1,36 @@ +/** + * + */ +package org.springframework.samples.kyuriboard.domain.logic; + +import org.springframework.samples.kyuriboard.domain.User; +import org.springframework.validation.Errors; +import org.springframework.validation.Validator; +import org.springframework.validation.ValidationUtils; + +/** + * @author DAMI(archy712@naver.com) + * + */ +public class UserValidator implements Validator { + + /* (non-Javadoc) + * @see org.springframework.validation.Validator#supports(java.lang.Class) + */ + public boolean supports(Class clazz) { + // TODO Auto-generated method stub + return User.class.isAssignableFrom(clazz); + } + + /* (non-Javadoc) + * @see org.springframework.validation.Validator#validate(java.lang.Object, org.springframework.validation.Errors) + */ + public void validate(Object obj, Errors errors) { + // TODO Auto-generated method stub + ValidationUtils.rejectIfEmpty(errors, "userId", "USERID_REQUIRED", "사용자ID가 필요합니다"); + ValidationUtils.rejectIfEmpty(errors, "userName", "USERNAME_REQUIRED", "사용자 이름이 필요합니다"); + ValidationUtils.rejectIfEmpty(errors, "passwd", "PASSWD_REQUIRED", "비밀번호가 필요합니다"); + ValidationUtils.rejectIfEmpty(errors, "email", "EMAIL_REQUIRED", "이메일 주소가 필요합니다"); + } + +} Index: /nextboard/src/org/springframework/samples/kyuriboard/domain/logic/BoardValidator.java =================================================================== --- /nextboard/src/org/springframework/samples/kyuriboard/domain/logic/BoardValidator.java (revision 3) +++ /nextboard/src/org/springframework/samples/kyuriboard/domain/logic/BoardValidator.java (revision 3) @@ -0,0 +1,34 @@ +/** + * BoardForm 객체에 대한 유효성 검증 + */ +package org.springframework.samples.kyuriboard.domain.logic; + +import org.springframework.samples.kyuriboard.domain.Board; +import org.springframework.validation.Errors; +import org.springframework.validation.Validator; +import org.springframework.validation.ValidationUtils; + +/** + * @author DAMI(archy712@naver.com) + * + */ +public class BoardValidator implements Validator { + + /* (non-Javadoc) + * @see org.springframework.validation.Validator#supports(java.lang.Class) + */ + public boolean supports(Class clazz) { + // TODO Auto-generated method stub + return Board.class.isAssignableFrom(clazz); + } + + /* (non-Javadoc) + * @see org.springframework.validation.Validator#validate(java.lang.Object, org.springframework.validation.Errors) + */ + public void validate(Object obj, Errors errors) { + // TODO Auto-generated method stub + ValidationUtils.rejectIfEmpty(errors, "title", "TITLE_REQUIRED", "글 제목이 필요합니다"); + ValidationUtils.rejectIfEmpty(errors, "content", "CONTENT_REQUIRED", "글 내용이 필요합니다"); + } + +} Index: /nextboard/src/org/springframework/samples/kyuriboard/domain/logic/KyuriBoardImpl.java =================================================================== --- /nextboard/src/org/springframework/samples/kyuriboard/domain/logic/KyuriBoardImpl.java (revision 3) +++ /nextboard/src/org/springframework/samples/kyuriboard/domain/logic/KyuriBoardImpl.java (revision 3) @@ -0,0 +1,205 @@ +/** + * + */ +package org.springframework.samples.kyuriboard.domain.logic; + +import java.util.List; + +import org.springframework.dao.DataAccessException; +import org.springframework.samples.kyuriboard.dao.BoardDao; +import org.springframework.samples.kyuriboard.dao.MemoDao; +import org.springframework.samples.kyuriboard.dao.UserDao; +import org.springframework.samples.kyuriboard.domain.Board; +import org.springframework.samples.kyuriboard.domain.Memo; +import org.springframework.samples.kyuriboard.domain.User; + +/** + * @author DAMI(archy712@naver.com) + * + */ +public class KyuriBoardImpl implements KyuriBoardFacade { + + private BoardDao boardDao; + + private MemoDao memoDao; + + private UserDao userDao; + + // ----------------------------------------------------- + // Setter Injection + // ----------------------------------------------------- + + /** + * @param boardDao the boardDao to set + */ + public void setBoardDao(BoardDao boardDao) { + this.boardDao = boardDao; + } + + /** + * @param memoDao the memoDao to set + */ + public void setMemoDao(MemoDao memoDao) { + this.memoDao = memoDao; + } + + /** + * @param userDao the userDao to set + */ + public void setUserDao(UserDao userDao) { + this.userDao = userDao; + } + + /* + * (non-Javadoc) + * @see org.springframework.samples.kyuriboard.domain.logic.KyuriBoardFacade#deleteBoard(int) + */ + public void deleteBoard(int boardId) throws DataAccessException { + // TODO Auto-generated method stub + this.boardDao.deleteBoard(boardId); + } + + /* (non-Javadoc) + * @see org.springframework.samples.kyuriboard.domain.logic.KyuriBoardFacade#deleteMemo(int) + */ + public void deleteMemo(int memoId) throws DataAccessException { + // TODO Auto-generated method stub + this.memoDao.deleteMemo(memoId); + } + + /* (non-Javadoc) + * @see org.springframework.samples.kyuriboard.domain.logic.KyuriBoardFacade#getBoardByBoardId(int) + */ + public Board getBoardByBoardId(int boardId) throws DataAccessException { + // TODO Auto-generated method stub + return this.boardDao.getBoardByBoardId(boardId); + } + + /* (non-Javadoc) + * @see org.springframework.samples.kyuriboard.domain.logic.KyuriBoardFacade#getBoardList() + */ + public List getBoardList() throws DataAccessException { + // TODO Auto-generated method stub + return this.boardDao.getBoardList(); + } + + /* (non-Javadoc) + * @see org.springframework.samples.kyuriboard.domain.logic.KyuriBoardFacade#getBoardListByTitle(java.lang.String) + */ + public List getBoardListByTitle(String title) throws DataAccessException { + // TODO Auto-generated method stub + return this.boardDao.getBoardListByTitle(title); + } + + /* (non-Javadoc) + * @see org.springframework.samples.kyuriboard.domain.logic.KyuriBoardFacade#getBoardListByUserId(java.lang.String) + */ + public List getBoardListByUserId(String userId) throws DataAccessException { + // TODO Auto-generated method stub + return this.boardDao.getBoardListByUserId(userId); + } + + /* (non-Javadoc) + * @see org.springframework.samples.kyuriboard.domain.logic.KyuriBoardFacade#getBoardListByUserName(java.lang.String) + */ + public List getBoardListByUserName(String userName) + throws DataAccessException { + // TODO Auto-generated method stub + return this.boardDao.getBoardListByUserName(userName); + } + + /* (non-Javadoc) + * @see org.springframework.samples.kyuriboard.domain.logic.KyuriBoardFacade#getMemoByMemoId(int) + */ + public Memo getMemoByMemoId(int memoId) throws DataAccessException { + // TODO Auto-generated method stub + return this.memoDao.getMemoByMemoId(memoId); + } + + /* (non-Javadoc) + * @see org.springframework.samples.kyuriboard.domain.logic.KyuriBoardFacade#getMemoListByBoardId(int) + */ + public List getMemoListByBoardId(int boardId) throws DataAccessException { + // TODO Auto-generated method stub + return this.memoDao.getMemoListByBoardId(boardId); + } + + /* (non-Javadoc) + * @see org.springframework.samples.kyuriboard.domain.logic.KyuriBoardFacade#getUserByUserId(java.lang.String) + */ + public User getUserByUserId(String userId) throws DataAccessException { + // TODO Auto-generated method stub + return this.userDao.getUserByUserId(userId); + } + + /* (non-Javadoc) + * @see org.springframework.samples.kyuriboard.domain.logic.KyuriBoardFacade#getUserByUserIdAndPasswd(java.lang.String, java.lang.String) + */ + public User getUserByUserIdAndPasswd(String userId, String passwd) + throws DataAccessException { + // TODO Auto-generated method stub + return this.userDao.getUserByUserIdAndPasswd(userId, passwd); + } + + /* (non-Javadoc) + * @see org.springframework.samples.kyuriboard.domain.logic.KyuriBoardFacade#getUserList() + */ + public List getUserList() throws DataAccessException { + // TODO Auto-generated method stub + return this.userDao.getUserList(); + } + + /* (non-Javadoc) + * @see org.springframework.samples.kyuriboard.domain.logic.KyuriBoardFacade#insertBoard(org.springframework.samples.kyuriboard.domain.Board) + */ + public void insertBoard(Board board) throws DataAccessException { + // TODO Auto-generated method stub + this.boardDao.insertBoard(board); + } + + /* (non-Javadoc) + * @see org.springframework.samples.kyuriboard.domain.logic.KyuriBoardFacade#insertMemo(org.springframework.samples.kyuriboard.domain.Memo) + */ + public void insertMemo(Memo memo) throws DataAccessException { + // TODO Auto-generated method stub + this.memoDao.insertMemo(memo); + } + + /* (non-Javadoc) + * @see org.springframework.samples.kyuriboard.domain.logic.KyuriBoardFacade#insertUser(org.springframework.samples.kyuriboard.domain.User) + */ + public void insertUser(User user) throws DataAccessException { + // TODO Auto-generated method stub + this.userDao.insertUser(user); + } + + /* (non-Javadoc) + * @see org.springframework.samples.kyuriboard.domain.logic.KyuriBoardFacade#updateBoard(org.springframework.samples.kyuriboard.domain.Board) + */ + public void updateBoard(Board board) throws DataAccessException { + // TODO Auto-generated method stub + this.boardDao.updateBoard(board); + } + + /* (non-Javadoc) + * @see org.springframework.samples.kyuriboard.domain.logic.KyuriBoardFacade#updateMemo(org.springframework.samples.kyuriboard.domain.Memo) + */ + public void updateMemo(Memo memo) throws DataAccessException { + // TODO Auto-generated method stub + this.memoDao.updateMemo(memo); + } + + /* (non-Javadoc) + * @see org.springframework.samples.kyuriboard.domain.logic.KyuriBoardFacade#updateUser(org.springframework.samples.kyuriboard.domain.User) + */ + public void updateUser(User user) throws DataAccessException { + // TODO Auto-generated method stub + this.userDao.updateUser(user); + } + + public void deleteMemoByBoardId(int boardId) throws DataAccessException { + // TODO Auto-generated method stub + this.memoDao.deleteMemoByBoardId(boardId); + } + +} Index: /nextboard/src/org/springframework/samples/kyuriboard/domain/User.java =================================================================== --- /nextboard/src/org/springframework/samples/kyuriboard/domain/User.java (revision 3) +++ /nextboard/src/org/springframework/samples/kyuriboard/domain/User.java (revision 3) @@ -0,0 +1,117 @@ +/** + * + */ +package org.springframework.samples.kyuriboard.domain; + +import java.io.Serializable; +import java.util.Date; + +/** + * @author DAMI(archy712@naver.com) + * + */ +public class User implements Serializable { + + /** + * 직렬화 ID + */ + private static final long serialVersionUID = 1L; + + /** + * 사용자 ID + */ + private String userId; + + /** + * 사용자 명 + */ + private String userName; + + /** + * 사용자 비밀번호 + */ + private String passwd; + + /** + * 사용자 이메일 + */ + private String email; + + /** + * 사용자 등록일 + */ + private Date insertDate; + + /** + * @return the email + */ + public String getEmail() { + return email; + } + + /** + * @param email the email to set + */ + public void setEmail(String email) { + this.email = email; + } + + /** + * @return the insertDate + */ + public Date getInsertDate() { + return insertDate; + } + + /** + * @param insertDate the insertDate to set + */ + public void setInsertDate(Date insertDate) { + this.insertDate = insertDate; + } + + /** + * @return the passwd + */ + public String getPasswd() { + return passwd; + } + + /** + * @param passwd the passwd to set + */ + public void setPasswd(String passwd) { + this.passwd = passwd; + } + + /** + * @return the userId + */ + public String getUserId() { + return userId; + } + + /** + * @param userId the userId to set + */ + public void setUserId(String userId) { + this.userId = userId; + } + + /** + * @return the userName + */ + public String getUserName() { + return userName; + } + + /** + * @param userName the userName to set + */ + public void setUserName(String userName) { + this.userName = userName; + } + + + +} Index: /nextboard/src/org/springframework/samples/kyuriboard/web/spring/BoardFormController.java =================================================================== --- /nextboard/src/org/springframework/samples/kyuriboard/web/spring/BoardFormController.java (revision 3) +++ /nextboard/src/org/springframework/samples/kyuriboard/web/spring/BoardFormController.java (revision 3) @@ -0,0 +1,152 @@ +/** + * BoardForm에 대한 컨트롤러 + * 게시물 수정/입력시 사용 + */ +package org.springframework.samples.kyuriboard.web.spring; + +import java.util.Map; +import java.util.HashMap; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.validation.BindException; +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.servlet.mvc.SimpleFormController; + +import org.apache.log4j.Logger; + +import org.springframework.samples.kyuriboard.domain.Board; +import org.springframework.samples.kyuriboard.domain.logic.KyuriBoardFacade; + +/** + * @author DAMI(archy712@naver.com) + * + */ +public class BoardFormController extends SimpleFormController { + + private Logger logger = Logger.getLogger(getClass()); + + public static final String[] HTMLYNS = {"Y", "N"}; + + // ---------------------------------------- + // Setter Injection + // ---------------------------------------- + private KyuriBoardFacade kyuriBoard; + + public void setkyuriBoard(KyuriBoardFacade kyuriBoard) { + this.kyuriBoard = kyuriBoard; + } + + public BoardFormController() { + setSessionForm(true); + setValidateOnBinding(false); + setCommandName("boardForm"); + setFormView("boardForm"); + } + + /* (non-Javadoc) + * @see org.springframework.web.servlet.mvc.AbstractFormController#formBackingObject(javax.servlet.http.HttpServletRequest) + */ + protected Object formBackingObject(HttpServletRequest request) throws Exception { + // TODO Auto-generated method stub + + if (logger.isInfoEnabled()) { + logger.info("formBackingObject() 호출"); + } + + if (request.getParameter("boardId") != null) { + return new BoardForm(this.kyuriBoard.getBoardByBoardId(new Integer(request.getParameter("boardId")).intValue())); + } else { + return new BoardForm(); + } + } + + /* (non-Javadoc) + * @see org.springframework.web.servlet.mvc.BaseCommandController#onBindAndValidate(javax.servlet.http.HttpServletRequest, java.lang.Object, org.springframework.validation.BindException) + */ + protected void onBindAndValidate(HttpServletRequest request, Object command, BindException errors) throws Exception { + // TODO Auto-generated method stub + + if (logger.isInfoEnabled()) { + logger.info("onBindAndValidate() 호출"); + } + + BoardForm boardForm = (BoardForm) command; + Board board = boardForm.getBoard(); + + // 구동서버가 톰캣일 경우에 한글 처리 + // 나중에 리팩토링시 [구동 WAS] 변수를 사용하여 처리를 할 것. + board.setTitle(new String(board.getTitle().getBytes("8859_1"), "euc-kr")); + board.setContent(new String(board.getContent().getBytes("8859_1"), "euc-kr")); + + errors.setNestedPath("board"); + getValidator().validate(board, errors); + errors.setNestedPath(""); + + // 부가적인 유효성 검사 + if ((boardForm.getBoard().getTitle() == null) || ((boardForm.getBoard().getTitle() != null) && (boardForm.getBoard().getTitle().length() < 10))) { + errors.reject("TITLE_NOTCORRECT", "제목은 10글자 이상이어야 합니다"); + } + + if ((boardForm.getBoard().getContent() == null) || ((boardForm.getBoard().getTitle() != null) && (boardForm.getBoard().getContent().length() < 10))) { + errors.reject("TITLE_NOTCORRECT", "내용은 10글자 이상이어야 합니다"); + } + } + + + /* (non-Javadoc) + * @see org.springframework.web.servlet.mvc.SimpleFormController#referenceData(javax.servlet.http.HttpServletRequest) + */ + protected Map referenceData(HttpServletRequest request) throws Exception { + // TODO Auto-generated method stub + Map model = new HashMap(); + model.put("htmlyns", HTMLYNS); + return model; + } + + /* (non-Javadoc) + * @see org.springframework.web.servlet.mvc.SimpleFormController#onSubmit(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, java.lang.Object, org.springframework.validation.BindException) + */ + protected ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response, Object command, BindException errors) throws Exception { + // TODO Auto-generated method stub + + if (logger.isInfoEnabled()) { + logger.info("onSubmit() 호출"); + } + + BoardForm boardForm = (BoardForm) command; + Board board = boardForm.getBoard(); + + UserSession userSession = (UserSession) request.getSession().getAttribute("userSession"); + board.setUserIp(request.getRemoteAddr()); + board.setUserId(userSession.getUser().getUserId()); + board.setVisited(0); + board.setRecom(0); + board.setInsertDate(new java.util.Date()); + + if (logger.isInfoEnabled()) { + logger.info("userIp : " + board.getUserIp()); + logger.info("userId : " + board.getUserId()); + logger.info("title : " + board.getTitle()); + logger.info("content : " + board.getContent()); + logger.info("htmlyn : " + board.getHtmlyn()); + } + + try { + if (boardForm.isNewBoard()) { + this.kyuriBoard.insertBoard(board); + } else { + this.kyuriBoard.updateBoard(board); + } + } catch (Exception ex) { + System.out.println("에러 : " + ex.getMessage()); + return showForm(request, response, errors); + } + + return super.onSubmit(request, response, command, errors); + } + + + +} Index: /nextboard/src/org/springframework/samples/kyuriboard/web/spring/RecomBoardController.java =================================================================== --- /nextboard/src/org/springframework/samples/kyuriboard/web/spring/RecomBoardController.java (revision 3) +++ /nextboard/src/org/springframework/samples/kyuriboard/web/spring/RecomBoardController.java (revision 3) @@ -0,0 +1,55 @@ +/** + * + */ +package org.springframework.samples.kyuriboard.web.spring; + +import java.util.Map; +import java.util.HashMap; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.servlet.mvc.Controller; + +import org.springframework.samples.kyuriboard.domain.Board; +import org.springframework.samples.kyuriboard.domain.logic.KyuriBoardFacade; + +/** + * @author DAMI(archy712@naver.com) + * + */ +public class RecomBoardController implements Controller { + + private KyuriBoardFacade kyuriBoard; + + /** + * @param kyuriBoard the kyuriBoard to set + */ + public void setKyuriBoard(KyuriBoardFacade kyuriBoard) { + this.kyuriBoard = kyuriBoard; + } + + + /* (non-Javadoc) + * @see org.springframework.web.servlet.mvc.Controller#handleRequest(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) + */ + public ModelAndView handleRequest(HttpServletRequest request, + HttpServletResponse response) throws Exception { + // TODO Auto-generated method stub + + // 추천수를 증가시킨다. + int boardId = new Integer(request.getParameter("boardId")).intValue(); + Board board = this.kyuriBoard.getBoardByBoardId(boardId); + int curRecom = board.getRecom() + 1; + board.setRecom(curRecom); + this.kyuriBoard.updateBoard(board); + + // 모델 객체를 탑재 + Map model = new HashMap(); + model.put("board", board); + + return new ModelAndView("viewBoard", model); + } + +} Index: /nextboard/src/org/springframework/samples/kyuriboard/web/spring/LogonController.java =================================================================== --- /nextboard/src/org/springframework/samples/kyuriboard/web/spring/LogonController.java (revision 3) +++ /nextboard/src/org/springframework/samples/kyuriboard/web/spring/LogonController.java (revision 3) @@ -0,0 +1,50 @@ +/** + * + */ +package org.springframework.samples.kyuriboard.web.spring; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.samples.kyuriboard.domain.User; +import org.springframework.samples.kyuriboard.domain.logic.KyuriBoardFacade; +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.servlet.mvc.Controller; + +/** + * @author DAMI(archy712@naver.com) + * + */ +public class LogonController implements Controller { + + private KyuriBoardFacade kyuriBoard; + + public void setKyuriBoard(KyuriBoardFacade kyuriBoard) { + this.kyuriBoard = kyuriBoard; + } + + /* (non-Javadoc) + * @see org.springframework.web.servlet.mvc.Controller#handleRequest(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) + */ + public ModelAndView handleRequest(HttpServletRequest request, + HttpServletResponse response) throws Exception { + // TODO Auto-generated method stub + String userId = request.getParameter("userId"); + String passwd = request.getParameter("passwd"); + User user = this.kyuriBoard.getUserByUserIdAndPasswd(userId, passwd); + if (user == null) { + return new ModelAndView("error", "message", "입력하신 ID와 비밀번호가 일치하지 않습니다."); + } else { + UserSession userSession = new UserSession(user); + request.getSession().setAttribute("userSession", userSession); + String forwardAction = request.getParameter("forwardAction"); + if (forwardAction != null) { + response.sendRedirect(forwardAction); + return null; + } else { + return new ModelAndView("index"); + } + } + } + +} Index: /nextboard/src/org/springframework/samples/kyuriboard/web/spring/UserForm.java =================================================================== --- /nextboard/src/org/springframework/samples/kyuriboard/web/spring/UserForm.java (revision 3) +++ /nextboard/src/org/springframework/samples/kyuriboard/web/spring/UserForm.java (revision 3) @@ -0,0 +1,85 @@ +/** + * + */ +package org.springframework.samples.kyuriboard.web.spring; + +import java.io.Serializable; + +import org.springframework.samples.kyuriboard.domain.User; + +/** + * @author DAMI(archy712@naver.com) + * + */ +public class UserForm implements Serializable { + + /** + * 직렬화 번호 + */ + private static final long serialVersionUID = 1L; + + /** + * User 객체 + */ + private User user; + + /** + * 생성모드인지 수정모드인지 결정 + */ + private boolean newUser; + + + /** + * 비밀번호 확인 + */ + private String repeatedPasswd; + + /** + * 디폴트 생성자 + * + */ + public UserForm() { + this.user = new User(); + this.newUser = true; + } + + /** + * 인자 생성자 + * @param user User객체 + */ + public UserForm(User user) { + this.user = user; + this.newUser = false; + } + + /** + * @return the newUser + */ + public boolean isNewUser() { + return newUser; + } + + /** + * @return the user + */ + public User getUser() { + return user; + } + + /** + * @return the repeatedPasswd + */ + public String getRepeatedPasswd() { + return repeatedPasswd; + } + + /** + * @param repeatedPasswd the repeatedPasswd to set + */ + public void setRepeatedPasswd(String repeatedPasswd) { + this.repeatedPasswd = repeatedPasswd; + } + + + +} Index: /nextboard/src/org/springframework/samples/kyuriboard/web/spring/UserSession.java =================================================================== --- /nextboard/src/org/springframework/samples/kyuriboard/web/spring/UserSession.java (revision 3) +++ /nextboard/src/org/springframework/samples/kyuriboard/web/spring/UserSession.java (revision 3) @@ -0,0 +1,35 @@ +/** + * + */ +package org.springframework.samples.kyuriboard.web.spring; + +import java.io.Serializable; + +import org.springframework.samples.kyuriboard.domain.User; + +/** + * @author DAMI(archy712@naver.com) + * + */ +public class UserSession implements Serializable { + + /** + * 직렬화 번호 + */ + private static final long serialVersionUID = 1L; + + private User user; + + public UserSession(User user) { + this.user = user; + } + + /** + * @return the user + */ + public User getUser() { + return user; + } + + +} Index: /nextboard/src/org/springframework/samples/kyuriboard/web/spring/DeleteMemoController.java =================================================================== --- /nextboard/src/org/springframework/samples/kyuriboard/web/spring/DeleteMemoController.java (revision 3) +++ /nextboard/src/org/springframework/samples/kyuriboard/web/spring/DeleteMemoController.java (revision 3) @@ -0,0 +1,56 @@ +/** + * 메모를 삭제 + */ +package org.springframework.samples.kyuriboard.web.spring; + +import java.util.Map; +import java.util.HashMap; +import java.util.List; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.servlet.mvc.Controller; + +import org.springframework.samples.kyuriboard.domain.Board; +import org.springframework.samples.kyuriboard.domain.logic.KyuriBoardFacade; + +/** + * @author DAMI(archy712@naver.com) + * + */ +public class DeleteMemoController implements Controller { + + private KyuriBoardFacade kyuriBoard; + + + /** + * @param kyuriBoard the kyuriBoard to set + */ + public void setKyuriBoard(KyuriBoardFacade kyuriBoard) { + this.kyuriBoard = kyuriBoard; + } + + + /* (non-Javadoc) + * @see org.springframework.web.servlet.mvc.Controller#handleRequest(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) + */ + public ModelAndView handleRequest(HttpServletRequest request, + HttpServletResponse response) throws Exception { + // TODO Auto-generated method stub + int boardId = new Integer(request.getParameter("boardId")).intValue(); + int memoId = new Integer(request.getParameter("memoId")).intValue(); + this.kyuriBoard.deleteMemo(memoId); + + Board board = this.kyuriBoard.getBoardByBoardId(boardId); + List memoList = this.kyuriBoard.getMemoListByBoardId(boardId); + + Map model = new HashMap(); + model.put("board", board); + model.put("memoList", memoList); + + return new ModelAndView("viewBoard", model); + } + +} Index: /nextboard/src/org/springframework/samples/kyuriboard/web/spring/InsertMemoController.java =================================================================== --- /nextboard/src/org/springframework/samples/kyuriboard/web/spring/InsertMemoController.java (revision 3) +++ /nextboard/src/org/springframework/samples/kyuriboard/web/spring/InsertMemoController.java (revision 3) @@ -0,0 +1,61 @@ +/** + * 게시물에 대한 메모를 등록 + */ +package org.springframework.samples.kyuriboard.web.spring; + +import java.util.Map; +import java.util.HashMap; +import java.util.List; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.servlet.mvc.Controller; + +import org.springframework.samples.kyuriboard.domain.Board; +import org.springframework.samples.kyuriboard.domain.Memo; +import org.springframework.samples.kyuriboard.domain.logic.KyuriBoardFacade; + +/** + * @author DAMI(archy712@naver.com) + * + */ +public class InsertMemoController implements Controller { + + private KyuriBoardFacade kyuriBoard; + + /** + * @param kyuriBoard the kyuriBoard to set + */ + public void setKyuriBoard(KyuriBoardFacade kyuriBoard) { + this.kyuriBoard = kyuriBoard; + } + + /* (non-Javadoc) + * @see org.springframework.web.servlet.mvc.Controller#handleRequest(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) + */ + public ModelAndView handleRequest(HttpServletRequest request, + HttpServletResponse response) throws Exception { + // TODO Auto-generated method stub + int boardId = new Integer(request.getParameter("boardId")).intValue(); + String content = new String(request.getParameter("content").getBytes("8859_1"), "euc-kr"); + UserSession userSession = (UserSession) request.getSession().getAttribute("userSession"); + Memo memo = new Memo(); + memo.setBoardId(boardId); + memo.setContent(content); + memo.setInsertDate(new java.util.Date()); + memo.setUserId(userSession.getUser().getUserId()); + this.kyuriBoard.insertMemo(memo); + + Board board = this.kyuriBoard.getBoardByBoardId(boardId); + List memoList = this.kyuriBoard.getMemoListByBoardId(boardId); + + Map model = new HashMap(); + model.put("board", board); + model.put("memoList", memoList); + + return new ModelAndView("viewBoard", model); + } + +} Index: /nextboard/src/org/springframework/samples/kyuriboard/web/spring/UserFormController.java =================================================================== --- /nextboard/src/org/springframework/samples/kyuriboard/web/spring/UserFormController.java (revision 3) +++ /nextboard/src/org/springframework/samples/kyuriboard/web/spring/UserFormController.java (revision 3) @@ -0,0 +1,158 @@ +/** + * + */ +package org.springframework.samples.kyuriboard.web.spring; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.oro.text.perl.Perl5Util; + +import org.springframework.validation.BindException; +import org.springframework.validation.ValidationUtils; + +import org.springframework.web.util.WebUtils; +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.servlet.mvc.SimpleFormController; + +import org.springframework.dao.DataIntegrityViolationException; + +import org.springframework.samples.kyuriboard.domain.User; +import org.springframework.samples.kyuriboard.domain.logic.KyuriBoardFacade; + +import org.apache.log4j.Logger; + +/** + * @author DAMI(archy712@naver.com) + * + */ +public class UserFormController extends SimpleFormController { + + private static Logger logger = Logger.getLogger(UserFormController.class); + + private KyuriBoardFacade kyuriBoard; + + /** + * @param kyuriBoard the kyuriBoard to set + */ + public void setKyuriBoard(KyuriBoardFacade kyuriBoard) { + this.kyuriBoard = kyuriBoard; + } + + /** + * Constructor + */ + public UserFormController() { + setSessionForm(true); + setValidateOnBinding(false); + setCommandName("userForm"); + setFormView("userForm"); + } + + /* (non-Javadoc) + * @see org.springframework.web.servlet.mvc.SimpleFormController#onSubmit(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, java.lang.Object, org.springframework.validation.BindException) + */ + protected ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response, Object command, BindException errors) throws Exception { + // TODO Auto-generated method stub + UserForm userForm = (UserForm) command; + User user = userForm.getUser(); + + //user.setUserName(new String(user.getUserName().getBytes("8859_1"), "euc-kr")); + user.setInsertDate(new java.util.Date()); + + try { + if (userForm.isNewUser()) { + this.kyuriBoard.insertUser(user); + } else { + this.kyuriBoard.updateUser(user); + } + } catch (DataIntegrityViolationException ex) { + errors.rejectValue("user.userId", "USERID_ALREADY_EXISTS", "회원ID가 이미 존재합니다. 다른 ID를 입력해 주세요"); + return showForm(request, response, errors); + } + + // 새로운 세션 설정 + UserSession userSession = new UserSession(this.kyuriBoard.getUserByUserId(userForm.getUser().getUserId())); + request.getSession().setAttribute("userSession", userSession); + + return super.onSubmit(request, response, command, errors); + } + + /* (non-Javadoc) + * @see org.springframework.web.servlet.mvc.AbstractFormController#formBackingObject(javax.servlet.http.HttpServletRequest) + */ + protected Object formBackingObject(HttpServletRequest request) throws Exception { + // TODO Auto-generated method stub + UserSession userSession = (UserSession) WebUtils.getSessionAttribute(request, "userSession"); + if (userSession != null) { + return new UserForm(this.kyuriBoard.getUserByUserId(userSession.getUser().getUserId())); + } else { + return new UserForm(); + } + } + + /* (non-Javadoc) + * @see org.springframework.web.servlet.mvc.BaseCommandController#onBindAndValidate(javax.servlet.http.HttpServletRequest, java.lang.Object, org.springframework.validation.BindException) + */ + protected void onBindAndValidate(HttpServletRequest request, Object command, BindException errors) throws Exception { + // TODO Auto-generated method stub + UserForm userForm = (UserForm) command; + User user = userForm.getUser(); + + if (user.getUserName() != null) { + user.setUserName(new String(user.getUserName().getBytes("8859_1"), "euc-kr")); + } + + if (logger.isDebugEnabled()) { + logger.debug("userName : " + user.getUserName()); + } + + errors.setNestedPath("user"); + getValidator().validate(user, errors); + errors.setNestedPath(""); + + // 부가적인 유효성 검증 + if (userForm.isNewUser()) { + ValidationUtils.rejectIfEmpty(errors, "user.userId", "USERID_REQUIRED", "회원ID가 필요합니다"); + if (user.getPasswd() == null || user.getPasswd().length() < 1 || + !user.getPasswd().equals(userForm.getRepeatedPasswd())) { + errors.reject("PASSWD_MISMATCH", "비밀번호가 존재하지 않거나 맞지 않습니다."); + } + } else if (user.getPasswd() != null && user.getPasswd().length() > 0) { + if (!user.getPasswd().equals(userForm.getRepeatedPasswd())) { + errors.reject("PASSWD_MISMATCH", "비밀번호가 존재하지 않거나 맞지 않습니다"); + } + } + + if (user.getPasswd() != null && user.getPasswd().length() < 4) { + errors.reject("PASSWD_TOO_SHORT", "비밀번호는 최소 4자리 이상이어야 합니다"); + } + + if (userForm.getRepeatedPasswd() != null && userForm.getRepeatedPasswd().length() < 4) { + errors.reject("REPEATEDPASSWD_TOO_SHORT", "확인 비밀번호는 최소 4자리 이상이어야 합니다"); + } + + if (user.getUserId() != null && user.getUserId().length() < 4) { + errors.reject("USERID_TOO_SHORT", "회원ID는 최소 4자리 이상이어야 합니다"); + } + + if (user.getUserName() != null && user.getUserName().length() < 2) { + errors.reject("USERNAME_TOO_SHORT", "회원 이름은 최소 2자리 이상이어야 합니다"); + } + + // 회원ID 영문 검사 + + // 이메일 검사 + String EMAIL_REGEXP = "/^[a-z0-9]+([_\\.-][a-z0-9]+)*@([a-z0-9]+([\\.-][a-z0-9]+)*)+\\.[a-z]{2,}$/i"; + Perl5Util perl5Util = new Perl5Util(); + if (!perl5Util.match(EMAIL_REGEXP, user.getEmail())) { + errors.reject("INVALID_EMAIL", "이메일 형식이 잘못되었습니다"); + } + + } + + + + + +} Index: /nextboard/src/org/springframework/samples/kyuriboard/web/spring/ViewBoardController.java =================================================================== --- /nextboard/src/org/springframework/samples/kyuriboard/web/spring/ViewBoardController.java (revision 3) +++ /nextboard/src/org/springframework/samples/kyuriboard/web/spring/ViewBoardController.java (revision 3) @@ -0,0 +1,61 @@ +/** + * + */ +package org.springframework.samples.kyuriboard.web.spring; + +import java.util.Map; +import java.util.HashMap; +import java.util.List; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.servlet.mvc.Controller; + +import org.springframework.samples.kyuriboard.domain.Board; +import org.springframework.samples.kyuriboard.domain.logic.KyuriBoardFacade; + +/** + * @author DAMI(archy712@naver.com) + * + */ +public class ViewBoardController implements Controller { + + private KyuriBoardFacade kyuriBoard; + + /** + * @param kyuriBoard the kyuriBoard to set + */ + public void setKyuriBoard(KyuriBoardFacade kyuriBoard) { + this.kyuriBoard = kyuriBoard; + } + + + /* (non-Javadoc) + * @see org.springframework.web.servlet.mvc.Controller#handleRequest(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) + */ + public ModelAndView handleRequest(HttpServletRequest request, + HttpServletResponse response) throws Exception { + // TODO Auto-generated method stub + + int boardId = new Integer(request.getParameter("boardId")).intValue(); + Board board = this.kyuriBoard.getBoardByBoardId(boardId); + + // 조회수 증가 + int curVisited = board.getVisited(); + board.setVisited(curVisited + 1); + this.kyuriBoard.updateBoard(board); + + // 메모 객체 + List memoList = this.kyuriBoard.getMemoListByBoardId(boardId); + + // 모델 객체 생성 + Map model = new HashMap(); + model.put("board", board); + model.put("memoList", memoList); + + return new ModelAndView("viewBoard", model); + } + +} Index: /nextboard/src/org/springframework/samples/kyuriboard/web/spring/ListBoardController.java =================================================================== --- /nextboard/src/org/springframework/samples/kyuriboard/web/spring/ListBoardController.java (revision 3) +++ /nextboard/src/org/springframework/samples/kyuriboard/web/spring/ListBoardController.java (revision 3) @@ -0,0 +1,149 @@ +/** + * + */ +package org.springframework.samples.kyuriboard.web.spring; + +import java.util.Map; +import java.util.HashMap; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.springframework.beans.support.PagedListHolder; +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.servlet.mvc.Controller; +import org.springframework.samples.kyuriboard.domain.logic.KyuriBoardFacade; + +import org.apache.log4j.Logger; + +/** + * @author DAMI(archy712@naver.com) + * + */ +public class ListBoardController implements Controller { + + protected Logger logger = Logger.getLogger(getClass()); + + private String successView; + + // List화면인지 Search화면인지 구분하는 변수 + private String mode; + + private KyuriBoardFacade kyuriBoard; + + /** + * + * @param mode the mode to set + */ + public void setMode(String mode) { + this.mode = mode; + } + + /** + * + * @param successView + */ + public void setSuccessView(String successView) { + this.successView = successView; + } + + /** + * + * @param kyuriBoard + */ + public void setKyuriBoard(KyuriBoardFacade kyuriBoard) { + this.kyuriBoard = kyuriBoard; + } + + /* (non-Javadoc) + * @see org.springframework.web.servlet.mvc.Controller#handleRequest(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) + */ + public ModelAndView handleRequest(HttpServletRequest request, + HttpServletResponse response) throws Exception { + // TODO Auto-generated method stub + + Map model = new HashMap(); + String page = request.getParameter("page"); + String searchKey = request.getParameter("searchKey"); + String searchVal = request.getParameter("searchVal"); + + if (logger.isInfoEnabled()) { + logger.info("searchKey : " + searchKey); + logger.info("searchVal : " + searchVal); + } + + if (searchVal != null) { + searchVal = new String(searchVal.getBytes("8859_1"), "euc-kr"); // 톰캣 문자열 처리 + } + + //System.out.println("searchKey : " + searchKey); + //System.out.println("searchVal : " + searchVal); + + model.put("searchKey", searchKey); + model.put("searchVal", searchVal); + + if (page == null) { + page = "1"; + } + + // 현재 페이지에 해당하는 게시물 리스트만 담음 + PagedListHolder boardList = null; + if ("search".equals(this.mode)) { + if ("writer".equals(searchKey)) { + boardList = new PagedListHolder(this.kyuriBoard.getBoardListByUserName(searchVal)); + } else { + boardList = new PagedListHolder(this.kyuriBoard.getBoardListByTitle(searchVal)); + } + } else { + boardList = new PagedListHolder(this.kyuriBoard.getBoardList()); + } + boardList.setPageSize(20); // 한 페이지의 레코드 수 20 개 + boardList.setPage(new Integer(page).intValue() - 1); // PagedListHolder는 인덱스가 0부터 시작 + model.put("boardList", boardList); + + // 페이지 바로 가기 + int pagedGroup = 10; + int nPage = new Integer(page).intValue(); // 현재 페이지를 정수형을 변환 + int pagedLoop = pagedGroup; // 페이지를 Loop 돌릴 MAX 페이지 설정 + if (pagedLoop > boardList.getPageCount()) { + pagedLoop = boardList.getPageCount(); // 페이지 Loop 변수가 전제 페이지 갯수보다 클 경우 보정 + } + String deli = new String(" "); // 구분자 + StringBuffer sb = new StringBuffer(); + + if ((boardList.getPageCount() > pagedGroup) && (nPage > pagedGroup)) { + sb.append(""); + sb.append("[이전 " + pagedGroup + "개]"); + sb.append(""); + sb.append(deli); + } + + for (int i = 0; i < pagedLoop; i++) { + sb.append(""); + sb.append(i + 1); + sb.append(""); + sb.append(deli); + } + + if ((boardList.getPageCount() > pagedGroup) && (nPage < pagedGroup)) { + sb.append(""); + sb.append("[다음 " + pagedGroup + "개]"); + sb.append(""); + } + model.put("pagedLink", sb.toString()); // 모델 객체에 삽입 + + return new ModelAndView(this.successView, model); + } + +} Index: /nextboard/src/org/springframework/samples/kyuriboard/web/spring/BoardForm.java =================================================================== --- /nextboard/src/org/springframework/samples/kyuriboard/web/spring/BoardForm.java (revision 3) +++ /nextboard/src/org/springframework/samples/kyuriboard/web/spring/BoardForm.java (revision 3) @@ -0,0 +1,55 @@ +/** + * + */ +package org.springframework.samples.kyuriboard.web.spring; + +import java.io.Serializable; + +import org.springframework.samples.kyuriboard.domain.Board; + +/** + * @author DAMI(archy712@naver.com) + * + */ +public class BoardForm implements Serializable { + + /** + * 직렬화 변수 + */ + private static final long serialVersionUID = 1L; + + private Board board; + + private boolean newBoard; + + /** + * Default Constructor + * + */ + public BoardForm() { + this.board = new Board(); + this.newBoard = true; + } + + public BoardForm(Board board) { + this.board = board; + this.newBoard = false; + } + + /** + * @return the board + */ + public Board getBoard() { + return board; + } + + /** + * @return the newBoard + */ + public boolean isNewBoard() { + return newBoard; + } + + + +} Index: /nextboard/src/org/springframework/samples/kyuriboard/web/spring/LogonInterceptor.java =================================================================== --- /nextboard/src/org/springframework/samples/kyuriboard/web/spring/LogonInterceptor.java (revision 3) +++ /nextboard/src/org/springframework/samples/kyuriboard/web/spring/LogonInterceptor.java (revision 3) @@ -0,0 +1,43 @@ +/** + * + */ +package org.springframework.samples.kyuriboard.web.spring; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.servlet.ModelAndViewDefiningException; +import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; +import org.springframework.web.util.WebUtils; + +/** + * @author DAMI(archy712@naver.com) + * + */ +public class LogonInterceptor extends HandlerInterceptorAdapter { + + /* (non-Javadoc) + * @see org.springframework.web.servlet.handler.HandlerInterceptorAdapter#preHandle(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, java.lang.Object) + */ + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object obj) throws Exception { + // TODO Auto-generated method stub + UserSession userSession = (UserSession) WebUtils.getSessionAttribute(request, "userSession"); + if (userSession == null) { + String url = request.getServletPath(); + String query = request.getQueryString(); + ModelAndView modelAndView = new ModelAndView("logonForm"); + if (query != null) { + modelAndView.addObject("logonForwardAction", url + "?" + query); + } else { + modelAndView.addObject("logonForwardAction", url); + } + throw new ModelAndViewDefiningException(modelAndView); + } else { + return true; + } + } + + + +} Index: /nextboard/src/org/springframework/samples/kyuriboard/web/spring/LogoutController.java =================================================================== --- /nextboard/src/org/springframework/samples/kyuriboard/web/spring/LogoutController.java (revision 3) +++ /nextboard/src/org/springframework/samples/kyuriboard/web/spring/LogoutController.java (revision 3) @@ -0,0 +1,39 @@ +/** + * + */ +package org.springframework.samples.kyuriboard.web.spring; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.servlet.mvc.Controller; + +/** + * @author DAMI(archy712@naver.com) + * + */ +public class LogoutController implements Controller { + + private String successView; + + /** + * @param successView the successView to set + */ + public void setSuccessView(String successView) { + this.successView = successView; + } + + + /* (non-Javadoc) + * @see org.springframework.web.servlet.mvc.Controller#handleRequest(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) + */ + public ModelAndView handleRequest(HttpServletRequest request, + HttpServletResponse response) throws Exception { + // TODO Auto-generated method stub + request.getSession().removeAttribute("userSession"); + request.getSession().invalidate(); + return new ModelAndView(this.successView); + } + +} Index: /nextboard/src/org/springframework/samples/kyuriboard/web/spring/DeleteBoardController.java =================================================================== --- /nextboard/src/org/springframework/samples/kyuriboard/web/spring/DeleteBoardController.java (revision 3) +++ /nextboard/src/org/springframework/samples/kyuriboard/web/spring/DeleteBoardController.java (revision 3) @@ -0,0 +1,52 @@ +/** + * + */ +package org.springframework.samples.kyuriboard.web.spring; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.servlet.mvc.Controller; + +import org.springframework.samples.kyuriboard.domain.logic.KyuriBoardFacade; + +/** + * @author DAMI(archy712@naver.com) + * + */ +public class DeleteBoardController implements Controller { + + private KyuriBoardFacade kyuriBoard; + + private String successView; + + /** + * @param kyuriBoard the kyuriBoard to set + */ + public void setKyuriBoard(KyuriBoardFacade kyuriBoard) { + this.kyuriBoard = kyuriBoard; + } + + + /** + * @param successView the successView to set + */ + public void setSuccessView(String successView) { + this.successView = successView; + } + + + /* (non-Javadoc) + * @see org.springframework.web.servlet.mvc.Controller#handleRequest(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) + */ + public ModelAndView handleRequest(HttpServletRequest request, + HttpServletResponse response) throws Exception { + // TODO Auto-generated method stub + int boardId = new Integer(request.getParameter("boardId")).intValue(); + this.kyuriBoard.deleteBoard(boardId); + this.kyuriBoard.deleteMemoByBoardId(boardId); + return new ModelAndView(this.successView); + } + +} Index: /nextboard/WebContent/META-INF/MANIFEST.MF =================================================================== --- /nextboard/WebContent/META-INF/MANIFEST.MF (revision 3) +++ /nextboard/WebContent/META-INF/MANIFEST.MF (revision 3) @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Class-Path: + Index: /nextboard/WebContent/WEB-INF/kyuriboard-ibatis.xml =================================================================== --- /nextboard/WebContent/WEB-INF/kyuriboard-ibatis.xml (revision 3) +++ /nextboard/WebContent/WEB-INF/kyuriboard-ibatis.xml (revision 3) @@ -0,0 +1,62 @@ + + + + + + + + + + WEB-INF/jdbc.properties + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Index: /nextboard/WebContent/WEB-INF/kyuriboard-service.xml =================================================================== --- /nextboard/WebContent/WEB-INF/kyuriboard-service.xml (revision 3) +++ /nextboard/WebContent/WEB-INF/kyuriboard-service.xml (revision 3) @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Index: /nextboard/WebContent/WEB-INF/log4j.properties =================================================================== --- /nextboard/WebContent/WEB-INF/log4j.properties (revision 3) +++ /nextboard/WebContent/WEB-INF/log4j.properties (revision 3) @@ -0,0 +1,18 @@ +# FATAL > ERROR > WARN > INFO > DEBUG +log4j.rootCategory=INFO, stdout +log4j.logger.org.springframework.samples.kyuriboard=INFO, kyuriboard + +# ---------------------------------------------------------------------- +# Configure stdout appender - set layout +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss}]\t%p\t[%F.%M():%L]\t%m%n + +# ---------------------------------------------------------------------- +log4j.appender.kyuriboard=org.apache.log4j.DailyRollingFileAppender +log4j.appender.kyuriboard.File=C:\\tkwoo\\kyuriboard.log +log4j.appender.kyuriboard.Append=true +log4j.appender.kyuriboard.DatePattern='.'yyyy-MM-dd +log4j.appender.kyuriboard.layout=org.apache.log4j.PatternLayout +log4j.appender.kyuriboard.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss}]\t%p\t[%F.%M():%L]\t%m%n +# ---------------------------------------------------------------------- Index: /nextboard/WebContent/WEB-INF/jsp/spring/insertBoardSuccess.jsp =================================================================== --- /nextboard/WebContent/WEB-INF/jsp/spring/insertBoardSuccess.jsp (revision 3) +++ /nextboard/WebContent/WEB-INF/jsp/spring/insertBoardSuccess.jsp (revision 3) @@ -0,0 +1,15 @@ +<%@ include file="header.jsp" %> +<%@ page contentType="text/html; charset=euc-kr" %> + +

+ + + + + + + +
글 입력 성공!
">게시물 리스트
+ + +<%@ include file="footer.jsp" %> Index: /nextboard/WebContent/WEB-INF/jsp/spring/editBoardSuccess.jsp =================================================================== --- /nextboard/WebContent/WEB-INF/jsp/spring/editBoardSuccess.jsp (revision 3) +++ /nextboard/WebContent/WEB-INF/jsp/spring/editBoardSuccess.jsp (revision 3) @@ -0,0 +1,15 @@ +<%@ include file="header.jsp" %> +<%@ page contentType="text/html; charset=euc-kr" %> + +

+ + + + + + + +
글 수정 성공!
">게시물 리스트
+ + +<%@ include file="footer.jsp" %> Index: /nextboard/WebContent/WEB-INF/jsp/spring/index.jsp =================================================================== --- /nextboard/WebContent/WEB-INF/jsp/spring/index.jsp (revision 3) +++ /nextboard/WebContent/WEB-INF/jsp/spring/index.jsp (revision 3) @@ -0,0 +1,15 @@ +<%@ include file="header.jsp" %> +<%@ page contentType="text/html; charset=euc-kr" %> + +

+ + + + + + + +
SPRING SAMPLE PROJECT
">게시물 리스트
+ + +<%@ include file="footer.jsp" %> Index: /nextboard/WebContent/WEB-INF/jsp/spring/header.jsp =================================================================== --- /nextboard/WebContent/WEB-INF/jsp/spring/header.jsp (revision 3) +++ /nextboard/WebContent/WEB-INF/jsp/spring/header.jsp (revision 3) @@ -0,0 +1,34 @@ +<%@ page contentType="text/html; charset=euc-kr" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt" %> + + + + + +SPRING SAMPLE PROJECT 테스트 + + + + + + + + + + + + + + +
+ SPRING SAMPLE PROJECT. + + + [">로그아웃 | ]님 어서오세요~ + + + [">회원가입 | ">로그인] + +
+
Index: /nextboard/WebContent/WEB-INF/jsp/spring/error.jsp =================================================================== --- /nextboard/WebContent/WEB-INF/jsp/spring/error.jsp (revision 3) +++ /nextboard/WebContent/WEB-INF/jsp/spring/error.jsp (revision 3) @@ -0,0 +1,15 @@ +<%@ include file="header.jsp" %> +<%@ page contentType="text/html; charset=euc-kr" %> + +

+ + + + + + + +
Error!
+ + +<%@ include file="footer.jsp" %> Index: /nextboard/WebContent/WEB-INF/jsp/spring/logout.jsp =================================================================== --- /nextboard/WebContent/WEB-INF/jsp/spring/logout.jsp (revision 3) +++ /nextboard/WebContent/WEB-INF/jsp/spring/logout.jsp (revision 3) @@ -0,0 +1,15 @@ +<%@ include file="header.jsp" %> +<%@ page contentType="text/html; charset=euc-kr" %> + +

+ + + + + + + +
로그아웃 성공!
">게시물 리스트
+ + +<%@ include file="footer.jsp" %> Index: /nextboard/WebContent/WEB-INF/jsp/spring/boardForm.jsp =================================================================== --- /nextboard/WebContent/WEB-INF/jsp/spring/boardForm.jsp (revision 3) +++ /nextboard/WebContent/WEB-INF/jsp/spring/boardForm.jsp (revision 3) @@ -0,0 +1,78 @@ +<%@ include file="header.jsp" %> +<%@ page contentType="text/html; charset=euc-kr" %> +<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> + + + + +
+ + +
.
+
+
+
+ + +
" method="POST"> + + +" method="POST"> + + + + + + + + + + + + + + + + + + + + + +
+ + 글 쓰기 + + + 글 수정 + +
제 목 + + " value="" size="60" maxlength="60"/> + +
HTML 사용 여부 + + + +
내 용 + + + +
+ [ + ">저장 | + ">리스트 + ] +
+ +
+ +<%@ include file="footer.jsp" %> Index: /nextboard/WebContent/WEB-INF/jsp/spring/deleteSuccess.jsp =================================================================== --- /nextboard/WebContent/WEB-INF/jsp/spring/deleteSuccess.jsp (revision 3) +++ /nextboard/WebContent/WEB-INF/jsp/spring/deleteSuccess.jsp (revision 3) @@ -0,0 +1,15 @@ +<%@ include file="header.jsp" %> +<%@ page contentType="text/html; charset=euc-kr" %> + +

+ + + + + + + +
글 삭제 성공!
">게시물 리스트
+ + +<%@ include file="footer.jsp" %> Index: /nextboard/WebContent/WEB-INF/jsp/spring/insertUserSuccess.jsp =================================================================== --- /nextboard/WebContent/WEB-INF/jsp/spring/insertUserSuccess.jsp (revision 3) +++ /nextboard/WebContent/WEB-INF/jsp/spring/insertUserSuccess.jsp (revision 3) @@ -0,0 +1,15 @@ +<%@ include file="header.jsp" %> +<%@ page contentType="text/html; charset=euc-kr" %> + +

+ + + + + + + +
회원가입 성공!
">게시물 리스트
+ + +<%@ include file="footer.jsp" %> Index: /nextboard/WebContent/WEB-INF/jsp/spring/footer.jsp =================================================================== --- /nextboard/WebContent/WEB-INF/jsp/spring/footer.jsp (revision 3) +++ /nextboard/WebContent/WEB-INF/jsp/spring/footer.jsp (revision 3) @@ -0,0 +1,20 @@ +<%@ page contentType="text/html; charset=euc-kr" %> +

 

+
+ + + + + +
+ Powered by the Spring Framework + + Powered by iBATIS +
+ +

+ (운영환경 : spring 2.0 + ibatis 2.0 + tomcat 5.0.28 + mysql 5.0.27 + jdk 1.4.13) +

+ + + Index: /nextboard/WebContent/WEB-INF/jsp/spring/logonForm.jsp =================================================================== --- /nextboard/WebContent/WEB-INF/jsp/spring/logonForm.jsp (revision 3) +++ /nextboard/WebContent/WEB-INF/jsp/spring/logonForm.jsp (revision 3) @@ -0,0 +1,39 @@ +<%@ include file="header.jsp" %> +<%@ page contentType="text/html; charset=euc-kr" %> + + + + + +
" method="POST"> + + + "/> + + + + + + + + + + + + + + + + + +
+ 로그인 +
회원ID :
비밀번호 :
+ +
+ +
+">회원가입 +
+ +<%@ include file="footer.jsp" %> Index: /nextboard/WebContent/WEB-INF/jsp/spring/userForm.jsp =================================================================== --- /nextboard/WebContent/WEB-INF/jsp/spring/userForm.jsp (revision 3) +++ /nextboard/WebContent/WEB-INF/jsp/spring/userForm.jsp (revision 3) @@ -0,0 +1,95 @@ +<%@ include file="header.jsp" %> +<%@ page contentType="text/html; charset=euc-kr" %> +<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> + + + + +
+ + +
.
+
+
+
+ + +
" method="POST"> + + +" method="POST"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + 회원 가입 + + + 회원 수정 + +
회원 ID + + + " value="" size="10" maxlength="10"/> + + + + + +
비밀번호 + + " value="" size="10" maxlength="10"/> + +
비밀번호 확인 + + " value="" size="10" maxlength="10"/> + +
이름 + + " value="" size="10" maxlength="10"/> + +
이메일 + + " value="" size="40" maxlength="50"/> + +
+ [ + ">저장 | + ">리스트 + ] +
+ +
+ +<%@ include file="footer.jsp" %> Index: /nextboard/WebContent/WEB-INF/jsp/spring/viewBoard.jsp =================================================================== --- /nextboard/WebContent/WEB-INF/jsp/spring/viewBoard.jsp (revision 3) +++ /nextboard/WebContent/WEB-INF/jsp/spring/viewBoard.jsp (revision 3) @@ -0,0 +1,98 @@ +<%@ include file="header.jsp" %> +<%@ page contentType="text/html; charset=euc-kr" %> +<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> + + + + + + + + + + + + + + + + + + + + + + + + + + + +
제 목
작성일작성자
조회수추천수
내 용
+ [ ">리스트 ] + [ ">글추천 ] + + [ ">글삭제 ] + + + [ 글삭제 ] + + + [ ">글수정 ] + + + [ 글수정 ] + +
+ +
+ +
+"> + + + + + + + + + + +
메모[ ">저장 ]
+ + + + + + +
+ () + ... + + [ ">삭제 ] + + + [ 삭제 ] + +
+
+
+ + +<%@ include file="footer.jsp" %> Index: /nextboard/WebContent/WEB-INF/jsp/spring/listBoard.jsp =================================================================== --- /nextboard/WebContent/WEB-INF/jsp/spring/listBoard.jsp (revision 3) +++ /nextboard/WebContent/WEB-INF/jsp/spring/listBoard.jsp (revision 3) @@ -0,0 +1,57 @@ +<%@ include file="header.jsp" %> +<%@ page contentType="text/html; charset=euc-kr" %> + + + + + + + + + + +
+ + value=""/> + + [총 글수 : ] [페이지 : /] + ">[글쓰기]
+ + + + + + + + + + + + + + + + + + + + + +
번 호제 목작 성 자작 성 일조 회
+ + "> + + + + +
+ +<%@ include file="footer.jsp" %> Index: /nextboard/WebContent/WEB-INF/kyuriboard-servlet.xml =================================================================== --- /nextboard/WebContent/WEB-INF/kyuriboard-servlet.xml (revision 3) +++ /nextboard/WebContent/WEB-INF/kyuriboard-servlet.xml (revision 3) @@ -0,0 +1,122 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Index: /nextboard/WebContent/WEB-INF/sql-map-config.xml =================================================================== --- /nextboard/WebContent/WEB-INF/sql-map-config.xml (revision 3) +++ /nextboard/WebContent/WEB-INF/sql-map-config.xml (revision 3) @@ -0,0 +1,10 @@ + + + + + + + + + Index: /nextboard/WebContent/WEB-INF/web.xml =================================================================== --- /nextboard/WebContent/WEB-INF/web.xml (revision 3) +++ /nextboard/WebContent/WEB-INF/web.xml (revision 3) @@ -0,0 +1,49 @@ + + + + + + + KyuriBoard + + Simple application by Spring + + + log4jConfigLocation + /WEB-INF/log4j.properties + + + + contextConfigLocation + + /WEB-INF/kyuriboard-ibatis.xml + /WEB-INF/kyuriboard-service.xml + + + + + org.springframework.web.util.Log4jConfigListener + + + + org.springframework.web.context.ContextLoaderListener + + + + kyuriboard + org.springframework.web.servlet.DispatcherServlet + 2 + + + + kyuriboard + *.do + + + + index.html + + + Index: /nextboard/WebContent/WEB-INF/jdbc.properties =================================================================== --- /nextboard/WebContent/WEB-INF/jdbc.properties (revision 3) +++ /nextboard/WebContent/WEB-INF/jdbc.properties (revision 3) @@ -0,0 +1,6 @@ +jdbc.driverClassName=org.gjt.mm.mysql.Driver +jdbc.url=jdbc:mysql://221.150.127.106:3306/kyuriboard +jdbc.username=root +jdbc.password=apmsetup + +hibernate.dialect=org.hibernate.dialect.MySQLDialect Index: /nextboard/WebContent/css/style.css =================================================================== --- /nextboard/WebContent/css/style.css (revision 3) +++ /nextboard/WebContent/css/style.css (revision 3) @@ -0,0 +1,46 @@ +body { + background-color : white; + font-family : 굴림; + font-size : 9pt; +} + +.table_default { + font-family : 굴림; + font-size : 9pt; + color : #000000; +} + +.list_menu { + height : 30; + background-color : #FFFFFF; + font-family : 굴림; + font-size : 9pt; + color : #000000; +} + +.list_title { + height : 30; + background-color : #7B869A; + font-family : 굴림; + font-size : 9pt; + font-weight : bold; + color : #FFFFFF; + text-align : center; +} + +.list_content { + height : 25; + background-color : #FFFFFF; + font-family : 굴림; + font-size : 9pt; + color : #000000; +} + +.list_page { + height : 30; + background-color : #FFFFFF; + font-family : 굴림; + font-size : 9pt; + color : #000000; + text-align : center; +} Index: /nextboard/WebContent/index.html =================================================================== --- /nextboard/WebContent/index.html (revision 3) +++ /nextboard/WebContent/index.html (revision 3) @@ -0,0 +1,7 @@ + + +KBOARD SAMPLES + +스프링 게시판 + + Index: /nextboard/.settings/org.eclipse.jdt.core.prefs =================================================================== --- /nextboard/.settings/org.eclipse.jdt.core.prefs (revision 3) +++ /nextboard/.settings/org.eclipse.jdt.core.prefs (revision 3) @@ -0,0 +1,7 @@ +#Sun Aug 30 02:16:13 KST 2009 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.6 Index: /nextboard/.settings/org.eclipse.wst.jsdt.ui.superType.name =================================================================== --- /nextboard/.settings/org.eclipse.wst.jsdt.ui.superType.name (revision 3) +++ /nextboard/.settings/org.eclipse.wst.jsdt.ui.superType.name (revision 3) @@ -0,0 +1,1 @@ +Window Index: /nextboard/.settings/org.eclipse.wst.jsdt.ui.superType.container =================================================================== --- /nextboard/.settings/org.eclipse.wst.jsdt.ui.superType.container (revision 3) +++ /nextboard/.settings/org.eclipse.wst.jsdt.ui.superType.container (revision 3) @@ -0,0 +1,1 @@ +org.eclipse.wst.jsdt.launching.baseBrowserLibrary Index: /nextboard/.settings/org.eclipse.wst.common.project.facet.core.xml =================================================================== --- /nextboard/.settings/org.eclipse.wst.common.project.facet.core.xml (revision 3) +++ /nextboard/.settings/org.eclipse.wst.common.project.facet.core.xml (revision 3) @@ -0,0 +1,7 @@ + + + + + + + Index: /nextboard/.settings/.jsdtscope =================================================================== --- /nextboard/.settings/.jsdtscope (revision 3) +++ /nextboard/.settings/.jsdtscope (revision 3) @@ -0,0 +1,11 @@ + + + + + + + + + + + Index: /nextboard/.settings/org.eclipse.wst.common.component =================================================================== --- /nextboard/.settings/org.eclipse.wst.common.component (revision 3) +++ /nextboard/.settings/org.eclipse.wst.common.component (revision 3) @@ -0,0 +1,9 @@ + + + + + + + + +