[실습문제] Day86 - MVC Model2를 활용한 회원형 게시판 만들기

Web/JSP

2020. 10. 28. 16:51

Q. 아래의 이미지들을 참고하여 MVC Model2를 활용한 회원형 게시판을 만드시오.

 

A.

[ SQL ]

- memberboard.sql

create table memberboard(
	no int auto_increment primary key,
	id varchar(20) not null,
	title varchar(100) not null,
	contents text not null,
	hit int not null default 0,
	wtime timestamp not null default CURRENT_TIMESTAMP,
	groupNum int not null default 0,
	stepNum int not null default 0,
	indentNum int not null default 0,
    foreign key (id) references member (id) on delete cascade
);

- member.sql

CREATE TABLE member(
name VARCHAR(20) NOT NULL,
id varchar(20) PRIMARY KEY,
nickname VARCHAR(20) NOT NULL, 	#nickname VARCHAR(20) UNIQUE,
pw VARCHAR(20) NOT NULL,
email varchar(50) NOT NULL,
postcode VARCHAR(6) NOT NULL,
roadAddress VARCHAR(40) NOT NULL,
jibunAddress VARCHAR(40) NOT NULL,
detailAddress VARCHAR(40) NOT NULL,
extraAddress VARCHAR(40) NOT NULL,
birthYear INT NOT NULL,
birthMonth INT NOT NULL,
birthDate INT NOT NULL,
cellphone CHAR(11) NOT NULL,
gender CHAR(6) NOT NULL
);

- web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
  <display-name>MemberBoard</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
</web-app>

[ XML ]

- context.xml

<?xml version="1.0" encoding="UTF-8"?>
<!--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
--><!-- The contents of this file will be loaded for each web application --><Context>

    <!-- Default set of monitored resources. If one of these changes, the    -->
    <!-- web application will be reloaded.                                   -->
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    <WatchedResource>WEB-INF/tomcat-web.xml</WatchedResource>
    <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>

    <!-- Uncomment this to disable session persistence across Tomcat restarts -->
    <!--
    <Manager pathname="" />
    -->
    <Resource
    name="jdbc/testdb"
    auth="Container"
    driverClassName="com.mysql.cj.jdbc.Driver"
    url="jdbc:mysql://localhost:3306/testdb?serverTimezone=UTC"
    username="root"
    password="1234"
    type="javax.sql.DataSource"
    maxTotal="50"
    maxWaitMillis="1000"
    removeAbandonedOnBorrow="true"
    removeAbandonedTimeout="5"
    logAbandoned="true"    
    />
</Context>

 

// Resource 내용 설명

 name : JNDI로 호출될 이름을 설정한다. (접근 -> java:comp/env/jdbc/testdb)

 auth : DBCP를 관리할 관리자 (Container or Application)

 driverClassName : JDBC를 이용하기 위한 드라이버 클래스

url : DB의 접속 URL(속성으로 자동 재접속 선택)

 username : DB의 계정명

 password : 계정에 대한 비밀번호

 type : 해당 resourcereturn type(DataSourceConnection 객체를 반환할 수 있다.)

 maxActive : 최대 접속 허용 개수

maxWaitMillis : DB 연결이 반환되는 Timebout의 최대 시간(-1은 무한 대기)

removeAbandonedOnBorrow

    : 사용할 수 있는 커넥션이 부족해지면 DBCP(DataBase Connection Pool)은 버려진 커넥션을 찾아 복구한다.

removeAbandonedTimeout : 커넥션이 버려졌다고 간주되기 전에 사용되지 않은 시간()를 설정한다.

logAbandoned : 만일 커넥션 자원을 낭비한 코드 위치의 로그를 남긴다.

 

[ DAO ]

- boardDAO.java

package com.superman.ex.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

import com.superman.ex.dto.BoardDTO;

public class BoardDAO {
	private static BoardDAO boardDAO = new BoardDAO();
	private int sizeOfPage = 10;
	private String CONNECTION_POOL_RESOURCE_NAME = "jdbc/testdb";
	private final String BOARD_TABLE_NAME = "memberboard";
	private final String MEMBER_TABLE_NAME = "member";
	private DataSource dataSource;
	private final String GET_BOARD_DTO_SQL = "SELECT m.*, mb.* FROM " + BOARD_TABLE_NAME + " mb, " + MEMBER_TABLE_NAME + " m" + " WHERE mb.no = ? AND m.id = ?";
	private final String SELECT_ALL_BOARD_SQL = "SELECT * FROM " + BOARD_TABLE_NAME + " order by GROUPNUM DESC, STEPNUM ASC LIMIT ?, ?";
	private final String INSERT_BOARD_SQL = 
			"INSERT INTO " + BOARD_TABLE_NAME + " (ID, TITLE, CONTENTS, GROUPNUM) values(?, ?, ?, ?)";
	private final String GET_CURRENT_NUM_SQL = "SELECT MAX(no) from " + BOARD_TABLE_NAME;
	private final String INCREASE_HIT_SQL = 
			"UPDATE " + BOARD_TABLE_NAME + " SET HIT=HIT+1 WHERE no=?";
	private final String UPDATE_BOARD_SQL = 
			"UPDATE " + BOARD_TABLE_NAME + " SET CONTENTS=?, WTIME=NOW() WHERE no=?";
	private final String UPDATE_STEP_NUM_SQL = 
			"UPDATE " + BOARD_TABLE_NAME + " SET STEPNUM=STEPNUM+1 WHERE GROUPNUM=? AND STEPNUM>=?";
	private final String INSERT_REPLY_SQL = 
			"INSERT INTO " + BOARD_TABLE_NAME + " (ID, TITLE, CONTENTS, GROUPNUM, STEPNUM, INDENTNUM) values(?, ?, ?, ?, ?, ?)";
	private final String DELETE_SQL =
			"DELETE FROM " + BOARD_TABLE_NAME + " WHERE no=?";
	private final String SEARCH_BOARD_SQL_BY_ID = "SELECT * FROM " + BOARD_TABLE_NAME + " WHERE ID LIKE ? order by GROUPNUM DESC, STEPNUM ASC";
	private final String SEARCH_BOARD_SQL_BY_TITLE = "SELECT * FROM " + BOARD_TABLE_NAME + " WHERE TITLE LIKE ? order by GROUPNUM DESC, STEPNUM ASC";
	private final String SEARCH_BOARD_SQL_BY_TITLE_AND_CONTENTS = "SELECT * FROM " + BOARD_TABLE_NAME + " WHERE TITLE LIKE ? OR CONTENTS LIKE ? order by GROUPNUM DESC, STEPNUM ASC"; // 제목 + 내용 검색
	private final String SELECT_COUNT_OF_LIST = "SELECT COUNT(*) FROM " + BOARD_TABLE_NAME; 
	
