일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- map
- Properties
- BFS
- Union-find
- union_find
- JPA
- Java
- html
- set
- NIO
- date
- 큐
- priority_queue
- math
- 스프링부트
- GC로그수집
- Calendar
- alter
- 힙덤프
- deque
- 스택
- 리소스모니터링
- scanner
- CSS
- dfs
- List
- javascript
- string
- spring boot
- sql
- Today
- Total
매일 조금씩
12/29 - JSP(7) : 파일첨부 방법, 파일첨부 되는 model1 게시판 만들기(기본 게시판) 본문
12/29 - JSP(7) : 파일첨부 방법, 파일첨부 되는 model1 게시판 만들기(기본 게시판)
mezo 2021. 1. 4. 19:17개념 정리 & 복습
파일첨부가 가능한 MODEL1 게시판
JSP로 구성할 수 있는 웹 애플리케이션 아키텍쳐는 크게 mode1과 model2 두가지로 나뉜다.
간단하게 model1은 JSP가 모든것을 처리하고, model2는 MVC 모델로 나누어 처리하는 것이다.
model1 방식을 마무리하고 파일 첨부 까지 구현해보도록 한다.
1. model1 기법
emoticon있는 게시판 BoardTO, BaordDAO로 만들기
Model1Ex02
TO,DAO로 만들어진 emoticon 게시판 paging으로 만들기
BoardEx01 > paging_emoticon1
Paging 이 있는 게시판은 BoardTO, BaordDAO만으로 처리할수 없다.
board_list에 BoardTO + paging => BoardListTO를 하나더 만들어야한다.
BoardListTO 는 BoardTO와 크게 다르지 않다. cpage 등의 페이지 정보를 함께 가지기 위해 기존의 BoardTO에서
paging관련 변수가 추가된 것이다.
※ 값을 가지고 가서 db와의 작업을 해야할땐 TO를 먼저 만든 후에 DAO를 만들고 그렇지 않을 경우엔 DAO만 그냥 만든다. 예를 들어 값을 가지고 가야하는 경우엔 TO, DAO를 순서대로 생성후,
ArrayList<BoardTO> lists = dao.메서드명(to) 이런식으로 해야한다.
값이 필요없는 list는 그럴 필요가 없었지만 paging이 있는 게시판일 경우 cpage를 들고가야하기 때문에
cpage값을 가지는 BoardListTO를 생성 후 BoardDAO를 생성해야하며 boardListTO를 메서드에 들고가야한다.
2. 파일 업로드 방법
p696
파일 업로드용 컴포넌트가 필요하다.
1. form
<form method="post" enctype="multipart/form-data"
<input type="file"
2. cos.jar
MultipartRequest
멀티파트파서
www.servlets.com
UploadEx01
먼저 cos.jar파일을 프로젝트의 WebContent > WEB-INF> lib에 넣는다.
그다음 body에 다음과 같은 form을 작성한다.
<form action="upload_ok01.jsp" method="post" enctype="mutipart/form-data">
</form>
반드시 action을 제외하고 위와 똑같은 형태로 작성해야한다.
다음 input태그를 추가한다.
<form action="upload_ok01.jsp" method="post" enctype="mutipart/form-data">
파일 : <input type="file" name="upload" />
<input type="submit" value="파일 전송" />
</form>
다음으로
업로드 경로, 업로드 하는 프로그램이 있어야한다.
upload 폴더를 만든후 이곳에 업로드 되도록 할것이다.
반드시 upload폴더의 절대경로를 알고 있어야한다.
다음으로 upload_ok01.jsp를 만든다.
아래 코드를 먼저 추가 한다.
<%@ page import="com.oreilly.servlet.multipart.DefaultFileRenamePolicy" %>
<%@ page import="com.oreilly.servlet.MultipartRequest" %>
업로드를 하려면 알아야 하는 기본요소 3가지
1. 업로드 경로 (절대 경로)
2. 제한 용량 (byte)
3. 인코딩
upload_ok02.jsp
파일 검색 후 다운로드 하기
파일 검색 후 ok이 뜨면 이클립스를 새로고침한 후에 다운로드 버튼을 눌러야함.
이미지파일은 브라우저에서 해석이 되기 때문에 다운로드가 안되고 띄워진다.
html 수업때도 한 내용인데.. 해석이 불가능한 파일만 다운로드가 되기 때문이다.
// 다운로드
out.println("<a href=./upload/" + multi.getFilesystemName("upload") + ">다운로드</a>");
// 이미지
out.println("<img src=./upload/" + multi.getFilesystemName("upload") + "/>");
아래처럼 설정을 먼저 해주면됨
전체 코드
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>
<form action="upload_ok02.jsp" method="post" enctype="multipart/form-data">
파일 : <input type="file" name="upload" />
<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" %>
<%
// 경로
// C:/Java/java/jsp-workspace/UploadEx01/WebContent/upload
// 제한용량(byte)
// 인코딩
String uploadPath = "C:/Java/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("업로드 완료");
%>
upload_ok02.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" %>
<%
// 경로
// C:/Java/java/jsp-workspace/UploadEx01/WebContent/upload
// 제한용량(byte)
// 인코딩
String uploadPath = "C:/Java/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("업로드 완료");
%>
3. 파일 업로드 가능한 기본 게시판 만들기
파일 업로드가 추가된 게시판 만들기
BoardEx01 > pds1
아래 4가지를 차례대로 수행한 후, 본격적으로 코드를 작성한다.
- 기존 게시판 board1테이블에 파일이름과 파일 크기만 추가해서 테이블 pds_board1 만들기
- cos.jar를 lib에 추가
- upload할 폴더 만들어서 경로 알아두기
- simple1에서 ok페이지 전부 복사해오기
1) write 작성
write페이지에서 form 태그다음과 같이 수정
<form action="board_write1_ok.jsp" method="post" name="wfrm" enctype="multipart/form-data">
쓰기 버튼에 id="submit1" 써주고 script 내용 simpe1에 꺼 복붙하기
write_ok 에 다음 내용 추가하기
<%@ page import="com.oreilly.servlet.multipart.DefaultFileRenamePolicy" %>
<%@ page import="com.oreilly.servlet.MultipartRequest" %>
<%@ page import="java.io.File" %>
아래 코드를 윗부분에 추가하기
String uploadPath = "C:/Java/java/jsp-workspace/BoardEx01/WebContent/upload";
int maxFileSize = 1024 * 1024 * 2;
String encType = "utf-8";
MultipartRequest multi
= new MultipartRequest(request, uploadPath, maxFileSize, encType, new DefaultFileRenamePolicy());
// 위의 multi가 request를 감싸고 있어서 아래코드도 처리해줌 (encType이 setCharacterEncoding("utf-8") 를 처리해줌)
//request.setCharacterEncoding("utf-8");
// 모든 request를 multi로 바꿔줘야함 환경값 빼고
그다음 wip 빼고 전부 request를 multi로 바꿔준다.
다음처럼 filename, filesize 정의해주기
String filename = multi.getFilesystemName("upload");
File file = multi.getFile("upload");
long filesize = 0;
if(file != null){
filesize = file.length();
}
filesize는 다음처럼 setLong 해줘야한다.
pstmt.setLong(7, filesize);
전체 코드는 다음과 같다.
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 > 게시판 > <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="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" %>
<%@ page import="com.oreilly.servlet.multipart.DefaultFileRenamePolicy" %>
<%@ page import="com.oreilly.servlet.MultipartRequest" %>
<%@ page import="java.io.File" %>
<%
// ---------------- 파일 업로드를 위함
String uploadPath = "C:/Java/java/jsp-workspace/BoardEx01/WebContent/upload";
int maxFileSize = 1024 * 1024 * 2;
String encType = "utf-8";
MultipartRequest multi
= new MultipartRequest(request, uploadPath, maxFileSize, encType, new DefaultFileRenamePolicy());
// --------------------------------
// 위의 multi가 request를 감싸고 있어서 아래코드도 처리해줌 (encType이 setCharacterEncoding("utf-8") 를 처리해줌)
//request.setCharacterEncoding("utf-8");
// 모든 request를 multi로 바꿔줘야함 환경값 빼고
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");
// 환경값만 request를 multi로 안바꾸고 그대로 사용
String wip = request.getRemoteAddr();
String filename = multi.getFilesystemName("upload");
File file = multi.getFile("upload");
long filesize = 0;
if(file != null){
filesize = file.length();
}
Connection conn = null;
PreparedStatement pstmt = null;
// 정상처리 / 비정상 => 결과를 통합처리하기 위한 변수
int flag = 1;
try{
Context iniCtx = new InitialContext();
Context envCtx = (Context)iniCtx.lookup("java:comp/env");
DataSource dataSource = (DataSource)envCtx.lookup("jdbc/mariadb2");
conn = dataSource.getConnection();
String sql = "insert pds_board1 values(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, filename);
pstmt.setLong(7, filesize);
pstmt.setString(8, wip);
// 일반적으로 0 값은 정상이다.
int result = pstmt.executeUpdate();
if(result == 1){
flag = 0;
}
}catch(NamingException e){
System.out.println("[에러] : "+e.getMessage());
}catch(SQLException e){
System.out.println("[에러] : "+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>");
%>
2) list 작성
simple1의 list 복사해와서 filesize 값만 추가해주면 된다.
long filesize = rs.getLong("filesize");
long 타입으로 처리하고,
그리고 html을 append하는 코드에서 다음의 코드를 hit 값 부분 밑에 추가한다.
if(filesize != 0){
sbHtml.append(" <td><img src='../../images/icon_file.gif'/></td>");
}else{
sbHtml.append(" <td> </td>");
}
첨부된 파일이 있을 때 파일 첨부 아이콘이 뜨도록 처리한 것이다.
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" %>
<%@ page import="java.util.Calendar" %>
<%
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
int totalRecord = 0;
StringBuffer sbHtml = new StringBuffer();
try{
Context iniCtx = new InitialContext();
Context envCtx = (Context)iniCtx.lookup("java:comp/env");
DataSource dataSource = (DataSource)envCtx.lookup("jdbc/mariadb2");
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();
// 읽을 위치를 맨 아래로
rs.last();
// 전체 데이터 갯수
totalRecord = rs.getRow();
rs.beforeFirst();
while(rs.next()){
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");
sbHtml.append("<tr>");
sbHtml.append(" <td> </td>");
sbHtml.append(" <td>"+ seq +"</td>");
sbHtml.append(" <td class='left'>");
sbHtml.append( "<a href='board_view1.jsp?seq=" + seq + "'> "+ subject + "</a> ");
if(wgap == 0){
sbHtml.append( "<img src='../../images/icon_new.gif' alt='HOT'></td>");
}
sbHtml.append(" <td>"+ writer +"</td>");
sbHtml.append(" <td>"+ wdate +"</td>");
sbHtml.append(" <td>"+ hit +"</td>");
if(filesize != 0){
sbHtml.append(" <td><img src='../../images/icon_file.gif'/></td>");
}else{
sbHtml.append(" <td> </td>");
}
sbHtml.append("</tr>");
}
}catch(NamingException e){
System.out.println("[에러] : "+e.getMessage());
}catch(SQLException e){
System.out.println("[에러] : "+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 > 게시판 > <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%"> </th>
<th width="5%">번호</th>
<th>제목</th>
<th width="10%">글쓴이</th>
<th width="17%">등록일</th>
<th width="5%">조회</th>
<th width="3%"> </th>
</tr>
<%= sbHtml %>
<!-- 행시작 -->
<!--
<tr>
<td> </td>
<td>1</td>
<td class="left"><a href="board_view1.jsp">adfas</a> <img src="../../images/icon_hot.gif" alt="HOT"></td>
<td>asdfa</td>
<td>2017-01-31</td>
<td>6</td>
<td> </td>
</tr>
-->
<!-- 행끝 -->
</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>
3) view 작성
파일이 없을 때가 문제
null(0.0byte)라고 출력되는 게 보기싫으므로 바꿔야한다.
별도의 file 변수를 함께 선언한다.
String filename = "";
long filesize = 0;
String file = "첨부파일 없음";
위와 같이 선언하고
아래와 같이 코드를 작성한다.
filename = rs.getString("filename");
filesize = rs.getLong("filesize");
if(filesize != 0){
file = "<a href='../../upload/" + filename + "'>" + filename + "</a>" + "("+filesize + "byte)";
}
그럼 첨부 파일이 없을 땐 "첨부파일 없음"이 나오고,
있을 땐 "파일이름(파일크기byte)"가 나와서 클릭하면 다운로드 받을 수 있다.
board_view1.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 seq = request.getParameter("seq");
String subject = "";
String writer = "";
String mail = "";
String wip = "";
String wdate = "";
String hit = "";
String filename = "";
long filesize = 0;
String content = "";
String file = "첨부파일 없음";
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try{
Context iniCtx = new InitialContext();
Context envCtx = (Context)iniCtx.lookup("java:comp/env");
DataSource dataSource = (DataSource)envCtx.lookup("jdbc/mariadb2");
conn = dataSource.getConnection();
// 조회수 증가를 위한 update
String sql = "update pds_board1 set hit=hit+1 where seq=?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, seq);
pstmt.executeUpdate();
sql = "select subject, writer, mail, wip, wdate, hit,filename, filesize, content from pds_board1 where seq=?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, seq);
rs = pstmt.executeQuery();
// 하나만 가져오니까 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");
filename = rs.getString("filename");
filesize = rs.getLong("filesize");
content = rs.getString("content").replaceAll("\n","<br />");
if(filesize != 0){
file = "<a href='../../upload/" + filename + "'>" + filename + "</a>" + "("+filesize + "byte)";
}
}
}catch(NamingException e){
System.out.println("[에러] : "+e.getMessage());
}catch(SQLException e){
System.out.println("[에러] : "+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 > 게시판 > <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>
<th></th>
<td></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'" />
<input type="button" value="삭제" class="btn_list btn_txt02" style="cursor: pointer;" onclick="location.href='board_delete1.jsp'" />
<input type="button" value="쓰기" class="btn_write btn_txt01" style="cursor: pointer;" onclick="location.href='board_write1.jsp'" />
</div>
</div>
<!--//게시판-->
</div>
</div>
<!-- 하단 디자인 -->
</body>
</html>
'빅데이터 플랫폼 구축을 위한 자바 개발자 양성과정' 카테고리의 다른 글
12/31 - JSP(9) - 이전글, 다음글 있는 model1 게시판 만들기 (0) | 2021.01.10 |
---|---|
12/30 - JSP(8) : 파일 첨부 되는 model1 게시판 만들기, 톰캣만으로 게시판 실행(배포) (0) | 2021.01.04 |
12/28 - JSP(6) : JSP 기본객체, model1기법으로 게시판 만들기 (0) | 2021.01.04 |
12/24 - JSP(5) : 최신글 표시, 페이징 있는 게시판 만들기 (0) | 2021.01.04 |
12/23 - JSP(4) : 게시판 만들기 (0) | 2021.01.04 |