반응형
 

JavaBoardEx/2024_0627_PhotoGallery at main · chaSunil/JavaBoardEx

게시판연습. Contribute to chaSunil/JavaBoardEx development by creating an account on GitHub.

github.com

 

 

자바스크립트에서 객체를 JSON으로 Ajax로 받아서 처리한다.

 

객체를 일일이 하드코딩해서 받아주려면, 고생한다. 라이브러리를 오늘 활용해보자.

 

<c:forEach var="vo" items="${list}">
    <div class="photo" onclick="showPhoto('${vo.p_idx}');">
        <img src="../images/${vo.p_filename}">
        <div class="title">${vo.p_title}</div>
    </div>
</c:forEach>

 

 

모달 만들기

 

<%@ 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>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet"
	href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
<script
	src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<script
	src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>

<style type="text/css">

	.mycommon {
		text-align: center;
		
		border: 1px solid gray;
		margin-bottom: 10px;
		padding: 5px;
	}
	
	
	#pop_image{
		width: 300px;
		height: 300px;
		border: 2px solid gray;
		outline: 2px solid black;
	}
	
	#pop_content {
		min-height: 50px;
	}

</style>


</head>
<body>

	<div class="modal fade" id="photoModal" role="dialog">
		<div class="modal-dialog">

			<!-- Modal content-->
			<div class="modal-content">
				<div class="modal-header">
					<button type="button" class="close" data-dismiss="modal">×</button>
					<h4 class="modal-title" id="pop_mem_name"></h4>
				</div>
				
				
				<!-- 본문 -->
				<div class="modal-body">
					<!-- 이미지 -->
					<div class="mycommon" style="text-align: center; height: 310px;">
						<img id="pop_image" src="">
					</div>
					
					
					<div class="mycommon" id="pop_title">사진제목</div>
					<div class="mycommon" id="pop_content">사진내용</div>
					<div class="mycommon" id="pop_regdate">올린날짜</div>

					<div id="pop_jop" style="text-align: center;">
						<input style="display: none;" class="btn btn-info" type="button" value="수정"> <input
							style="display: none;" class="btn btn-danger" type="button" value="삭제"> <input
							style="display: none;" class="btn btn-success" type="button" value="다운">
							<button style="display: none;" class="btn btn-primary" type="button" class="btn btn-default" data-dismiss="modal">Close</button>
					</div>

				</div>

<!-- 				<div class="modal-footer">
					<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
				</div> -->
			</div>

		</div>
	</div>

</body>
</html>

 

 

ajax 사용

<%@ 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>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
<style type="text/css">

@font-face {
    font-family: 'MabinogiClassicR';
    src: url('https://fastly.jsdelivr.net/gh/projectnoonnu/noonfonts_2207-01@1.0/MabinogiClassicR.woff2') format('woff2');
    font-weight: normal;
    font-style: normal;
}

* {
	font-family: 'MabinogiClassicR';
}

#background {
	background: url(../images/maul.png) no-repeat 100% 0 fixed;
	background-size: cover;
}

#box {
	width: 800px;
	height: 1200px;
	margin: auto;
}

#title {
	display: block;
	margin: auto;
	margin-bottom: 50px;
	width: 250px;
}

#photo-box {
	height: 700px;
	background-color: white;
	border: 2px solid black;
	margin-top: 10px;
	/* 상하스크롤 */
	overflow-y: scroll;
	
}

.photo {
	width: 140px;
	height: 160px;
	border: 1px solid gray;
	overflow: hidden;
	margin-left: 45px;
	margin-top: 50px;
	padding: 10px;
	
	float: left;
}

.photo:hover {
	border-color: green;
}

.photo > img {
	height: 110px;
	width: 120px;
	object-fit : cover;
	border: 1px solid black;
}

.title {
	border: 1px solid gray;
	padding: 1px;
	margin-top: 5px;
	text-align: center;
	
	overflow: hidden;
	white-space: nowrap;
	text-overflow: ellipsis;
	word-break: break-all;
}
</style>

<script type="text/javascript">

	function photo_insert() {
		
		// 로그인 체크(로그인이 안된 경우)
		if("${ empty user }"=="true") {
			if (confirm("사진올리기는 로그인 하신 후 이용이 가능합니다.\n로그인 하시겠습니까?")==false) {
				return;
			} else {
				location.href="../member/login_form.do";
				return;
			}
			
		}
		// 로그인이 된 경우 => 사진등록폼으로 이동
		location.href="insert_form.do"; // PhotoInsertFromAction
	}
	
	function showPhoto(p_idx){
		
		alert(p_idx + "번 그림정보 조회");
		$("#photoModal").modal({backdrop: "static"});
		
		// p_idx에 대한 사진정보 가져오기(Ajax이용 JSON 형식)
		// 팝업화면에서 백그라운드 형식으로 ajax가 데이터를 요청해서 가져온다.
		$.ajax({
			url		:	"photo_one.do",		// PhotoOneAction
			data	:	{"p_idx": p_idx},	// parameter => photo_one.do?p_idx=5
			dataType:	"json",
			success	:	function(res_data){
				// res_data = {"p_idx":5, "p_title":"제목", "p_content":"내용", "p_filename":"a.jpg"...}
				console.log(res_data);
				
				$("#pop_image").prop("src","../images/" + res_data.p_filename);
			},
			error	:	function(err){
				alert(err.responseText);
			}
		});
		
		$("#pop_title").html("내가 부여한 제목");
		
	}

</script>

</head>
<body>