	private BoardDAO() {
		try {
			Context context = new InitialContext();
			dataSource = (DataSource)context.lookup("java:comp/env/" + CONNECTION_POOL_RESOURCE_NAME);
		} catch (NamingException e) {
			e.printStackTrace();
		}
	}
	
	public static BoardDAO getBoardDAO() {
		return boardDAO;
	}
	
	public Connection getConnection() {
		Connection conn = null;
		try {
			conn = dataSource.getConnection();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return conn;
	}

	public BoardDTO getBoardDTO(BoardDTO dto) {
		Connection conn = getConnection();
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			ps = conn.prepareStatement(GET_BOARD_DTO_SQL);
			System.out.println(GET_BOARD_DTO_SQL);
			ps.setInt(1, dto.getNo());
			ps.setString(2, dto.getId());
			rs = ps.executeQuery();
			if(rs.next())
			{
				dto.setNo(rs.getInt("no"));
				dto.setId(rs.getString("id"));
				dto.setNickname(rs.getString("nickname"));
				dto.setName(rs.getString("name"));
				dto.setCellphone(rs.getString("cellphone"));
				dto.setTitle(rs.getString("title"));
				dto.setContents(rs.getString("contents"));
				dto.setHit(rs.getInt("hit"));
				dto.setWtime(rs.getString("wtime"));
				dto.setGroupNum(rs.getInt("groupNum"));
				dto.setStepNum(rs.getInt("stepNum"));
				dto.setIndentNum(rs.getInt("indentNum"));
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			close(rs, ps, conn);
		}		
		return dto;
	}
	
	public void increaseHit(int no) {
		Connection conn = getConnection();
		PreparedStatement ps = null;
		int result = 0;
		try {
			ps = conn.prepareStatement(INCREASE_HIT_SQL);
			ps.setInt(1, no);
			result = ps.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			close(ps, conn);
		}
	}
	
	public int getCurrentNum() {
		Connection conn = getConnection();
		PreparedStatement ps = null;
		ResultSet rs = null;
		int curNum = 0;
		try {
			ps = conn.prepareStatement(GET_CURRENT_NUM_SQL);
			rs = ps.executeQuery();
			if(rs.next()) {
				curNum = rs.getInt(1);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return curNum + 1;
	}
	
	public void writeOKDAO(BoardDTO dto) {
		Connection conn = getConnection();
		PreparedStatement ps = null;
		int curNum = getCurrentNum();
		int result = 0;
		try {
			ps = conn.prepareStatement(INSERT_BOARD_SQL);
			ps.setString(1, dto.getId());
			ps.setString(2, dto.getTitle());
			ps.setString(3, dto.getContents());
			ps.setInt(4, curNum);
			result = ps.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			close(ps, conn);
		}
	}
	
	public void modifyOK(BoardDTO dto) {
		Connection conn = getConnection();
		PreparedStatement ps = null;
		int result = 0;
		try {
			ps = conn.prepareStatement(UPDATE_BOARD_SQL);
			ps.setString(1, dto.getContents());
			ps.setInt(2, dto.getNo());
			result = ps.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			close(ps, conn);
		}
	}
	
	public void updateStepNum(BoardDTO dto) {
		Connection conn = null;
		PreparedStatement ps = null;
		int result = 0;
		conn = getConnection();
		try {
			ps = conn.prepareStatement(UPDATE_STEP_NUM_SQL);
			ps.setInt(1, dto.getGroupNum());
			ps.setInt(2, dto.getStepNum()+1);
			result = ps.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			close(ps, conn);
		}
	}
	
	public BoardDTO replyDAO(BoardDTO dto) {
		getBoardDTO(dto);		
		System.out.println(GET_BOARD_DTO_SQL);
		
		return dto;
	}
	
	public void replyOKDAO(BoardDTO dto) {
		updateStepNum(dto);
		Connection conn = null;
		PreparedStatement ps = null;
		int result = 0;
		conn = getConnection();
		try {
			ps = conn.prepareStatement(INSERT_REPLY_SQL);
			ps.setString(1, dto.getId());
			ps.setString(2, dto.getTitle());
			ps.setString(3, dto.getContents());
			ps.setInt(4, dto.getGroupNum());
			ps.setInt(5, dto.getStepNum()+1);
			ps.setInt(6, dto.getIndentNum()+1);
			result = ps.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			close(ps, conn);
		}		
	}
	
	public void deleteDAO(int no) {
		Connection conn = null;
		PreparedStatement ps = null;
		int result = 0;
		conn = getConnection();
		try {
			ps = conn.prepareStatement(DELETE_SQL);
			ps.setInt(1, no);
			result = ps.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			close(ps, conn);
		}		
	}
	
	public void close(ResultSet rs, PreparedStatement ps, Connection conn){
		
			try {
				if(rs != null) rs.close();
				if(ps != null) ps.close();
				if(conn != null) conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
	}
	
	public void close(PreparedStatement ps, Connection conn){
		
		try {
			if(ps != null) ps.close();
			if(conn != null) conn.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	public int cntOfList() {
		int cnt = 0;
		Connection conn = getConnection();
		PreparedStatement ps = null;
		ResultSet rs = null;		
		try {
			ps = conn.prepareStatement(SELECT_COUNT_OF_LIST);
			rs = ps.executeQuery();
			if(rs.next()) {
				cnt = rs.getInt(1);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			close(rs, ps, conn);
		}		
		return cnt;
	}
	
	public int calTotalPage() {
		int numberOfArticles = cntOfList();
		int totalPage = numberOfArticles / sizeOfPage;
        if(numberOfArticles == 0){
        	totalPage = 0;
            return totalPage;
        }    
		totalPage = numberOfArticles % sizeOfPage == 0 ? totalPage - 1 : totalPage;
		
		return totalPage;
	}
	
	public ArrayList<BoardDTO> listDAO(int curPage){
		ArrayList<BoardDTO> list = new ArrayList<BoardDTO>();
		Connection conn = getConnection();
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			ps = conn.prepareStatement(SELECT_ALL_BOARD_SQL);
			ps.setInt(1, curPage*sizeOfPage); // 오프셋이 들어감(몇 번째 위치부터 가지고 올 것인지, limit가 페이징에 사용되는 것, limit가 없는 경우 전체 글을 한 페이지에 출력하는 것)
			ps.setInt(2, sizeOfPage); 
			rs = ps.executeQuery();
			while(rs.next()) {
				BoardDTO dto = new BoardDTO();
				dto.setNo(rs.getInt("no"));
				dto.setId(rs.getString("id"));
				dto.setTitle(rs.getString("title"));
				dto.setContents(rs.getString("contents"));
				dto.setHit(rs.getInt("hit"));
				dto.setWtime(rs.getString("wtime"));
				dto.setGroupNum(rs.getInt("groupNum"));
				dto.setStepNum(rs.getInt("stepNum"));
				dto.setIndentNum(rs.getInt("indentNum"));
				list.add(dto);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			close(rs, ps, conn);
		}
		return list;
	}
	
	public BoardDTO viewDAO(BoardDTO dto) {
		increaseHit(dto.getNo());
		dto = getBoardDTO(dto);
		return dto;
	}

	public ArrayList<BoardDTO> search(String kindOfSearch, String searchKeyword) {
		ArrayList<BoardDTO> list = new ArrayList<BoardDTO>();
		Connection conn = getConnection();
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			if(kindOfSearch.equals("searchId")){
				ps = conn.prepareStatement(SEARCH_BOARD_SQL_BY_ID);
				ps.setString(1, "%" + searchKeyword + "%"); // 작성된 내용에 해당 시 검색되도록 % 사용
			} else if(kindOfSearch.equals("searchTitle")){
				ps = conn.prepareStatement(SEARCH_BOARD_SQL_BY_TITLE);
				ps.setString(1, "%" + searchKeyword + "%");
			} else if(kindOfSearch.equals("searchTitleAndContents")){
				ps = conn.prepareStatement(SEARCH_BOARD_SQL_BY_TITLE_AND_CONTENTS);
				ps.setString(1, "%" + searchKeyword + "%");
				ps.setString(2, "%" + searchKeyword + "%");
			}
			rs = ps.executeQuery();
			while(rs.next()) {
				BoardDTO dto = new BoardDTO();
				dto.setNo(rs.getInt("no"));
				dto.setId(rs.getString("id"));
				dto.setTitle(rs.getString("title"));
				dto.setContents(rs.getString("contents"));
				dto.setHit(rs.getInt("hit"));
				dto.setWtime(rs.getString("wtime"));
				dto.setGroupNum(rs.getInt("groupNum"));
				dto.setStepNum(rs.getInt("stepNum"));
				dto.setIndentNum(rs.getInt("indentNum"));
				list.add(dto);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			close(rs, ps, conn);
		}
		return list;
	}
	
}

- memberDAO.java

package com.superman.ex.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

import com.superman.ex.dto.MemberDTO;

public class MemberDAO {
	private static MemberDAO memberDAO = new MemberDAO();
	private String CONNECTION_POOL_RESOURCE_NAME = "jdbc/testdb";
	private final String TABLE_NAME = "member";
	private DataSource dataSource;
	
	private final String INSERT_MEMBER_SQL = 
			"INSERT INTO " + TABLE_NAME + " (name, id, nickname, pw, email, postcode, roadAddress, jibunAddress, detailAddress, extraAddress, birthYear, birthMonth, birthDate, cellphone, gender) values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
	private final String UPDATE_MEMBER_SQL = 
			"UPDATE " + TABLE_NAME + " SET nickname=?, pw=?, email=?, postcode=?, roadAddress=?, jibunAddress=?, detailAddress=?, extraAddress=?, birthYear=?, birthMonth=?, birthDate=?, cellphone=?, gender=? WHERE ID = ?";
	private final String LOGIN_MEMBER_SQL = 
			"SELECT * FROM member WHERE id = ? AND pw = ?";
	private MemberDAO() {
		try {
			Context context = new InitialContext();
			dataSource = (DataSource)context.lookup("java:comp/env/" + CONNECTION_POOL_RESOURCE_NAME);
		} catch (NamingException e) {
			e.printStackTrace();
		}
	}
	
	public static MemberDAO getMemberDAO() {
		return memberDAO;
	}
	
	public Connection getConnection() {
		Connection conn = null;
		try {
			conn = dataSource.getConnection();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return conn;
	}
	
	public void memberRegisterDAO(MemberDTO dto) {
		Connection conn = getConnection();
		PreparedStatement pstmt = null;
		int result = 0;
		try {
			pstmt = conn.prepareStatement(INSERT_MEMBER_SQL);
			pstmt.setString(1, dto.getName());
			pstmt.setString(2, dto.getId());
			pstmt.setString(3, dto.getNickname());
			pstmt.setString(4, dto.getPw());
			pstmt.setString(5, dto.getEmail());
			pstmt.setString(6, dto.getPostcode());
			pstmt.setString(7, dto.getRoadAddress());
			pstmt.setString(8, dto.getJibunAddress());
			pstmt.setString(9, dto.getDetailAddress());
			pstmt.setString(10, dto.getExtraAddress());
			pstmt.setInt(11, dto.getBirthYear());
			pstmt.setInt(12, dto.getBirthMonth());
			pstmt.setInt(13, dto.getBirthDate());
			pstmt.setString(14, dto.getCellphone());
			pstmt.setString(15, dto.getGender());
			result = pstmt.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			close(pstmt, conn);
		}		
	}
	
	public void memberModifyDAO(MemberDTO dto) {
		Connection conn = getConnection();
		PreparedStatement pstmt = null;
		int result = 0;
		try {
			pstmt = conn.prepareStatement(UPDATE_MEMBER_SQL);
			pstmt.setString(1, dto.getNickname());
			pstmt.setString(2, dto.getPw());
			pstmt.setString(3, dto.getEmail());
			pstmt.setString(4, dto.getPostcode());
			pstmt.setString(5, dto.getRoadAddress());
			pstmt.setString(6, dto.getJibunAddress());
			pstmt.setString(7, dto.getDetailAddress());
			pstmt.setString(8, dto.getExtraAddress());
			pstmt.setInt(9, dto.getBirthYear());
			pstmt.setInt(10, dto.getBirthMonth());
			pstmt.setInt(11, dto.getBirthDate());
			pstmt.setString(12, dto.getCellphone());
			pstmt.setString(13, dto.getGender());
			pstmt.setString(14, dto.getId());
			result = pstmt.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			close(pstmt, conn);
		}	
	}
	
	public MemberDTO memberLoginDAO(MemberDTO dto) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		conn = getConnection();
		try {
			pstmt = conn.prepareStatement(LOGIN_MEMBER_SQL);
			pstmt.setString(1, dto.getId());
			pstmt.setString(2, dto.getPw());
			rs = pstmt.executeQuery();
			if(rs.next()) {
				dto.setName(rs.getString("name"));
				dto.setId(rs.getString("id"));
				dto.setNickname(rs.getString("nickname"));
				dto.setPw(rs.getString("pw"));
				dto.setEmail(rs.getString("email"));
				dto.setPostcode(rs.getString("postcode"));
				dto.setRoadAddress(rs.getString("roadAddress"));
				dto.setJibunAddress(rs.getString("jibunAddress"));
				dto.setDetailAddress(rs.getString("detailAddress"));
				dto.setExtraAddress(rs.getString("extraAddress"));
				dto.setBirthYear(rs.getInt("birthYear"));
				dto.setBirthMonth(rs.getInt("birthMonth"));
				dto.setBirthDate(rs.getInt("birthDate"));
				dto.setCellphone(rs.getString("Cellphone"));
				dto.setGender(rs.getString("gender"));
			} else {
				dto = null;
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			close(rs, pstmt, conn);
		}
		return dto;
	}
	public void close(ResultSet rs, PreparedStatement pstmt, Connection conn){
		
		try {
			if(rs != null) rs.close();
			if(pstmt != null) pstmt.close();
			if(conn != null) conn.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	public void close(PreparedStatement pstmt, Connection conn){
		
		try {
			if(pstmt != null) pstmt.close();
			if(conn != null) conn.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}	
}

[ DTO ]

- boardDTO.java

package com.superman.ex.dto;

public class BoardDTO {
	private int no;
	private String id;
	private String nickname;
	private String name;
	private String cellphone;	
	private String title;
	private String contents;
	private int hit;
	private String wtime;
	private int groupNum;
	private int stepNum;
	private int indentNum;
	
	
	public int getNo() {
		return no;
	}
	public void setNo(int no) {
		this.no = no;
	}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}	
	public String getNickname() {
		return nickname;
	}
	public void setNickname(String nickname) {
		this.nickname = nickname;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getCellphone() {
		return cellphone;
	}
	public void setCellphone(String cellphone) {
		this.cellphone = cellphone;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getContents() {
		return contents;
	}
	public void setContents(String contents) {
		this.contents = contents;
	}
	public int getHit() {
		return hit;
	}
	public void setHit(int hit) {
		this.hit = hit;
	}
	public String getWtime() {
		return wtime;
	}
	public void setWtime(String wtime) {
		this.wtime = wtime;
	}
	public int getGroupNum() {
		return groupNum;
	}
	public void setGroupNum(int groupNum) {
		this.groupNum = groupNum;
	}
	public int getStepNum() {
		return stepNum;
	}
	public void setStepNum(int stepNum) {
		this.stepNum = stepNum;
	}
	public int getIndentNum() {
		return indentNum;
	}
	public void setIndentNum(int indentNum) {
		this.indentNum = indentNum;
	}
}

- memberDTO.java

package com.superman.ex.dto;

public class MemberDTO {
	private String name;
	private String id;
	private String nickname;
	private String pw;
	private String email;
	private String postcode;
	private String roadAddress;
	private String jibunAddress;
	private String detailAddress;
	private String extraAddress;
	private int birthYear;
	private int birthMonth;
	private int birthDate;
	private String cellphone;
	private String gender;
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getNickname() {
		return nickname;
	}
	public void setNickname(String nickname) {
		this.nickname = nickname;
	}
	public String getPw() {
		return pw;
	}
	public void setPw(String pw) {
		this.pw = pw;
	}	
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public String getPostcode() {
		return postcode;
	}
	public void setPostcode(String postcode) {
		this.postcode = postcode;
	}
	public String getRoadAddress() {
		return roadAddress;
	}
	public void setRoadAddress(String roadAddress) {
		this.roadAddress = roadAddress;
	}
	public String getJibunAddress() {
		return jibunAddress;
	}
	public void setJibunAddress(String jibunAddress) {
		this.jibunAddress = jibunAddress;
	}
	public String getDetailAddress() {
		return detailAddress;
	}
	public void setDetailAddress(String detailAddress) {
		this.detailAddress = detailAddress;
	}
	public String getExtraAddress() {
		return extraAddress;
	}
	public void setExtraAddress(String extraAddress) {
		this.extraAddress = extraAddress;
	}
	public int getBirthYear() {
		return birthYear;
	}
	public void setBirthYear(int birthYear) {
		this.birthYear = birthYear;
	}
	public int getBirthMonth() {
		return birthMonth;
	}
	public void setBirthMonth(int birthMonth) {
		this.birthMonth = birthMonth;
	}
	public int getBirthDate() {
		return birthDate;
	}
	public void setBirthDate(int birthDate) {
		this.birthDate = birthDate;
	}
	public String getCellphone() {
		return cellphone;
	}
	public void setCellphone(String cellphone) {
		this.cellphone = cellphone;
	}
	public String getGender() {
		return gender;
	}
	public void setGender(String gender) {
		this.gender = gender;
	}
}

[ Controller ]

- FrontController.java

package com.superman.ex.frontcontroller;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.superman.ex.command.Command;
import com.superman.ex.command.board.DeleteCommand;
import com.superman.ex.command.board.ListCommand;
import com.superman.ex.command.board.ModifyOKCommand;
import com.superman.ex.command.board.ReplyCommand;
import com.superman.ex.command.board.ReplyOKCommand;
import com.superman.ex.command.board.SearchCommand;
import com.superman.ex.command.board.ViewCommand;
import com.superman.ex.command.board.WriteOKCommand;
import com.superman.ex.command.member.LoginCommand;
import com.superman.ex.command.member.MemberModifyOKCommand;
import com.superman.ex.command.member.MemberRegisterOKCommand;

@WebServlet("*.do")
public class FrontController extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    public FrontController() {
        super();
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doAction(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doAction(request, response);
	}
	
	public void doAction(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		String requestURI = request.getRequestURI();
		System.out.println("requestURI " + requestURI);
		String commandName = request.getServletPath();
		System.out.println("servletPath " +  commandName);
//		String contextPath = request.getContextPath();
//		System.out.println("contextPath " + contextPath);
//		int idx = servletPath.lastIndexOf("/");
//		String commandName = servletPath.substring(idx);
//		System.out.println("commandName " + commandName);
		String viewPage = null;
		Command command = null;
		int flag = 0;
		
		if(commandName.equals("/Board/list.do")) {
			command = new ListCommand();
			command.excute(request, response);
			viewPage = "list.jsp";
			flag = 1;
		} else if(commandName.equals("/Board/write.do")) {
			viewPage = "write.jsp";
		} else if(commandName.equals("/Board/writeOK.do")) {
			command = new WriteOKCommand();
			command.excute(request, response);
			viewPage = "list.do";
		} else if(commandName.equals("/Board/view.do")) {
			command = new ViewCommand();
			command.excute(request, response);
			viewPage = "view.jsp";
			flag = 1;
		} else if(commandName.equals("/Board/modifyOK.do")) {
			command = new ModifyOKCommand();
			command.excute(request, response);
			viewPage = "list.do";
		} else if(commandName.equals("/Board/reply.do")) {
			command = new ReplyCommand();
			command.excute(request, response);
			viewPage = "reply.jsp";
			flag = 1;
		} else if(commandName.equals("/Board/replyOK.do")) {
			command = new ReplyOKCommand();
			command.excute(request, response);
			viewPage = "list.do";
		} else if(commandName.equals("/Board/delete.do")) {
			command = new DeleteCommand();
			command.excute(request, response);
			viewPage = "list.do";
			
			////////////////////////////////////////////////////////////////////////
			
		} else if(commandName.equals("/index.do")) {
			viewPage = "index.jsp";
		} else if(commandName.equals("/login.do")) {
			command = new LoginCommand();
			command.excute(request, response);			
			viewPage = "index.jsp";
		} else if(commandName.equals("/Member/memberRegister.do")) {
			viewPage = "memberRegister.jsp";
		} else if(commandName.equals("/Member/memberRegisterOK.do")) {
			command = new MemberRegisterOKCommand();
			command.excute(request, response);
			viewPage = "../index.jsp";
		} else if(commandName.equals("/Member/memberModify.do")) {
			viewPage = "memberModify.jsp";
		} else if(commandName.equals("/Member/memberModifyOK.do")) {
			command = new MemberModifyOKCommand();
			command.excute(request, response);
			viewPage = "../index.jsp";
		} else if(commandName.equals("/Board/search.do")) {
			command = new SearchCommand();
			command.excute(request, response);
			viewPage = "searchList.jsp";
			flag = 1;
		} else if(commandName.equals("/logout.do")) {
			request.getSession().invalidate();
			viewPage = "index.jsp";
		}
		
		if(flag==0) {
			response.sendRedirect(viewPage);
		} else if(flag==1) {
			RequestDispatcher dispatcher = request.getRequestDispatcher(viewPage);
			dispatcher.forward(request, response);			
		}		
	}
}

[ Command ]

- command.java

package com.superman.ex.command;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public interface Command {
	void excute(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException;
}

// board

- ListCommand.java

package com.superman.ex.command.board;

import java.io.IOException;
import java.util.ArrayList;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.superman.ex.command.Command;
import com.superman.ex.dao.BoardDAO;
import com.superman.ex.dto.BoardDTO;

public class ListCommand implements Command {

	@Override
	public void excute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		BoardDAO dao = BoardDAO.getBoardDAO();
		int curPage = 0;
		if(request.getParameter("curPage") != null)
			curPage = Integer.parseInt(request.getParameter("curPage")); // String을 Integer(래퍼클래스)로 형변환 해주는 것
		ArrayList<BoardDTO> list = dao.listDAO(curPage); // listDAO 호출
		int totalPage = dao.calTotalPage();
		request.setAttribute("list", list);
		request.setAttribute("totalPage", totalPage);
	}
}

- WriteOKCommand.java

package com.superman.ex.command.board;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.superman.ex.command.Command;
import com.superman.ex.dao.BoardDAO;
import com.superman.ex.dto.BoardDTO;
import com.superman.ex.dto.MemberDTO;

public class WriteOKCommand implements Command {

	@Override
	public void excute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		BoardDAO dao = BoardDAO.getBoardDAO();
		BoardDTO dto = new BoardDTO();
		dto.setId( ((MemberDTO)request.getSession().getAttribute("userInfo")).getId() );
		dto.setTitle(request.getParameter("title"));
		dto.setContents(request.getParameter("contents"));
		dao.writeOKDAO(dto);		
	}
}

- ViewCommand.java

package com.superman.ex.command.board;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.mysql.cj.Session;
import com.superman.ex.command.Command;
import com.superman.ex.dao.BoardDAO;
import com.superman.ex.dto.BoardDTO;
import com.superman.ex.dto.MemberDTO;

public class ViewCommand implements Command {

	@Override
	public void excute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		BoardDAO dao = BoardDAO.getBoardDAO();
		BoardDTO dto = new BoardDTO();
		dto.setNo(Integer.parseInt(request.getParameter("no")));
		dto.setId(request.getParameter("id"));
		dao.viewDAO(dto);
		request.setAttribute("dto", dto);
	}
}

- SearchCommand.java

package com.superman.ex.command.board;

import java.io.IOException;
import java.util.ArrayList;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.superman.ex.command.Command;
import com.superman.ex.dao.BoardDAO;
import com.superman.ex.dto.BoardDTO;

public class SearchCommand implements Command {

	@Override
	public void excute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		BoardDAO dao = BoardDAO.getBoardDAO();
		String kindOfSearch = request.getParameter("kindOfSearch");
		String searchKeyword = request.getParameter("searchKeyword");
		ArrayList<BoardDTO> list = dao.search(kindOfSearch, searchKeyword);
		request.setAttribute("list", list);
	}
}

- ReplyCommand.java

package com.superman.ex.command.board;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.superman.ex.command.Command;
import com.superman.ex.dao.BoardDAO;
import com.superman.ex.dto.BoardDTO;

public class ReplyCommand implements Command {

	@Override
	public void excute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		BoardDAO dao = BoardDAO.getBoardDAO();
		BoardDTO dto = new BoardDTO();
		dto.setNo( Integer.parseInt( request.getParameter("no") ) );
		dto.setId( request.getParameter("id") );
		dao.replyDAO(dto);
		request.setAttribute("dto", dto);
	}
}

- ReplyOKCommand.java

package com.superman.ex.command.board;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.superman.ex.command.Command;
import com.superman.ex.dao.BoardDAO;
import com.superman.ex.dto.BoardDTO;

public class ReplyOKCommand implements Command {

	@Override
	public void excute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		BoardDAO dao = BoardDAO.getBoardDAO();
		BoardDTO dto = new BoardDTO();
		dto.setId(request.getParameter("id"));
		dto.setTitle(request.getParameter("title"));
		dto.setContents(request.getParameter("contents"));
		dto.setNo(Integer.parseInt(request.getParameter("no")));
		dto.setGroupNum(Integer.parseInt(request.getParameter("groupNum")));
		dto.setStepNum(Integer.parseInt(request.getParameter("stepNum")));
		dto.setIndentNum(Integer.parseInt(request.getParameter("indentNum")));
		dao.replyOKDAO(dto);
	}
}

- ModifyOKCommand.java

package com.superman.ex.command.board;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.superman.ex.command.Command;
import com.superman.ex.dao.BoardDAO;
import com.superman.ex.dto.BoardDTO;

public class ModifyOKCommand implements Command {

	@Override
	public void excute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		BoardDAO dao = BoardDAO.getBoardDAO();
		BoardDTO dto = new BoardDTO();
		dto.setNo(Integer.parseInt(request.getParameter("no")));
		dto.setName(request.getParameter("name"));
		dto.setTitle(request.getParameter("title"));
		dto.setContents(request.getParameter("contents"));
		dao.modifyOK(dto);
	}
}

- DeleteCommand.java

package com.superman.ex.command.board;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.superman.ex.command.Command;
import com.superman.ex.dao.BoardDAO;

public class DeleteCommand implements Command {

	@Override
	public void excute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		BoardDAO dao = BoardDAO.getBoardDAO();
		dao.deleteDAO(Integer.parseInt(request.getParameter("no")));
	}
}

// member

- LoginCommand.java

package com.superman.ex.command.member;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.superman.ex.command.Command;
import com.superman.ex.dao.MemberDAO;
import com.superman.ex.dto.MemberDTO;

public class LoginCommand implements Command {

	@Override
	public void excute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		MemberDAO dao = MemberDAO.getMemberDAO();
		MemberDTO dto = new MemberDTO();
		dto.setId(request.getParameter("id"));
		dto.setPw(request.getParameter("pw"));
		HttpSession session = request.getSession(); // 세션 가져 옴
		session.setAttribute("userInfo", dao.memberLoginDAO(dto));
	}
}

- MemberRegisterOKCommand.java

package com.superman.ex.command.member;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.superman.ex.command.Command;
import com.superman.ex.dao.MemberDAO;
import com.superman.ex.dto.MemberDTO;

public class MemberRegisterOKCommand implements Command {

	@Override
	public void excute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		MemberDAO dao = MemberDAO.getMemberDAO();
		MemberDTO dto = new MemberDTO();
		
		dto.setName(request.getParameter("name"));
		dto.setId(request.getParameter("id"));
		dto.setNickname(request.getParameter("nickname"));
		dto.setPw(request.getParameter("pw"));
		dto.setEmail(request.getParameter("email"));
		dto.setPostcode(request.getParameter("postcode"));
		dto.setRoadAddress(request.getParameter("roadAddress"));
		dto.setJibunAddress(request.getParameter("jibunAddress"));
		dto.setDetailAddress(request.getParameter("detailAddress"));
		dto.setExtraAddress(request.getParameter("extraAddress"));
		dto.setBirthYear( Integer.parseInt(request.getParameter("birthYear")) );
		dto.setBirthMonth( Integer.parseInt(request.getParameter("birthMonth")) );
		dto.setBirthDate( Integer.parseInt(request.getParameter("birthDate")) );
		dto.setCellphone(request.getParameter("cellphone"));
		dto.setGender(request.getParameter("gender"));
		dao.memberRegisterDAO(dto);
	}
}

- MemberModifyCommand.java

package com.superman.ex.command.member;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.superman.ex.command.Command;
import com.superman.ex.dao.MemberDAO;
import com.superman.ex.dto.MemberDTO;

public class MemberModifyCommand implements Command {

	@Override
	public void excute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		MemberDAO dao = MemberDAO.getMemberDAO();
		MemberDTO dto = new MemberDTO();
		HttpSession session = request.getSession();
		
//		dto.setId( ((MemberDTO)session.getAttribute("userInfo") );
		
	}
}

- MemberModifyOKCommand.java

package com.superman.ex.command.member;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.superman.ex.command.Command;
import com.superman.ex.dao.MemberDAO;
import com.superman.ex.dto.MemberDTO;

public class MemberModifyOKCommand implements Command {

	@Override
	public void excute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		MemberDAO dao = MemberDAO.getMemberDAO();
		MemberDTO dto = new MemberDTO();
		HttpSession session = request.getSession();
		
		dto.setName(request.getParameter("name"));
		dto.setId(request.getParameter("id"));
		dto.setNickname(request.getParameter("nickname"));
		dto.setPw(request.getParameter("pw"));
		dto.setEmail(request.getParameter("email"));
		dto.setPostcode(request.getParameter("postcode"));
		dto.setRoadAddress(request.getParameter("roadAddress"));
		dto.setJibunAddress(request.getParameter("jibunAddress"));
		dto.setDetailAddress(request.getParameter("detailAddress"));
		dto.setExtraAddress(request.getParameter("extraAddress"));
		dto.setBirthYear( Integer.parseInt(request.getParameter("birthYear")) );
		dto.setBirthMonth( Integer.parseInt(request.getParameter("birthMonth")) );
		dto.setBirthDate( Integer.parseInt(request.getParameter("birthDate")) );
		dto.setCellphone(request.getParameter("cellphone"));
		dto.setGender(request.getParameter("gender"));
		dao.memberModifyDAO(dto);
		
		session.setAttribute("userInfo", dto);
	}
}

[ View ]

- index.jsp

<%@page import="com.superman.ex.dto.MemberDTO"%>
<%@ 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>
<html lang="ko-kr">
<head>
<meta charset="UTF-8">
<meta name="description" content="HTML Study">
<meta name="keywords" content="HTML,CSS,XML,JavaScript">
<meta name="author" content="Bruce">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Insert title here</title>
</head>
<body>
	<c:if test="${userInfo eq null}">
		<form action="login.do" method="post">
			아이디 : <input type="text" name="id"><br />
			비밀번호 : <input type="password" name="pw"><br />
			<input type="submit" value="로그인">
		</form>
		<a href="Member/memberRegister.do">회원가입</a><br/>
	</c:if>
	<c:if test="${userInfo ne null }">
		${userInfo.id } 님<br/>
		<a href="logout.do">로그아웃</a><br/>
		<a href="Member/memberModify.do">회원정보 수정</a><br/>
		<a href="Board/list.do">게시판</a><br/>
	</c:if>
</body>
</html>

// board

- list.jsp

<%@ 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>
<html lang="ko-kr">
<head>
<meta charset="UTF-8">
<meta name="description" content="HTML Study">
<meta name="keywords" content="HTML,CSS,XML,JavaScript">
<meta name="author" content="Bruce">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>목록</title>
</head>
<body>
	<form method = "post" action="search.do">
		검색 : 
			<select name="kindOfSearch">
				<option value="searchTitle">제목</option>
				<option value="searchTitleAndContents">제목 + 내용</option>
				<option value="searchId">작성자</option>
			</select>
			
