63일차_JAVA

서창민·2023년 6월 9일
0

JAVA

목록 보기
15/21
post-thumbnail

23.06.09 금 63일차

JAVA

  • 기본 동작 확인 순서
1. WEB Project 생성 jsp 생성 후 동작확인
2. DB 연동 확인

EX)오라클 DB 연동 코드 예시
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.sql.*" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%	
String url = "jdbc:oracle:thin:@//localhost:1521/xe";
String userid = "system";
String userpwd = "1234";

Class.forName("oracle.jdbc.OracleDriver");
Connection con = DriverManager.getConnection(url, userid, userpwd); 
%>
<h2><%=con%></h2>
</body>
</html>

  • 회원가입

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ include file="top.jsp" %>
<script>
	function formOk(){
		alert("확인");
		f1.submit();
	}
</script>
	<section>
		<br>
		<div align=center>
			<h2>회원가입 프로그램</h2>
			<form name=f1 action="formOk.jsp" method="post"
						enctype="multipart/form-data" onSubmit="return formOk()">
				<table border=1 width="450" height=300>
					<tr><td align=center>학번</td><td><input type=text name=m_sno></td></tr>
					<tr><td align=center>이름</td><td><input type=text name=m_sname></td></tr>
					<tr><td align=center>파일</td><td><input type=file name=m_file></td></tr>
					<tr><td align=center>특이사항</td><td>
						  <textarea cols=40 rows =5 name=m_etc></textarea></td></tr>
					<tr><td colspan=2 align=center>
					  	  <input type=submit value="회원가입">&emsp;
					  	  <input type=reset value="다시작성"></td></tr>					
				</table>
			</form>	
		</div>
		<br>
	</section>
<%@ include file="footer.jsp" %>

회원가입 게시판을 만들었다.
form의 형태에서 메소드 유형과 인코딩타입을 기재해 주어야 파일을 전달하는데 오류가 나지 않는다.
enctype="multipart/form-data" 을 사용하면 리퀘스트값을 가져올 수 없다.
input 리셋타입을 처음 사용해보았다. 테이블에 작성한 내용을 초기화 시켜준다.
onSubmit으로 리턴을 정해준뒤 스크립트에서 알림을 발생시키고 submit 동작하도록 설정해주었다.


  • 회원가입 저장
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="com.oreilly.servlet.MultipartRequest" %>
<%@ page import="com.oreilly.servlet.multipart.DefaultFileRenamePolicy" %>
<%@ page import="java.util.*" %>
<%@ page import="java.io.*" %>
<%@ page import="java.sql.*" %>
<%@ include file ="DB.jsp" %>

<%	
	// 파일 업로드 폴더 지정
	String realFolder="";
	String saveFolder="/files/"; 
	String encType="UTF-8"; // 인코딩 타입
	int maxSize = 5*1024*1024; //5MB
	
	// 실제 파일을 가져오는 경로
	realFolder = getServletContext().getRealPath(saveFolder);
	out.println("realFolder:" + realFolder + "<br>");
	
 	MultipartRequest multi =null;
			// MultipartRequest 생성되는 시점에 파일이 저장이 된다
	multi = new MultipartRequest(request, realFolder, maxSize, encType, new DefaultFileRenamePolicy()); 
	out.println("realFolder:" + multi + "<br>");
	String m_sno = multi.getParameter("m_sno");
	String m_sname = multi.getParameter("m_sname");
	String m_etc = multi.getParameter("m_etc");
	String m_files = multi.getFilesystemName("m_files");
	File file = multi.getFile("m_files"); // 실제 파일 저장
	out.println("realFolder:" + m_files + "<br>");

	if (m_files == null){
		m_files = "space.png";
	}
	
	String Insert_sql="";
	Insert_sql = "insert into member2 (m_idx, m_sno, m_sname, m_files, m_etc, m_cnt)"; 
	Insert_sql = Insert_sql +"values(idx_member.nextval, ?, ?, ?, ?, 1)";
	
	PreparedStatement pstmt = con.prepareStatement(Insert_sql);
	pstmt.setString(1, m_sno);
	pstmt.setString(2, m_sname);
	pstmt.setString(3, m_files);
	pstmt.setString(4, m_etc);

	pstmt.executeUpdate();
	response.sendRedirect("list.jsp");