<!-- popup:Modal -->
<%@include file="popup.jsp" %>

	<div id="background">
	<div id="box">
		<img id="title" alt="" src="../images/maplelogo.png">
		<div class="row">
		  <div class="col-sm-6">
		  	<input class="btn btn-primary" type="button" value="사진올리기" onclick="photo_insert();">
		  </div>
		  <div class="col-sm-6" style="text-align: right;">
		  
		  
		  	<!-- 로그인이 안된 경우 -->
		  	<c:if test="${empty user}">
		  	<input class="btn btn-info" type="button" value="회원가입" onclick="location.href='../member/insert_form.do'">
		  	<input class="btn btn-primary" type="button" value="로그인" onclick="location.href='../member/login_form.do'">
		  	</c:if>
		  	
		  	<!-- 로그인이 된 경우 -->
		  	<c:if test="${not empty user}">
		  	<b>${user.mem_name}</b>님 환영합니다.
		  	<input class="btn btn-primary" type="button" value="로그아웃" onclick="location.href='../member/logout.do'">
		  	</c:if>
		  </div>
		</div>
	
	<div id="photo-box">
	
	<c:forEach var="vo" items="${list}">
		<div class="photo" onclick="showPhoto('${vo.p_idx}');">
			<img src="../images/${vo.p_filename}">
			<div class="title">${vo.p_title}</div>
		</div>
	</c:forEach>
	</div>

	</div>
	</div>
</body>
</html>

 

 

include 되면 두페이지가 하나의 페이지로 합쳐졌다고 생각하면 된다.

 

 

이제 라이브러리를 사용해보자

https://mvnrepository.com/

 

 

json-20240303.jar설치

 

 

 

Photo에 대한 정보를 서버를 통해서, 전달해주자

package action.photo;

import java.io.IOException;

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 org.json.JSONObject;

import dao.PhotoDao;
import db.vo.PhotoVo;

/**
 * Servlet implementation class PhotoOneAction
 */
@WebServlet("/photo/photo_one.do")
public class PhotoOneAction extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#service(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		// photo/photo_one.do?p_idx=5
		
		// 1. parameter 받기
		int p_idx = Integer.parseInt(request.getParameter("p_idx"));
		
		// 2. p_idx에 해당하는 포토 Vo 데이터 얻어오기
		PhotoVo vo = PhotoDao.getInstance().selectOne(p_idx);
		
		// String format 사용안하고 json 라이브러리를 사용한다.
		// 응답처리
		response.setContentType("application/json; charset=utf-8;");
		
		// VO -> JSON 객체 생성해주기
		JSONObject json = new JSONObject();
		json.put("p_idx",vo.getP_idx());
		json.put("p_title",vo.getP_title());
		json.put("p_content", vo.getP_content());
		json.put("p_filename", vo.getP_filename());
		json.put("p_regdate",vo.getP_regdate());
		json.put("p_ip",vo.getP_ip());
		json.put("mem_idx",vo.getMem_idx());
		json.put("mem_name",vo.getMem_name());
		
		response.getWriter().print(json.toString());
		

	}
}
	public PhotoVo selectOne(int p_idx) {
		PhotoVo vo = null;

		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;

		String sql = "select * from photo where p_idx=?";

		try {
			// 1. Connection 얻어오기
			conn = DBService.getInstance().getConnection();

			// 2. PreparedStatement
			pstmt = conn.prepareStatement(sql);

			// 3. pstmt parameter index 채우기
			pstmt.setInt(1, p_idx);

			// 4. ResultSet 얻어오기(킵해놨던 sql문 출력하기)
			rs = pstmt.executeQuery();

			// while문을 사용해도 되지만, 공회전이 1회더 발생한다.
			if (rs.next()) {
				// 1. rs가 가리키는 레코드의 값을 읽어온다
				
				vo = new PhotoVo();
				
				vo.setP_idx(rs.getInt("p_idx"));
				vo.setP_title(rs.getString("p_title"));
				vo.setP_content(rs.getString("p_content"));
				vo.setP_filename(rs.getString("p_filename"));
				vo.setP_ip(rs.getString("p_ip"));
				vo.setP_regdate(rs.getString("p_regdate"));
				vo.setMem_idx(rs.getInt("mem_idx"));
				vo.setMem_name(rs.getString("mem_name"));

			}

		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		} finally {
			// 예외 처리에서 무조건 실행되는 부분
			// 마무리 작업(열린역순으로 닫기)
			// 한 번에 잡아서 try catch 하기 : alt + shift + s
			try {
				if (rs != null)
					rs.close();
				if (pstmt != null)
					pstmt.close();
				if (conn != null)
					conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

		return vo;
	}
<%@ 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>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
<style type="text/css">

@font-face {
    font-family: 'MabinogiClassicR';
    src: url('https://fastly.jsdelivr.net/gh/projectnoonnu/noonfonts_2207-01@1.0/MabinogiClassicR.woff2') format('woff2');
    font-weight: normal;
    font-style: normal;
}

* {
	font-family: 'MabinogiClassicR';
}

#background {
	background: url(../images/maul.png) no-repeat 100% 0 fixed;
	background-size: cover;
}

#box {
	width: 800px;
	height: 1200px;
	margin: auto;
}

#title {
	display: block;
	margin: auto;
	margin-bottom: 50px;
	width: 250px;
}

#photo-box {
	height: 700px;
	background-color: white;
	border: 2px solid black;
	margin-top: 10px;
	/* 상하스크롤 */
	overflow-y: scroll;
	
}

.photo {
	width: 140px;
	height: 160px;
	border: 1px solid gray;
	overflow: hidden;
	margin-left: 45px;
	margin-top: 50px;
	padding: 10px;
	
	float: left;
}

.photo:hover {
	border-color: green;
}

.photo > img {
	height: 110px;
	width: 120px;
	object-fit : cover;
	border: 1px solid black;
}

.title {
	border: 1px solid gray;
	padding: 1px;
	margin-top: 5px;
	text-align: center;
	
	overflow: hidden;
	white-space: nowrap;
	text-overflow: ellipsis;
	word-break: break-all;
}
</style>