		<input type="text" name="searchKeyword">
		<input type="submit" value="검색">
	</form>	
	<table border="1">
		<tr>
			<td>번호</td><td>아이디</td><td>제목</td><td>조회수</td>
		</tr>
		<c:forEach var="dto" items="${list}">
			<tr>
				<td>${dto.no }</td>
				<td>${dto.id}</td>
				<td>
					<a href="view.do?no=${dto.no}&id=${dto.id}">
					<c:forEach var="i" begin="1" end="${dto.indentNum}" step="1">-</c:forEach>
					${dto.title}
					</a>
				</td>
				<td>${dto.hit}</td>
			</tr>
		</c:forEach>
		<tr>
			<td colspan="4"><a href="write.do">글작성</a></td>
		</tr>
	</table>
	<c:set var="curPage" value="${param.curPage }" /> // 페이징 처리 , param.curPage = request.getParameter()
	<c:if test="${curPage eq null }">
		<c:set var="curPage" value="0"/> // curPage가 없으면 0으로 세팅해주는 것
	</c:if>
	<c:forEach var="i" begin="0" end="${totalPage}" step="1">
		<c:if test="${i eq curPage}">
			${i+1} // 인덱스 페이지 숫자를 유저에게 친숙하도록 +1 해주는 것
		</c:if>
		<c:if test="${i ne curPage}">
			<a href="list.do?curPage=${i}">${i+1}</a> // 다음으로 넘어가는 링크 만드는 것
		</c:if>			
	</c:forEach>
</body>
</html>

- write.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<!DOCTYPE html>
<html lang="ko-kr">
<head>
<meta charset="UTF-8">
<meta name="description" content="HTML Study">
<meta name="keywords" content="HTML,CSS,XML,JavaScript">
<meta name="author" content="Bruce">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Insert title here</title>
</head>
<body>
	<form method="post" action="writeOK.do">
		<table border="1">
			<tr>
				<td>제목</td><td><input type="text" name="title" /></td>
			</tr>
			<tr>
				<td>내용</td><td><textarea name="contents" cols="100" rows="15"></textarea></td>
			</tr>
			<tr>
				<td colspan="2"><input type="submit" value="입력"> <a href="list.do">목록</a></td>
			</tr>
		</table>
	</form>
</body>
</html>

- view.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html lang="ko-kr">
<head>
<meta charset="UTF-8">
<meta name="description" content="HTML Study">
<meta name="keywords" content="HTML,CSS,XML,JavaScript">
<meta name="author" content="Bruce">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Insert title here</title>
</head>
<body>
	<form method="post" action="modifyOK.do">
		<table border="1">
			<tr>
				<td>닉네임</td><td>${dto.nickname}</td>
			</tr>
			<tr>
				<td>전화번호</td><td>${dto.cellphone}</td>
			</tr>
			<tr>
				<td>이름</td><td>${dto.name}</td>
			</tr>
			<tr>
				<td>제목</td><td>${dto.title}</td>
			</tr>
			<tr>
				<td>내용</td><td><textarea name="contents" cols="100" rows="15">${dto.contents}</textarea></td>
			</tr>
			<tr>
				<td colspan="2">
					<c:if test="${userInfo.id eq dto.id }">
						<input type="submit" value="수정">					
						<a href="delete.do?no=${dto.no}">삭제</a>
					</c:if>
					<a href="list.do">목록</a>
					<a href="reply.do?no=${dto.no}&id=${dto.id}">답변</a>
				</td>
			</tr>
		</table>
		<input type="hidden" name="no" value="${dto.no}">
	</form>
</body>
</html>

- searchList.jsp

<%@ 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>
<html lang="ko-kr">
<head>
<meta charset="UTF-8">
<meta name="description" content="HTML Study">
<meta name="keywords" content="HTML,CSS,XML,JavaScript">
<meta name="author" content="Bruce">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>검색결과</title>
</head>
<body>
	<form method = "post" action="search.do">
	검색 : 
		<select name="kindOfSearch">
			<option value="searchTitle">제목</option>
			<option value="searchTitleAndContents">제목 + 내용</option>
			<option value="searchId">작성자</option>
		</select>
		
