지구정복

[JSP] 12/30 | 여러파일 업로드, 자바빈-model1기법(파일첨부게시판 만들기), 답변기능있는 게시판만들기, 톰캣으로 JSP실행하기, WAR배포해서 JSP실행하기 본문

데이터 엔지니어링 정복/JAVA & JSP

[JSP] 12/30 | 여러파일 업로드, 자바빈-model1기법(파일첨부게시판 만들기), 답변기능있는 게시판만들기, 톰캣으로 JSP실행하기, WAR배포해서 JSP실행하기

eeaarrtthh 2020. 12. 30. 17:29
728x90
반응형

-여러 파일 동시에 업로드하기

-upload_form.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<!-- upload_ok01.jsp에 파일을 업로드 시킨다는 뜻 -->
<form action="upload_ok01.jsp" method="post" enctype="multipart/form-data">
파일1 : <input type="file" name="upload1" />
파일2 : <input type="file" name="upload2" />
<input type="submit" value="파일 전송">
</form>

</body>
</html>

-upload_ok01.jsp

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

<%@ page import="com.oreilly.servlet.multipart.DefaultFileRenamePolicy" %>
<%@ page import="com.oreilly.servlet.MultipartRequest" %>

<%
	String uploadPath = "C:/Java/jsp-workspace/UploadEx01/WebContent/upload";
	int maxFileSize = 1024 * 1024 * 2;
	String encType = "utf-8";
	MultipartRequest multi 
		= new MultipartRequest( request, uploadPath, maxFileSize, encType, new DefaultFileRenamePolicy() );
	
	
	out.println( "업로드 완료" );
%>

 

 

-파일첨부기능이 있는 게시판 Model1형태로 만들기

-boardTO.java

package model1;

public class BoardTO {
	private String seq;
	private String subject;
	private String writer;
	private String mail;
	private String password;
	private String content;
	private String hit;
	private String wip;
	private String wdate;
	private String emot;
	private int wgap;
	
	public String getSeq() {
		return seq;
	}
	public String getSubject() {
		return subject;
	}
	public String getWriter() {
		return writer;
	}
	public String getMail() {
		return mail;
	}
	public String getPassword() {
		return password;
	}
	public String getContent() {
		return content;
	}
	public String getHit() {
		return hit;
	}
	public String getWip() {
		return wip;
	}
	public String getWdate() {
		return wdate;
	}
	public String getEmot() {
		return emot;
	}
	public int getWgap() {
		return wgap;
	}
	
	public void setSeq(String seq) {
		this.seq = seq;
	}
	public void setSubject(String subject) {
		this.subject = subject;
	}
	public void setWriter(String writer) {
		this.writer = writer;
	}
	public void setMail(String mail) {
		this.mail = mail;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public void setContent(String content) {
		this.content = content;
	}
	public void setHit(String hit) {
		this.hit = hit;
	}
	public void setWip(String wip) {
		this.wip = wip;
	}
	public void setWdate(String wdate) {
		this.wdate = wdate;
	}
	public void setEmot(String emot) {
		this.emot = emot;
	}
	public void setWgap(int wgap) {
		this.wgap = wgap;
	}
}

-boardDAO.java

package Pack1;

import java.io.File;
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.sql.DataSource;

public class BoardDAO {
	private DataSource dataSource;
	
	public BoardDAO() {
		try {
			Context initCtx = new InitialContext();
			Context envCtx = (Context)initCtx.lookup( "java:comp/env" );
			this.dataSource = (DataSource)envCtx.lookup( "jdbc/mariadb2" );
		} catch (Exception e) {
			System.out.println( "[에러]: " + e.getMessage() );
		}
	}
	
	//write
	public void boardWrite() {}
	
	//write_ok
	public int boardWriteOk( BoardTO to ) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		
		int flag = 1;
		
		try {
			conn = dataSource.getConnection();
			
			String sql = "insert into pds_board1 values (0, ?, ?, ?, ?, ?, ?, ?, 0, ?, now() )";
			pstmt = conn.prepareStatement(sql);
			pstmt.setString( 1, to.getSubject() );
			pstmt.setString( 2, to.getWriter() );
			pstmt.setString( 3, to.getMail() );
			pstmt.setString( 4, to.getPassword() );
			pstmt.setString( 5, to.getContent() );
			pstmt.setString( 6, to.getFilename() );
			pstmt.setLong( 7, to.getFilesize() );
			pstmt.setString( 8, to.getWip() );
			
			int result = pstmt.executeUpdate();
			if ( result == 1 ) {
				//정상일 때
				flag = 0;
			}
		} catch(SQLException e) {
			System.out.println( "error: " + e.getMessage() );
		} finally {
			if ( pstmt != null ) try { pstmt.close(); } catch ( SQLException e ) {}
			if ( conn != null ) try {  conn.close(); } catch ( SQLException e ) {}
		}
		return flag;
	}
	
	//list
	public ArrayList<BoardTO> boardList() {
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		
		ArrayList<BoardTO> lists = new ArrayList<BoardTO>();
		
		try {
			conn = dataSource.getConnection();
			
			String sql = "select seq, subject, writer, filesize, date_format(wdate, '%Y-%m-%d') wdate, hit, datediff(now(), wdate) wgap from pds_board1 order by seq desc";
			pstmt = conn.prepareStatement(sql, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
			rs = pstmt.executeQuery();
			
			while( rs.next() ) {
				BoardTO to = new BoardTO();
				String seq = rs.getString( "seq" );
				String subject = rs.getString( "subject" );
				String writer = rs.getString( "writer" );
				long filesize = rs.getLong( "filesize" );
				String wdate = rs.getString( "wdate" );
				String hit = rs.getString( "hit" );
				int wgap = rs.getInt( "wgap" );
				
				to.setSeq(seq);
				to.setSubject(subject);
				to.setWriter(writer);
				to.setFilesize(filesize);
				to.setWdate(wdate);
				to.setHit(hit);
				to.setWgap(wgap);
				
				lists.add(to);
			}
			
		} catch(SQLException e) {
			System.out.println( "error: " + e.getMessage() );
		} finally {
			if ( rs != null ) try { rs.close(); } catch ( SQLException e ) {}
			if ( pstmt != null ) try { pstmt.close(); } catch ( SQLException e ) {}
			if ( conn != null ) try {  conn.close(); } catch ( SQLException e ) {}
		}
		return lists;
	}
	
	//view
	public BoardTO boardView( BoardTO to ) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		String file = "";
		
		try {
			conn = dataSource.getConnection();
			
			String sql = "update pds_board1 set hit = hit+1 where seq = ?";
			pstmt = conn.prepareStatement(sql);
			pstmt.setString( 1, to.getSeq() );
			rs = pstmt.executeQuery();
			
			sql = "select subject, writer, filename, filesize, mail, wip, wdate, hit, content from pds_board1 where seq = ?";
			pstmt = conn.prepareStatement(sql);
			pstmt.setString( 1, to.getSeq() );
			rs = pstmt.executeQuery();
			
			//데이터를 하나만 가져오니깐 while문 대신 if문을 사용한다.
			if ( rs.next() ) {
				String subject = rs.getString( "subject" );
				String writer = rs.getString( "writer" );
				String mail = rs.getString( "mail" );
				String wip = rs.getString( "wip" );
				String wdate = rs.getString( "wdate" );
				String hit = rs.getString( "hit" );
				String filename = rs.getString( "filename" );
				long filesize = rs.getLong( "filesize" );
				if ( filesize != 0 ) {
					file = "<a href='../../upload/" + filename + "'>" + filename + "</a> (" + filesize + "byte)";
				}
				String content = rs.getString( "content" ).replaceAll( "\n", "<br>");
				
				to.setSubject(subject);
				to.setWriter(writer);
				to.setMail(mail);
				to.setWip(wip);
				to.setWdate(wdate);
				to.setHit(hit);
				to.setContent(content);
				to.setFilename(filename);
				to.setFilesize(filesize);
				to.setFile(file);
			}
		} catch(SQLException e) {
			System.out.println( "error: " + e.getMessage() );
		} finally {
			if ( rs != null ) try { rs.close(); } catch ( SQLException e ) {}
			if ( pstmt != null ) try { pstmt.close(); } catch ( SQLException e ) {}
			if ( conn != null ) try {  conn.close(); } catch ( SQLException e ) {}
		}
		return to;
	}
	
