매일 조금씩

12/28 - JSP(6) : JSP 기본객체, model1기법으로 게시판 만들기 본문

빅데이터 플랫폼 구축을 위한 자바 개발자 양성과정

12/28 - JSP(6) : JSP 기본객체, model1기법으로 게시판 만들기

mezo 2021. 1. 4. 19:15
728x90
반응형

 

BasicEx01

 

 

 

 

p114

기본 객체와 영역

 

 

 

 

 

기본 객체  -  인스턴스(객체) 변수화된 클래스


중요 기본객체는 다음과 같다.

  • request  :  클라이언트의 요청정보를 저장한다.
  • response  :  응답 정보를 저장한다.
  • out  :  JSP 페이지가 생성하는 결과를 출력할 때 사용하는 출력 스트림이다.
  • session  :  HTTP 세션 정보를 저장한다.
  • application  :  웹 어플리케이션에 대한 정보를 저장한다.

추가 기본객체는 다음과 같다.

  • pageContext  :  JSP 페이지에 대한 정보를 저장한다.
  • page  :  JSP 페이지를 구현한 자바 클래스 인스턴스이다.
  • config  :  JSP 페이지에 대한 설정 정보를 저장한다.
  • exception  :  익셉션 객체이다. 에러 페이지에서만 사용한다.

 

 

                                     * tomcat (java se - ee)

 

1. request                         

 javax.servlet.http.HttpServletRequest

         setCharacterEncoding

         getParameter

         getRemoteAddr

         88p

                       getHeaderNames()

                       getHeader()

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.util.Enumeration" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- 헤더정보(숨겨진 정보) -->
<%
	Enumeration e = request.getHeaderNames();
	while(e.hasMoreElements()){
		String name = (String)e.nextElement();
		String value = request.getHeader(name);
		out.println(name + ":" + value + "<br />");
	}
%>
</body>
</html>

(user-agent 정보는 브라우저에 따라서 다달라짐)

 

 

2. response                         

javax.servlet.http.HttpServleResponse

▷p90

         redirect - 자동이동

         js

                       location.href = "파일명";

         jsp

                       response.sendRedirect("파일명");    // location.href 랑 같음

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	response.sendRedirect("https://www.daum.net");
%>

 

 

  p95     인코딩   =>   % 글자

                       java.net.URLEncoder

                       java.net.URLDecoder

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.net.URLEncoder" %>
<%@ page import="java.net.URLDecoder" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
	String msg = "Hello 안녕";
	String encodeMsg = URLEncoder.encode(msg, "utf-8");
	out.println(encodeMsg + "<br />");
	String decodeMsg = URLEncoder.encode(encodeMsg,"utf-8");
	out.println(decodeMsg + "<br />");
	
%>

</body>
</html>

 

 

3. out                               

javax.servlet.http.JspWriter 

▷p115

print() / println() / newLine() - 엔터

 

1) jsp에서 서블릿을 만들고 출력은 out을 사용하는데 그 출력이 바로 클라이언트로 가는게 아니고

    buffer에 누적을 했다가 거기서 완료가 되면 클라이언트로 넘어간다. 

버퍼사용은 위 세가지 장점을 가진다. 

 

2) 표현식 / 스크립틀릿

<% if(grade > 10) { %>

<%= gradeStringA %>

<% } else if(grade > 10) {%>  

<%= gradeStringB %>

<% } %>

 

<% (위 방식 말고 아래 방식처럼 java / html 분리하는 방식으로 써야 에러가 적다)

            if (grade >10){

                         out.println(gradeStringA);

            } else if(grade > 5){

                         out.println(gradeStringB);

            }

%>

 

3) 출력버퍼 조절

-  디렉티브에서 설정   

out01.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" buffer="4kb" autoFlush="true"%>
<%
	// buffer="버퍼크기" 로 버퍼 크기 조절
	// autoFlush = 버퍼 다차기 전에 클라이언트에 보내서 비우기 (다차면 에러걸림)
	// 8kb
	out.println(out.getBufferSize() + "<br />");
	out.println(out.getRemaining() + "<br />");
	out.println(out.isAutoFlush() + "<br />");
%>