<script type="text/javascript">

	function photo_insert() {
		
		// 로그인 체크(로그인이 안된 경우)
		if("${ empty user }"=="true") {
			if (confirm("사진올리기는 로그인 하신 후 이용이 가능합니다.\n로그인 하시겠습니까?")==false) {
				return;
			} else {
				location.href="../member/login_form.do";
				return;
			}
			
		}
		// 로그인이 된 경우 => 사진등록폼으로 이동
		location.href="insert_form.do"; // PhotoInsertFromAction
	}
	
	function showPhoto(p_idx){
		
		alert(p_idx + "번 그림정보 조회");
		$("#photoModal").modal({backdrop: "static"});
		
		// p_idx에 대한 사진정보 가져오기(Ajax이용 JSON 형식)
		// 팝업화면에서 백그라운드 형식으로 ajax가 데이터를 요청해서 가져온다.
		$.ajax({
			url		:	"photo_one.do",		// PhotoOneAction
			data	:	{"p_idx": p_idx},	// parameter => photo_one.do?p_idx=5
			dataType:	"json",
			success	:	function(res_data){
				// res_data = {"p_idx":5, "p_title":"제목", "p_content":"내용", "p_filename":"a.jpg"...}
				console.log(res_data);
				
				$("#pop_mem_name").html("올린이 : " + res_data.mem_name);
				$("#pop_image").prop("src","../images/" + res_data.p_filename);
				
				$("#pop_title").html(res_data.p_title);
				$("#pop_content").html(res_data.p_content);
				$("#pop_regdate").html(res_data.p_regdate);
				
				// 버튼 보여지기 유/무(기본적으로 숨겨놓음)
				$("#btn_popup_download").hide();
				$("#btn_popup_update").hide();
				$("#btn_popup_delete").hide();
				
				// 로그인된 상태에는 다운로드 가능
				if("${not empty user}" == "true") {
					$("#btn_popup_download").show();
				}
				
				// 현재 사진을 올린 유저가 로그인한 유저면(수정/삭제)
				if("${user.mem_idx}" == res_data.mem_idx) {
					$("#btn_popup_update").show();
					$("#btn_popup_delete").show();
				}
			},
			error	:	function(err){
				alert(err.responseText);
			}
		});
		
		$("#pop_title").html("내가 부여한 제목");
	}

</script>

</head>
<body>

<!-- popup:Modal -->
<%@include file="popup.jsp" %>

	<div id="background">
	<div id="box">
		<img id="title" alt="" src="../images/maplelogo.png">
		<div class="row">
		  <div class="col-sm-6">
		  	<input class="btn btn-primary" type="button" value="사진올리기" onclick="photo_insert();">
		  </div>
		  <div class="col-sm-6" style="text-align: right;">
		  
		  
		  	<!-- 로그인이 안된 경우 -->
		  	<c:if test="${empty user}">
		  	<input class="btn btn-info" type="button" value="회원가입" onclick="location.href='../member/insert_form.do'">
		  	<input class="btn btn-primary" type="button" value="로그인" onclick="location.href='../member/login_form.do'">
		  	</c:if>
		  	
		  	<!-- 로그인이 된 경우 -->
		  	<c:if test="${not empty user}">
		  	<b>${user.mem_name}</b>님 환영합니다.
		  	<input class="btn btn-primary" type="button" value="로그아웃" onclick="location.href='../member/logout.do'">
		  	</c:if>
		  </div>
		</div>
	
	<div id="photo-box">
	
	<c:forEach var="vo" items="${list}">
		<div class="photo" onclick="showPhoto('${vo.p_idx}');">
			<img src="../images/${vo.p_filename}">
			<div class="title">${vo.p_title}</div>
		</div>
	</c:forEach>
	</div>

	</div>
	</div>
</body>
</html>
<%@ 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>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet"
	href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
<script
	src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<script
	src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>

<style type="text/css">

	.mycommon {
		text-align: center;
		
		width: 300px;
		margin: auto;
		border: 1px solid gray;
		margin-bottom: 10px;
		padding: 5px;
	}
	
	
	#pop_image{
		width: 100%;
		height: 300px;
		border: 2px solid gray;
		outline: 2px solid black;
	}
	
	#pop_content {
		min-height: 50px;
	}

</style>


</head>
<body>

	<div class="modal fade" id="photoModal" role="dialog">
		<div class="modal-dialog" style="width: 360px">

			<!-- Modal content-->
			<div class="modal-content">
				<div class="modal-header">
					<button type="button" class="close" data-dismiss="modal">×</button>
					<h4 class="modal-title" id="pop_mem_name"></h4>
				</div>
				
				
				<!-- 본문 -->
				<div class="modal-body">
					<!-- 이미지 -->
					<div class="mycommon" style="text-align: center; height: 310px;">
						<img id="pop_image" src="">
					</div>
					
					
					<div class="mycommon" id="pop_title">사진제목</div>
					<div class="mycommon" id="pop_content">사진내용</div>
					<div class="mycommon" id="pop_regdate">올린날짜</div>

					<div id="pop_jop" style="text-align: center;">
						<input style="display: none;" class="btn btn-info" type="button" value="수정" id="btn_popup_update"> <input
							style="display: none;" class="btn btn-danger" type="button" value="삭제" id="btn_popup_delete"> <input
							style="display: none;" class="btn btn-success" type="button" value="다운" id="btn_popup_download">
							<button class="btn btn-primary" type="button" class="btn btn-default" data-dismiss="modal">닫기</button>
					</div>

				</div>

<!-- 				<div class="modal-footer">
					<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
				</div> -->
			</div>

		</div>
	</div>

</body>
</html>

 

 

 

다운로드 기능만들기

 

FileDownload.zip
0.00MB

 

 

파일이 깨지므로 텍스트 파일로 열었다가, 이클립스에 그대로 복붙하기

 

<%@ 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>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet"
	href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
<script
	src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<script
	src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>

<style type="text/css">

	.mycommon {
		text-align: center;
		
		width: 300px;
		margin: auto;
		border: 1px solid gray;
		margin-bottom: 10px;
		padding: 5px;
	}
	
	
	#pop_image{
		width: 100%;
		height: 300px;
		border: 2px solid gray;
		outline: 2px solid black;
	}
	
	#pop_content {
		min-height: 50px;
	}

</style>

<script type="text/javascript">

	// 전역변수
	var g_p_filename;

	function download() {
		
		
		
	}

</script>