	//delete
	public BoardTO boardDelete( BoardTO to ) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		
		try {
			conn = dataSource.getConnection();
			
			String sql = "select subject, writer from pds_board1 where seq = ?";
			pstmt = conn.prepareStatement(sql);
			pstmt.setString( 1, to.getSeq() );
			rs = pstmt.executeQuery();
			
			//데이터를 하나만 가져오니깐 while문 대신 if문을 사용한다.
			if ( rs.next() ) {
				String subject = rs.getString( "subject" );
				String writer = rs.getString( "writer" );
				
				to.setSubject(subject);
				to.setWriter(writer);
			}

		} catch(SQLException e) {
			System.out.println( "error: " + e.getMessage() );
		} finally {
			if ( rs != null ) try { rs.close(); } catch ( SQLException e ) {}
			if ( pstmt != null ) try { pstmt.close(); } catch ( SQLException e ) {}
			if ( conn != null ) try {  conn.close(); } catch ( SQLException e ) {}
		}
		return to;
	}
	
	//delete_ok
	public int boardDeleteOk( BoardTO to ) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		
		int flag = 2;
		
		try {
			conn = dataSource.getConnection();
			
			String sql = "select filename from pds_board1 where seq = ?";
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, to.getSeq() );
			
			rs = pstmt.executeQuery();
			String filename = null;
			if ( rs.next() ) {
				filename = rs.getString( "filename" );
			}
			
			sql = "delete from pds_board1 where seq = ? and password = ?";
			pstmt = conn.prepareStatement(sql);
			pstmt.setString( 1, to.getSeq() );
			pstmt.setString( 2, to.getPassword() );
			
			int result = pstmt.executeUpdate();
			
			if ( result == 0 ) {
				flag = 1;
			} else if ( result == 1 ) {
				flag = 0;
				if ( filename != null ) {
					File file = new File( "C:/Java/jsp-workspace/PdsModel1Ex01/WebContent/upload/"+ filename );
					file.delete();
				}
			}
		} catch(SQLException e) {
			System.out.println( "error: " + e.getMessage() );
		} finally {
			if ( rs != null ) try { rs.close(); } catch ( SQLException e ) {}
			if ( pstmt != null ) try { pstmt.close(); } catch ( SQLException e ) {}
			if ( conn != null ) try {  conn.close(); } catch ( SQLException e ) {}
		}
		return flag;
	}
	
	//modify
	public BoardTO boardModify( BoardTO to ) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		
		try {
			conn = dataSource.getConnection();
			
			String sql = "select writer, subject, content, mail, filename from pds_board1 where seq = ?";
			pstmt = conn.prepareStatement(sql);
			pstmt.setString( 1, to.getSeq() );
			rs = pstmt.executeQuery();
			
			
			if ( rs.next() ) {
				to.setSubject( rs.getString( "subject" ) );
				to.setWriter( rs.getString( "writer" ) );
				to.setContent( rs.getString( "content" ) );
				if ( rs.getString( "filename" ) != null ) {
					to.setFilename( rs.getString( "filename" ) );
				} else {
					to.setFilename( "" );
				}
				to.setMail( rs.getString( "mail" ) );
			}

			
		} catch(SQLException e) {
			System.out.println( "error: " + e.getMessage() );
		} finally {
			if ( rs != null ) try { rs.close(); } catch ( SQLException e ) {}
			if ( pstmt != null ) try { pstmt.close(); } catch ( SQLException e ) {}
			if ( conn != null ) try {  conn.close(); } catch ( SQLException e ) {}
		}
		return to;
	}
	
	//modify_ok
	public int boardModifyOk( BoardTO to ) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		
		int flag = 2;
		
		try {
			conn = dataSource.getConnection();
			
			String sql = "select filename from pds_board1 where seq = ?";
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, to.getSeq());
			rs = pstmt.executeQuery();
			String oldFilename = null;
			if ( rs.next() ) {
				oldFilename = rs.getString( "filename" );
			}
			
			if ( to.getFilename() != null ) {
				//수정에서 첨부파일이 있을 때
				sql = "update pds_board1 set subject = ?, content = ?, mail = ?, filename = ?, filesize = ? where seq = ? and password = ?";
				pstmt = conn.prepareStatement(sql);
				pstmt.setString( 1, to.getSubject() );
				pstmt.setString( 2, to.getContent() );
				pstmt.setString( 3, to.getMail() );
				pstmt.setString( 4, to.getFilename() );
				pstmt.setLong( 5, to.getFilesize() );
				pstmt.setString( 6, to.getSeq() );
				pstmt.setString( 7, to.getPassword() );
			} else {
				//수정에서 첨부파일이 없을 때
				sql = "update pds_board1 set subject = ?, content = ?, mail = ? where seq = ? and password = ?";
				pstmt = conn.prepareStatement(sql);
				pstmt.setString( 1, to.getSubject() );
				pstmt.setString( 2, to.getContent() );
				pstmt.setString( 3, to.getMail() );
				pstmt.setString( 4, to.getSeq() );
				pstmt.setString( 5, to.getPassword() );
			}
			int result = pstmt.executeUpdate();
			
			if ( result == 0 ) {
				flag = 1;
			} else if ( result == 1 ) {
				flag = 0;
				if ( to.getFilename() != null && oldFilename != null ) {
					//기존 첨부파일이 있고 추가된 첨부파일이 있을 경우 기존 파일은 삭제한다.
					File file = new File( "C:/Java/jsp-workspace/PdsModel1Ex01/WebContent/upload/"+ oldFilename );
					file.delete();
				}
			}
			
		} catch(SQLException e) {
			System.out.println( "error: " + e.getMessage() );
		} finally {
			if ( rs != null ) try { rs.close(); } catch ( SQLException e ) {}
			if ( pstmt != null ) try { pstmt.close(); } catch ( SQLException e ) {}
			if ( conn != null ) try {  conn.close(); } catch ( SQLException e ) {}
		}
		return flag;
	}
}

-board_list1.jsp

<%@page import="Pack1.BoardTO"%>
<%@page import="Pack1.BoardDAO"%>
<%@page import="java.util.ArrayList"%>

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

<%
	StringBuffer sbHtml = new StringBuffer();
	
	BoardDAO dao = new BoardDAO();
	ArrayList<BoardTO> lists = dao.boardList();

	int totalRecord = lists.size();
	
	for ( BoardTO to : lists ) {
		sbHtml.append( " <tr> " );
		sbHtml.append( " 	<td>&nbsp;</td> " );
		sbHtml.append( " 	<td>" + to.getSeq() + "</td> " );
		sbHtml.append( "	<td class='left'> ");
		sbHtml.append( "		<a href='board_view1.jsp?seq=" + to.getSeq() + "'>" + to.getSubject() + "</a>&nbsp; ");
		if( to.getWgap() == 0 ) {
			sbHtml.append( "		<img src='../../images/icon_hot.gif' alt='HOT'> ");
		}
		sbHtml.append( "	</td> " );
		sbHtml.append( " 	<td>" + to.getWriter() + "</td> " );
		sbHtml.append( " 	<td>" + to.getWdate() + "</td> " );
		sbHtml.append( " 	<td>" + to.getHit() + "</td> " );
		if ( to.getFilesize() != 0 ) {
			sbHtml.append( " 	<td><img src='../../images/icon_file.gif' /></td> " );
		} else {
			sbHtml.append( " 	<td>&nbsp;</td> " );
		}
		sbHtml.append( " </tr> " );	
	}
%>

<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<title>Insert title here</title>
<link rel="stylesheet" type="text/css" href="../../css/board_list.css">
</head>

