[JAVA_Back-End]

[JSP] JAVA코드 DAO / DTO 생성하여 구현 본문

Programming/JSP

[JSP] JAVA코드 DAO / DTO 생성하여 구현

너굴위 2023. 10. 10. 14:09
728x90
반응형

request

response

out

(session)

application

 

 


페이지 모듈화

- 반복되는 코드를 공통으로 묶어 외부파일로 관리할 수 있도록 함

  html / java

main.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>
<!-- main.jsp -->
Hello1.jsp<br />
<!-- Hello2.jsp<br /> -->
<!--
액션태그 : < jsp:
태그 : jsp 용 태그
< jsp:include
인클루드 액션태그
-->
<%
int i = 10;
%>
<jsp:include page="sub.jsp">
<jsp:param value="value" name="data"/>
<jsp:param value="<%=i %>" name="i"/>
</jsp:include>
Hello3.jsp<br />
i = <%=i %><br/>
</body>
</html>
sub.jsp - 모듈화 시킨 코드
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Hello2.jsp<br />
data = <%=request.getParameter("data") %><br />
i = <%=request.getParameter("i") %><br />

결과

 


 

main2.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>


<table width="800" border="1">
<tr>
<td height="100"><jsp:include page="header.jsp"></jsp:include></td> <!-- 외부파일을 적용할 수 있다. -->

<tr>


</table>


<table width="800" border="1">
<tr>
<td width="150" height="600">왼쪽</td>
<td>내용</td>
<tr>




</table>


<table width="800" border="1">
<tr>
<td height="100"><jsp:include page="footer.jsp"></jsp:include></td>
<tr>




</table>


</body>
</html>

 

//header.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<% 
 	out.println("난 헤더");
%>

 

//footer.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<% 
 	out.println("난 푸터");
%>

 

<%@ 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>

<table width="800" border="1">
<tr>
	<td height="100"><jsp:include page="header.jsp"></jsp:include></td>   <!-- 외부파일을 적용할 수 있다. -->
		
<tr>

</table>

<table width="800" border="1">
<tr>
	<td width="150" height="600">왼쪽</td>
	<td>내용</td>
<tr>


</table>

<table width="800" border="1">
<tr>
	<td height="100"><jsp:include page="footer.jsp"></jsp:include></td>
<tr>


</table>

</body>
</html>

 

 

 

 

 

결과


<!-- 액션태그: <jsp: jsp용 태그 <jsp: include 인클루드 액션태그 -->

액션태그를 사용하여 따로 만든 jsp파일을 적용할 수 있다.

 

 

F:\자바 국비\java모음\java파일모음\jsp-workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\WebEx03\org\apache\jsp

=> 해당 파일 안에 java와 class파일이 위치해 있다. (서블릿 클래스)

 

페이지 요청에 대한 처리

 

main.class실행 -> sub.class실행 -> 실행하고자 하는 클래스 파일 실행 순서로 출력할 수 있게 된다.

 

 

 

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

<%
    out.println("남은 버퍼 사이즈: "+out.getRemaining()+"<br />");   //출력을 조절할 수 있음
    out.println("1<br  />");
    out.println("2<br  />");
    out.println("3<br  />");

    out.clearBuffer();
    out.println("남은 버퍼 사이즈: "+out.getRemaining()+"<br />");
    out.println("4<br  />");
    out.println("5<br  />");
    out.println("6<br  />");

    out.flush();
    out.println("남은 버퍼 사이즈: "+out.getRemaining()+"<br />");
    out.println("7<br  />");
    out.println("8<br  />");

    out.close();
    out.println("9<br  />");
    out.println("10<br  />");
%>

 

 

 

페이지 이동

 


자바빈

-> 멤버필드가 있는 클래스

 

자바빈 생성위치

 

Swing

     mvc model1

     mvc model2

     model / view / controller

     TO  - transfer object

     DAO - data access object

 


게시판 DAO / DTO 생성

// DB연결 코드(동적할당)

<?xml version="1.0" encoding="utf-8" ?>
<Context>
	<Resource
		name="jdbc/mariadb3"
		auth="Container"
		type="javax.sql.DataSource"
		driverClassName="org.mariadb.jdbc.Driver"
		url="jdbc:mariadb://localhost:3306/board"
		username="board"
		password="123456"
	/>
</Context>

 

//board_list.jsp

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

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


<!-- 기본 게시판 기능 -->