</head>
<body>

	<div class="modal fade" id="photoModal" role="dialog">
		<div class="modal-dialog" style="width: 360px">

			<!-- Modal content-->
			<div class="modal-content">
				<div class="modal-header">
					<button type="button" class="close" data-dismiss="modal">×</button>
					<h4 class="modal-title" id="pop_mem_name"></h4>
				</div>
				
				
				<!-- 본문 -->
				<div class="modal-body">
					<!-- 이미지 -->
					<div class="mycommon" style="text-align: center; height: 310px;">
						<img id="pop_image" src="">
					</div>
					
					
					<div class="mycommon" id="pop_title">사진제목</div>
					<div class="mycommon" id="pop_content">사진내용</div>
					<div class="mycommon" id="pop_regdate">올린날짜</div>

					<div id="pop_jop" style="text-align: center;">
						<input style="display: none;" class="btn btn-info" type="button" value="수정" id="btn_popup_update"> <input
							style="display: none;" class="btn btn-danger" type="button" value="삭제" id="btn_popup_delete"> <input
							style="display: none;" class="btn btn-success" type="button" value="다운" 
							onclick="download();" id="btn_popup_download">
							<button class="btn btn-primary" type="button" class="btn btn-default" data-dismiss="modal">닫기</button>
					</div>

				</div>

<!-- 				<div class="modal-footer">
					<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
				</div> -->
			</div>

		</div>
	</div>

</body>
</html>

 

 

 

javascript hoisting을 사용하면, var타입으로 선언된 변수가 밑에서 초기화 되었어도, 초기화된 곳보다

위에서 그 변수를 사용이 가능하다.

 

<%@ 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>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
<style type="text/css">

@font-face {
    font-family: 'MabinogiClassicR';
    src: url('https://fastly.jsdelivr.net/gh/projectnoonnu/noonfonts_2207-01@1.0/MabinogiClassicR.woff2') format('woff2');
    font-weight: normal;
    font-style: normal;
}

* {
	font-family: 'MabinogiClassicR';
}

#background {
	background: url(../images/maul.png) no-repeat 100% 0 fixed;
	background-size: cover;
}

#box {
	width: 800px;
	height: 1200px;
	margin: auto;
}

#title {
	display: block;
	margin: auto;
	margin-bottom: 50px;
	width: 250px;
}

#photo-box {
	height: 700px;
	background-color: white;
	border: 2px solid black;
	margin-top: 10px;
	/* 상하스크롤 */
	overflow-y: scroll;
	
}

.photo {
	width: 140px;
	height: 160px;
	border: 1px solid gray;
	overflow: hidden;
	margin-left: 45px;
	margin-top: 50px;
	padding: 10px;
	
	float: left;
}

.photo:hover {
	border-color: green;
}

.photo > img {
	height: 110px;
	width: 120px;
	object-fit : cover;
	border: 1px solid black;
}

.title {
	border: 1px solid gray;
	padding: 1px;
	margin-top: 5px;
	text-align: center;
	
	overflow: hidden;
	white-space: nowrap;
	text-overflow: ellipsis;
	word-break: break-all;
}
</style>

<script type="text/javascript">

	function photo_insert() {
		
		// 로그인 체크(로그인이 안된 경우)
		if("${ empty user }"=="true") {
			if (confirm("사진올리기는 로그인 하신 후 이용이 가능합니다.\n로그인 하시겠습니까?")==false) {
				return;
			} else {
				location.href="../member/login_form.do";
				return;
			}
			
		}
		// 로그인이 된 경우 => 사진등록폼으로 이동
		location.href="insert_form.do"; // PhotoInsertFromAction
	}
	
	function showPhoto(p_idx){
		
		alert(p_idx + "번 그림정보 조회");
		$("#photoModal").modal({backdrop: "static"});
		
		// p_idx에 대한 사진정보 가져오기(Ajax이용 JSON 형식)
		// 팝업화면에서 백그라운드 형식으로 ajax가 데이터를 요청해서 가져온다.
		$.ajax({
			url		:	"photo_one.do",		// PhotoOneAction
			data	:	{"p_idx": p_idx},	// parameter => photo_one.do?p_idx=5
			dataType:	"json",
			success	:	function(res_data){
				// res_data = {"p_idx":5, "p_title":"제목", "p_content":"내용", "p_filename":"a.jpg"...}
				console.log(res_data);
				
				// 다운로드 받을 filename을 popup.jsp 전역변수에다가 전달해주었다.
				g_p_filename = res_data.p_filename;
				
				$("#pop_mem_name").html("올린이 : " + res_data.mem_name);
				$("#pop_image").prop("src","../images/" + res_data.p_filename);
				
				$("#pop_title").html(res_data.p_title);
				$("#pop_content").html(res_data.p_content);
				$("#pop_regdate").html(res_data.p_regdate);
				
				// 버튼 보여지기 유/무(기본적으로 숨겨놓음)
				$("#btn_popup_download").hide();
				$("#btn_popup_update").hide();
				$("#btn_popup_delete").hide();
				
				// 로그인된 상태에는 다운로드 가능
				if("${not empty user}" == "true") {
					$("#btn_popup_download").show();
				}
				
				// 현재 사진을 올린 유저가 로그인한 유저면(수정/삭제)
				if("${user.mem_idx}" == res_data.mem_idx) {
					$("#btn_popup_update").show();
					$("#btn_popup_delete").show();
				}
			},
			error	:	function(err){
				alert(err.responseText);
			}
		});
		
		$("#pop_title").html("내가 부여한 제목");
	}

</script>

</head>
<body>