<body>
<!-- 상단 디자인 -->
<div class="con_title">
	<h3>게시판</h3>
	<p>HOME &gt; 게시판 &gt; <strong>게시판</strong></p>
</div>
<div class="con_txt">
	<div class="contents_sub">
		<div class="board_top">
			<div class="bold">총 <span class="txt_orange"><%= totalRecord %></span>건</div>
		</div>

		<!--게시판-->
		<div class="board">
			<table>
			<tr>
				<th width="3%">&nbsp;</th>
				<th width="5%">번호</th>
				<th>제목</th>
				<th width="10%">글쓴이</th>
				<th width="17%">등록일</th>
				<th width="5%">조회</th>
				<th width="3%">&nbsp;</th>
			</tr>
			<%= sbHtml %>
			</table>
		</div>	
		<!--//게시판-->

		<div class="align_right">
			<input type="button" value="쓰기" class="btn_write btn_txt01" style="cursor: pointer;" onclick="location.href='board_write1.jsp'" />
		</div>
	</div>
</div>
<!--//하단 디자인 -->

</body>
</html>

-board_write1.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<title>Insert title here</title>
<link rel="stylesheet" type="text/css" href="../../css/board_write.css">

<script type="text/javascript">
	window.onload = function() {
		document.getElementById( 'submit1' ).onclick = function() {
			if ( document.wfrm.info.checked == false ) {
				alert( '동의를 해주세요' );
				return false;
			}
			if ( document.wfrm.writer.value.trim() == '' ) {
				alert( '글쓴이를 입력해주세요' );
				return false;
			}
			if ( document.wfrm.subject.value.trim() == '' ) {
				alert( '제목을 입력해주세요' );
				return false;
			}
			if ( document.wfrm.password.value.trim() == '' ) {
				alert( '비밀번호를 입력해주세요' );
				return false;
			}
			document.wfrm.submit();
		}
	}
</script>

</head>

<body>
<!-- 상단 디자인 -->
<div class="con_title">
	<h3>게시판</h3>
	<p>HOME &gt; 게시판 &gt; <strong>게시판</strong></p>
</div>
<div class="con_txt">
	<form action="board_write1_ok.jsp" method="post" name="wfrm" enctype="multipart/form-data">
		<div class="contents_sub">	
			<!--게시판-->
			<div class="board_write">
				<table>
				<tr>
					<th class="top">글쓴이</th>
					<td class="top" colspan="3"><input type="text" name="writer" value="" class="board_view_input_mail" maxlength="5" /></td>
				</tr>
				<tr>
					<th>제목</th>
					<td colspan="3"><input type="text" name="subject" value="" class="board_view_input" /></td>
				</tr>
				<tr>
					<th>비밀번호</th>
					<td colspan="3"><input type="password" name="password" value="" class="board_view_input_mail"/></td>
				</tr>
				<tr>
					<th>내용</th>
					<td colspan="3"><textarea name="content" class="board_editor_area"></textarea></td>
				</tr>
				<tr>
					<th>이메일</th>
					<td colspan="3"><input type="text" name="mail1" value="" class="board_view_input_mail"/> @ <input type="text" name="mail2" value="" class="board_view_input_mail"/></td>
				</tr>
				<tr>
					<th>첨부파일</th>
					<td colspan="3">
						<input type="file" name="upload" value="파일첨부" class="board_view_input" />
					</td>
				</tr>
				</table>
				
				<table>
				<tr>
					<br />
					<td style="text-align:left;border:1px solid #e0e0e0;background-color:f9f9f9;padding:5px">
						<div style="padding-top:7px;padding-bottom:5px;font-weight:bold;padding-left:7px;font-family: Gulim,Tahoma,verdana;">※ 개인정보 수집 및 이용에 관한 안내</div>
						<div style="padding-left:10px;">
							<div style="width:97%;height:95px;font-size:11px;letter-spacing: -0.1em;border:1px solid #c5c5c5;background-color:#fff;padding-left:14px;padding-top:7px;">
								1. 수집 개인정보 항목 : 회사명, 담당자명, 메일 주소, 전화번호, 홈페이지 주소, 팩스번호, 주소 <br />
								2. 개인정보의 수집 및 이용목적 : 제휴신청에 따른 본인확인 및 원활한 의사소통 경로 확보 <br />
								3. 개인정보의 이용기간 : 모든 검토가 완료된 후 3개월간 이용자의 조회를 위하여 보관하며, 이후 해당정보를 지체 없이 파기합니다. <br />
								4. 그 밖의 사항은 개인정보취급방침을 준수합니다.
							</div>
						</div>
						<div style="padding-top:7px;padding-left:5px;padding-bottom:7px;font-family: Gulim,Tahoma,verdana;">
							<input type="checkbox" name="info" value="1" class="input_radio"> 개인정보 수집 및 이용에 대해 동의합니다.
						</div>
					</td>
				</tr>
				</table>
			</div>
			
			<div class="btn_area">
				<div class="align_left">
					<input type="button" value="목록" class="btn_list btn_txt02" style="cursor: pointer;" onclick="location.href='board_list1.jsp'" />
				</div>
				<div class="align_right">
					<input type="button" id="submit1" value="쓰기" class="btn_write btn_txt01" style="cursor: pointer;" />
				</div>
			</div>
			<!--//게시판-->
		</div>
	</form>
</div>
<!-- 하단 디자인 -->

</body>
</html>

-board_write1_ok.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%@page import="Pack1.BoardTO"%>
<%@page import="Pack1.BoardDAO"%>

<%@ page import="com.oreilly.servlet.multipart.DefaultFileRenamePolicy" %>
<%@ page import="com.oreilly.servlet.MultipartRequest" %>
<%@ page import="java.io.File" %>

<%
	String uploadPath = "C:/Java/jsp-workspace/PdsModel1Ex01/WebContent/upload";
	int maxFileSize = 1024 * 1024 * 10;
	String encType = "utf-8";
	MultipartRequest multi 
		= new MultipartRequest( request, uploadPath, maxFileSize, encType, new DefaultFileRenamePolicy() );
	
	String subject = multi.getParameter( "subject" );
	String writer = multi.getParameter( "writer" );
	//필수입력항목이 아닌경우 아래와 같이 값을 검사하고 저장해야 한다.
	String mail = "";
	if ( !multi.getParameter( "mail1" ).equals("") && !multi.getParameter( "mail2" ).equals("") ) {
		mail = multi.getParameter( "mail1" ) +  "@" + multi.getParameter( "mail2" );
	}
	String password = multi.getParameter( "password" );
	String content = multi.getParameter( "content" );
	String wip = request.getRemoteAddr();	//환경값만 request사용
	
	String filename = multi.getFilesystemName( "upload" );
	File file = multi.getFile( "upload" );
	long filesize = 0;
	if ( file != null ) {
		filesize = file.length();
	}
	
	BoardTO to = new BoardTO();
	BoardDAO dao = new BoardDAO();
	
	to.setSubject(subject);
	to.setWriter(writer);
	to.setMail(mail);
	to.setPassword(password);
	to.setContent(content);
	to.setWip(wip);
	to.setFilename(filename);
	to.setFilesize(filesize);
	
	int flag = dao.boardWriteOk(to);
	
	out.println( " <script type='text/javascript'> " );
	if( flag == 0 ) {
		out.println( " alert('글쓰기에 성공했습니다.'); " );
		out.println( " location.href='board_list1.jsp;'" );
	} else {
		out.println( " alert('글쓰기에 실패했습니다.'); " );
		out.println( " history.back(); " );
	}
	out.println( " </script> " );
	

%>


-board_view1.jsp

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

<%@page import="Pack1.BoardTO"%>
<%@page import="Pack1.BoardDAO"%>