%>

파일의 이름이 null 일때 기본이미지로 저장하고, 파일의 입력값 대로 DB에도 저장될 수 있게 쿼리문을 작성한다.

실제 폴더에 파일이 저장되도록 MultipartRequest를 사용하여 저장을 한다. 실제 경로와 같은지 확인이 필요하며 파일의 이동이 가능하도록 파일명 또한 주의해서 불러오도록 해야한다.


  • 회원 목록
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<!-- db 호출시 사용 -->
<%@ page import="java.sql.*" %>
<%@ include file ="DB.jsp" %>
<%@ include file="top.jsp" %>

<%	
	String ch1= request.getParameter("ch1");
	String ch2= request.getParameter("ch2");
	
	PreparedStatement pstmt=null;	
	ResultSet rs = null;
	if (ch1==null || ch2==null || ch2.equals("")){
		String sql = "select * from member2 order by m_sno asc";
 		pstmt = con.prepareStatement(sql);

	}else if(ch1.equals("m_sno")){
		String sql = "select * from member2 where m_sno = ?  order by m_sno asc";
		pstmt = con.prepareStatement(sql);
		pstmt.setString(1, ch2);

	}else if(ch1.equals("m_sname")) {
		String sql = "select * from member2 where m_sname like ? order by m_sno asc";
		pstmt = con.prepareStatement(sql);
		pstmt.setString(1, "%" + ch2+ "%");
	}
	rs = pstmt.executeQuery();
%>

	<section>
		<br>
		<div align=center>
			<h2>회원 목록 보기</h2>
				<table border=1 width=700px;>
					<tr>
						<td>순번</td>
						<td>학번</td>
						<td>이름</td>
						<td>파일명</td>
						<td>특이사항</td>
						<td>사진</td>
						<td>조회수</td>
					</tr>
					<% while (rs.next()){ 
						String m_idx = rs.getString("m_idx");
						String m_sno = rs.getString("m_sno");
						String m_sname = rs.getString("m_sname");
						String m_files = rs.getString("m_files");
						String m_etc = rs.getString("m_etc");
						String m_cnt = rs.getString("m_cnt");

					%>
					<tr>
						<td><a href=edit.jsp?m_idx=<%=m_idx%>><%=m_idx%></a></td>
						<td><%=m_sno%></td>
						<td><%=m_sname%></td>
						<td><%=m_files%></td>
						<td><%=m_etc%></td>
						<td align=center><a href=delete.jsp?m_idx=<%=m_idx%>>
						<img src='./files/<%=m_files%>' width=60px></a></td>
						<td><%=m_cnt%></td>
					</tr>
					<%} %>
				</table>
		</div>
		<br>
		<div align=center>
			<form >
				<select name=ch1>
					<option value="m_sno">학번</option>
					<option value="m_sname">이름</option>
				</select>
				<input type=text name=ch2>
				<input type=submit value="검색하기">
			</form>
		</div>
	</section>
<%@ include file="footer.jsp" %>