<!-- popup:Modal -->
<%@include file="popup.jsp" %>

	<div id="background">
	<div id="box">
		<img id="title" alt="" src="../images/maplelogo.png">
		<div class="row">
		  <div class="col-sm-6">
		  	<input class="btn btn-primary" type="button" value="사진올리기" onclick="photo_insert();">
		  </div>
		  <div class="col-sm-6" style="text-align: right;">
		  
		  
		  	<!-- 로그인이 안된 경우 -->
		  	<c:if test="${empty user}">
		  	<input class="btn btn-info" type="button" value="회원가입" onclick="location.href='../member/insert_form.do'">
		  	<input class="btn btn-primary" type="button" value="로그인" onclick="location.href='../member/login_form.do'">
		  	</c:if>
		  	
		  	<!-- 로그인이 된 경우 -->
		  	<c:if test="${not empty user}">
		  	<b>${user.mem_name}</b>님 환영합니다.
		  	<input class="btn btn-primary" type="button" value="로그아웃" onclick="location.href='../member/logout.do'">
		  	</c:if>
		  </div>
		</div>
	
	<div id="photo-box">
	
	<c:forEach var="vo" items="${list}">
		<div class="photo" onclick="showPhoto('${vo.p_idx}');">
			<img src="../images/${vo.p_filename}">
			<div class="title">${vo.p_title}</div>
		</div>
	</c:forEach>
	</div>

	</div>
	</div>
</body>
</html>
<%@ 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>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet"
	href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
<script
	src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<script
	src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>

<style type="text/css">

	.mycommon {
		text-align: center;
		
		width: 300px;
		margin: auto;
		border: 1px solid gray;
		margin-bottom: 10px;
		padding: 5px;
	}
	
	
	#pop_image{
		width: 100%;
		height: 300px;
		border: 2px solid gray;
		outline: 2px solid black;
	}
	
	#pop_content {
		min-height: 50px;
	}

</style>

<script type="text/javascript">

	// 전역변수
	var g_p_filename; // javascript hoisting
	// 자바스크립트는 변수 초기화가 밑에 선언 되어있어도, 변수의 사용이 위에서 가능하다.
	// 이것을 hoisting이라고 한다. var 형태가 그렇게 사용가능하다.

	function download() {
		// 현재경로 /photo/list.do
		location.href = "../FileDownload.do?dir=/images/&filename=" + g_p_filename;
	}

</script>

</head>
<body>

	<div class="modal fade" id="photoModal" role="dialog">
		<div class="modal-dialog" style="width: 360px">

			<!-- Modal content-->
			<div class="modal-content">
				<div class="modal-header">
					<button type="button" class="close" data-dismiss="modal">×</button>
					<h4 class="modal-title" id="pop_mem_name"></h4>
				</div>
				
				
				<!-- 본문 -->
				<div class="modal-body">
					<!-- 이미지 -->
					<div class="mycommon" style="text-align: center; height: 310px;">
						<img id="pop_image" src="">
					</div>
					
					
					<div class="mycommon" id="pop_title">사진제목</div>
					<div class="mycommon" id="pop_content">사진내용</div>
					<div class="mycommon" id="pop_regdate">올린날짜</div>

					<div id="pop_jop" style="text-align: center;">
						<input style="display: none;" class="btn btn-info" type="button" value="수정" id="btn_popup_update"> <input
							style="display: none;" class="btn btn-danger" type="button" value="삭제" id="btn_popup_delete"> <input
							style="display: none;" class="btn btn-success" type="button" value="다운" 
							onclick="download();" id="btn_popup_download">
							<button class="btn btn-primary" type="button" class="btn btn-default" data-dismiss="modal">닫기</button>
					</div>

				</div>

<!-- 				<div class="modal-footer">
					<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
				</div> -->
			</div>

		</div>
	</div>

</body>
</html>

 

 

브라우저 별로 인코딩이 맞지 않으면, 파일명이 한글일때 에러가 발생한다.

 

아래 코드를 사용하면 자바스크립트 자체에서 인코딩이 되어서 들어간다.

function download() {
    // 현재경로 /photo/list.do
    location.href = "../FileDownload.do?dir=/images/&filename=" 
            + encodeURIComponent(g_p_filename,"utf-8");
}

 

 

 

파일 삭제하기

 

<%@ 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>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
<style type="text/css">

@font-face {
    font-family: 'MabinogiClassicR';
    src: url('https://fastly.jsdelivr.net/gh/projectnoonnu/noonfonts_2207-01@1.0/MabinogiClassicR.woff2') format('woff2');
    font-weight: normal;
    font-style: normal;
}

* {
	font-family: 'MabinogiClassicR';
}

#background {
	background: url(../images/maul.png) no-repeat 100% 0 fixed;
	background-size: cover;
}

#box {
	width: 800px;
	height: 1200px;
	margin: auto;
}

#title {
	display: block;
	margin: auto;
	margin-bottom: 50px;
	width: 250px;
}

#photo-box {
	height: 700px;
	background-color: white;
	border: 2px solid black;
	margin-top: 10px;
	/* 상하스크롤 */
	overflow-y: scroll;
	
}

.photo {
	width: 140px;
	height: 160px;
	border: 1px solid gray;
	overflow: hidden;
	margin-left: 45px;
	margin-top: 50px;
	padding: 10px;
	
	float: left;
}

.photo:hover {
	border-color: green;
}

.photo > img {
	height: 110px;
	width: 120px;
	object-fit : cover;
	border: 1px solid black;
}

.title {
	border: 1px solid gray;
	padding: 1px;
	margin-top: 5px;
	text-align: center;
	
	overflow: hidden;
	white-space: nowrap;
	text-overflow: ellipsis;
	word-break: break-all;
}
</style>