<%
	request.setCharacterEncoding( "utf-8" );
	
	BoardTO to = new BoardTO();
	to.setSeq( request.getParameter( "seq" ) );
	to.setSubject( "" );
	to.setWriter( "" );
	to.setMail( "" );
	to.setWip( "" );
	to.setWdate( "" );
	to.setHit( "" );
	to.setContent( "" );
	to.setFilename( "" );
	to.setFilesize( 0 );
	to.setFile( "" );
	
	BoardDAO dao = new BoardDAO();
	
	to = dao.boardView(to);
	
	String seq = to.getSeq();
	String subject = to.getSubject();
	String writer = to.getWriter();
	String mail = to.getMail();
	String wip = to.getWip();
	String wdate = to.getWdate();
	String hit = to.getHit();
	String content = to.getContent();
	String filename = to.getFilename();
	long filesize = to.getFilesize();
	String file = to.getFile();
	
	
%>

<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<title>Insert title here</title>
<link rel="stylesheet" type="text/css" href="../../css/board_view.css">
</head>

<body>
<!-- 상단 디자인 -->
<div class="con_title">
	<h3>게시판</h3>
	<p>HOME &gt; 게시판 &gt; <strong>게시판</strong></p>
</div>
<div class="con_txt">
	<div class="contents_sub">
		<!--게시판-->
		<div class="board_view">
			<table>
			<tr>
				<th width="10%">제목</th>
				<td width="60%"><%= subject %></td>
				<th width="10%">등록일</th>
				<td width="20%"><%= wdate %></td>
			</tr>
			<tr>
				<th>글쓴이</th>
				<td><%= writer %>(<%= mail %>)(<%= wip %>)</td>
				<th>조회</th>
				<td><%= hit %></td>
			</tr>
			<tr>
				<th>첨부 파일</th>
				<td><%= file %></td>

			</tr>
			<tr>
				<td colspan="4" height="200" valign="top" style="padding: 20px; line-height: 160%"><%= content %></td>
			</tr>
			</table>
		</div>

		<div class="btn_area">
			<div class="align_left">
				<input type="button" value="목록" class="btn_list btn_txt02" style="cursor: pointer;" onclick="location.href='board_list1.jsp'" />
			</div>
			<div class="align_right">
				<input type="button" value="수정" class="btn_list btn_txt02" style="cursor: pointer;" onclick="location.href='board_modify1.jsp?seq=<%= seq %>'" />
				<input type="button" value="삭제" class="btn_list btn_txt02" style="cursor: pointer;" onclick="location.href='board_delete1.jsp?seq=<%= seq %>'" />
				<input type="button" value="쓰기" class="btn_write btn_txt01" style="cursor: pointer;" onclick="location.href='board_write1.jsp'" />
			</div>
		</div>	
		<!--//게시판-->
	</div>
</div>
<!-- 하단 디자인 -->

</body>
</html>

-board_delete1.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
	
<%@page import="Pack1.BoardTO"%>
<%@page import="Pack1.BoardDAO"%>

<%
	request.setCharacterEncoding( "utf-8" );
	
	String seq = request.getParameter( "seq" );
	
	String subject = "";
	String writer = "";
	
	BoardTO to = new BoardTO();
	BoardDAO dao = new BoardDAO();
	
	to.setSeq(seq);
	to.setSubject(subject);
	to.setWriter(writer);
	
	to = dao.boardDelete(to);
	
	subject = to.getSubject();
	writer = to.getWriter();
	
	
%>

<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<title>Insert title here</title>
<link rel="stylesheet" type="text/css" href="../../css/board_write.css">

<script type="text/javascript">
	window.onload = function() {
		document.getElementById( 'submit1' ).onclick = function() {
			if( document.dfrm.password.value.trim() == '' ) {
				alert( '비밀번호를 입력해주세요' );
				return false;
			}
			document.dfrm.submit();
		}
	}
</script>

</head>

<body>
<!-- 상단 디자인 -->
<div class="con_title">
	<h3>게시판</h3>
	<p>HOME &gt; 게시판 &gt; <strong>게시판</strong></p>
</div>
<div class="con_txt">
	<form action="board_delete1_ok.jsp" method="post" name="dfrm">
		<input type="hidden" name="seq" value="<%= seq %>">
		<div class="contents_sub">	
			<!--게시판-->
			<div class="board_write">
				<table>
				<tr>
					<th class="top">글쓴이</th>
					<td class="top" colspan="3"><input type="text" name="writer" value="<%= writer %>" class="board_view_input_mail" maxlength="5" readonly/></td>
				</tr>
				<tr>
					<th>제목</th>
					<td colspan="3"><input type="text" name="subject" value="<%= subject %>" class="board_view_input" readonly/></td>
				</tr>
				<tr>
					<th>비밀번호</th>
					<td colspan="3"><input type="password" name="password" value="" class="board_view_input_mail"/></td>
				</tr>
				</table>
			</div>
			
			<div class="btn_area">
				<div class="align_left">
					<input type="button" value="목록" class="btn_list btn_txt02" style="cursor: pointer;" onclick="location.href='board_list1.jsp'" />
					<input type="button" value="보기" class="btn_list btn_txt02" style="cursor: pointer;" onclick="location.href='board_view1.jsp?seq=<%=seq %>'" />
				</div>
				<div class="align_right">
					<input type="button" id="submit1" value="삭제" class="btn_write btn_txt01" style="cursor: pointer;" />
				</div>
			</div>
			<!--//게시판-->
		</div>
	</form>
</div>
<!-- 하단 디자인 -->

</body>
</html>

-board_delete1_ok.jsp

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


<%@page import="Pack1.BoardTO"%>
<%@page import="Pack1.BoardDAO"%>

<%
	request.setCharacterEncoding( "utf-8" );

	String seq = request.getParameter( "seq" );
	String password = request.getParameter( "password" );
	
	BoardTO to = new BoardTO();
	BoardDAO dao = new BoardDAO();
	
	to.setSeq(seq);
	to.setPassword(password);
	
	int flag = dao.boardDeleteOk(to);
	
	
	out.println( " <script type='text/javascript'> " );
	if( flag == 0 ) {
		out.println( " alert('글삭제에 성공했습니다.'); " );
		out.println( " location.href='board_list1.jsp;' " );
	} else if ( flag == 1 ) {
		out.println( " alert('비밀번호가 틀립니다.'); " );
		out.println( " history.back(); " );
	} else {
		out.println( " alert('글삭제에 실패했습니다.'); " );
		out.println( " history.back(); " );
	}
	out.println( " </script> " );
	
%>

-board_modify1.jsp

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

<%@page import="Pack1.BoardTO"%>
<%@page import="Pack1.BoardDAO"%>

<%
	request.setCharacterEncoding( "utf-8" );
	
	String seq = request.getParameter( "seq" );
	
	BoardTO to = new BoardTO();
	BoardDAO dao = new BoardDAO();
	to.setSeq(seq);
	
	to = dao.boardModify(to);
	
	String writer = to.getWriter();
	String subject = to.getSubject();
	String content = to.getContent();
	String mail[] = null;
	if ( to.getMail().equals("") ) {
		mail = new String[] {"", ""};
	} else {
		mail = to.getMail().split("@");
	}
	String filename = to.getFilename();
	
%>

<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<title>Insert title here</title>
<link rel="stylesheet" type="text/css" href="../../css/board_write.css">

<script type="text/javascript">
 	window.onload = function() {
 		document.getElementById( 'submit2' ).onclick = function() {
 			if ( document.mfrm.subject.value.trim() == '' ) {
 				alert( '제목을 입력해주세요' );
 				return false;
 			}
 			if ( document.mfrm.password.value.trim() == '' ) {
 				alert( '비밀번호를 입력해주세요' );
 				return false;
 			}
 			if ( document.mfrm.content.value.trim() == '' ) {
 				alert( '내용을 입력해주세요' );
 				return false;
 			}
 			document.mfrm.submit();
 		}
 	}
</script>

</head>

<body>
<!-- 상단 디자인 -->
<div class="con_title">
	<h3>게시판</h3>
	<p>HOME &gt; 게시판 &gt; <strong>게시판</strong></p>