<%

	BoardDAO dao = new BoardDAO();
	ArrayList<BoardTO> datas = dao.boardList();

	int totalRecord=datas.size();

	StringBuilder sbHtml = new StringBuilder();

	for(BoardTO to : datas){     //데이터를 읽고 append를 통해 표 형식으로 출력
			String seq = to.getSeq();
			String subject = to.getSubject();
			String writer = to.getWriter();
			String wdate = to.getWdate();
			String hit = to.getHit();
			int wgap = to.getWgap();
			
			sbHtml.append("<tr>");    
			sbHtml.append("<td>&nbsp;</td>");
			sbHtml.append("<td>"+seq+"</td>");
			sbHtml.append("<td class='left'>");
			sbHtml.append("<a href='board_view1.jsp?seq="+seq+"'>"+subject+"</a>&nbsp;");
			if(wgap==0){
			sbHtml.append("<img src='../../images/icon_new.gif' alt='NEW'>");   //조건에 따라 html태그도 뺐다가 넣었다가 할 수 있다.
			}
			sbHtml.append("</td>");                                                          //get방식으로 seq를 가지고 감(공백 없이 가지고 가야함)
			sbHtml.append("<td>"+writer+"</td>");                                               //nbsp (스페이스바)
			sbHtml.append("<td>"+wdate+"</td>");
			sbHtml.append("<td>"+hit+"</td>");
			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.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.toString() %>
		<!-- 끝 -->
			</table>
		</div>	

		<div class="btn_area">
			<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>
</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.css">
<script type="text/javascript">                                         //예외처리부분
	window.onload = function(){
		document.getElementById('wbtn').onclick = function(){
			//alert('click');  // 이벤트 동작 확인
			if(document.wfrm.info.checked == false){
				alert('동의를 하셔야 합니다.');
				return;
			}
			if(document.wfrm.writer.value.trim()==''){
				alert('글쓴이를 입력 하셔야 합니다.');
				return;
			}
			if(document.wfrm.password.value.trim()==''){
				alert('비밀번호를 입력 하셔야 합니다.');
				return;
			}
			document.wfrm.submit();
			
		};
	};
</script>
</head>

<body> 
<!-- 상단 디자인 -->
<div class="con_title">
	<h3>게시판</h3>
	<p>HOME &gt; 게시판 &gt; <strong>게시판</strong></p>
</div>
<div class="con_menu"></div>
<div class="con_txt">
	<form action="./board_write1_ok.jsp" method="post" name="wfrm">
		<div class="contents_sub">	
			<!--게시판-->
			<div class="board_write">
				<table>
				<tr>
					<th class="top">글쓴이</th>
					<td class="top"><input type="text" name="writer" value="" class="board_view_input_mail" maxlength="5" /></td>
				</tr>
				<tr>
					<th>제목</th>
					<td><input type="text" name="subject" value="" class="board_view_input" /></td>
				</tr>
				<tr>
					<th>비밀번호</th>
					<td><input type="password" name="password" value="" class="board_view_input_mail"/></td>
				</tr>
				<tr>
					<th>내용</th>
					<td><textarea name="content" class="board_editor_area"></textarea></td>
				</tr>
				<tr>
					<th>이메일</th>
					<td><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'" />
				</div>
				<div class="align_right">
					<input type="button" id="wbtn" 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="model1.BoardTO" %>  
<%@ page import="model1.BoardDAO" %>

  
<%
    
    	request.setCharacterEncoding("utf-8");    //내용을 파라미터로 가져온다 (파라미터로 name명을 작성하면 된다.)
    	
    	BoardTO to = new BoardTO();     //TO를 통해 각 값을 set/get
    	
    	to.setSubject(request.getParameter("subject"));
    	to.setWriter(request.getParameter("writer"));
    	to.setMail("");
    	
    	if(!request.getParameter("mail1").equals("")&&!request.getParameter("mail1").equals("")){  //메일의 @으로 인해 잘못된 입력이 생길 수 있기 때문에 예외처리를 해준다.
    	 	to.setMail(request.getParameter("mail1")+"@"+request.getParameter("mail2"));
    	}
    	to.setPassword(request.getParameter("password"));
    	to.setContent(request.getParameter("content"));
    	to.setWip(request.getRemoteAddr());
    	
    	BoardDAO dao = new BoardDAO();
    	
    	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 if(flag==1){
    		//에러
    		out.println("alert('글쓰기 실패');");
    		out.println("history.back();");
    	}
    	out.println("</script>");
    %>
    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

</body>
</html>

 

// board_view1.jsp

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

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

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


	BoardTO to = new BoardTO();
	to.setSeq(request.getParameter("seq"));

	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 hit=to.getHit();
	String content=to.getContent();
	String wdate=to.getWdate();

	
%>

<!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.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'" />
			</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>

 

//BoardDAO.java

package model1;

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

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

public class BoardDAO {
	
	private DataSource dataSource = null;
	
	public BoardDAO() {
		
		 try {
	         Context initCtx = new InitialContext();
	         Context envCtx = (Context)initCtx.lookup("java:comp/env");
	         this.dataSource = (DataSource)envCtx.lookup("jdbc/mariadb3");
	      } catch (NamingException e) {
	         // TODO: handle exception
	      }
	   }
	
	
	public void boardWrite() {
		
	}
	
	public int boardWriteOk(BoardTO to) {
		
	 	Connection conn=null;
		PreparedStatement pstmt =null;
			
			// 정상: 0 / 비정상: 1
			
			int flag =1;
			
	    	try{
	    	
	    		conn =this.dataSource.getConnection();
	    		
	    		String sql ="insert into board1 values (0,?,?,0,?,?,?,?,now()) ";      //DB에서 넣는 내용과 폼을 통해 입력하는 내용을 구분하여 적어야 한다
	    		pstmt =conn.prepareStatement(sql);
	    		pstmt.setString(1,to.getSubject());
	    		pstmt.setString(2,to.getWriter());
	    		pstmt.setString(3,to.getPassword());
	    		pstmt.setString(4,to.getContent());
	    		pstmt.setString(5,to.getMail());
	    		pstmt.setString(6,to.getWip());
	    		
	    		if(pstmt.executeUpdate()==1){  //쿼리 업데이트 내용이 1이면 정상적으로 등록되었다는 flag=0으로 설정한다.
	    			flag=0;
	    		}
	    		

	    	} catch(SQLException e){
	    			System.out.println( "[에러] " + e.getMessage() );
	    	} finally{
	    			if(pstmt!=null)try{pstmt.close();}catch(SQLException e) {};
	    			if(conn!=null)try{conn.close();}catch(SQLException e) {};
	    	}

		return flag;
	}
	
	public ArrayList<BoardTO> boardList() {
		
		Connection conn=null;
		PreparedStatement pstmt =null;
		ResultSet rs = null;

		ArrayList<BoardTO> datas = new ArrayList<>();

		try{
	
			conn = this.dataSource.getConnection();
			
			//datediff를 통해 현재날짜와 글 등록 날짜 사이의 차이를 계산하여 24시간 이내에 작성된 글인지 확인할 수 있다.
			String sql = "select seq, subject, writer, date_format(wdate,'%Y-%m-%d') wdate, hit, datediff(now(),wdate)wgap from board1 order by seq desc";   //글 등록번호를 기준으로 목록을 내림차순 정리 
			pstmt = conn.prepareStatement(sql);
			
			
			rs = pstmt.executeQuery();
			
	
			while(rs.next()){     //데이터를 읽고 append를 통해 표 형식으로 출력
				BoardTO to = new BoardTO();
				to.setSeq(rs.getString("seq"));
				to.setSubject(rs.getString("subject"));
				to.setWriter(rs.getString("writer"));
				to.setWdate(rs.getString("wdate"));
				to.setHit(rs.getString("hit"));
				to.setWgap(rs.getInt("wgap"));
				
				datas.add(to);
				
				
			}
			
		} catch(SQLException e){
			System.out.println( "[에러] " + 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 datas;
	}
	
	public BoardTO boardView(BoardTO to) {    //seq가 들어감
		
		Connection conn=null;
		PreparedStatement pstmt =null;
		ResultSet rs = null;
		
		
		try{
		
			conn = this.dataSource.getConnection();
			
			String sql = "update board1 set hit=hit+1 where seq=?";
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1,to.getSeq());
			
			pstmt.executeUpdate();
			
			sql ="select seq, subject, writer, mail, wip, wdate, hit, content from board1 where seq=?";
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1,to.getSeq());
			
			rs = pstmt.executeQuery();
			//데이터가 하나이기 때문에 while사용할 필요 없음
			if(rs.next()){
				to.setSubject( rs.getString("subject"));
				to.setWriter(rs.getString("writer"));
				to.setMail(rs.getString("mail"));
				to.setWip(rs.getString("wip"));
				to.setHit(rs.getString("hit"));
				to.setContent(rs.getString("content") == null? "": rs.getString("content").replaceAll("\n","<br />"));    //엔터키를 html에서는 br로 인식하여 엔터키로 받을 수 있도록 문자열의 형태를 변경한다.
				to.setWdate(rs.getString("wdate"));
			}
		} catch(SQLException e){
			System.out.println( "[에러] " + 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;
		
	}
	
	public void bordModify() {
		
	}

	public void boardModifyOk() {
		
	}
	
	public void boardDelete() {
		
	}
	
	public void boardDeleteOk() {
		
	}
	
	
	
	}

 

 

//BoardTO.java
package model1;

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

}

 

728x90
반응형