<script type="text/javascript">

	function photo_insert() {
		
		// 로그인 체크(로그인이 안된 경우)
		if("${ empty user }"=="true") {
			if (confirm("사진올리기는 로그인 하신 후 이용이 가능합니다.\n로그인 하시겠습니까?")==false) {
				return;
			} else {
				location.href="../member/login_form.do";
				return;
			}
			
		}
		// 로그인이 된 경우 => 사진등록폼으로 이동
		location.href="insert_form.do"; // PhotoInsertFromAction
	}
	
	function showPhoto(p_idx){
		
		alert(p_idx + "번 그림정보 조회");
		$("#photoModal").modal({backdrop: "static"});
		
		// p_idx에 대한 사진정보 가져오기(Ajax이용 JSON 형식)
		// 팝업화면에서 백그라운드 형식으로 ajax가 데이터를 요청해서 가져온다.
		$.ajax({
			url		:	"photo_one.do",		// PhotoOneAction
			data	:	{"p_idx": p_idx},	// parameter => photo_one.do?p_idx=5
			dataType:	"json",
			success	:	function(res_data){
				// res_data = {"p_idx":5, "p_title":"제목", "p_content":"내용", "p_filename":"a.jpg"...}
				console.log(res_data);
				
				
				
				// 다운로드 받을 filename을 popup.jsp 전역변수에다가 전달해주었다.
				g_p_filename = res_data.p_filename;
				g_p_idx		 = res_data.p_idx;
				
				
				$("#pop_mem_name").html("올린이 : " + res_data.mem_name);
				$("#pop_image").prop("src","../images/" + res_data.p_filename);
				
				$("#pop_title").html(res_data.p_title);
				$("#pop_content").html(res_data.p_content);
				$("#pop_regdate").html(res_data.p_regdate);
				
				// 버튼 보여지기 유/무(기본적으로 숨겨놓음)
				$("#btn_popup_download").hide();
				$("#btn_popup_update").hide();
				$("#btn_popup_delete").hide();
				
				// 로그인된 상태에는 다운로드 가능
				if("${not empty user}" == "true") {
					$("#btn_popup_download").show();
				}
				
				// 현재 사진을 올린 유저가 로그인한 유저면(수정/삭제)
				if("${user.mem_idx}" == res_data.mem_idx) {
					$("#btn_popup_update").show();
					$("#btn_popup_delete").show();
				}
			},
			error	:	function(err){
				alert(err.responseText);
			}
		});
		
		$("#pop_title").html("내가 부여한 제목");
	}

</script>

</head>
<body>

<!-- popup:Modal -->
<%@include file="popup.jsp" %>

	<div id="background">
	<div id="box">
		<img id="title" alt="" src="../images/maplelogo.png">
		<div class="row">
		  <div class="col-sm-6">
		  	<input class="btn btn-primary" type="button" value="사진올리기" onclick="photo_insert();">
		  </div>
		  <div class="col-sm-6" style="text-align: right;">
		  
		  
		  	<!-- 로그인이 안된 경우 -->
		  	<c:if test="${empty user}">
		  	<input class="btn btn-info" type="button" value="회원가입" onclick="location.href='../member/insert_form.do'">
		  	<input class="btn btn-primary" type="button" value="로그인" onclick="location.href='../member/login_form.do'">
		  	</c:if>
		  	
		  	<!-- 로그인이 된 경우 -->
		  	<c:if test="${not empty user}">
		  	<b>${user.mem_name}</b>님 환영합니다.
		  	<input class="btn btn-primary" type="button" value="로그아웃" onclick="location.href='../member/logout.do'">
		  	</c:if>
		  </div>
		</div>
	
	<div id="photo-box">
	
	<c:forEach var="vo" items="${list}">
		<div class="photo" onclick="showPhoto('${vo.p_idx}');">
			<img src="../images/${vo.p_filename}">
			<div class="title">${vo.p_title}</div>
		</div>
	</c:forEach>
	</div>

	</div>
	</div>
</body>
</html>
<%@ 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>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet"
	href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
<script
	src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<script
	src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>

<style type="text/css">

	.mycommon {
		text-align: center;
		
		width: 300px;
		margin: auto;
		border: 1px solid gray;
		margin-bottom: 10px;
		padding: 5px;
	}
	
	
	#pop_image{
		width: 100%;
		height: 300px;
		border: 2px solid gray;
		outline: 2px solid black;
	}
	
	#pop_content {
		min-height: 50px;
	}

</style>

<script type="text/javascript">

	// 전역변수
	var g_p_filename; // javascript hoisting
	// 자바스크립트는 변수 초기화가 밑에 선언 되어있어도, 변수의 사용이 위에서 가능하다.
	// 이것을 hoisting이라고 한다. var 형태가 그렇게 사용가능하다.
	var g_p_idx;

	function download() {
		// 현재경로 /photo/list.do
		// alert("홍길동/" + encodeURIComponent("홍길동","utf-8"));
		location.href = "../FileDownload.do?dir=/images/&filename=" 
				+ encodeURIComponent(g_p_filename,"utf-8");
	}
	
	function delete_photo() {
		
		if(confirm("정말 삭제하시겠습니까?\n삭제하면 복구 할 수 없습니다.")==false) {
			return;
		}
		location.href="delete.do?p_idx=" + g_p_idx;
		
	}

</script>

</head>
<body>

	<div class="modal fade" id="photoModal" role="dialog">
		<div class="modal-dialog" style="width: 360px">

			<!-- Modal content-->
			<div class="modal-content">
				<div class="modal-header">
					<button type="button" class="close" data-dismiss="modal">×</button>
					<h4 class="modal-title" id="pop_mem_name"></h4>
				</div>
				
				
				<!-- 본문 -->
				<div class="modal-body">
					<!-- 이미지 -->
					<div class="mycommon" style="text-align: center; height: 310px;">
						<img id="pop_image" src="">
					</div>
					
					
					<div class="mycommon" id="pop_title">사진제목</div>
					<div class="mycommon" id="pop_content">사진내용</div>
					<div class="mycommon" id="pop_regdate">올린날짜</div>

					<div id="pop_jop" style="text-align: center;">
						<input style="display: none;" class="btn btn-info" type="button" value="수정" id="btn_popup_update"> <input
							style="display: none;" class="btn btn-danger" type="button" value="삭제" 
							onclick="delete_photo();" id="btn_popup_delete"> <input
							style="display: none;" class="btn btn-success" type="button" value="다운" 
							onclick="download();" id="btn_popup_download">
							<button class="btn btn-primary" type="button" class="btn btn-default" data-dismiss="modal">닫기</button>
					</div>

				</div>

<!-- 				<div class="modal-footer">
					<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
				</div> -->
			</div>

		</div>
	</div>

</body>
</html>
package action.photo;