회원 목록의 리스트를 보여주는 코드이다.


  • 회원 목록 삭제
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.io.*" %>
<%@ page import="java.sql.*" %>
<%@ include file ="DB.jsp" %>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
/* 
1. 넘어온 레코드에서 삭제할 파일 찾기(select)
2. 파일 삭제 (FSO)
3. 레코드 삭제(delete)
*/

	String m_idx = request.getParameter("m_idx");
	
	// 쿼리
	PreparedStatement pstmt=null;	
	ResultSet rs = null;
	
	// 파일 찾기
	String search_sql = "select * from member2 where m_idx=?";
		pstmt = con.prepareStatement(search_sql);
		pstmt.setString(1, m_idx);
		rs = pstmt.executeQuery();
		rs.next();
		
		// 파일삭제
		String m_files = rs.getString("m_files");		
		String saveFolder="/files/";
		String realFolder = getServletContext().getRealPath(saveFolder);
		String deleteFileName = realFolder+ m_files ;
		File f = new File(deleteFileName);
		
		// 파일 존재 시 삭제 동작
		if(f.exists() && !m_files.equals("space.png")){
			f.delete();
		}
		
	// 레코드 삭제
	String delete_sql = "delete from member2 where m_idx=?";
		pstmt = con.prepareStatement(delete_sql);
		pstmt.setString(1, m_idx);
 		pstmt.executeUpdate();

		response.sendRedirect("list.jsp");	 
	
%>

</body>
</html>

select문으로 실제 파일을 찾아온 뒤에 폴더에 저장된 실제 파일을 삭제하고 쿼리문으로 DB에 존재하는 파일도 함께 삭제하는 코드이다.

조건으로는 기본 이미지가 아니고 파일이 존재할때 파일을 삭제하도록 한다.


  • 회원 목록 상세 페이지
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<!-- db 호출시 사용 -->
<%@ page import="java.sql.*" %>
<%@ include file ="DB.jsp" %>
<%@ include file="top.jsp" %>

<%	
	String m_idx = request.getParameter("m_idx");	

	PreparedStatement pstmt=null;	
	ResultSet rs = null;
		String update_sql = "update member2 set m_cnt=m_cnt+1 where m_idx = ?";
		pstmt = con.prepareStatement(update_sql);
		pstmt.setString(1, m_idx);
		pstmt.executeUpdate();
		
		String select_sql = "select * from member2 where m_idx = ?";
 		pstmt = con.prepareStatement(select_sql);
		pstmt.setString(1, m_idx);
		rs = pstmt.executeQuery();
	while (rs.next()){ 
		String m_sno = rs.getString("m_sno");
		String m_sname = rs.getString("m_sname");
		String m_files = rs.getString("m_files");
		String m_etc = rs.getString("m_etc");
	
%>
<script>
	function delK(k){
		alert("확인K" + k);
		// location.href="delete.jsp?m_idx="+k
		// 안쪽은 ES6표기법이고, 바깥쪽은 EL 표기법
		location.href='delete.jsp?m_idx=' + k;
	}
	function formOK(){
		alert("확인K" + k);
		f1.submit();
	}
</script>
<section>
	<br>
	<div align="center">
		<h2>회원 목록 상세 보기</h2>
		<form name="f1" action=update.jsp method="post" enctype="multipart/form-data" onSubmit="return formOk()">
			<input type="hidden" name="m_idx" value="<%=m_idx%>">
						
			<table border="1" width="500" height="400">
				<tr>
					<td>학번</td>
					<td><input type="text" name="m_sno" value="<%=m_sno%>"></td>
					<td rowspan="3" align="center"><img src='./files/<%=m_files %>' width="150px"></td>
				</tr>
				<tr>
					<td>이름</td>
					<td><input type="text" name="m_sname" value="<%=m_sname%>"></td>
				</tr>
				<tr>
					<td>파일명</td>
					<td><input type="file" name="m_files" value="<%=m_files%>"></td>
				</tr>
				<tr>
					<td>특이<br>사항</td>
					<td colspan="2"><textarea name="m_etc"><%=m_etc%></textarea></td>
				</tr>
				<tr>
					<td colspan="3" align="center">
						<input type="submit" name="k" value="수정하기">
						<input type="button" value="삭제하기" onClick="delK(<%=m_idx%>)">
					</td>
				</tr>
				<%} %>
			</table>
		</form>
	</div>
</section>