out02.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page buffer="1kb" autoFlush="true" %>
<%
	out.println("버퍼 크기 : " + out.getBufferSize() + "<br />");
	out.println("버퍼 크기 : " + out.getRemaining() + "<br />");

	for(int i=1; i<=1000; i++){
		out.println(i+"Hello JSP<br />");
		if(i % 200 == 0){
			out.println("버퍼 남은 크기 : " + out.getRemaining() + "<br />");
		}
	}
%>

 - out객체에서 설정

out03.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	out.println("버퍼 크기 : " + out.getBufferSize() + "<br />");
	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 />");
%>

 

 

4. session                         

 javax.servlet.http.HttpSession

 

 

5. application                     

javax.servlet.http.ServletContext

 

 

6. pageContext

pageContext01.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	out.println("Hello JSP<br />");
	
	JspWriter writer = pageContext.getOut();
	// getRequest()
	// getResponse()
	
	// writer = out 같은 개념이다.
	out.println(out + "<br />");
	out.println(writer + "<br />");

	writer.println("Hello JSP<br />");
%>

 

 

 

99p 그림 중요!

1. jsp에 해당하는 서블릿이 존재하지 않을 경우

2. jsp에 해당하는 서블릿이 존재하는 경우

이 두가지 과정 구분하기

 

위 두가지 과정은 아래 두경우일때의 결과가 다르다.

         1) eclipse 로 tomcat을 돌리기

         2) tomcat 혼자 돌리기

 

 

eclipse로 tomcat돌리기

1. 소스

C:\Java\java\jsp-workspace\프로젝트명

2. 내부경로 복사(추가)

C:\Java\java\jsp-workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\프로젝트명

3. 자바, 클래스

C:\Java\java\jsp-workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\프로젝트명\org\apache\jsp

 

이클립스에서 이상한 결과가 나오면 동기화가 안된 경우를 생각해야한다.

1,2번이 동기화가 안된 경우가 있기 때문이다.

 

 

 

 

 

 

 

 

 

JSP 액션 태그


▷p155

Java에는 액션 태그라고 불리는 JSP 전용 태그가 있다.

HTML 같은 태그인데 서버에서 해석되는 태그이다. 

<jsp:기능태그> </jsp:기능태그>

 

 

1. <jsp:include> 액션 태그를 이용한 공통 영역 작성

외부파일 포함 = include

반복되는 코드가 있으면 이걸 메서드화하는데 이 메서드를 페이지화 한것을 include라고 한다.

브라우저에서 페이지소스보기 하면 안나오고 그 코드가 나옴

C:\Java\java\jsp-workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\BasicEx01\org\apache\jsp

위주소로 가서 보면 파일이 class와 java 파일 두개로 나누어 저장된 것을 볼수 있다.

값을 전달 하려면 include 하는 곳(include01.jsp)에서 <% %>로 선언, 초기화 하고, 

sub.jsp에서 부르면 안됨!

 

include01.jsp에 아래처럼 쓰고

<jsp:include page="./sub.jsp">
	<jsp:param name="data" value="data"/>
</jsp:include>

sub.jsp에서 request.getParameter로 받아야한다.

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

	out.println("Hello sub.jsp<br />");
	out.println("data : " + data);
%>

 

include01.jsp 에서 데이터를 선언해서 쓰는것도 가능하긴 하다.

<%
	String data="value";
%>
<jsp:include page="./sub.jsp">
	<jsp:param name="data" value="<%=data %>"/>
	<jsp:param name="data2" value="data2"/>
</jsp:include>

 

 

 

2. include 디렉티브를 이용한 공통 영역 작성

include02.jsp

<%
	String data1 = "value1";
%>
<%@ include file="sub02.jsp" %>

sub02.jsp

<%
	out.println("Hello sub.jsp<br />");
	out.println("data1 : " + data1);
%>

이렇게 하면 sub02에서 data1부분에 에러가 뜨는데 실행은 잘만 된다. 

include 디렉티브에 sub02.jsp파일의 위코드가 그대로 들어가는거라고 볼수 있기 때문이다.

(파일명을 sub02.jspf로 확장자명을 바꿔주면 에러안남)

 

 

▷p177