import java.io.File;
import java.io.IOException;

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 dao.PhotoDao;
import db.vo.PhotoVo;

/**
 * Servlet implementation class PhotoDeleteAction
 */
@WebServlet("/photo/delete.do")
public class PhotoDeleteAction extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#service(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		// /photo/delete.do?p_idx=5
		
		// 1. parameter 받기
		int p_idx = Integer.parseInt(request.getParameter("p_idx"));
		
		// 현재 p_idx가 사용하고 있는 파일도 삭제
		// 2. PhotoVo 정보를 얻어온다.
		PhotoVo vo = PhotoDao.getInstance().selectOne(p_idx);
		// /images/의 절대경로
		String absPath = request.getServletContext().getRealPath("/images/");
		//						  절대경로	파일명
		File deleteFile = new File(absPath, vo.getP_filename());
		
		deleteFile.delete();
		
		// DB delete
		int res = PhotoDao.getInstance().delete(p_idx);
		
		// 메인화면으로 이동
		response.sendRedirect("list4636.do");

	}
}

 

package action.photo;

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 dao.PhotoDao;
import db.vo.PhotoVo;

/**
 * Servlet implementation class PhotoModifyFormAction
 */
@WebServlet("/photo/modify_form.do")
public class PhotoModifyFormAction extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#service(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		// 1. parameter 받기
		int p_idx = Integer.parseInt(request.getParameter("p_idx"));
		
		// 2. p_idx -> PhotoVo 얻기
		PhotoVo vo = PhotoDao.getInstance().selectOne(p_idx);
		
		// <br> -> \n
		String p_content = vo.getP_content().replaceAll("<br>", "\n");
		vo.setP_content(p_content);
		
		// 3. request binding
		request.setAttribute("vo", vo);

		// Dispatcher형식으로 호출
		String forward_page = "photo_modify_form.jsp";
		RequestDispatcher disp = request.getRequestDispatcher(forward_page);
		disp.forward(request, response);

	}

}

 

<%@ 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>
<!-- bootstrap 3 -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>

<!-- SweetAlert2사용설정  -->
<script src="//cdn.jsdelivr.net/npm/sweetalert2@11"></script>

<style type="text/css">
  #box{
      width: 600px;
      margin: auto;
      margin-top: 50px;  
  }

  textarea {
	  width: 100%;
	  resize: none;
  }
  
  input[type='button']{
      width: 100px;
  }
  
  img{
      width: 200px;
  }

</style>


<script type="text/javascript">
   
   function send(f){
	   
	   //입력값 체크....
	   
	   var p_title = f.p_title.value.trim();
	   var p_content = f.p_content.value.trim();
	   
	   if(p_title==''){
		   alert('제목을 입력하세요');
		   f.p_title.value='';
		   f.p_title.focus();
		   return;
	   }
	   
	   
	   if(p_content==''){
		   alert('내용을 입력하세요');
		   f.p_content.value='';
		   f.p_content.focus();
		   return;
	   }
	   
	   
	   f.action = "modify.do"; //PhotoModifyAction
	   f.submit();
	   
   }
   
   
   
   //----------- Ajax 이용한 이미지 수정 ----------------------
 
   function ajaxFileUpload() {
       // 업로드 버튼이 클릭되면 파일 찾기 창을 띄운다.
       $("#ajaxFile").click();
   }

   function ajaxFileChange() {
       // 파일이 선택되면 업로드를 진행한다.
       photo_upload();
   }


   
   function photo_upload() {

	   //파일선택->취소시 [0]은 인덱스를 나타낸것임
	   if( $("#ajaxFile")[0].files[0]==undefined)return;
	   
	   	   
	   var form = $("#ajaxForm")[0];
	   
       var formData = new FormData(form);
       formData.append("p_idx", '${ vo.p_idx }');  // p_idx=5
       formData.append("photo", $("#ajaxFile")[0].files[0]); // photo=bmi.png

       $.ajax({
             url : "photo_upload.do", //PhotoUploadAction
             type : "POST",
             data : formData,
             // 파일 보낼때는 binarydata로 false를 고정적으로 써줘야 한다.
             processData : false,
             contentType : false,
             dataType : 'json',
             success:function(res_data) {
            	 //result_data = {"p_filename":"aaa.jpg"}
                 
            	 //location.href=''; //자신의 페이지를 리로드(refresh)
            	 
            	 //$("#my_img").attr("src","../images/" + res_data.p_filename);
            	 $("#my_img").prop("src","../images/" + res_data.p_filename);
            	 
             },
             error : function(err){
            	 alert(err.responseText);
             }
       });

   }
</script>



</head>
<body>

<!--화일업로드용 폼  -->
<form enctype="multipart/form-data" id="ajaxForm" method="post">
    <input id="ajaxFile" type="file"  style="display:none;"  onChange="ajaxFileChange();" >
</form>

  
  
  
<form>

  <input type="hidden"  name="p_idx"  value="${ vo.p_idx }"> 

  <div id="box">
        <div class="panel panel-primary">
	      <div class="panel-heading"><h4>수정화면</h4></div>
	      <div class="panel-body">
	          <table class="table  table-striped">
	               <tr>
	                   <td colspan="2" align="center">
	                       <img src="../images/${ vo.p_filename }" id="my_img">
	                       <br>
	                       <input  class="btn  btn-info" type="button"  value="이미지편집"  onclick="ajaxFileUpload();">
	                   </td>
	               </tr>
	          
	               <tr>
	                  <th>제목</th>
	                  <td><input name="p_title"  value="${ vo.p_title }"></td>
	               </tr>
	               
	               <tr>
	                  <th>내용</th>
	                  <td>
	                      <textarea  name="p_content"  rows="5" cols="">${ vo.p_content }</textarea>
	                  </td>
	               </tr>
	               
	               <tr>
	                   <td colspan="2" align="center">
	                       <input class="btn  btn-primary" type="button"  value="수정하기" 
	                              onclick="send(this.form);">
	                       <input class="btn  btn-success" type="button"  value="메인으로" 
	                              onclick="location.href='list.do'">
	                   </td>
	               </tr>
	               
	          </table>
	      </div>
	    </div>
  </div>