</div>
<div class="con_txt">
	<form action="board_modify1_ok.jsp" method="post" name="mfrm" enctype="multipart/form-data">
		<input type="hidden" name="seq" value="<%= seq %>">
		<div class="contents_sub">	
			<!--게시판-->
			<div class="board_write">
				<table>
				<tr>
					<th class="top">글쓴이</th>
					<td class="top" colspan="3"><input type="text" name="writer" value="<%= writer %>" class="board_view_input_mail" maxlength="5" readonly/></td>
				</tr>
				<tr>
					<th>제목</th>
					<td colspan="3"><input type="text" name="subject" value="<%= subject %>" class="board_view_input" /></td>
				</tr>
				<tr>
					<th>비밀번호</th>
					<td colspan="3"><input type="password" name="password" value="" class="board_view_input_mail"/></td>
				</tr>
				<tr>
					<th>내용</th>
					<td colspan="3"><textarea name="content" class="board_editor_area"><%= content %></textarea></td>
				</tr>
				<tr>
					<th>이메일</th>
					<td colspan="3"><input type="text" name="mail1" value="<%= mail[0] %>" class="board_view_input_mail"/> @ <input type="text" name="mail2" value="<%= mail[1] %>" class="board_view_input_mail"/></td>
				</tr>
				<tr>
					<th>첨부파일</th>
					<td colspan="3">
						기존 파일명 : <%=filename %><br /><br />
						<input type="file" name="upload" value="" class="board_view_input" />
					</td>
				</tr>
				</table>
			</div>
			
			<div class="btn_area">
				<div class="align_left">
					<input type="button" value="목록" class="btn_list btn_txt02" style="cursor: pointer;" onclick="location.href='board_list1.jsp'" />
					<input type="button" value="보기" class="btn_list btn_txt02" style="cursor: pointer;" onclick="location.href='board_view1.jsp?seq=<%=seq %>'" />
				</div>
				<div class="align_right">
					<input type="button" id="submit2" value="수정" class="btn_write btn_txt01" style="cursor: pointer;" />
				</div>
			</div>
			<!--//게시판-->
		</div>
	</form>
</div>
<!-- 하단 디자인 -->

</body>
</html>

-board_modify1_ok.jsp

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

<%@page import="Pack1.BoardTO"%>
<%@page import="Pack1.BoardDAO"%>

<%@ page import="com.oreilly.servlet.multipart.DefaultFileRenamePolicy" %>
<%@ page import="com.oreilly.servlet.MultipartRequest" %>
<%@ page import="java.io.File" %>

<%
	String uploadPath = "C:/Java/jsp-workspace/PdsModel1Ex01/WebContent/upload";
	int maxFileSize = 1024 * 1024 * 10;
	String encType = "utf-8";
	MultipartRequest multi 
		= new MultipartRequest( request, uploadPath, maxFileSize, encType, new DefaultFileRenamePolicy() );
	
	String seq = multi.getParameter( "seq" );
	String password = multi.getParameter( "password" );
	String subject = multi.getParameter( "subject" );
	String content = multi.getParameter( "content" );
	String mail = "";
	if ( !multi.getParameter( "mail1" ).equals("") && !multi.getParameter( "mail2" ).equals("") ) {
		mail = multi.getParameter( "mail1" ) + "@" + multi.getParameter( "mail2" );
	}
	String newFilename = multi.getFilesystemName( "upload" );
	File newFile = multi.getFile( "upload" );
	long newFilesize = 0;
	if ( newFile != null ) {
		newFilesize = newFile.length();
	}
	
	BoardTO to = new BoardTO();
	BoardDAO dao = new BoardDAO();
	to.setSeq(seq);
	to.setPassword(password);
	to.setSubject(subject);
	to.setContent(content);
	to.setMail(mail);
	to.setFilename( newFilename );
	to.setFilesize(newFilesize);
	
	int flag = dao.boardModifyOk(to);
	
	
	out.println( " <script type='text/javascript'> " );
	if( flag == 0 ) {
		out.println( " alert('글수정에 성공했습니다.'); " );
		out.println( " location.href='board_modify1.jsp?seq=" + seq + "'" );
	} else if ( flag == 1 ) {
		out.println( " alert('비밀번호가 틀립니다.'); " );
		out.println( " history.back(); " );
	} else {
		out.println( " alert('글수정에 실패했습니다.'); " );
		out.println( " history.back(); " );
	}
	out.println( " </script> " );
	
%>

 

 

ㅇ답변글있는 게시판 만들기

모글	board_write1.jsp
답변글	board_view1.jsp
		board_reply1.jsp

컬럼4개 필요

알고리즘

글번호		seq	순서값, 순차증가
			board_write1.jsp		자동증가
			board_reply1.jsp		자동증가

글그룹		grp	순서값, 모글seq필요
			board_write1.jsp		모글의 seq
			board_reply1.jsp		모글의 seq

그룹내순서	grps	같은 그룹내부의 순서
			board_write1.jsp		0
			board_reply1.jsp		
				같은 그룹내라면 아래의 규칙을 따른다.
				1. 부모글의 grps보다 큰 grps번호는 무조건1씩증가
				2. 자신은 부모글의 grps+1

그룹내깊이	grpl	같은 그룹내부의 깊이
			board_write1.jsp		0
			board_reply1.jsp
				같은 그룹내라면 아래의 규칙을 따른다.
				1. 자신은 부모글의 grpl+1


알고리즘을 순차적으로 표현하면 아래와 같다.
			seq	grp	grps	grpl
write1	모글1		1	1	0	0
write1	모글2		2	2	0	0
reply1	모글1-1		3	1	3	1
reply1	모글1-2		4	1	2	1
reply1	모글1-3		5	1	1	1
reply1	모글1-1-1	6	1	5	2
reply1	모글1-1-2	7	1	4	2
reply1	모글1-2-1	8	1	3	2

위를 정렬시키면 order by grp desc, grps asc
			seq	grp	grps	grpl
write1	모글2		2	2	0	0
write1	모글1		1	1	0	0
reply1	 모글1-3	5	1	1	1
reply1	 모글1-2	4	1	2	1
reply1	  모글1-2-1	8	1	3	2
reply1	 모글1-1	3	1	3	1
reply1	  모글1-1-2	7	1	4	2
reply1	  모글1-1-1	6	1	5	2

-데이터베이스 DDL

create table rep_board1 (
seq int not null primary key auto_increment,
grp int not null,
grps int not null,
grpl int not null,
subject varchar(150) not null,
writer varchar(12) not null,
mail varchar(50),
password varchar(12)	 not null,
content varchar(2000),
hit int not null,
wip varchar(15) not null,
wdate datetime not null
);

-board_list1.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
	
<%@ page import="javax.naming.Context" %>
<%@ page import="javax.naming.InitialContext" %>
<%@ page import="javax.naming.NamingException" %>
<%@ page import="javax.sql.DataSource" %>

<%@ page import="java.sql.Connection" %>
<%@ page import="java.sql.PreparedStatement" %>
<%@ page import="java.sql.ResultSet" %>
<%@ page import="java.sql.SQLException" %>