	<input type="text" name="searchKeyword">
	<input type="submit" value="검색">
	</form>	
	<table border="1">
		<tr>
			<td>번호</td><td>아이디</td><td>제목</td><td>조회수</td>
		</tr>
		<c:forEach var="dto" items="${list}">
			<tr>
				<td>${dto.no }</td>
				<td>${dto.id}</td>
				<td>
					<a href="view.do?no=${dto.no}&id=${dto.id}">
					<c:forEach var="i" begin="1" end="${dto.indentNum}" step="1">-</c:forEach>
					${dto.title}
					</a>
				</td>
				<td>${dto.hit}</td>
			</tr>
		</c:forEach>
		<tr>
			<td colspan="4"><a href="write.do">글작성</a></td>
		</tr>
	</table>
</body>
</html>

- reply.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<!DOCTYPE html>
<html lang="ko-kr">
<head>
<meta charset="UTF-8">
<meta name="description" content="HTML Study">
<meta name="keywords" content="HTML,CSS,XML,JavaScript">
<meta name="author" content="Bruce">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Insert title here</title>
</head>
<body>
	<form method="post" action="replyOK.do">
		<table border="1">
			<tr>
				<td>닉네임</td><td>${userInfo.nickname}</td>
			</tr>
			<tr>
				<td>전화번호</td><td>${userInfo.cellphone}</td>
			</tr>
			<tr>
				<td>이름</td><td>${userInfo.name }</td>
			</tr>
			<tr>
				<td>제목</td><td><input type="text" name="title" value="re: ${dto.title}"/></td>
			</tr>
			<tr>
				<td>내용</td><td><textarea name="contents" cols="100" rows="15" autofocus>&#10&#13re: ${dto.contents}</textarea></td>
			</tr>
			<tr>
				<td colspan="2">
					<input type="submit" value="답변"> 
					<a href="list.do">목록</a>
				</td>
			</tr>
		</table>
		<input type="hidden" name="no" value="${dto.no}" />
		<input type="hidden" name="id" value="${userInfo.id }" />
		<input type="hidden" name="groupNum" value="${dto.groupNum}" />
		<input type="hidden" name="stepNum" value="${dto.stepNum}" />
		<input type="hidden" name="indentNum" value="${dto.indentNum}" />
	</form>
</body>
</html>

// member

- memberRegister.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
 <%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="description" content="HTML Study">
<meta name="keywords" content="HTML,CSS,XML,JavaScript">
<meta name="author" content="Bruce">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>회원가입</title>
</head>
<body>
	<form action="memberRegisterOK.do" method="post">
		이름<br />
		<input type="text" name="name" size="30"><br />
		아이디<br />
		<input type="text" name="id" size="30"><br />
		NickName<br />
		<input type="text" name="nickname" size="20"><br />		
		비밀번호<br />
		<input type="password" name="pw" size="20"><br />
		비밀번호 재확인<br />		
		<input type="password" name="pw2" size="20"><br />
		이메일<br />
		<input type="email" name="email" size="20"><br />				
		주소<br />
		<input type="text" id="sample4_postcode" placeholder="우편번호" name="postcode" readonly>
		<input type="button" onclick="sample4_execDaumPostcode()" value="우편번호 찾기"><br />
		<input type="text" id="sample4_roadAddress" placeholder="도로명주소" name="roadAddress">
		<input type="text" id="sample4_jibunAddress" placeholder="지번주소" name="jibunAddress">
		<span id="guide" style="color:#999;display:none"></span>
		<input type="text" id="sample4_detailAddress" placeholder="상세주소" name="detailAddress">
		<input type="text" id="sample4_extraAddress" placeholder="참고항목" name="extraAddress"><br/>
		생년월일<br />
		<input type="text" name="birthYear" max="4">
		<select name="birthMonth">
		<c:forEach var="i" begin="1" end="12" step="1">
			<option value="${i }">${i }</option>
		</c:forEach>
		</select>
		<input type="text" name="birthDate"><br />
		전화번호<br />
		<input type="text" name="cellphone"><br />
		성별구분<br />
		<input type="radio" name="gender" value="male">남 &nbsp;<input type="radio" name="gender" value="female">여 <br />
		<input type="submit" value="회원가입"> <input type="reset" value="취소">
	</form>
	<script src="https://t1.daumcdn.net/mapjsapi/bundle/postcode/prod/postcode.v2.js"></script>
	<script src= "../js/memberRegister.js"></script>
</body>
</html>

- memberModify.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="description" content="HTML Study">
<meta name="keywords" content="HTML,CSS,XML,JavaScript">
<meta name="author" content="Bruce">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>회원정보수정</title>
</head>
<body>
	<form action="memberModifyOK.do" method="post">
		이름<br />
		<input type="text" name="name" size="30" value="${userInfo.name}" readonly><br />
		아이디<br />
		<input type="text" name="id" size="30" value="${userInfo.id }" readonly><br />
		NickName<br />
		<input type="text" name="nickname" size="20" value="${userInfo.nickname }"><br />		
		비밀번호<br />
		<input type="password" name="pw" size="20"><br />
		비밀번호 재확인<br />		
		<input type="password" name="pw2" size="20"><br />
		이메일<br />
		<input type="email" name="email" size="20" value="${userInfo.email }"><br />				
		주소<br />
		<input type="text" id="sample4_postcode" placeholder="우편번호" name="postcode" value="${userInfo.postcode }" readonly>
		<input type="button" onclick="sample4_execDaumPostcode()" value="우편번호 찾기"><br />
		<input type="text" id="sample4_roadAddress" placeholder="도로명주소" name="roadAddress" value="${userInfo.roadAddress }">
		<input type="text" id="sample4_jibunAddress" placeholder="지번주소" name="jibunAddress" value="${userInfo.jibunAddress }">
		<span id="guide" style="color:#999;display:none"></span>
		<input type="text" id="sample4_detailAddress" placeholder="상세주소" name="detailAddress" value="${userInfo.detailAddress }">
		<input type="text" id="sample4_extraAddress" placeholder="참고항목" name="extraAddress" value="${userInfo.extraAddress }"><br/>
		생년월일<br />
		<input type="text" name="birthYear" max="4" value="${userInfo.birthYear }">
 		<select name="birthMonth">
			<c:forEach var="i" begin="1" end="12" step="1">
				<option value="${i}" <c:if test="${userInfo.birthMonth eq i}">selected</c:if> >${i}</option>
			</c:forEach> 
 		</select>
		<input type="text" name="birthDate" value="${userInfo.birthDate }"><br />
		전화번호<br />
		<input type="text" name="cellphone" value="${userInfo.cellphone }"><br />
		성별구분<br />
		<!--  <input type="radio" name="gender" value="male" <c:if test="${userInfo.gender eq 'male'}"> checked </c:if> >남 &nbsp; -->
		<input type="radio" name="gender" value="male" ${userInfo.gender eq 'male' ? 'checked':''}>남 &nbsp;
		<input type="radio" name="gender" value="female" <c:if test="${userInfo.gender eq 'female'}"> checked </c:if> >여 <br />
		<input type="submit" value="회원정보수정"> <input type="reset" value="취소">
	</form>
	<script src="https://t1.daumcdn.net/mapjsapi/bundle/postcode/prod/postcode.v2.js"></script>
	<script src= "../js/memberRegister.js"></script>
</body>
</html>

 

// memberRegister.js

//본 예제에서는 도로명 주소 표기 방식에 대한 법령에 따라, 내려오는 데이터를 조합하여 올바른 주소를 구성하는 방법을 설명합니다.
function sample4_execDaumPostcode() {
    new daum.Postcode({
        oncomplete: function(data) {
            // 팝업에서 검색결과 항목을 클릭했을때 실행할 코드를 작성하는 부분.

            // 도로명 주소의 노출 규칙에 따라 주소를 표시한다.
            // 내려오는 변수가 값이 없는 경우엔 공백('')값을 가지므로, 이를 참고하여 분기 한다.
            var roadAddr = data.roadAddress; // 도로명 주소 변수
            var extraRoadAddr = ''; // 참고 항목 변수

            // 법정동명이 있을 경우 추가한다. (법정리는 제외)
            // 법정동의 경우 마지막 문자가 "동/로/가"로 끝난다.
            if(data.bname !== '' && /[동|로|가]$/g.test(data.bname)){
                extraRoadAddr += data.bname;
            }
            // 건물명이 있고, 공동주택일 경우 추가한다.
            if(data.buildingName !== '' && data.apartment === 'Y'){
               extraRoadAddr += (extraRoadAddr !== '' ? ', ' + data.buildingName : data.buildingName);
            }
            // 표시할 참고항목이 있을 경우, 괄호까지 추가한 최종 문자열을 만든다.
            if(extraRoadAddr !== ''){
                extraRoadAddr = ' (' + extraRoadAddr + ')';
            }

            // 우편번호와 주소 정보를 해당 필드에 넣는다.
            document.getElementById('sample4_postcode').value = data.zonecode;
            document.getElementById("sample4_roadAddress").value = roadAddr;
            document.getElementById("sample4_jibunAddress").value = data.jibunAddress;
            
            // 참고항목 문자열이 있을 경우 해당 필드에 넣는다.
            if(roadAddr !== ''){
                document.getElementById("sample4_extraAddress").value = extraRoadAddr;
            } else {
                document.getElementById("sample4_extraAddress").value = '';
            }

            var guideTextBox = document.getElementById("guide");
            // 사용자가 '선택 안함'을 클릭한 경우, 예상 주소라는 표시를 해준다.
            if(data.autoRoadAddress) {
                var expRoadAddr = data.autoRoadAddress + extraRoadAddr;
                guideTextBox.innerHTML = '(예상 도로명 주소 : ' + expRoadAddr + ')';
                guideTextBox.style.display = 'block';

            } else if(data.autoJibunAddress) {
                var expJibunAddr = data.autoJibunAddress;
                guideTextBox.innerHTML = '(예상 지번 주소 : ' + expJibunAddr + ')';
                guideTextBox.style.display = 'block';
            } else {
                guideTextBox.innerHTML = '';
                guideTextBox.style.display = 'none';
            }
        }
    }).open();
}
728x90