*** 두가지 방법의 차이 

         <jsp:include>

                   디자인 모듈(nav bar같은거)

         <%@ page include>

                   프로그램 모듈(코드에서 공통되는 부분) + 간단한 디자인

                   ( 파일명을 sub02.jspf로 확장자명을 바꿔주면 에러안남 )

 

 

 

3. <jsp:forward> 액션 태그를 이용한 JSP 페이지 이동

실습1) sub03.jsp로 페이지 이동

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

시작<br />

<jsp:forward page="sub03.jsp"></jsp:forward>

끝 <br />

</body>
</html>

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

	sub03.jsp
	
</body>
</html>

 

위  결과처럼 url은 forward01.jsp인데 결과는 sub03.jsp이다.

실행은 시키는데 forward결과는 다 날려버리고 sub03.jsp의 결과만 데려온다.

 

 

 

실습2) 같은 url에서 ?url로 여러가지 결과페이지 보여주기

forward02.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	request.setCharacterEncoding("utf-8");

	String url = request.getParameter("url");
	
	RequestDispatcher dispatcher=null;
	
	if(url == null || url.equals("a")){
		dispatcher = request.getRequestDispatcher("./forward/a.jsp");
	}else{
		dispatcher = request.getRequestDispatcher("./forward/b.jsp");
	}
	
	dispatcher.forward(request, response);
%>

같은 url인데  ?url= 를 사용해서 여러가지 결과 페이지를 보여줄수 있다.

 

 

 

 

 

 

자바빈과 <jsp:useBean> 액션 태그


▷p190

 

 

자바빈즈(콩)

            (D)TO / VO

1. Java

2. 액션 태그

 

 

1. Java 코드를 이용하여 자바 객체 사용

BasicEx01> Java Resource > src > pack1> Member01.java

package pack1;

// Beans
public class MemberTO {
	private String id;
	private String password;
	
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	
}

member_ok01.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="pack1.MemberTO" %>
    
<%
	MemberTO to = new MemberTO();	
	to.setId("test");
	to.setPassword("1234");
	
	out.println(to.getId() + "<br />");
	out.println(to.getPassword() + "<br />");
%>

 

 

 

 

2. <jsp:useBean> 태그를 이용한 자바 객체 사용

 

실습1) hardcoding 사용 <jsp:useBean>

member_ok02.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
 
<% 
	//MemberTO to = new MemberTO();	
%>

<jsp:useBean id="to" class="pack1.MemberTO" />

<% 
	//to.setId("test");
	//to.setPassword("1234");
%>
	
<jsp:setProperty name="to" property="id" value="test" />
<jsp:setProperty name="to" property="password" value="1234" />

<%
	//out.println(to.getId() + "<br />");
	//out.println(to.getPassword() + "<br />");
%>
<jsp:getProperty name="to" property="id" /><br />
<jsp:getProperty name="to" property="password" /><br />

이렇게 jsp만 가지고 짜는 코드는 hard Coding이라고 한다.

반면 1. 의 자바 코드로 클래스를 만들어서 짜는 코드를 model 1기법 이라고 한다.

이 둘중 뭘로 할건지 정해줘야한다. 

 

model2구조도 있다. 

실제 업무에선 model2를 많이 사용한다.

 

 

 

 

jsp만 가지고 처리하는게 아니라 class(JavaBeans)를 가지고 처리하는 걸 model1 기법이라고 한다.

model1 만드는 법은 swing과 비슷하다.

model1

            swing

                        DAO

                        TO

 

실습2) model1 구조로 사원테이블 검색

BasicEx01> Java Resource > src > model1 > DeptTO.java

package model1;

public class DeptTO {
	private String deptno;
	private String dname;
	private String loc;
	
	public String getDeptno() {
		return deptno;
	}
	public void setDeptno(String deptno) {
		this.deptno = deptno;
	}
	public String getDname() {
		return dname;
	}
	public void setDname(String dname) {
		this.dname = dname;
	}
	public String getLoc() {
		return loc;
	}
	public void setLoc(String loc) {
		this.loc = loc;
	}
	
	
}

BasicEx01> Java Resource > src > model1 > DeptDAO.java