<%@ include file="footer.jsp" %>

회원 목록의 데이터를 확인할 수 있는 상세페이지를 구현한다.


  • 회원 목록 수정
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="com.oreilly.servlet.MultipartRequest" %>
<%@ page import="com.oreilly.servlet.multipart.DefaultFileRenamePolicy" %>
<%@ page import="java.util.*" %>
<%@ page import="java.io.*" %>
<%@ page import="java.sql.*" %>
<%@ include file ="DB.jsp" %>
<%
/*
1.  레코드에서 수정한 파일( 삭제할 파일 찾기)
2. space.png가 아니면 삭제하기
3. 파일 추가하기
4. 레코드 수정하기 (파일선택이 있는경우와 없는경우)
*/

// 파일 업로드 폴더 지정
String realFolder="";
String saveFolder="/files/"; 
String encType="UTF-8"; // 인코딩 타입
int maxSize = 5*1024*1024; //5MB

// 실제 파일을 가져오는 경로
realFolder = getServletContext().getRealPath(saveFolder);

MultipartRequest multi =null;
		// MultipartRequest 생성되는 시점에 파일이 저장이 된다
multi = new MultipartRequest(request, realFolder, maxSize, encType, new DefaultFileRenamePolicy()); 
	String m_idx = multi.getParameter("m_idx");
	String m_sno = multi.getParameter("m_sno");
	String m_sname = multi.getParameter("m_sname");
	String m_etc = multi.getParameter("m_etc");
	String m_files = multi.getFilesystemName("m_files");
	
	// 기존 레코드에 있는 파일 이름 찾기
	PreparedStatement pstmt=null;	
	PreparedStatement pstmt2=null;	
	ResultSet rs = null;
	String search_sql = "select * from member2 where m_idx=?";
	pstmt = con.prepareStatement(search_sql);
	pstmt.setString(1, m_idx);
	rs = pstmt.executeQuery();
	rs.next();
	
	String deleteFileName = rs.getString("m_files");
	
	out.println(deleteFileName);
	File f = new File(deleteFileName);
	
	// 수정에서 파일 첨부에 값을 첨부하면 기존 파일 삭제
	if(m_files !=null){
		if (!deleteFileName.equals("space.png")){
			f.delete();
		}
	}
	
	if(m_files != null){
		String update_sql = "update member2 set m_sno = ?, m_sname = ?, m_etc = ?, m_files= ? where m_idx=?";
		pstmt2 = con.prepareStatement(update_sql);
		pstmt2.setString(1, m_sno);
		pstmt2.setString(2, m_sname);
		pstmt2.setString(3, m_etc);
		pstmt2.setString(4, m_files);
		pstmt2.setString(5, m_idx);
		pstmt2.executeUpdate();
	}else{
		String update_sql = "update member2 set m_sno = ?, m_sname = ?, m_etc = ? where m_idx=?";
		pstmt2 = con.prepareStatement(update_sql);
		pstmt2.setString(1, m_sno);
		pstmt2.setString(2, m_sname);
		pstmt2.setString(3, m_etc);
		pstmt2.setString(4, m_idx);
		pstmt2.executeUpdate();
	}
	pstmt2.close();
	rs.close();
	pstmt.close();
	con.close();

	response.sendRedirect("list.jsp");	 

%>

파일을 찾고 그 파일명이 널이 아닐경우 파일을 추가하여 수정할수 있고, 파일명이 널일경우엔 사진 이외의 값을 추가할 수 있는 쿼리문을 작성했다.


  • 끝말
어제 만든 게시판 회원가입을 복습해서 진행했다.
쿼리문과 데이터 값을 받아오는 구문에 대한 이해가 아직도 많이 부족하다.
많은 코드작성과 복습으로 보완해야할 부분이다.
추가적으로 오늘 데이터의 크기를 비교해서 
profile
Back-end Developer Preparation Students

0개의 댓글