<%
	request.setCharacterEncoding( "utf-8" );
	int cpage = 1;
	if ( request.getParameter( "cpage" ) != null && !request.getParameter( "cpage" ).equals("") ) {
		cpage = Integer.parseInt( request.getParameter( "cpage" ) );
	}
	
	//데이터 개수 고정하기
	int recordPerPage = 10;
	int totalRecord = 0;
	
	//전체 페이지 개수
	int totalPage = 1;
	
	//보여질 페이지 개수
	int blockPerPage = 5;

	Connection conn = null;
	PreparedStatement pstmt = null;
	ResultSet rs = null;
	
	
	StringBuffer sbHtml = new StringBuffer();
	
	try {
		//커넥션 풀로 DB에 연결하기
		Context initCtx = new InitialContext();
		Context envCtx = (Context)initCtx.lookup( "java:comp/env" );
		DataSource dataSource = (DataSource)envCtx.lookup( "jdbc/mariadb2" );
		conn = dataSource.getConnection();
		
		String sql = "select seq, grpl, subject, writer, date_format(wdate, '%Y-%m-%d') wdate, hit, datediff(now(), wdate) wgap from rep_board1 order by grp desc, grps asc";
		pstmt = conn.prepareStatement(sql, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
		rs = pstmt.executeQuery();
		
		rs.last();
		totalRecord = rs.getRow();
		rs.beforeFirst();
		
		int skip = ( cpage * recordPerPage ) - recordPerPage;
		if ( skip != 0 ) rs.absolute( skip );
		
		totalPage = ( ( totalRecord-1 ) / recordPerPage ) + 1;
		
		for( int i=0; i<recordPerPage && rs.next(); i++ ) {
			String seq = rs.getString( "seq" );
			int grpl = rs.getInt( "grpl" );
			String sgrpl = "";
			for ( int j=1; j<=grpl; j++ ) {
				sgrpl += "&nbsp;&nbsp;";
			}
			String subject = rs.getString( "subject" );
			String writer = rs.getString( "writer" );
			String wdate = rs.getString( "wdate" );
			String hit = rs.getString( "hit" );
			int wgap = rs.getInt( "wgap" );
			
			sbHtml.append( " <tr> " );
			sbHtml.append( " 	<td>&nbsp;</td> " );
			sbHtml.append( " 	<td>" + seq + "</td> " );
			sbHtml.append( "	<td class='left'> ");
			if ( grpl != 0 ) {
				sbHtml.append( sgrpl + "<img src='../../images/icon_re.gif' />" );
			}
			sbHtml.append( "		<a href='board_view1.jsp?cpage=" + cpage + "&seq=" + seq + "'>" + subject + "</a>&nbsp; ");
			if( wgap == 0 ) {
				sbHtml.append( "		<img src='../../images/icon_hot.gif' alt='HOT'> ");
			}
			sbHtml.append( "	</td> " );
			sbHtml.append( " 	<td>" + writer + "</td> " );
			sbHtml.append( " 	<td>" + wdate + "</td> " );
			sbHtml.append( " 	<td>" + hit + "</td> " );
			sbHtml.append( " 	<td>&nbsp;</td> " );
			sbHtml.append( " </tr> " );
		}

	} catch(NamingException e) {
		System.out.println( "error: " + e.getMessage() );
	} catch(SQLException e) {
		System.out.println( "error: " + e.getMessage() );
	} finally {
		if ( rs != null ) rs.close();
		if ( pstmt != null ) pstmt.close();
		if ( conn != null ) conn.close();
	}
%>

<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<title>Insert title here</title>
<link rel="stylesheet" type="text/css" href="../../css/board_list.css">
</head>

<body>
<!-- 상단 디자인 -->
<div class="con_title">
	<h3>게시판</h3>
	<p>HOME &gt; 게시판 &gt; <strong>게시판</strong></p>
</div>
<div class="con_txt">
	<div class="contents_sub">
		<div class="board_top">
			<div class="bold">총 <span class="txt_orange">1</span>건</div>
		</div>

		<!--게시판-->
		<div class="board">
			<table>
			<tr>
				<th width="3%">&nbsp;</th>
				<th width="5%">번호</th>
				<th>제목</th>
				<th width="10%">글쓴이</th>
				<th width="17%">등록일</th>
				<th width="5%">조회</th>
				<th width="3%">&nbsp;</th>
			</tr>
			<%= sbHtml %>
			</table>
		</div>	
		<!--//게시판-->

		<div class="align_right">
			<input type="button" value="쓰기" class="btn_write btn_txt01" style="cursor: pointer;" onclick="location.href='board_write1.jsp?cpage=<%=cpage %>'" />
		</div>
	</div>
</div>
<!--//하단 디자인 -->
		<!--페이지넘버-->
		<div class="paginate_regular">
			<div align="absmiddle">

<%	
	//페이지 5개로 만들 때 시작페이지와 끝 페이지 선언
	int startBlock = ( ( cpage-1 ) / blockPerPage ) * blockPerPage + 1;
	int endBlock = ( ( cpage-1 ) / blockPerPage ) * blockPerPage + blockPerPage;
	if ( endBlock >= totalPage ) {
		endBlock = totalPage;
	}
%>


<%	
	//앞에 5개 페이지 넘어가기
	if ( startBlock == 1 ) {
		out.println( " <span><a>&lt;&lt;</a></span> " );
	} else {
		out.println( " <span><a href='board_list1.jsp?cpage=" + (startBlock-blockPerPage) + "'>&lt;&lt;</a></span> " );
	}
	out.println( " &nbsp; " );
	
	//이전 페이지로 넘어가기
	if ( cpage == 1 ) {
		out.println( "<span><a href=''>&lt;</a></span>" );
	} else {
		out.println( "<span><a href='board_list1.jsp?cpage=" + (cpage-1) + "'>&lt;</a></span>" );
	}
	
	//전체 페이지 출력 및 현재 페이지 표시
	out.println( "&nbsp;&nbsp;" );
	for ( int i=startBlock; i<=endBlock; i++ ) {
		if ( cpage == i ) {
			out.println( "<span>[" + i + "]</span>" );
		} else {
			out.println( "<span><a href='board_list1.jsp?cpage=" + i + "'>" + i + "</a></span>" );
		}
	}
	out.println( " &nbsp;&nbsp; " );
	
	//다음 페이지로 넘어가기
	if ( cpage == totalPage ) {
		out.println( "<span><a href=''>&gt;</a></span>" );
	} else {
		out.println( "<span><a href='board_list1.jsp?cpage=" + (cpage+1) + "'>&gt;</a></span>" );
	}
	out.println( " &nbsp; " );
	
	//뒤 5개 페이지 넘어가기
	if ( endBlock == totalPage ) {
		out.println( " <span><a>&gt;&gt;</a></span> " );
	} else {
		out.println( " <span><a href='board_list1.jsp?cpage=" + (startBlock+blockPerPage) + "'>&gt;&gt;</a></span> " );
	}
	//out.println( "<span><a href='board_list1.jsp?cpage=" + totalPage + "'>&gt;&gt;</a></span>" );
%>				
			</div>
		</div>
		<!--//페이지넘버-->
</body>
</html>

-board_write_ok.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="javax.naming.Context" %>
<%@ page import="javax.naming.InitialContext" %>
<%@ page import="javax.naming.NamingException" %>
<%@ page import="javax.sql.DataSource" %>

<%@ page import="java.sql.Connection" %>
<%@ page import="java.sql.PreparedStatement" %>
<%@ page import="java.sql.SQLException" %>

<%
	request.setCharacterEncoding("utf-8");

	String subject = request.getParameter( "subject" );
	String writer = request.getParameter( "writer" );
	//필수입력항목이 아닌경우 아래와 같이 값을 검사하고 저장해야 한다.
	String mail = "";
	if ( !request.getParameter( "mail1" ).equals("") && !request.getParameter( "mail2" ).equals("") ) {
		mail = request.getParameter( "mail1" ) +  "@" + request.getParameter( "mail2" );
	}
	String password = request.getParameter( "password" );
	String content = request.getParameter( "content" );
	String wip = request.getRemoteAddr();

	Connection conn = null;
	PreparedStatement pstmt = null;
	
	//정상처리인지 비정상처리인지를 구분하는 변수 -> 결과를 한 군데에서 통합처리하기 위한 변수
	int flag = 1;
	
	try {
		//커넥션 풀로 DB에 연결하기
		Context initCtx = new InitialContext();
		Context envCtx = (Context)initCtx.lookup( "java:comp/env" );
		DataSource dataSource = (DataSource)envCtx.lookup( "jdbc/mariadb2" );
		conn = dataSource.getConnection();
		
		String sql = "insert into rep_board1 values (0, last_insert_id()+1, 0, 0, ?, ?, ?, ?, ?, 0, ?, now() )";
		pstmt = conn.prepareStatement(sql);
		pstmt.setString( 1, subject );
		pstmt.setString( 2, writer );
		pstmt.setString( 3, mail );
		pstmt.setString( 4, password );
		pstmt.setString( 5, content );
		pstmt.setString( 6, wip );
		
		int result = pstmt.executeUpdate();
		if ( result == 1 ) {
			flag = 0;
		}
	} catch(NamingException e) {
		System.out.println( "error: " + e.getMessage() );
	} catch(SQLException e) {
		System.out.println( "error: " + e.getMessage() );
	} finally {
		if ( pstmt != null ) pstmt.close();
		if ( conn != null ) conn.close();
	}
	
	out.println( " <script type='text/javascript'> " );
	if( flag == 0 ) {
		out.println( " alert('글쓰기에 성공했습니다.'); " );
		out.println( " location.href='board_list1.jsp;' " );
	} else {
		out.println( " alert('글쓰기에 실패했습니다.'); " );
		out.println( " history.back(); " );
	}
	out.println( " </script> " );
	

%>


-board_reply1.jsp -> board_write1.jsp를 복사해서 이름 변경

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
	
<%
	request.setCharacterEncoding( "utf-8" );
	
	String cpage = request.getParameter( "cpage" );
	String seq = request.getParameter( "seq" );
	
%>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<title>Insert title here</title>
<link rel="stylesheet" type="text/css" href="../../css/board_write.css">
<script type="text/javascript">
	window.onload = function() {
		document.getElementById( 'submit1' ).onclick = function() {
			if ( document.rfrm.info.checked == false ) {
				alert( '개인정보 동의를 해주세요' );
				return false;
			}
			if ( document.rfrm.writer.value.trim() == '' ) {
				alert( '글쓴이를 입력해주세요' );
				return false;
			}
			if ( document.rfrm.subject.value.trim() == '' ) {
				alert( '제목을 입력해주세요' );
				return false;
			}
			if ( document.rfrm.password.value.trim() == '' ) {
				alert( '비밀번호를 입력해주세요' );
				return false;
			}
			document.rfrm.submit();
		}
	}
</script>
</head>

<body>
<!-- 상단 디자인 -->
<div class="con_title">
	<h3>게시판</h3>
	<p>HOME &gt; 게시판 &gt; <strong>게시판</strong></p>
</div>
<div class="con_txt">
	<form action="board_reply1_ok.jsp" method="post" name="rfrm">
		<input type="hidden" name="seq" value="<%=seq %>" />
		<input type="hidden" name="cpage" value="<%=cpage %>" />
		<div class="contents_sub">	
			<!--게시판-->
			<div class="board_write">
				<table>
				<tr>
					<th class="top">글쓴이</th>
					<td class="top" colspan="3"><input type="text" name="writer" value="" class="board_view_input_mail" maxlength="5" /></td>
				</tr>
				<tr>
					<th>제목</th>
					<td colspan="3"><input type="text" name="subject" value="" class="board_view_input" /></td>
				</tr>
				<tr>
					<th>비밀번호</th>
					<td colspan="3"><input type="password" name="password" value="" class="board_view_input_mail"/></td>
				</tr>
				<tr>
					<th>내용</th>
					<td colspan="3"><textarea name="content" class="board_editor_area"></textarea></td>
				</tr>
				<tr>
					<th>이메일</th>
					<td colspan="3"><input type="text" name="mail1" value="" class="board_view_input_mail"/> @ <input type="text" name="mail2" value="" class="board_view_input_mail"/></td>
				</tr>
				</table>
				
				<table>
				<tr>
					<br />
					<td style="text-align:left;border:1px solid #e0e0e0;background-color:f9f9f9;padding:5px">
						<div style="padding-top:7px;padding-bottom:5px;font-weight:bold;padding-left:7px;font-family: Gulim,Tahoma,verdana;">※ 개인정보 수집 및 이용에 관한 안내</div>
						<div style="padding-left:10px;">
							<div style="width:97%;height:95px;font-size:11px;letter-spacing: -0.1em;border:1px solid #c5c5c5;background-color:#fff;padding-left:14px;padding-top:7px;">
								1. 수집 개인정보 항목 : 회사명, 담당자명, 메일 주소, 전화번호, 홈페이지 주소, 팩스번호, 주소 <br />
								2. 개인정보의 수집 및 이용목적 : 제휴신청에 따른 본인확인 및 원활한 의사소통 경로 확보 <br />
								3. 개인정보의 이용기간 : 모든 검토가 완료된 후 3개월간 이용자의 조회를 위하여 보관하며, 이후 해당정보를 지체 없이 파기합니다. <br />
								4. 그 밖의 사항은 개인정보취급방침을 준수합니다.
							</div>
						</div>
						<div style="padding-top:7px;padding-left:5px;padding-bottom:7px;font-family: Gulim,Tahoma,verdana;">
							<input type="checkbox" name="info" value="1" class="input_radio"> 개인정보 수집 및 이용에 대해 동의합니다.
						</div>
					</td>
				</tr>
				</table>
			</div>
			
			<div class="btn_area">
				<div class="align_left">
					<input type="button" value="목록" class="btn_list btn_txt02" style="cursor: pointer;" onclick="location.href='board_list1.jsp?cpage=<%=cpage %>'" />
				</div>
				<div class="align_right">
					<input type="button" id="submit1" value="답글쓰기" class="btn_write btn_txt01" style="cursor: pointer;" />
				</div>
			</div>
			<!--//게시판-->
		</div>
	</form>
</div>
<!-- 하단 디자인 -->

</body>
</html>

-board_reply1_ok.jsp

<%@page import="java.sql.ResultSet"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="javax.naming.Context" %>
<%@ page import="javax.naming.InitialContext" %>
<%@ page import="javax.naming.NamingException" %>
<%@ page import="javax.sql.DataSource" %>

<%@ page import="java.sql.Connection" %>
<%@ page import="java.sql.PreparedStatement" %>
<%@ page import="java.sql.SQLException" %>

<%
	request.setCharacterEncoding("utf-8");
	
	String cpage = request.getParameter( "cpage" );
	String seq = request.getParameter( "seq" );

	String subject = request.getParameter( "subject" );
	String writer = request.getParameter( "writer" );
	//필수입력항목이 아닌경우 아래와 같이 값을 검사하고 저장해야 한다.
	String mail = "";
	if ( !request.getParameter( "mail1" ).equals("") && !request.getParameter( "mail2" ).equals("") ) {
		mail = request.getParameter( "mail1" ) +  "@" + request.getParameter( "mail2" );
	}
	String password = request.getParameter( "password" );
	String content = request.getParameter( "content" );
	String wip = request.getRemoteAddr();

	Connection conn = null;
	PreparedStatement pstmt = null;
	ResultSet rs = null;
	
	int flag = 1;
	
	try {
		Context initCtx = new InitialContext();
		Context envCtx = (Context)initCtx.lookup( "java:comp/env" );
		DataSource dataSource = (DataSource)envCtx.lookup( "jdbc/mariadb2" );
		conn = dataSource.getConnection();
		
		//부모글의 grp, grps, grpl 가져오기
		String sql = "select grp, grps, grpl from rep_board1 where seq = ?";
		pstmt = conn.prepareStatement(sql);
		pstmt.setString( 1, seq );
		rs = pstmt.executeQuery();
		int grp = 0;
		int grps = 0;
		int grpl = 0;
		if( rs.next() ) {
			grp = rs.getInt( "grp" );
			grps = rs.getInt( "grps" );
			grpl = rs.getInt( "grpl" );
		}
		
		//같은 grp일경우 1씩 증가
		sql = "update rep_board1 set grps = grps + 1 where grp = ? and grps > ?";
		pstmt = conn.prepareStatement(sql);
		pstmt.setInt( 1, grp );
		pstmt.setInt( 2, grps );
		pstmt.executeUpdate();
		
		sql = "insert into rep_board1 values (0, ?, ?, ?, ?, ?, ?, ?, ?, 0, ?, now() )";
		pstmt = conn.prepareStatement(sql);
		pstmt.setInt( 1, grp );
		pstmt.setInt( 2, grps+1 );
		pstmt.setInt( 3, grpl+1 );
		pstmt.setString( 4, subject );
		pstmt.setString( 5, writer );
		pstmt.setString( 6, mail );
		pstmt.setString( 7, password );
		pstmt.setString( 8, content );
		pstmt.setString( 9, wip );
		
		int result = pstmt.executeUpdate();
		if ( result == 1 ) {
			flag = 0;
		}
	} catch(NamingException e) {
		System.out.println( "error: " + e.getMessage() );
	} catch(SQLException e) {
		System.out.println( "error: " + e.getMessage() );
	} finally {
		if ( pstmt != null ) pstmt.close();
		if ( conn != null ) conn.close();
	}
	
	out.println( " <script type='text/javascript'> " );
	if( flag == 0 ) {
		out.println( " alert('글쓰기에 성공했습니다.'); " );
		out.println( " location.href='board_list1.jsp?cpage=" + cpage + "';" );
	} else {
		out.println( " alert('글쓰기에 실패했습니다.'); " );
		out.println( " history.back(); " );
	}
	out.println( " </script> " );
	

%>


-board_view.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ page import="javax.naming.Context" %>
<%@ page import="javax.naming.InitialContext" %>
<%@ page import="javax.naming.NamingException" %>
<%@ page import="javax.sql.DataSource" %>

<%@ page import="java.sql.Connection" %>
<%@ page import="java.sql.PreparedStatement" %>
<%@ page import="java.sql.ResultSet" %>
<%@ page import="java.sql.SQLException" %>

<%
	request.setCharacterEncoding( "utf-8" );

	String cpage = request.getParameter( "cpage" );
	
	String seq = request.getParameter( "seq" );
	String subject = "";
	String writer = "";
	String mail = "";
	String wip = "";
	String wdate = "";
	String hit = "";
	String content = "";
	
	Connection conn = null;
	PreparedStatement pstmt = null;
	ResultSet rs = null;
	
	try {
		//커넥션 풀로 DB에 연결하기
		Context initCtx = new InitialContext();
		Context envCtx = (Context)initCtx.lookup( "java:comp/env" );
		DataSource dataSource = (DataSource)envCtx.lookup( "jdbc/mariadb2" );
		conn = dataSource.getConnection();
		
		//board_view.jsp에 들어오면 조회수 증가를 위한 update문을 사용한다.
		String sql = "update rep_board1 set hit = hit+1 where seq = ?";
		pstmt = conn.prepareStatement(sql);
		pstmt.setString( 1, seq );
		rs = pstmt.executeQuery();
		
		sql = "select subject, writer, mail, wip, wdate, hit, content from rep_board1 where seq = ?";
		pstmt = conn.prepareStatement(sql);
		pstmt.setString( 1, seq );
		rs = pstmt.executeQuery();
		
		//데이터를 하나만 가져오니깐 while문 대신 if문을 사용한다.
		if ( rs.next() ) {
			subject = rs.getString( "subject" );
			writer = rs.getString( "writer" );
			mail = rs.getString( "mail" );
			wip = rs.getString( "wip" );
			wdate = rs.getString( "wdate" );
			hit = rs.getString( "hit" );
			content = rs.getString( "content" ).replaceAll( "\n", "<br>");
		}

		
	} catch(NamingException e) {
		System.out.println( "error: " + e.getMessage() );
	} catch(SQLException e) {
		System.out.println( "error: " + e.getMessage() );
	} finally {
		if ( rs != null ) rs.close();
		if ( pstmt != null ) pstmt.close();
		if ( conn != null ) conn.close();
	}
	
%>

<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<title>Insert title here</title>
<link rel="stylesheet" type="text/css" href="../../css/board_view.css">
</head>

<body>
<!-- 상단 디자인 -->
<div class="con_title">
	<h3>게시판</h3>
	<p>HOME &gt; 게시판 &gt; <strong>게시판</strong></p>
</div>
<div class="con_txt">
	<div class="contents_sub">
		<!--게시판-->
		<div class="board_view">
			<table>
			<tr>
				<th width="10%">제목</th>
				<td width="60%"><%= subject %></td>
				<th width="10%">등록일</th>
				<td width="20%"><%= wdate %></td>
			</tr>
			<tr>
				<th>글쓴이</th>
				<td><%= writer %>(<%= mail %>)(<%= wip %>)</td>
				<th>조회</th>
				<td><%= hit %></td>
			</tr>
			<tr>
				<td colspan="4" height="200" valign="top" style="padding: 20px; line-height: 160%"><%= content %></td>
			</tr>
			</table>
		</div>

		<div class="btn_area">
			<div class="align_left">
				<input type="button" value="목록" class="btn_list btn_txt02" style="cursor: pointer;" onclick="location.href='board_list1.jsp?cpage=<%=cpage %>'" />
			</div>
			<div class="align_right">
				<input type="button" value="수정" class="btn_list btn_txt02" style="cursor: pointer;" onclick="location.href='board_modify1.jsp?cpage=<%=cpage%>&seq=<%= seq %>'" />
				<input type="button" value="삭제" class="btn_list btn_txt02" style="cursor: pointer;" onclick="location.href='board_delete1.jsp?cpage=<%=cpage%>&seq=<%= seq %>'" />
				<input type="button" value="새글쓰기" class="btn_write btn_txt01" style="cursor: pointer;" onclick="location.href='board_write1.jsp?cpage=<%=cpage %>'" />
				<input type="button" value="답글쓰기" class="btn_write btn_txt01" style="cursor: pointer;" onclick="location.href='board_reply1.jsp?cpage=<%=cpage %>&seq=<%= seq %>'" />
			</div>
		</div>	
		<!--//게시판-->
	</div>
</div>
<!-- 하단 디자인 -->

</body>
</html>

-실행결과

 

delete 구현시 답글이 있는 글을 삭제하면 view페이지만 보이지 않게 만들어야한다.

 

 

ㅇ 서버를 이용해서 웹 어플리케이션 실행하기 & 배포할 WAR 파일 생성하기

p351, 357

아파치톰캣을 바로 실행하기

 

 

개발서버에 배포(deplyment)
http://localhost:8080/
	=> C:\Java\apache-tomcat-9.0.41\webapps\ROOT

만약 아래 디렉터리에 board 폴더를 만들면
C:\Java\apache-tomcat-9.0.41\webapps
	board
		META-INF
			context.xml
		WEB-INF
			lib
				*.jar
			classes
				*.class
		*.jsp 파일을 만든다.
=> http://localhost:8080/board/*.jsp
를 하면 실행이된다.

즉 board는 이클립스의 프로젝트와 같다.

이클립스 프로젝트를 만드는 것처럼 실제 폴더에 board 폴더를 만든다.

그리고 아래와 같이 board폴더안에 두개의 폴더와 jsp파일을 만든다.

 

이제 웹페이지에서 실행시키면 다음과 같다.

 

다음으로 외부 라이브러리를 집어넣는다. context.xml, css, image, mariadb의 sample1도 마찬가지이다.

 

그리고 웹페이지에서 board_list1.jsp를 실행해보면 이클립스에서 실행한 것과 똑같은 결과가 나온다.

아래는 하드코딩방법을 실행했으므로 모델1기법을 실행해보자.

 

이번엔 모델1 기법을 실행해보자.

이클립스 디렉터리의 classes 폴더를 전체 복사해서 톰캣 디렉터리에 넣는다.

 

이번에는 jsp파일을 옮긴다.

 

그리고 실행해보면 결과가 같다.

 

 

하지만 위와 같이할 경우 직접 디렉터리를 만들고 구성해야하므로 불편하다.

이를 편리하게하는 것이 war를 사용하는 것이다. war(Web Archiver) 압축파일

 

ㅇ war 배포하기

위 war파일을 톰캣 webapps에서 압축을 푼다.

톰캣서버를 껐다가 다시 시작하고 웹페이지에서 Model1Ex02에 있는 board_list1.jsp를 실행하면 아래와 같이 

정상적으로 실행이 된다.

 

 

728x90
반응형
Comments