package model1;

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;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class DeptDAO {
	private DataSource dataSource = null;
	public DeptDAO() {
		// TODO Auto-generated constructor stub
		try {
			Context iniCtx = new InitialContext();
			Context envCtx = (Context)iniCtx.lookup("java:comp/env");
			this.dataSource = (DataSource)envCtx.lookup("jdbc/mariadb1");
		} catch (NamingException e) {
			System.out.println("[에러] " + e.getMessage());
		}
	}
	
	public ArrayList<DeptTO> listDept(){
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		
		ArrayList<DeptTO> lists = new ArrayList<DeptTO>();
		
		try {
			conn = dataSource.getConnection();
			
			String sql = "select deptno, dname, loc from dept";
			pstmt = conn.prepareStatement(sql);
			
			rs = pstmt.executeQuery();
			while(rs.next()) {
				DeptTO to = new DeptTO();
				to.setDeptno(rs.getString("deptno"));
				to.setDname(rs.getString("dname"));
				to.setLoc(rs.getString("loc"));
			
				lists.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 lists;
	}
}

deptlist.jsp

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

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

<%
	DeptDAO dao = new DeptDAO();
	ArrayList<DeptTO> lists = dao.listDept();
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<%
	for(DeptTO to : lists){
		out.println(to.getDeptno() + "/" + to.getDname() + "/" + to.getLoc() + "/" + "<br />");
	}
%>

</body>
</html>

 

 

실습3) 동이름 검색해서 주소 테이블 출력하기

BasicEx01> Java Resource > src > model1 > ZipTO.java

package model1;

public class ZipTO {
	private String zipcode;
	private String sido;
	private String gugun;
	private String dong;
	private String ri;
	private String bunji;
	
	public String getZipcode() {
		return zipcode;
	}
	public void setZipcode(String zipcode) {
		this.zipcode = zipcode;
	}
	public String getSido() {
		return sido;
	}
	public void setSido(String sido) {
		this.sido = sido;
	}
	public String getGugun() {
		return gugun;
	}
	public void setGugun(String gugun) {
		this.gugun = gugun;
	}
	public String getDong() {
		return dong;
	}
	public void setDong(String dong) {
		this.dong = dong;
	}
	public String getRi() {
		return ri;
	}
	public void setRi(String ri) {
		this.ri = ri;
	}
	public String getBunji() {
		return bunji;
	}
	public void setBunji(String bunji) {
		this.bunji = bunji;
	}
	
	
	
	
}

BasicEx01> Java Resource > src > model1 > ZipDAO.java

package model1;

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;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class ZipDAO {
	private DataSource dataSource = null;
	public ZipDAO() {
		// TODO Auto-generated constructor stub
		try {
			Context iniCtx = new InitialContext();
			Context envCtx = (Context)iniCtx.lookup("java:comp/env");
			this.dataSource = (DataSource)envCtx.lookup("jdbc/mariadb1");
		} catch (NamingException e) {
			System.out.println("[에러] " + e.getMessage());
		}
	}
	
	public ArrayList<ZipTO> listDong(String strDong){
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		
		ArrayList<ZipTO> lists = new ArrayList<ZipTO>();
		
		try {
			conn = dataSource.getConnection();
			
			String sql = "select zipcode, sido, gugun, dong, ri, bunji from zipcode where dong like ?";
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, strDong + "%");
			rs = pstmt.executeQuery();
			
			while(rs.next()) {
				ZipTO to = new ZipTO();
				to.setZipcode(rs.getString("zipcode"));
				to.setSido(rs.getString("sido"));
				to.setGugun(rs.getString("gugun"));
				to.setDong(rs.getString("dong"));
				to.setRi(rs.getString("ri"));
				to.setBunji(rs.getString("bunji"));
			
				lists.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 lists;
	}
	
	
	
}

zipcode01.jsp

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

<%@ page import="model1.ZipTO" %>
<%@ page import="model1.ZipDAO" %>

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

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

	String strDong = request.getParameter("dong");
	
	// if문 밖에서 출력되니까 if문 밖에 선언
	StringBuffer html = new StringBuffer();
	
	if(strDong != null){
		
		ZipDAO dao = new ZipDAO();
		ArrayList<ZipTO> lists = dao.listDong(strDong);
		
		html.append("<hr />");
		html.append("<table width='600' border='1'>");
		html.append("<tr>");
		html.append("<td>우편번호</td>");
		html.append("<td>시도</td>");
		html.append("<td>구군</td>");
		html.append("<td>동</td>");
		html.append("<td>리</td>");
		html.append("<td>번지</td>");
		html.append("</tr>");
		
		for(ZipTO to : lists){
			html.append("<tr>");
			html.append("<td>" + to.getZipcode() + "</td>");
			html.append("<td>" + to.getSido() + "</td>");
			html.append("<td>" + to.getGugun() + "</td>");
			html.append("<td>" + to.getDong() + "</td>");
			html.append("<td>" + to.getRi() + "</td>");
			html.append("<td>" + to.getBunji() + "</td>");
		}
		html.append("</table>");
		
	}
%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
	const checkfrm = function(){
		if(document.frm.dong.value.trim() == ""){
			alert('동이름을 입력하세요');
			return;
		}
		document.frm.submit();
	};
</script>
</head>
<body>

<form name="frm" method="post" action="zipcode01.jsp">
	<input type="text" name="dong" /> 
	<input type="button" value="동이름 검색" onclick="checkfrm()"/>
</form>
<%
	out.println(html);
%>


</body>
</html>

 

 

 

 

 

 

model1 기법으로 게시판 만들기


 

새로운 프로젝트 Model1Ex01

TO

         - 테이블 구조

                 +

         - 추가 컬럼 ... wgap

DAO

         생성자

         메서드 - 페이지당 하나만드는게 가장 기본적

 

 

1. TO 만들기 

package model1;

public class BoardTO {
	private String seq;
	private String subject;
	private String writer;
	private String mail;
	private String password;
	private String content;
	private String hit;
	private String wdate;
	private String wip;
	private int wgap;
	
	public String getWip() {
		return wip;
	}
	public void setWip(String wip) {
		this.wip = wip;
	}
	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 getMail() {
		return mail;
	}
	public void setMail(String mail) {
		this.mail = mail;
	}
	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 getHit() {
		return hit;
	}
	public void setHit(String hit) {
		this.hit = hit;
	}
	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;
	}
	
	
}

 

2. DAO 만들기 

게시판 페이지 별로 클래스 하나씩이라고 생각했었는데

DAO에선 그 클래스를 메서드로 만든다고 생각하면된다.

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;
	
	public BoardDAO() {
		try {
			Context iniCtx = new InitialContext();
			Context envCtx = (Context)iniCtx.lookup("java:comp/env");
			this.dataSource = (DataSource)envCtx.lookup("jdbc/mariadb2");
		} catch (NamingException e) {
			System.out.println("[에러] " + e.getMessage());
		}
	}
	
	
	// writer - dao 통과 안해도됨
	public void boardWrite() {}
	
	// writer_ok - flag 값있어야함
	public int boardWriteOk(BoardTO to) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		
		// 정상처리 / 비정상 => 결과를 통합처리하기 위한 변수
		int flag = 1;
		
		try{
			conn = dataSource.getConnection();
			
			String sql = "insert board1 values(0, ?, ?, ?, ?, ?, 0, ?, now())";
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, to.getSubject());
			pstmt.setString(2, to.getWriter());
			pstmt.setString(3, to.getMail());
			pstmt.setString(4, to.getPassword());
			pstmt.setString(5, to.getContent());
			pstmt.setString(6, to.getWip());
			
			// 일반적으로 0 값은 정상이다.
			int result = pstmt.executeUpdate();
			if(result == 1){
				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;
	}
	
	
	// list
	public ArrayList<BoardTO> boardList(){
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		
		ArrayList<BoardTO> lists = new ArrayList<BoardTO>();
		try{
			conn = dataSource.getConnection();
			
			String sql = "select seq, subject, writer, date_format(wdate,'%Y-%m-%d') wdate, hit, datediff(now(), wdate) wgap from board1 order by seq desc";
			pstmt = conn.prepareStatement(sql, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
			
			rs = pstmt.executeQuery();
			
			while(rs.next()){
				BoardTO to = new BoardTO();
				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"));
				
				lists.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 lists;
	}
	
	
	// view
	public BoardTO boardView(BoardTO to) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		
	
		try{
			conn = dataSource.getConnection();
			
			// 조회수 증가를 위한 update
			String sql = "update board1 set hit=hit+1 where seq=?";
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, to.getSeq());
			
			pstmt.executeUpdate();
			
			sql = "select subject, writer, mail, wip, wdate, hit, content from board1 where seq=?";
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, to.getSeq());
			
			rs = pstmt.executeQuery();
			// 하나만 가져오니까 if문 사용
			if(rs.next()){
				to.setSubject(rs.getString("subject"));
				to.setWriter(rs.getString("writer"));
				to.setMail(rs.getString("mail"));
				to.setHit(rs.getString("hit"));
				to.setWip(rs.getString("wip"));
				to.setWdate(rs.getString("wdate"));
				to.setContent(rs.getString("content"));
			}
		
		}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;
	}
	
	// delete
	public BoardTO boardDelete(BoardTO to) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		
		try{
			conn = dataSource.getConnection();
			
			String sql = "select subject, writer from board1 where seq=?";
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, to.getSeq());
			
			rs = pstmt.executeQuery();
			// 하나만 가져오니까 if문 사용
			if(rs.next()){
				to.setSubject(rs.getString("subject"));
				to.setWriter(rs.getString("writer"));
			}
		}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;
	}
	
	// delete_ok
	public int boardDeleteOk(BoardTO to) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		
		// 정상처리 / 비정상 => 결과를 통합처리하기 위한 변수
		int flag = 2;
		
		try{
			conn = dataSource.getConnection();
			
			String sql = "delete from board1 where seq=? and password=?";
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, to.getSeq());
			pstmt.setString(2, to.getPassword());
			
			int result = pstmt.executeUpdate();
			if(result == 0){
				// 비밀번호 오류
				flag = 1;
			}else if(result == 1){
				// 정상
				flag = 0;
			}
		}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;
	}
	
	// modify
	public BoardTO boardModify(BoardTO to) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		
		try{
			conn = dataSource.getConnection();
			
			String sql = "select subject, writer, content, mail from board1 where seq=?";
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, to.getSeq());
			
			rs = pstmt.executeQuery();
			// 하나만 가져오니까 if문 사용
			if(rs.next()){
				to.setSubject(rs.getString("subject"));
				to.setWriter(rs.getString("writer"));
				to.setMail(rs.getString("mail"));
				to.setContent(rs.getString("content"));
			}
		}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;
	}
	
	// modify_ok
	public int boardModifyOk(BoardTO to) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		
		// 정상처리 / 비정상 => 결과를 통합처리하기 위한 변수
		int flag = 2;
		
		try{
			conn = dataSource.getConnection();
			
			String sql = "update board1 set subject = ?, mail=?, content=? where seq=? and password=?";
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, to.getSubject());
			pstmt.setString(2, to.getMail());
			pstmt.setString(3, to.getContent());
			pstmt.setString(4, to.getSeq());
			pstmt.setString(5, to.getPassword());
			
			int result = pstmt.executeUpdate();
			if(result == 0){
				// 비밀번호 오류
				flag = 1;
			}else if(result == 1){
				// 정상
				flag = 0;
			}
		}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;
	}
}

 

 

3. 게시판 페이지 코드 수정

TO, DAO를 사용하는 페이지 코드에 다음과 같이 TO, DAO를 import 해줘야한다.

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

 

대표적으로 board_modify1.jsp 페이지를 보면 원래는 다음과 같은 코드이다.

<%@ 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 = null;
	String content = "";
	
	
	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();
		
		String sql = 
				"select subject, writer, content, mail from 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");
			if(rs.getString("mail").equals("")){
				mail = new String[] {"",""};
			}else{
				mail = rs.getString("mail").split("@");
			}
			content = rs.getString("content").replaceAll("\n","<br />");
		}
	}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();
	}
%>

 

model1 기법을 위해 수정된 코드는 다음과 같다.

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

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

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

	BoardTO to = new BoardTO();
	to.setSeq(seq);
	
	BoardDAO dao = new BoardDAO();
	to = dao.boardView(to);
	
	String subject = to.getSubject();
	String writer = to.getWriter();
	String[] mail = null;
	if(to.getMail().equals("")){
		mail = new String[] {"",""};
	}else{
		mail = to.getMail().split("@");
	}
	String content = to.getContent();
%>

 

 

 

 

728x90
반응형