</form>


</body>
</html>

 

 

package action.photo;

import java.io.File;
import java.io.IOException;

import javax.servlet.ServletContext;
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 javax.servlet.http.HttpSession;

import com.oreilly.servlet.MultipartRequest;
import com.oreilly.servlet.multipart.DefaultFileRenamePolicy;

import dao.PhotoDao;
import db.vo.MemberVo;
import db.vo.PhotoVo;

/**
 * Servlet implementation class PhotoUploadAction
 */
@WebServlet("/photo/photo_upload.do")
public class PhotoUploadAction extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#service(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		// /photo/photo_upload.do?p_idx=5&photo=aaa.jpg
		HttpSession session = request.getSession();
		
		MemberVo user = (MemberVo) session.getAttribute("user");
		// session timeout
		if(user==null) {
			response.sendRedirect("../member/login_form.do?reason=session_timeout");
			return;
		}
		
		// 유저정보 얻어오기
		int mem_idx = user.getMem_idx();
		String mem_name = user.getMem_name();
		
		// 파일업로드 처리
		String webPath = "/images/"; // 웹(url)경로
		
		// 현재 웹어플리케이션의 전역관리객체(상대경로->절대경로)
		ServletContext application = request.getServletContext();
		// 				  웹(상대경로)->절대경로
		String saveDir = application.getRealPath(webPath);
		int maxSize = 1024 * 1024 * 100;	// 최대업로드크기(100MB)
		//FileUpload 객체 => MultipartRequest
		MultipartRequest mr = new MultipartRequest(
											request,		// request 위임
											saveDir,		// 저장위치
											maxSize,		// 최대업로드크기
											"utf-8",		// 수신인코딩
											// 파일이름이 동일할 경우 다른이름으로 변경
											new DefaultFileRenamePolicy()
											);
		// 업로드 파일명을 얻어온다.
		String p_filename = "no_file";
		// mr에 의해서 업로드된 파일정보 얻어온다.
		File f = mr.getFile("photo");
		
		if(f!=null) { // 업로드 파일이 존재하면
			p_filename = f.getName();
		}
		
		int p_idx = Integer.parseInt(mr.getParameter("p_idx"));
		
		// p_idx에 저장된 이전 파일 삭제
		PhotoVo vo = PhotoDao.getInstance().selectOne(p_idx);
		
		File delFile = new File(saveDir, vo.getP_filename());
		delFile.delete();
		
		// update된 파일이름 수정
		vo.setP_filename(p_filename);
		int res = PhotoDao.getInstance().update_filename(vo);
		
		

	}

}

 

 

	public int update_filename(PhotoVo vo) {
		// TODO Auto-generated method stub

		int res = 0;
		Connection conn = null;
		PreparedStatement pstmt = null;

		String sql = "update photo set p_filename=? where p_idx=? ";

		try {
			// 1. Connection 얻어오기
			conn = DBService.getInstance().getConnection();

			// 2. PreparedStatement
			pstmt = conn.prepareStatement(sql);

			// 3. pstmt parameter index 채우기
			pstmt.setString(1, vo.getP_filename());
			pstmt.setInt(2, vo.getP_idx());

			// 4. DB update
			res = pstmt.executeUpdate();

		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		} finally {
			// 예외 처리에서 무조건 실행되는 부분
			// 마무리 작업(열린역순으로 닫기)
			// 한 번에 잡아서 try catch 하기 : alt + shift + s
			try {
				if (pstmt != null)
					pstmt.close();
				if (conn != null)
					conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

		return res;

	}// end:update()

 

 

 

package action.photo;

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 dao.PhotoDao;
import db.vo.PhotoVo;

/**
 * Servlet implementation class PhotoModifyAction
 */
@WebServlet("/photo/modify.do")
public class PhotoModifyAction extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#service(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		request.setCharacterEncoding("utf-8");
		
		int p_idx = Integer.parseInt(request.getParameter("p_idx"));
		String p_title = request.getParameter("p_title");
		String p_content = request.getParameter("p_content");
		
		PhotoVo vo = new PhotoVo(p_idx, p_title, p_content);
		
		int res = PhotoDao.getInstance().update(vo);
		
		response.sendRedirect("list4636.do");
		

	}

}

 

 

 

	public int update(PhotoVo vo) {
		// TODO Auto-generated method stub

		int res = 0;
		Connection conn = null;
		PreparedStatement pstmt = null;

		String sql = "update photo set p_title=?,p_content=? where p_idx=? ";

		try {
			// 1. Connection 얻어오기
			conn = DBService.getInstance().getConnection();

			// 2. PreparedStatement
			pstmt = conn.prepareStatement(sql);

			// 3. pstmt parameter index 채우기
			pstmt.setString(1, vo.getP_title());
			pstmt.setString(2, vo.getP_content());
			pstmt.setInt(3, vo.getP_idx());
			
			// 4. DB update
			res = pstmt.executeUpdate();

		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		} finally {
			// 예외 처리에서 무조건 실행되는 부분
			// 마무리 작업(열린역순으로 닫기)
			// 한 번에 잡아서 try catch 하기 : alt + shift + s
			try {
				if (pstmt != null)
					pstmt.close();
				if (conn != null)
					conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

		return res;

	}// end:update()

 

 

 

 

 

 

 

 

 

https://inpa.tistory.com/entry/SweetAlert2-%F0%9F%93%9A-%EC%84%A4%EC%B9%98-%EC%82%AC%EC%9A%A9

 

🎨 SweetAlert2 - 이쁜 alert 모달창 설치 & 사용법

SweetAlert2 자바스크립트로 웹 프로그래밍을 하다 보면 자주 Alert 함수를 사용하게 됩니다. Alert는 사용자에게 알림을 주고자 할 때 정말 자구 사용하는 컴포넌트 입니다. 다음과 같이 자바스크립

inpa.tistory.com

 

 

반응형