public class BoardService { private static BoardService instance = new BoardService(); private BoardDAO dao; private BoardService(){ dao = BoardDAO.getInstance(); } public static BoardService getInstance(){ return instance; } public void writeContent(BoardDTO bto)throws SQLException{ /* * 1. bto에 property 설정 - no, writedate, content * no - sequence의 값 - dao.selectBoardNO(); * writedate - Utilities.getNow(); * content를 DB에 넣는 용으로 변경 Utilities.changeContentForDB(); * bdto의 refamily에 no 값을 설정 * 2. dao.insertContent(bto); * 3. 날짜 형태를 년.월.일 시:분:초 형태로 변경 - bto의 property 변경 * Utilities.changeDayTimeFormat(); */ //1 int no = dao.selectBoardNo(); String writedate = Utilities.getNow(); bto.setNo(no); bto.setWritedate(writedate); bto.setContent(Utilities.changeContentForDB(bto.getContent())); bto.setRefamily(no); //2 dao.insertContent(bto); //3 bto.setWritedate(Utilities.changeDayTimeFormat(writedate)); } //글목록 public ArrayList<BoardDTO> getBoardAllList() throws SQLException{ //1. dao로 부터 전체 글내용을 ArrayList로 조회 ArrayList<BoardDTO> list_all = dao.selectBoardAllList(); //2. list내의 BoardDTO객체들의 wrtiedate를 변경 for(int i=0;i<list_all.size();i++){ list_all.get(i).setWritedate(Utilities.changeDayFormat(list_all.get(i).getWritedate())); } return list_all; } public BoardDTO getContentByNO(int no) throws SQLException{
//1.조회수 증가 dao.updateViewCount(no); //2. no로 글 정보 조회 BoardDTO bto = dao.selectContentByNO(no); //2-1 writedate를 yyy.MM.dd HH:mm:ss 형식으로 변경 bto.setWritedate(Utilities.changeDayTimeFormat(bto.getWritedate()));
return bto; } public BoardDTO getContentByNOForForm(int no)throws SQLException{ //1. no값으로 글 조회 BoardDTO bto = dao.selectContentByNO(no); //2. content를 textarea용으로 변경(DB용으로 바뀌어 있는 것을 HTML용으로 변경) bto.setContent(Utilities.changeContentForTextArea(bto.getContent())); System.out.println("가져올때-----------\n"+bto.getContent()); return bto; } public void modifyContent(BoardDTO bto)throws SQLException { //1. property변경 - content, writedate bto.setWritedate(Utilities.getNow()); bto.setContent(Utilities.changeContentForDB(bto.getContent())); //2. 수정처리 dao.updateContent(bto); //3. 날짜 포멧 변경 bto.setWritedate(Utilities.changeDayTimeFormat(Utilities.getNow()));
}
public void deleteContentByNO(int no)throws SQLException{ dao.deleteContentByNO(no);
public class BoardService { private static BoardService instance = new BoardService(); private BoardDAO dao; private BoardService(){ dao = BoardDAO.getInstance(); } public static BoardService getInstance(){ return instance; } public void writeContent(BoardDTO bto)throws SQLException{ /* * 1. bto에 property 설정 - no, writedate, content * no - sequence의 값 - dao.selectBoardNO(); * writedate - Utilities.getNow(); * content를 DB에 넣는 용으로 변경 Utilities.changeContentForDB(); * bdto의 refamily에 no 값을 설정 * 2. dao.insertContent(bto); * 3. 날짜 형태를 년.월.일 시:분:초 형태로 변경 - bto의 property 변경 * Utilities.changeDayTimeFormat(); */ //1 int no = dao.selectBoardNo(); String writedate = Utilities.getNow(); bto.setNo(no); bto.setWritedate(writedate); bto.setContent(Utilities.changeContentForDB(bto.getContent())); bto.setRefamily(no); //2 dao.insertContent(bto); //3 bto.setWritedate(Utilities.changeDayTimeFormat(writedate)); } //글목록 public ArrayList<BoardDTO> getBoardAllList() throws SQLException{ //1. dao로 부터 전체 글내용을 ArrayList로 조회 ArrayList<BoardDTO> list_all = dao.selectBoardAllList(); //2. list내의 BoardDTO객체들의 wrtiedate를 변경 for(int i=0;i<list_all.size();i++){ list_all.get(i).setWritedate(Utilities.changeDayFormat(list_all.get(i).getWritedate())); } return list_all; } public BoardDTO getContentByNO(int no) throws SQLException{
//1.조회수 증가 dao.updateViewCount(no); //2. no로 글 정보 조회 BoardDTO bto = dao.selectContentByNO(no); //2-1 writedate를 yyy.MM.dd HH:mm:ss 형식으로 변경 bto.setWritedate(Utilities.changeDayTimeFormat(bto.getWritedate()));
return bto; } public BoardDTO getContentByNOForForm(int no)throws SQLException{
public class BoardService { private static BoardService instance = new BoardService(); private BoardDAO dao; private BoardService(){ dao = BoardDAO.getInstance(); } public static BoardService getInstance(){ return instance; } public void writeContent(BoardDTO bto)throws SQLException{ /* * 1. bto에 property 설정 - no, writedate, content * no - sequence의 값 - dao.selectBoardNO(); * writedate - Utilities.getNow(); * content를 DB에 넣는 용으로 변경 Utilities.changeContentForDB(); * bdto의 refamily에 no 값을 설정 * 2. dao.insertContent(bto); * 3. 날짜 형태를 년.월.일 시:분:초 형태로 변경 - bto의 property 변경 * Utilities.changeDayTimeFormat(); */ //1 int no = dao.selectBoardNo(); String writedate = Utilities.getNow(); bto.setNo(no); bto.setWritedate(writedate); bto.setContent(Utilities.changeContentForDB(bto.getContent())); bto.setRefamily(no); //2 dao.insertContent(bto); //3 bto.setWritedate(Utilities.changeDayTimeFormat(writedate)); } //글목록 public ArrayList<BoardDTO> getBoardAllList() throws SQLException{ //1. dao로 부터 전체 글내용을 ArrayList로 조회 ArrayList<BoardDTO> list_all = dao.selectBoardAllList(); //2. list내의 BoardDTO객체들의 wrtiedate를 변경 for(int i=0;i<list_all.size();i++){ list_all.get(i).setWritedate(Utilities.changeDayFormat(list_all.get(i).getWritedate())); } return list_all; } public BoardDTO getContentByNO(int no) throws SQLException{
//1.조회수 증가 dao.updateViewCount(no); //2. no로 글 정보 조회 BoardDTO bto = dao.selectContentByNO(no); //2-1 writedate를 yyy.MM.dd HH:mm:ss 형식으로 변경 bto.setWritedate(Utilities.changeDayTimeFormat(bto.getWritedate()));
return bto; } public BoardDTO getContentByNOForForm(int no)throws SQLException{
public class WriteContentController implements Controller{
//controller에서는 클라이언트가 보낸 값을 읽어서 비지니스 로직단에 넘겨주고, 비지니스 서비스 쪽에서 DB에서 값을 얻어오고 초기 값을 설정해 준다. @Override public ForwardDTO execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1, client가 보낸 요청 파라미터 조회 String title = request.getParameter("title"); String writer = request.getParameter("writer"); String content = request.getParameter("content"); BoardDTO bto = new BoardDTO(title, writer, content); //2. 비지니스 로직 - Model(Business Service)로 요청 BoardService boardService = BoardService.getInstance(); ForwardDTO forwardDTO = null; try { boardService.writeContent(bto); request.setAttribute("board",bto); forwardDTO = new ForwardDTO("/show_content.jsp",false); } catch (SQLException e) { e.printStackTrace(); request.setAttribute("error_message", e.getMessage()); forwardDTO = new ForwardDTO("/error.jsp",false); }
return forwardDTO; }
}
* dto
package board.dto;
public class BoardDTO { private int no; private String title; private String writer; private String content; private String writedate; private int viewcount; private int refamily; private int restep; private int relevel; public BoardDTO() { super(); }
public class Utilities { //글목록에서 한페이지에 보여질 게시물의 개수 public static final int CONTENT_PER_PAGE = 10; //한 페이지 그룹으로 묶을 페이지의 개수 public static final int PAGE_PER_PAGEGROUP = 10; //생성자( Utilities객체의 메소드가 전부 static이어서 객체를 생성할 필요가 없어서 생성자를 private로 막았다. ) private Utilities(){
Date date = new Date(); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");//new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
return simpleDateFormat.format(date); } /** * 인수로 14자리 형태 일시를 받아 날짜만 yyyy.MM.dd 형태의 String으로 만들어 return * - 목록에서 작성일시를 보여줄때 사용할 메소드 * 예) 20120512100524 -> 2012.05.12 * @param dateTime * @return */ public static String changeDayFormat(String dateTime){
return dateTime.substring(0, 4)+"."+dateTime.substring(4, 6)+"."+dateTime.substring(6, 8); // SimpleDateFormat sf = new SimpleDateFormat("yyyy.MM.dd"); // String changeDay = sf.format(dateTime); //이렇게 하면 넘어오는 dateTime이 String값이어서 실행시점에 에러가 난다. sf.format(dateTime)의 dateTime은 Date객체가 들어가야 한다. // // return changeDay; } /** * 인수로 14자리 형태의 일시를 받아 yyyy.MM.dd HH:mm:ss 형태의 String으로 만들어 return * - 글 상세보기에서 사용할 메소드 * 예)20120512100524 -> 2012.05.12 10:05:24 * @param dateTime * @return */ public static String changeDayTimeFormat(String dateTime){
return dateTime.substring(0, 4)+"."+dateTime.substring(4, 6)+"."+dateTime.substring(6, 8)+" "+dateTime.substring(8, 10)+":"+dateTime.substring(10, 12)+":"+ dateTime.substring(12, 14); } /** * TextArea에서 입력 받은 글 내용을 HTML로 출력 될 때에 맞는 형식으로 변경하는 메소드 * 새글등록, 답변글등록, 글 수정시 사용 * > - > * < - < * \n - <br> * 공백 - */ public static String changeContentForDB(String content){ //변환 시 순서가 중요 String newContent = content.replaceAll(">", ">");
//3. 공통 사후 작업 if(fdto.isRedirect()){ response.sendRedirect(fdto.getUrl()); }else{ RequestDispatcher rdp = request.getRequestDispatcher(fdto.getUrl()); rdp.forward(request, response); } }
public class BoardDTO { private int no; private String title; private String writer; private String content; private String writedate; private int viewcount; private int refamily; private int restep; private int relevel; public BoardDTO() { super(); }
public class Utilities { //글목록에서 한페이지에 보여질 게시물의 개수 public static final int CONTENT_PER_PAGE = 10; //한 페이지 그룹으로 묶을 페이지의 개수 public static final int PAGE_PER_PAGEGROUP = 10; //생성자( Utilities객체의 메소드가 전부 static이어서 객체를 생성할 필요가 없어서 생성자를 private로 막았다. ) private Utilities(){
refamily : 원본글과 답변에 대한 그룹 묶음 restep : 같은 그룹끼리의 정렬(순서)을 관리 relevel : 답변에 대한 디자인을 처리하기위한 것(내가 답변하고자 하는 레벨+1(답변시 한칸씩 옆으로 밀리는 모습))
* [실습] dynamic web project name : board_fc lib : jstl 라이브러리 copy
File WebContent\WEB-INF\board.sql
* 게시판 생성시 필요한 컬럼 정보
테이블 - 게시판(board) 속성 no : number - primary key : 글번호 title : varchar2(150) - nut null : 글제목 writer : varchar2(30) - not null : 글작성자 content : varchar2(4000) - not null : 글내용 writedate : varchar2(14) - not null : 글작성(수정) 일시 (yyyyMMddHHmmss) viewcount : number - not null : 조회수(최초입력 : 0, 조회시마다 1씩 증가) ----------답변과 관련된 속성---------- refamily : number - not null : 원본글 기준으로 그 답변 글들을 묶은 그룹번호 기분글(최초 원본글) - 새로운 값(글번호) 답변글 : 답변하는 글의 refamily값 restep : number - not null : 같은 refamily로 묶인 글들 사이에서의 정렬 순서 기준글 : 0 답변글 : 답변하는 글의 restep값 + 1 relevel : number - not null : 답변 레벨 기준글 : 0 답변글 : 답변하는 글의 relevel + 1
시퀀스 - 게시판 글번호를 위한 자동증가 시퀀스 이름 : board_no_seq : 0~무한대, 1씩 증가
* table 생성 쿼리
create table board( no number, title varchar2(150) not null, writer varchar2(30) not null, content varchar2(4000) not null, writedate varchar2(14) not null, viewcount number not null, --답변과 관련된 속성 refamily number not null, restep number not null, relevel number not null, constraint board_pk primary key(no) ) select * from board; drop table board;
drop sequence board_no_seq; create sequence board_no_seq; select board_no_seq.nextval from dual;
public class LoginController implements Controller{ public ForwardDTO execute(HttpServletRequest request,HttpServletResponse response) throws Exception{ //1. 요청파라미터 조회
ForwardDTO forwardDTO = null; try { MemberDTO mto = memberManageService.getMemberById(id); //아이디가 맞는 경우 if(mto!=null){ //아이디가 맞고 비밀번호도 맞는 경우 if(mto.getPassword().equals(password)){ //세션으로 로그인 정보 넘기기 HttpSession httpSession = request.getSession(); httpSession.setAttribute("memberDTO", mto); forwardDTO = new ForwardDTO("/res/login_success.jsp", false); } else{//아이디는 맞고 비밀번호는 틀린경우
import member.dto.ForwardDTO; //FrontController 서블릿 public class MemberFrontController extends HttpServlet { private static final long serialVersionUID = 1L;
public MemberFrontController() { super(); // TODO Auto-generated constructor stub }
MemberDTO mdto = (MemberDTO) request.getAttribute("mdto"); //update 시 오류가 날수 있기 때문에 DB를 먼저 update 하고 session의 값을 바꿔 줘야 한다. memberManageService.modifyMember(mdto); mdto.setMileage(login_info.getMileage()); httpSession.setAttribute("memberDTO", mdto); forwardDTO = new ForwardDTO("/res/member_details.jsp", false);
package member.dto; //url값을 가지고 있는 DTO public class ForwardDTO { private String url; private boolean redirect;//true-리다이렉트, false - 요청디스패치 public ForwardDTO() { super(); // TODO Auto-generated constructor stub } public ForwardDTO(String url, boolean redirect) { super(); this.url = url; this.redirect = redirect; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public boolean isRedirect() { return redirect; } public void setRedirect(boolean redirect) { this.redirect = redirect; } @Override public String toString() { return "ForwardDTO [url=" + url + ", redirect=" + redirect + "]"; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + (redirect ? 1231 : 1237); result = prime * result + ((url == null) ? 0 : url.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; ForwardDTO other = (ForwardDTO) obj; if (redirect != other.redirect) return false; if (url == null) { if (other.url != null) return false; } else if (!url.equals(other.url)) return false; return true; }
}
package member.dto;
public class MemberDTO { private String id; private String password; private String name; private String registerNumber1; private String registerNumber2; private int mileage; public MemberDTO() { super(); } public MemberDTO(String id, String password, String name, String registerNumber1, String registerNumber2, int mileage) { super(); this.id = id; this.password = password; this.name = name; this.registerNumber1 = registerNumber1; this.registerNumber2 = registerNumber2; this.mileage = mileage; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getRegisterNumber1() { return registerNumber1; } public void setRegisterNumber1(String registerNumber1) { this.registerNumber1 = registerNumber1; } public String getRegisterNumber2() { return registerNumber2; } public void setRegisterNumber2(String registerNumber2) { this.registerNumber2 = registerNumber2; } public int getMileage() { return mileage; } public void setMileage(int mileage) { this.mileage = mileage; } @Override public String toString() { return "MemberDTO [id=" + id + ", password=" + password + ", name=" + name + ", registerNumber1=" + registerNumber1 + ", registerNumber2=" + registerNumber2 + ", mileage=" + mileage + "]"; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((id == null) ? 0 : id.hashCode()); result = prime * result + mileage; result = prime * result + ((name == null) ? 0 : name.hashCode()); result = prime * result + ((password == null) ? 0 : password.hashCode()); result = prime * result + ((registerNumber1 == null) ? 0 : registerNumber1.hashCode()); result = prime * result + ((registerNumber2 == null) ? 0 : registerNumber2.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; MemberDTO other = (MemberDTO) obj; if (id == null) { if (other.id != null) return false; } else if (!id.equals(other.id)) return false; if (mileage != other.mileage) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; if (password == null) { if (other.password != null) return false; } else if (!password.equals(other.password)) return false; if (registerNumber1 == null) { if (other.registerNumber1 != null) return false; } else if (!registerNumber1.equals(other.registerNumber1)) return false; if (registerNumber2 == null) { if (other.registerNumber2 != null) return false; } else if (!registerNumber2.equals(other.registerNumber2)) return false; return true; }
}
* exception
package member.exception;
public class DuplicatedIdException extends Exception{ public DuplicatedIdException(){} public DuplicatedIdException(String message){ super(message); } }
package member.exception;
public class DuplicatedRegisterNumberException extends Exception{ public DuplicatedRegisterNumberException(){} public DuplicatedRegisterNumberException(String message){ super(message); } }
//디비 관련과 커넥션을 만들어 놓은 클래스 //싱글톤 패턴을 사용해서 커넥션이 한번만 되도록 설정. public class DatabaseUtility { //싱글톤 패턴 - 생성자에서 DataSource객체를 생성해서 instance변수에 할당. private BasicDataSource dataSource; private static DatabaseUtility instance = new DatabaseUtility();
private DatabaseUtility(){ dataSource = new BasicDataSource();//객체 생성 //프라퍼티 설정 //1. 연결할 DB와 관련된 설정 dataSource.setDriverClassName("oracle.jdbc.driver.OracleDriver");//BasicDataSource를 사용하면 따로 드라이버 로딩을 해줄 필요가 없다. 바로 처리가능 dataSource.setUrl("jdbc:oracle:thin:@127.0.0.1:1521:XE"); dataSource.setUsername("scott"); dataSource.setPassword("tiger");
public class MemberManageService { //회원 관리 비지니스 로직을 처리하는 Business Service 클래스 private static MemberManageService instance = new MemberManageService(); private MemberDAO dao; private MemberManageService(){ dao = MemberDAO.getInstance(); } public static MemberManageService getInstance(){ return instance; } //가입 처리 메소드 public void registerMember(MemberDTO mto)throws SQLException, DuplicatedIdException, DuplicatedRegisterNumberException{
//1. 등록된 ID가 있는 지 체크 // - 이미 등록된 ID라면 DuplicatedIdException를 발생시킨다. if(dao.selectMemberById(mto.getId())!=null){ throw new DuplicatedIdException(mto.getId()+"는 이미등록된 아이디 입니다.");
} //2. 등록된 주민번호가 있는 지 체크 // - 이미 등록된 주민번호라면 DuplicatedRegisterNumberException 발생시킨다. if(dao.selectMemberByregisterNumber(mto.getRegisterNumber1(), mto.getRegisterNumber2())!=null){ throw new DuplicatedRegisterNumberException("는 이미 가입된 주민번호 입니다."); } //3. 디비에 회원정보 등록 처리 dao.insertMember(mto);
} //전체 회원목록 조회 public ArrayList<MemberDTO> getMemberList() throws SQLException{ return dao.selectAllMember(); } //마일리지 범위로 조회 public ArrayList<MemberDTO> selectMemberByMileageRange(int startMileage, int endMileage)throws SQLException { return dao.selectMemberByMileageRange(startMileage, endMileage); } //ID로 회원 목록조회 public MemberDTO getMemberById(String id) throws SQLException{ return dao.selectMemberById(id); } public void modifyMember(MemberDTO mto) throws SQLException{ dao.updateMember(mto);
} public void removeMemberById(String id)throws SQLException { dao.deleteMemberById(id);
} public ArrayList<MemberDTO> getSearchByMemberName(String name) throws SQLException{ return dao.searchByMemberName(name);
} }
* res
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <jsp:include page="/menu.jsp"/> <c:if test="${requestScope.error_message!=null }"> 실행 도중 오류가 발생했습니다.<br> 오류 내용 ${error_message } </c:if> <a href='/${initParam.context_root }/index.jsp'>메인페이지로 이동</a> </body> </html>
create table member( id varchar2(10), password varchar2(10) not null, name varchar2(50) not null, register_number varchar2(13) not null, mileage number, constraint member_pk primary key(id) ) select id, password, name, register_number1, register_number2, mileage from member where name like '%'||?||'%'"
import member.dto.ForwardDTO; //FrontController 서블릿 public class MemberFrontController extends HttpServlet { private static final long serialVersionUID = 1L;
public MemberFrontController() { super(); // TODO Auto-generated constructor stub }
public class LoginController implements Controller{ public ForwardDTO execute(HttpServletRequest request,HttpServletResponse response) throws Exception{ //1. 요청파라미터 조회
ForwardDTO forwardDTO = null; try { MemberDTO mto = memberManageService.getMemberById(id); //아이디가 맞는 경우 if(mto!=null){ //아이디가 맞고 비밀번호도 맞는 경우 if(mto.getPassword().equals(password)){ //세션으로 로그인 정보 넘기기 HttpSession httpSession = request.getSession(); httpSession.setAttribute("memberDTO", mto); forwardDTO = new ForwardDTO("/res/login_success.jsp", false); } else{//아이디는 맞고 비밀번호는 틀린경우
import member.dto.ForwardDTO; //FrontController 서블릿 public class MemberFrontController extends HttpServlet { private static final long serialVersionUID = 1L;
public MemberFrontController() { super(); // TODO Auto-generated constructor stub }
import member.dto.ForwardDTO; //FrontController 서블릿 public class MemberFrontController extends HttpServlet { private static final long serialVersionUID = 1L;
public MemberFrontController() { super(); // TODO Auto-generated constructor stub }