지구정복

[JSP] 1/6 | 서블릿(어노테이션 이용, 서블릿 2개 실행하기), MVC Model2기법 (개념, 각각의 역할, 사용연습, 우편번호검색기, 게시판만들기) 본문

데이터 엔지니어링 정복/JAVA & JSP

[JSP] 1/6 | 서블릿(어노테이션 이용, 서블릿 2개 실행하기), MVC Model2기법 (개념, 각각의 역할, 사용연습, 우편번호검색기, 게시판만들기)

eeaarrtthh 2021. 1. 6. 16:46
728x90
반응형
SMALL

배울내용

기존에 Java -> Web Program
	class -> Servlet(Java - html) - 속도가 너무 느렸다.

그래서 나온 것이 JSP(Java Server Page) <- ASP(Active Server Page) 대신
	여기서는
	hard coding
	model1 
	기법이 있다.

발전된 것이 mvc model2기법이다

Servlet 클래스
1. HttpServlet 클래스 -> 상속받아야한다.
	메서드
	init
	destroy
	service
		doPost
		doGet
		=> doProcess
	service와 doPost, doGet은 같이 사용할 수 없어서 하나만 사용해야 한다.

2. web.xml
	패키지.클래스명
	url	- 맵핑

 

ㅇ복습

먼저 web.xml을 포함해서 이클립스에서 다이나믹 웹 프로젝트를 만든다.

그리고 자바 리소스에서 'servlet' 패키지를 만들고 그 안에 'ServletEx01.java'를 만든다.

-web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
  <display-name>ServletEx02</display-name>
  <!-- 밑에 welcome파일은 url에서 http://localhost/8080만 쳤을 때 알아서 아래에 있는 파일들을 찾아서 띄워준다. 
  	아래 파일이 모두 없을시 에러가 뜬다.  -->
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  
  <servlet>
  	<servlet-name>servlet01</servlet-name>
  	<servlet-class>servlet.ServletEx01</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>servlet01</servlet-name>
  	<url-pattern>/servlet01/*</url-pattern><!--*를 쓰면 여러개의 url에 대해서 하나의 클래스가 처리한다. -->
  	<!-- <url-pattern>*.do</url-pattern> 는 파일명처럼 받을 수 있다. -->
  </servlet-mapping>
</web-app>

-ServletEx01.java

package servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;

import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ServletEx01 extends HttpServlet {
	/*
	@Override
	public void init() throws ServletException {
		// TODO Auto-generated method stub
		super.init();
	}
	
	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		super.destroy();
	}
	
	@Override
	public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
		// TODO Auto-generated method stub
		super.service(req, res);
	}
	*/
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		this.doProcess(req, resp);
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		this.doProcess(req, resp);
	}
	
	protected void doProcess(HttpServletRequest req, HttpServletResponse resp) {
		try {
			//입력 영역 : getParameter 사용
			req.setCharacterEncoding( "utf-8" );
			
			
			//출력 영역 : out 사용
			resp.setContentType( "text/html;charset=utf-8" );
			StringBuffer html = new StringBuffer();
			html.append( "<!doctype html>" );
			html.append( "<head>" );
			html.append( "<meta charset='utf-8'>" );
			html.append( "</head>" );
			html.append( "<body>" );
			html.append( "Hello Servlet" );
			html.append( "</body>" );
			html.append( "</html>" );
			
			PrintWriter out = resp.getWriter();
			out.println( html );
			out.close();	//out은 스트림이기때문에 닫아준다.
			
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
	}
}

 

ㅇ어노테이션 기법

더보기

@을 써서 서블릿을 사용하는 방법

기존 web.xml에 작성하면 저장하는 속도가 너무 느리기때문에 이를 사용한다.

 

위에 @WebServlet을 쓰기만 하면 된다.

-ServletEx02.java

package servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet( urlPatterns = { "/servlet02", "/servlet03" } ) 
//webservlet을 사용, 여러개의 서블릿클래스를 사용할 수 있다

public class ServletEx02 extends HttpServlet {
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		this.doProcess(req, resp);
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		this.doProcess(req, resp);
	}
	
	protected void doProcess(HttpServletRequest req, HttpServletResponse resp) {
		try {
			//입력 영역 : getParameter 사용
			req.setCharacterEncoding( "utf-8" );
			
			
			//출력 영역 : out 사용
			resp.setContentType( "text/html;charset=utf-8" );
			StringBuffer html = new StringBuffer();
			html.append( "<!doctype html>" );
			html.append( "<head>" );
			html.append( "<meta charset='utf-8'>" );
			html.append( "</head>" );
			html.append( "<body>" );
			html.append( "Hello Servlet" );
			html.append( "</body>" );
			html.append( "</html>" );
			
			PrintWriter out = resp.getWriter();
			out.println( html );
			out.close();	//out은 스트림이기때문에 닫아준다.
			
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
}
	

 

이클립스에서 Servlet클래스를 만들 수 있다.

현재 /ServletEx03을 사용중이므로 /ServletEx04로 바꿔준다.

 

-ServletEx03.java

package servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


@WebServlet("/ServletEx04")
public class ServletEx03 extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    public ServletEx03() {
        super();
        // TODO Auto-generated constructor stub
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		this.doProcess(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		this.doProcess(request, response);
	}
	
	protected void doProcess(HttpServletRequest req, HttpServletResponse resp) {
		try {
			//입력 영역 : getParameter 사용
			req.setCharacterEncoding( "utf-8" );
			
			
			//출력 영역 : out 사용
			resp.setContentType( "text/html;charset=utf-8" );
			StringBuffer html = new StringBuffer();
			html.append( "<!doctype html>" );
			html.append( "<head>" );
			html.append( "<meta charset='utf-8'>" );
			html.append( "</head>" );
			html.append( "<body>" );
			html.append( "Hello Servlet" );
			html.append( "</body>" );
			html.append( "</html>" );
			
			PrintWriter out = resp.getWriter();
			out.println( html );
			out.close();	//out은 스트림이기때문에 닫아준다.
			
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

 

어노테이션에 초기값 설정하고 출력하기

-ServletEx04.java

package servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet( 
		//보여지는 페이지명
		urlPatterns = { "/servlet04" },
		//초기값 주기
		initParams = {
				@WebInitParam( name = "id", value = "tester" ),
				@WebInitParam( name = "password", value = "123456" )
		})

public class ServletEx04 extends HttpServlet {
	
	private String id;
	private String password;
	
	@Override
	public void init() throws ServletException {
		id = getInitParameter( "id" );
		password = getInitParameter( "password" );
	}
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		this.doProcess(req, resp);
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		this.doProcess(req, resp);
	}
	
	protected void doProcess(HttpServletRequest req, HttpServletResponse resp) {
		System.out.println( "id : " + id );
		System.out.println( "password : " + password );
	}
	
	
}

 

이를 이클립스에서 Servlet 페이지로 자동으로 만들어보자.

 

아래처럼 자동으로 만들어진다.

 

 

ㅇ서블릿 2개 사용하기

더보기

이번에는 다시 다이나믹웹프로젝트를 만들고 servlet 패키지를 만든다. 그리고 Servlet 클래스를 만든다.

이때 초기값 설정하지 않고 아래와 같이 생성자빼고 init, doget, dopost만 포함시키고 만든다.

-ServletEx01.java

package servlet;

import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/ServletEx01")
public class ServletEx01 extends HttpServlet {
	private static final long serialVersionUID = 1L;

	public void init() throws ServletException {
		System.out.println( "ServletEx01 init 호출" );
	}

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println( "ServletEx01 doGet() 호출" );
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

-ServletEx02.java

package servlet;

import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/ServletEx02")
public class ServletEx02 extends HttpServlet {
	private static final long serialVersionUID = 1L;

	public void init() throws ServletException {
		System.out.println( "ServletEx02 init 호출" );
	}

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println( "ServletEx02 doGet() 호출" );
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

이때 실행하면 실행시키는 쪽만 실행된다. 이때 두 개 모두 실행시키려면 어노테이션에 loadOnStartup을 설정한다.

그러면 톰캣 웹서버가 실행되면서 두 개의 서블릿클래스를 모두 실행시킨다.

-ServletEx01.java

package servlet;

import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet( urlPatterns = "/ServletEx01", loadOnStartup = 1 )
public class ServletEx01 extends HttpServlet {
	private static final long serialVersionUID = 1L;

	public void init() throws ServletException {
		System.out.println( "ServletEx01 init 호출" );
	}

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println( "ServletEx01 doGet() 호출" );
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

-ServletEx02.java

package servlet;

import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet( urlPatterns = "/ServletEx02", loadOnStartup = 2 )
public class ServletEx02 extends HttpServlet {
	private static final long serialVersionUID = 1L;

	public void init() throws ServletException {
		System.out.println( "ServletEx02 init 호출" );
	}

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println( "ServletEx02 doGet() 호출" );
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

 

 

18. MVC Model2 기법

더보기
https://m.blog.naver.com/PostView.nhn?blogId=kksssii&logNo=220805270268&proxyReferer=https:%2F%2Fwww.google.com%2F

p518

모델2구조는 모델1구조와 달리 웹 브라우저의 요청을 하나의 서블릿이 받는다. 모델1의 경우 웹 브라우저의 요청을 JSP가 직접 받아서 자비빈이나 서비스 클래스를 사용해서 작업을 처리하고 그 결과를 클라이언트에게 출력했다.

반면 모델 2는 웹 브라우저의 모든 요청을 단일 진입점, 즉 하나의 서블릿에서 처리한다는 점이다. 이러한 특징 때문에 MVC(Model-View-Controller) 패턴을 이용해서 웹 어플리케이션을 구현한다.

 

각각의 역할은 다음과 같다.

컨트롤러 : 사용자의 입력 처리와 흐름 제어를 담당한다.

모델 : 비즈니스 영역의 로직을 처리한다.

뷰 : 비즈니스 영역에 대한 프레젠테이션 뷰(즉, 사용자가 보게될 결과 화면)를 담당한다.

 

또한 MVC핵심은 다음과 같다.

비즈니스 로직을 처리하는 모델과 결과화면을 보여주는 뷰를 분리한다.

어플리케이션의 흐름제어나 사용자의 처리 요청은 컨트롤러에 집중된다.

 

MVC모델의 매핑관계를 확인하면 다음과 같다.

컨트롤러 = 서블릿

모델 = 로직처리클래스, 자바빈

뷰 = JSP
사용자 = 웹브라우저 또는 휴대폰과 같은 기기

 

 

컨트롤러 서블릿의 내부 동작 과정은 다음과 같다.

1. 웹 브라우저가 전송한 HTTP 요청을 받는다. 서블릿의 doGet() 또는 doPost() 메서드가 호출된다.

2. 웹 브라우저가 어떤 기능을 요청했는지 분석한다. 예를 들면 게시판 목록을 요청했는지, 글쓰기를 요청했는지 알아낸다.

3. 모델을 사용하여 요청한 기능을 수행한다.

4. 모델로부터 전달받은 결과물을 알맞게 가공한 후, request나 session의 setAttribute()메서드를 사용하여 결과값을 속성에 저장한다. 이렇게 저장한 결과값은 뷰인 JSP에서 사용한다.

5. 웹 브라우저에 결과를 전송할 JSP 선택한 후, 해당 JSP로 포워딩한다. 경우에 따라 리다이렉트를 하기도 한다.

 

 

MVC의 뷰: JSP

뷰 역할을 하는 JSP는 컨트롤러에서 request 기본 객체나 session 기본 객체에 저장한 데이터를 사용하여 웹 브라우저에 알맞은 결과를 출력한다.

웹 브라우저가 요청한 결과를 보여주는 프레젠테이션의 역할을 하거나 웹 브라우저의 요청을 컨트롤러에 전달해주는 매개체가 되기도 한다.

 

MVC의 모델

비즈니스 로직을 처리하기만 하면 그것의 형태가 어떻게되든 모델이 될 수 있다. 

모델이 제공해야 하는 기능은 웹 브라우저의 요청을 처리하는 데 필요한 기능이다.

 

-컨트롤러 처리 방식

컨트롤러가 요청을 받는 방식 : 하나의 서블릿에서 처리
1. 파라메터 방식
	/controller?action=view1
		view1에 해당하는 내용처리
		view1.jsp
	/controller?action=view2
		view2에 해당하는 내용처리
		view2.jsp

2. url
	view1.do
		view1에 해당하는 내용처리		
	view2.do
		view2에 해당하는 내용처리

다이나믹웹프로젝트를 만들고 jsp를 만든다.

-view1.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>
view1.jsp
</body>
</html>

-view2.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>
view1.jsp
</body>
</html>

그리고 자바리소스에 서블릿을 만든다.

-ControllerEx01.java

package servlet;

import java.io.IOException;
import java.io.UnsupportedEncodingException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/Controller")
public class ControllerEx01 extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		this.doProcess(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		this.doProcess(request, response);
	}

	protected void doProcess(HttpServletRequest request, HttpServletResponse response) {
		try {
			request.setCharacterEncoding( "utf-8" );
			
			String action = request.getParameter( "action" );
			
			if ( action == null || action.equals( "" ) || action.equals( "view1" ) ) {
				System.out.println( "view1 호출 " );
			} else if ( action.equals( "view2" ) ) {
				System.out.println( "view2 호출" );
			}
			
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

action=view1을 하면 view1 호출이 출력되고 action=view2를 입력하면 view2 호출이 출력된다.

 

이제 위 모델에서 jsp파일을 보이도록 만들어보자.

-controllerEx01.java

package servlet;

import java.io.IOException;
import java.io.UnsupportedEncodingException;

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;

@WebServlet("/Controller")
public class ControllerEx01 extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		this.doProcess(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		this.doProcess(request, response);
	}

	protected void doProcess(HttpServletRequest request, HttpServletResponse response) {
		try {
			request.setCharacterEncoding( "utf-8" );
			
			String action = request.getParameter( "action" );
			
			String url = "";
			if ( action == null || action.equals( "" ) || action.equals( "view1" ) ) {
				System.out.println( "view1 호출 " );
				url = "view1.jsp";
			} else if ( action.equals( "view2" ) ) {
				System.out.println( "view2 호출" );
				url = "view2.jsp";
			}
            
			// jsp:forword와 똑같은 기능을 하는 것이 밑의 코드이다. 아래 코드로 인해 jsp파일이 출력된다.
			RequestDispatcher dispatcher = request.getRequestDispatcher( url );
			dispatcher.forward(request, response);
			
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ServletException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

action=view2로 바꾸면 아래와 같다.

이때 jsp파일을 직접실행할 수 있으므로 WebContent에 views란 폴더를 만들고 그 안에 jsp파일들을 옮긴다.

WEB-INF 디렉터리는 보안기능이 있기때문에 WEB-INF폴더 안에 바로 있어야 실행이된다.

이때 view1.jsp나 view2.jsp에서 jsp 구문을 사용할 수 있다.

-view1.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>
<%
	out.println( "Hello view1" );
%>
</body>
</html>

-ControllerEx01.java 에서 url을 views폴더의 view1.jsp로 변경해준다.

package servlet;

import java.io.IOException;
import java.io.UnsupportedEncodingException;

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;

@WebServlet("/Controller")
public class ControllerEx01 extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		this.doProcess(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		this.doProcess(request, response);
	}
	
	protected void doProcess(HttpServletRequest request, HttpServletResponse response) {
		try {
			request.setCharacterEncoding( "utf-8" );
			
			String action = request.getParameter( "action" );
			String url = "";
			
			if( action == null || action.equals( "" ) || action.equals( "view1" ) ) {
				System.out.println( "view1 호출" );
				url = "/WEB-INF/views/view1.jsp";
			} else if ( action.equals( "view2" ) ) {
				System.out.println( "view2 호출" );
				url = "/WEB-INF/views/view2.jsp";
			}
			
			RequestDispatcher dispatcher = request.getRequestDispatcher( url );
			dispatcher.forward(request, response);
			
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ServletException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

 

이번에는 view에 대한 모델들을 만들어보자.

-View1Model.java

package model1;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class View1Model {
	public void execute() {
		System.out.println( "View1Model" );
	}
	
	public void execute(HttpServletRequest request, HttpServletResponse response) {
		System.out.println( "View1Model" );
	}
}

-View2Model.java

package model1;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class View2Model {
	public void execute() {
		System.out.println( "View2Model" );
	}
	
	public void execute(HttpServletRequest request, HttpServletResponse response) {
		System.out.println( "View2Model" );
	}
}

-ControllerEx01.java 에서도 model을 불러올 수 있도록 수정한다.

package servlet;

import java.io.IOException;
import java.io.UnsupportedEncodingException;

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 model1.View1Model;
import model1.View2Model;

@WebServlet("/Controller")
public class ControllerEx01 extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		this.doProcess(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		this.doProcess(request, response);
	}
	
	protected void doProcess(HttpServletRequest request, HttpServletResponse response) {
		try {
			request.setCharacterEncoding( "utf-8" );
			
			String action = request.getParameter( "action" );
			String url = "";
			
			if( action == null || action.equals( "" ) || action.equals( "view1" ) ) {
				System.out.println( "view1 호출" );
				
				View1Model model = new View1Model();
				//model.execute();
				model.execute( request, response );
				
				url = "/WEB-INF/views/view1.jsp";
			} else if ( action.equals( "view2" ) ) {
				System.out.println( "view2 호출" );
				
				View2Model model = new View2Model();
				//model.execute();
				model.execute( request, response );
				
				url = "/WEB-INF/views/view2.jsp";
			}
			
			RequestDispatcher dispatcher = request.getRequestDispatcher( url );
			dispatcher.forward(request, response);
			
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ServletException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

 

이번에는 viewModel을 하나로 합치는데 이때는 interface를 사용한다.

-ViewModel.java (인터페이스)

package model1;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public interface ViewModel {
	public void execute( HttpServletRequest request, HttpServletResponse response );
}

-View1Model.java

package model1;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class View1Model implements ViewModel {
	@Override
	public void execute(HttpServletRequest request, HttpServletResponse response) {
		System.out.println( "view1Model");
	}
}

-View2Model.java

package model1;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class View2Model implements ViewModel {

	@Override
	public void execute(HttpServletRequest request, HttpServletResponse response) {
		System.out.println( "View2Model" );
	}
	

}

-ControllerEx01.java 에서 ViewModel을 선언하고 다형성을 이용해서 view1.jsp와 view2.jsp를 각각 받는다.

package servlet;

import java.io.IOException;
import java.io.UnsupportedEncodingException;

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 model1.View1Model;
import model1.View2Model;
import model1.ViewModel;

@WebServlet("/Controller")
public class ControllerEx01 extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		this.doProcess(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		this.doProcess(request, response);
	}
	
	protected void doProcess(HttpServletRequest request, HttpServletResponse response) {
		try {
			request.setCharacterEncoding( "utf-8" );
			
			String action = request.getParameter( "action" );
			String url = "";
			
			ViewModel model = null;
			if( action == null || action.equals( "" ) || action.equals( "view1" ) ) {
				System.out.println( "view1 호출" );
				
				//다형성으로 받기
				model = new View1Model();
				//model.execute();
				model.execute( request, response );
				
				url = "/WEB-INF/views/view1.jsp";
			} else if ( action.equals( "view2" ) ) {
				System.out.println( "view2 호출" );
				
				//다형성으로 받기
				model = new View2Model();
				//model.execute();
				model.execute( request, response );
				
				url = "/WEB-INF/views/view2.jsp";
			}
			
			RequestDispatcher dispatcher = request.getRequestDispatcher( url );
			dispatcher.forward(request, response);
			
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ServletException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

 

이번에는 우편번호 검색기를 모델2기법으로 만들어보자.

ZipcodeModel1Ex01.war
0.56MB

 

 

-context.xml 은 자신의 데이터베이스 정보에 맞게 수정해야 한다.

<?xml version="1.0" encoding="utf-8" ?>
<Context>
	<Resource
		name = "jdbc/mariadb2"
		auth = "Container"
		type = "javax.sql.DataSource"
		driverClassName = "org.mariadb.jdbc.Driver"
		url = "jdbc:mysql://localhost:3307/sample"
		username = "root"
		password = "!123456"
	/>
</Context>

-zipcode.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%@ page import="model1.ZipcodeTO" %>
<%@ page import="model1.ZipcodeDAO" %>
<%@ page import="java.util.ArrayList" %>

<!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 action="./Controller" method="post" name="frm">
<input type="hidden" name="action" value="zipcode_ok" />
동이름 <input type="text" name="dong" />
<input type="button" value="동이름 검색" onclick="checkfrm()" />
</form>

</body>
</html>

-zipcode_ok.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%@ page import="model1.ZipcodeTO" %>
<%@ page import="model1.ZipcodeDAO" %>
<%@ page import="java.util.ArrayList" %>


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

	StringBuffer html = new StringBuffer();	
	if( strDong != null ) {
		ZipcodeDAO dao = new ZipcodeDAO();
		ArrayList<ZipcodeTO> lists = dao.searchLists( strDong );
			
		html.append( "<table width='600' border='1'>" );
		for(ZipcodeTO 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( "</tr>" );
		}
		html.append( "</table>" );
	}
%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<%= html %>

</body>
</html>

-ZipcodeTO.java

package model1;

public class ZipcodeTO {
	private String zipcode;
	private String sido;
	private String gugun;
	private String dong;
	private String ri;
	private String bunji;
	private String seq;
	
	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;
	}
	public String getSeq() {
		return seq;
	}
	public void setSeq(String seq) {
		this.seq = seq;
	}
}

-ZipcodeDAO.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 ZipcodeDAO {
	private DataSource dataSource = null;
	
	public ZipcodeDAO() {
		// TODO Auto-generated constructor stub	
		try {
			Context initCtx = new InitialContext();
			Context envCtx = (Context)initCtx.lookup( "java:comp/env" );
			this.dataSource = (DataSource)envCtx.lookup( "jdbc/mariadb2" );
		} catch (NamingException e) {
			// TODO Auto-generated catch block
			System.out.println( "[에러] " + e.getMessage() );
		}
	}
	
	public ArrayList<ZipcodeTO> searchLists(String strDong) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		
		ArrayList<ZipcodeTO> lists = new ArrayList<ZipcodeTO>();
		
		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() ) {
				ZipcodeTO to = new ZipcodeTO();
				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) {
			// TODO Auto-generated catch block
			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;
	}
}




-Controller.java

package servlet;

import java.io.IOException;
import java.io.UnsupportedEncodingException;

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;

/**
 * Servlet implementation class ControllerEx01
 */
@WebServlet("/Controller")
public class ControllerEx01 extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		this.doProcess(request, response);
	}
	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		this.doProcess(request, response);
	}
	
	protected void doProcess(HttpServletRequest request, HttpServletResponse response) {
		try {
			request.setCharacterEncoding( "utf-8" );
			
			String action= request.getParameter( "action" );
			String url = "";
			
			if ( action == null || action.equals("") || action.equals( "zipcode" ) ) {
				url = "/WEB-INF/views/zipcode.jsp";
			} else if ( action.equals( "zipcode_ok" ) ) {
				url = "/WEB-INF/views/zipcode_ok.jsp";
			}
			
			RequestDispatcher dispatcher = request.getRequestDispatcher( url );
			dispatcher.forward(request, response);
			
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ServletException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

}

하지만 현재 모델2는 아니다. 이유는 현재 뷰에서 모델을 부르기 때문에 컨트롤러에서 모델을 불러오도록 해야 한다.

자바리소스에 model2라는 패키지를 만들고 ActionModel.java 인터페이스를 만든다.

-ActionModel.java

package model2;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public interface ActionModel {
	public void execute( HttpServletRequest request, HttpServletResponse response );
}

그리고 각각의 jsp파일인 zipcode.jsp, zipcode_ok.jsp에 대한 모델을 만든다. 이때 ActionModel인터페이스를 구현한다.

 

-ZipcodeOkAction.java

package model2;

import java.io.UnsupportedEncodingException;
import java.util.ArrayList;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import model1.ZipcodeDAO;
import model1.ZipcodeTO;

public class ZipcodeOkAction implements ActionModel {

	@Override
	public void execute(HttpServletRequest request, HttpServletResponse response) {
		try {
			request.setCharacterEncoding( "utf-8" );
			
			String strDong = request.getParameter("dong");

			StringBuffer html = new StringBuffer();	
			ZipcodeDAO dao = new ZipcodeDAO();
			ArrayList<ZipcodeTO> lists = dao.searchLists( strDong );
			
			
			request.setAttribute( "lists", lists );
			
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}

-ZipcodeAction.java 손댈 것이 없음

package model2;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ZipcodeAction implements ActionModel {

	@Override
	public void execute(HttpServletRequest request, HttpServletResponse response) {
		
	}

}

-ControllerEx01 아래처럼 수정한다.

package servlet;

import java.io.IOException;
import java.io.UnsupportedEncodingException;

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 model2.ActionModel;
import model2.ZipcodeAction;
import model2.ZipcodeOkAction;

/**
 * Servlet implementation class ControllerEx01
 */
@WebServlet("/Controller")
public class ControllerEx01 extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		this.doProcess(request, response);
	}
	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		this.doProcess(request, response);
	}
	
	protected void doProcess(HttpServletRequest request, HttpServletResponse response) {
		try {
			request.setCharacterEncoding( "utf-8" );
			
			String action= request.getParameter( "action" );
			String url = "";
			
			ActionModel model = null;
			
			if ( action == null || action.equals("") || action.equals( "zipcode" ) ) {
				//zipcode.jsp에서는 특별한 일이 없다.
				model = new ZipcodeAction();
				model.execute(request, response);
				url = "/WEB-INF/views/zipcode.jsp";
				
			} else if ( action.equals( "zipcode_ok" ) ) {
				//zipcode_ok.jsp에서는 데이터베이스 선택 구문이 들어가야 한다.
				model = new ZipcodeOkAction();
				model.execute(request, response);
				url = "/WEB-INF/views/zipcode_ok.jsp";
			}
			
			RequestDispatcher dispatcher = request.getRequestDispatcher( url );
			dispatcher.forward(request, response);
			
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ServletException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

}

 

실행순서가 헷갈릴 수도 있는데  MVC 패턴을 이해해야 한다.

1. ControllerEx01 실행

2. ControllerEx01의 어노테이션으로 서블릿 클래스 생성

3. ControllerEx01에서 doGet이나 doPost메서드가 자동으로 실행되면서 doProcess메서드 실행

4. doProcess메서드에서 action조건 검사해서 ZipcodeAction() 모델의 execute() 메서드 실행

5. zipcode.jsp가 웹브라우저에 출력됨

6. zipcode.jsp에서 동이름이 입력되고 검색이 눌리면 서블릿클래스 Controller로 이동되고 이때 action=zipcode_ok값이 전달됨

7. ControllerEx01에서 action값 검사를 다시 실시

8. ZipcodeOkAction 모델의 execute()실행

9. ZipcodeOkAction에서 dong값을 받아오고 ZipcodeDAO를 만들고 searchLists메서드를 실행하고 그 반환값을 lists에 저장한다.

10. 저장된 lists를 request.setAttribute로 데이터를 넘겨준다.

11. ControllerEx01에서는 받은 데이터를 zipcode_ok.jsp url로 페이지로 이동시킨다.

12. zipcode_ok.jsp에서는 request.getAttribute() 메서드로 lists 데이터를 받은뒤 StringBuffer로 html 문서를 만든다.

 

 

 

기존에 model1으로 만든게시판을 복사해서 model2Ex01로 프로젝트를 만들고

만들어진 프로젝트 오른쪽버튼 - propertyies에서 아래와 같이 프로젝트명과 동일하게 이름을 바꿔준다.

아래와 같이 모델2로 만들어질 페이지를 정리해본다.

controller?action=
		인터페이스이름 BoardAction
			execute() 메서드
	list					DAO
		ListAction
		board_list1.jsp
	view
		ViewAction
		board_view1.jsp
	write	
		WriteAction
		board_write1.jsp
	wirte_ok
		WriteOkAction
		board_wirte1_ok.jsp
	modify
		ModifyAction
		board_modify1.jsp
	modify_ok
		ModifyOkAction
		board_modify1_ok.jsp
	delete
		DeleteAction
		board_delete1.jsp
	delete_ok
		DeleteOkAction
		board_delete1_ok.jsp

먼저 WEB-INF의 lib폴더에 마리아디비 라이브러리를 넣고, META-INF에 context.xml파일을 작성한다.

-context.xml

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

 

그리고 WEB-INF에 views폴더를 만들고 그 안에 board_~.jsp 파일들을 모두 넣는다.

다음으로 자바리소스 디렉터리에 아래와 같이 model1, model2, servlet 패키지를 만든다.

특히 model2 패키지에는 각 페이지별 모델을 모두 만들어준다.

또한 servlet 패키지에는 controllerEx01.java를 만들어서 컨트롤러를 만들어준다.

model1 패키지 (수정사항 없음)

-BoardTO.java

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

-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.sql.DataSource;

public class BoardDAO {
	private DataSource dataSource;
	
	public BoardDAO() {
		try {
			Context initCtx = new InitialContext();
			Context envCtx = (Context)initCtx.lookup( "java:comp/env" );
			this.dataSource = (DataSource)envCtx.lookup( "jdbc/mariadb2" );
		} catch (Exception e) {
			System.out.println( "에러: " + e.getMessage() );
		}
	}
	
	//write
	public void boardWrite() {}
	
	//write_ok
	public int boardWriteOk( BoardTO to ) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		
		int flag = 1;
		
		try {
			conn = dataSource.getConnection();
			
			String sql = "insert into 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() );
			
			int result = pstmt.executeUpdate();
			if ( result == 1 ) {
				//정상일 때
				flag = 0;
			}
		} catch(SQLException e) {
			System.out.println( "error: " + 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( "error: " + 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();
			
			//board_view.jsp에 들어오면 조회수 증가를 위한 update문을 사용한다.
			String sql = "update board1 set hit = hit+1 where seq = ?";
			pstmt = conn.prepareStatement(sql);
			pstmt.setString( 1, to.getSeq() );
			rs = pstmt.executeQuery();
			
			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();
			
			//데이터를 하나만 가져오니깐 while문 대신 if문을 사용한다.
			if ( rs.next() ) {
				to.setSubject( rs.getString( "subject" ) );
				to.setWriter( rs.getString( "writer" ) );
				to.setMail( rs.getString( "mail" ) );
				to.setWip( rs.getString( "wip" ) );
				to.setWdate( rs.getString( "wdate" ) );
				to.setHit( rs.getString( "hit" ) );
				to.setContent( rs.getString( "content" ).replaceAll( "\n", "<br>") );
			}
			
		} catch (SQLException e) {
			System.out.println( "error: " + 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();
			
			//데이터를 하나만 가져오니깐 while문 대신 if문을 사용한다.
			if ( rs.next() ) {
				to.setSubject( rs.getString( "subject" ) );
				to.setWriter( rs.getString( "writer" ) );
			}
			
		} catch(SQLException e) {
			System.out.println( "error: " + 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();
			
			//개인의 비밀번호는 db안쪽에서 검색되도록 해야 한다.
			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();
			
			//seq는 정상적으로 알아서 잘 넘어가기때문에 비밀번호 오류만 잡아준다.
			if ( result == 0 ) {
				//result 0일 때는 비밀번호 오류
				flag = 1;
			} else if ( result == 1 ) {
				//정상일 때
				flag = 0;
			}
		} catch(SQLException e) {
			System.out.println( "error: " + 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 writer, subject, content, mail from board1 where seq = ?";
			pstmt = conn.prepareStatement(sql);
			pstmt.setString( 1, to.getSeq() );
			rs = pstmt.executeQuery();
			
			//데이터를 하나만 가져오니깐 while문 대신 if문을 사용한다.
			if ( rs.next() ) {
				to.setSubject( rs.getString( "subject" ) );
				to.setWriter( rs.getString( "writer" ) );
				to.setContent( rs.getString( "content" ) );
				to.setMail( rs.getString( "mail" ) );
			}

		} catch(SQLException e) {
			System.out.println( "error: " + 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();
			
			//개인의 비밀번호는 db안쪽에서 검색되도록 해야 한다.
			String sql = "update board1 set subject = ?, content = ?, mail = ? where seq = ? and password = ?";
			pstmt = conn.prepareStatement(sql);
			pstmt.setString( 1, to.getSubject() );
			pstmt.setString( 2, to.getContent() );
			pstmt.setString( 3, to.getMail() );
			pstmt.setString( 4, to.getSeq() );
			pstmt.setString( 5, to.getPassword() );
			
			int result = pstmt.executeUpdate();
			
			//seq는 정상적으로 알아서 잘 넘어가기때문에 비밀번호 오류만 잡아준다.
			if ( result == 0 ) {
				//result 0일 때는 비밀번호 오류
				flag = 1;
			} else if ( result == 1 ) {
				//정상일 때
				flag = 0;
			}
			
		} catch(SQLException e) {
			System.out.println( "error: " + e.getMessage() );
		} finally {
			if ( pstmt != null ) try { pstmt.close(); } catch ( SQLException e ) {}
			if ( conn != null ) try {  conn.close(); } catch ( SQLException e ) {}
		}
		return flag;
	}
}

 

model2 패키지

-BoardAction.java (인터페이스)

package model2;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public interface BoardAction {
	public void execute( HttpServletRequest request, HttpServletResponse response );
}

-ListAction.java

package model2;

import java.util.ArrayList;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import model1.BoardDAO;
import model1.BoardTO;

public class ListAction implements BoardAction {

	@Override
	public void execute(HttpServletRequest request, HttpServletResponse response) {
		System.out.println( "ListAction 호출" );
	
		BoardDAO dao = new BoardDAO();
		ArrayList<BoardTO> lists = dao.boardList();
		
		request.setAttribute( "lists", lists );
	}

}

-WriteAction.java

package model2;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class WriteAction implements BoardAction {

	@Override
	public void execute(HttpServletRequest request, HttpServletResponse response) {
		System.out.println( "WriteAction 호출" );
	}

}

-WriteOkAction.java

package model2;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import model1.BoardDAO;
import model1.BoardTO;

public class WriteOkAction implements BoardAction {

	@Override
	public void execute(HttpServletRequest request, HttpServletResponse response) {
		System.out.println( "WriteOkAction 호출" );
		
		BoardTO to = new BoardTO();	

		to.setSubject( request.getParameter( "subject" ) ); 
		to.setWriter( request.getParameter( "writer" ) );
		to.setMail( "" );
		if ( !request.getParameter( "mail1" ).equals("") && !request.getParameter( "mail2" ).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);
		
		request.setAttribute( "flag", flag );
	}

}

-ViewAction.java

package model2;

import java.io.UnsupportedEncodingException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import model1.BoardDAO;
import model1.BoardTO;

public class ViewAction implements BoardAction {

	@Override
	public void execute(HttpServletRequest request, HttpServletResponse response) {
		System.out.println( "ViewAction 호출" );
		
		BoardTO to = new BoardTO();
		to.setSeq( request.getParameter( "seq" ) );
		
		BoardDAO dao = new BoardDAO();
		to = dao.boardView( to );
		
		request.setAttribute( "to", to );
	}
}

-DeleteAction.java

package model2;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import model1.BoardDAO;
import model1.BoardTO;

public class DeleteAction implements BoardAction {

	@Override
	public void execute(HttpServletRequest request, HttpServletResponse response) {
		System.out.println( "DeleteAction 호출" );
		
		BoardTO to = new BoardTO();	
		to.setSeq( request.getParameter( "seq" ) );
		
		BoardDAO dao = new BoardDAO();
		to = dao.boardDelete(to);
		
		request.setAttribute( "to", to );
	}

}

-DeleteOkAction.java

package model2;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import model1.BoardDAO;
import model1.BoardTO;

public class DeleteOkAction implements BoardAction {

	@Override
	public void execute(HttpServletRequest request, HttpServletResponse response) {
		System.out.println( "DeleteOkAction 호출" );
		
		BoardTO to = new BoardTO();

		String seq = request.getParameter( "seq" );
		String password = request.getParameter( "password" );
		
		to.setSeq(seq);
		to.setPassword(password);
		
		BoardDAO dao = new BoardDAO();
		int flag = dao.boardDeleteOk(to);
		
		request.setAttribute( "flag", flag );
	}

}

-ModifyAction.java

package model2;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import model1.BoardDAO;
import model1.BoardTO;

public class ModifyAction implements BoardAction {

	@Override
	public void execute(HttpServletRequest request, HttpServletResponse response) {
		System.out.println( "ModifyAction 호출" );
		
		BoardTO to = new BoardTO();
		to.setSeq( request.getParameter( "seq" ) );
		
		BoardDAO dao = new BoardDAO();
		to = dao.boardModify( to );
		
		request.setAttribute( "to", to );
	}

}

-ModifyOkAction.java

package model2;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import model1.BoardDAO;
import model1.BoardTO;

public class ModifyOkAction implements BoardAction {

	@Override
	public void execute(HttpServletRequest request, HttpServletResponse response) {
		System.out.println( "ModifyOkAction 호출" );
		
		BoardTO to = new BoardTO();
		String seq = request.getParameter( "seq" );
		String password = request.getParameter( "password" );
		String subject = request.getParameter( "subject" );
		String content = request.getParameter( "content" );
		String mail = "";
		if ( !request.getParameter( "mail1" ).equals("") && !request.getParameter( "mail2" ).equals("") ) {
			mail = request.getParameter( "mail1" ) + "@" + request.getParameter( "mail2" );
		}
		
		to.setSeq(seq);
		to.setPassword(password);
		to.setSubject(subject);
		to.setContent(content);
		to.setMail(mail);
		
		BoardDAO dao = new BoardDAO();
		int flag = dao.boardModifyOk(to);
		
		request.setAttribute( "flag", flag );
		request.setAttribute( "seq", to.getSeq() );
	}

}

 

servlet 패키지

-controllerEx01.java

package servlet;

import java.io.IOException;
import java.io.UnsupportedEncodingException;

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 model2.BoardAction;
import model2.DeleteAction;
import model2.DeleteOkAction;
import model2.ListAction;
import model2.ModifyAction;
import model2.ModifyOkAction;
import model2.ViewAction;
import model2.WriteAction;
import model2.WriteOkAction;

/**
 * Servlet implementation class ControllerEx01
 */
@WebServlet("/Controller")
public class controllerEx01 extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		this.doProcess(request, response);
	}
	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		this.doProcess(request, response);
	}
	
	protected void doProcess(HttpServletRequest request, HttpServletResponse response) {
		try {
			request.setCharacterEncoding( "utf-8" );
			
			String action= request.getParameter( "action" );
			String url = "";
			
			BoardAction boardAction = null;
			
			if ( action == null || action.equals("") || action.equals( "list" ) ) {
				boardAction = new ListAction();
				boardAction.execute(request, response);
				url = "/WEB-INF/views/board_list1.jsp";
				
			} else if ( action.equals( "view" ) ) {
				boardAction = new ViewAction();
				boardAction.execute(request, response);
				url = "/WEB-INF/views/board_view1.jsp";
				
			} else if ( action.equals( "write" ) ) {
				boardAction = new WriteAction();
				boardAction.execute(request, response);
				url = "/WEB-INF/views/board_write1.jsp";
				
			} else if ( action.equals( "write_ok" ) ) {
				boardAction = new WriteOkAction();
				boardAction.execute(request, response);
				url = "/WEB-INF/views/board_write1_ok.jsp";
				
			} else if ( action.equals( "modify" ) ) {
				boardAction = new ModifyAction();
				boardAction.execute(request, response);
				url = "/WEB-INF/views/board_modify1.jsp";
				
			} else if ( action.equals( "modify_ok" ) ) {
				boardAction = new ModifyOkAction();
				boardAction.execute(request, response);
				url = "/WEB-INF/views/board_modify1_ok.jsp";
				
			} else if ( action.equals( "delete" ) ) {
				boardAction = new DeleteAction();
				boardAction.execute(request, response);
				url = "/WEB-INF/views/board_delete1.jsp";
				
			} else if ( action.equals( "delete_ok" ) ) {
				boardAction = new DeleteOkAction();
				boardAction.execute(request, response);
				url = "/WEB-INF/views/board_delete1_ok.jsp";
				
			}
			
			RequestDispatcher dispatcher = request.getRequestDispatcher( url );
			dispatcher.forward(request, response);
			
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ServletException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

}

 

views폴더의 jsp파일들

-Board_list1.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" %>

<%
	ArrayList<BoardTO> lists = (ArrayList)request.getAttribute( "lists" );
	
	int totalRecord = lists.size();
	
	StringBuffer sbHtml = new StringBuffer();
		
	for( BoardTO to : lists ) {
		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='./Controller?action=view&seq=" + seq + "'>" + subject + "</a>&nbsp; ");
		if( wgap == 0 ) {
			sbHtml.append( "		<img src='./images/icon_hot.gif' alt='HOT'> ");
		}
		sbHtml.append( "	</td> " );
		sbHtml.append( " 	<td>" + writer + "</td> " );
		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_list.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 %>
			</table>
		</div>	
		<!--//게시판-->

		<div class="align_right">
			<input type="button" value="쓰기" class="btn_write btn_txt01" style="cursor: pointer;" onclick="location.href='./Controller?action=write'" />
		</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_write.css">

<script type="text/javascript">
	window.onload = function() {
		document.getElementById( 'submit1' ).onclick = function() {
			if ( document.wfrm.info.checked == false ) {
				alert( '동의를 해주세요' );
				return false;
			}
			if ( document.wfrm.writer.value.trim() == '' ) {
				alert( '글쓴이를 입력해주세요' );
				return false;
			}
			if ( document.wfrm.subject.value.trim() == '' ) {
				alert( '제목을 입력해주세요' );
				return false;
			}
			if ( document.wfrm.password.value.trim() == '' ) {
				alert( '비밀번호를 입력해주세요' );
				return false;
			}
			document.wfrm.submit();
		}
	}
</script>

</head>

<body>
<!-- 상단 디자인 -->
<div class="con_title">
	<h3>게시판</h3>
	<p>HOME &gt; 게시판 &gt; <strong>게시판</strong></p>
</div>
<div class="con_txt">
	<form action="./Controller" method="post" name="wfrm">
		<input type="hidden" name="action" value="write_ok" />
		<div class="contents_sub">	
			<!--게시판-->
			<div class="board_write">
				<table>
				<tr>
					<th class="top">글쓴이</th>
					<td class="top" colspan="3"><input type="text" name="writer" value="" class="board_view_input_mail" maxlength="5" /></td>
				</tr>
				<tr>
					<th>제목</th>
					<td colspan="3"><input type="text" name="subject" value="" class="board_view_input" /></td>
				</tr>
				<tr>
					<th>비밀번호</th>
					<td colspan="3"><input type="password" name="password" value="" class="board_view_input_mail"/></td>
				</tr>
				<tr>
					<th>내용</th>
					<td colspan="3"><textarea name="content" class="board_editor_area"></textarea></td>
				</tr>
				<tr>
					<th>이메일</th>
					<td colspan="3"><input type="text" name="mail1" value="" class="board_view_input_mail"/> @ <input type="text" name="mail2" value="" class="board_view_input_mail"/></td>
				</tr>
				</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='./Controller?action=list'" />
				</div>
				<div class="align_right">
					<input type="button" id="submit1" value="쓰기" class="btn_write btn_txt01" style="cursor: pointer;" />
				</div>
			</div>
			<!--//게시판-->
		</div>
	</form>
</div>
<!-- 하단 디자인 -->

</body>
</html>

-Board_write1_ok.jsp

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

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

	int flag = (Integer)request.getAttribute( "flag" );
	
	
	out.println( " <script type='text/javascript'> " );
	if( flag == 0 ) {
		out.println( " alert('글쓰기에 성공했습니다.'); " );
		out.println( " location.href='./Controller?action=list' " );
	} else {
		out.println( " alert('글쓰기에 실패했습니다.'); " );
		out.println( " history.back(); " );
	}
	out.println( " </script> " );
%>


-Board_view1.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" );

	BoardTO to = (BoardTO)request.getAttribute( "to" );
	
%>

<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<title>Insert title here</title>
<link rel="stylesheet" type="text/css" href="./css/board_view.css">
</head>

<body>
<!-- 상단 디자인 -->
<div class="con_title">
	<h3>게시판</h3>
	<p>HOME &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%"><%= to.getSubject() %></td>
				<th width="10%">등록일</th>
				<td width="20%"><%= to.getWdate() %></td>
			</tr>
			<tr>
				<th>글쓴이</th>
				<td><%= to.getWriter() %>(<%= to.getMail() %>)(<%= to.getWip() %>)</td>
				<th>조회</th>
				<td><%= to.getHit() %></td>
			</tr>
			<tr>
				<td colspan="4" height="200" valign="top" style="padding: 20px; line-height: 160%"><%= to.getContent() %></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='./Controller?action=list'" />
			</div>
			<div class="align_right">
				<input type="button" value="수정" class="btn_list btn_txt02" style="cursor: pointer;" onclick="location.href='./Controller?action=modify&seq=<%= to.getSeq() %>'" />
				<input type="button" value="삭제" class="btn_list btn_txt02" style="cursor: pointer;" onclick="location.href='./Controller?action=delete&seq=<%= to.getSeq() %>'" />
				<input type="button" value="쓰기" class="btn_write btn_txt01" style="cursor: pointer;" onclick="location.href='./Controller?action=write'" />
			</div>
		</div>	
		<!--//게시판-->
	</div>
</div>
<!-- 하단 디자인 -->

</body>
</html>

-Board_delete1.jsp

<%@page import="model1.BoardDAO"%>
<%@page import="model1.BoardTO"%>
<%@ 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 = (BoardTO)request.getAttribute( "to" );
	
	String seq = to.getSeq();
	String subject = to.getSubject();
	String writer = to.getWriter();
	
%>

<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<title>Insert title here</title>
<link rel="stylesheet" type="text/css" href="./css/board_write.css">

<script type="text/javascript">
	window.onload = function() {
		document.getElementById( 'submit1' ).onclick = function() {
			if( document.dfrm.password.value.trim() == '' ) {
				alert( '비밀번호를 입력해주세요' );
				return false;
			}
			document.dfrm.submit();
		}
	}
</script>

</head>

<body>
<!-- 상단 디자인 -->
<div class="con_title">
	<h3>게시판</h3>
	<p>HOME &gt; 게시판 &gt; <strong>게시판</strong></p>
</div>
<div class="con_txt">
	<form action="./Controller" method="post" name="dfrm">
		<input type="hidden" name="action" value="delete_ok" />
		<input type="hidden" name="seq" value="<%= seq %>">
		<div class="contents_sub">	
			<!--게시판-->
			<div class="board_write">
				<table>
				<tr>
					<th class="top">글쓴이</th>
					<td class="top" colspan="3"><input type="text" name="writer" value="<%= writer %>" class="board_view_input_mail" maxlength="5" readonly/></td>
				</tr>
				<tr>
					<th>제목</th>
					<td colspan="3"><input type="text" name="subject" value="<%= subject %>" class="board_view_input" readonly/></td>
				</tr>
				<tr>
					<th>비밀번호</th>
					<td colspan="3"><input type="password" name="password" value="" class="board_view_input_mail"/></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='./Controller?action=list'" />
					<input type="button" value="보기" class="btn_list btn_txt02" style="cursor: pointer;" onclick="location.href='./Controller?action=view&seq=<%= seq %>'" />
				</div>
				<div class="align_right">
					<input type="button" id="submit1" value="삭제" class="btn_write btn_txt01" style="cursor: pointer;" />
				</div>
			</div>
			<!--//게시판-->
		</div>
	</form>
</div>
<!-- 하단 디자인 -->

</body>
</html>

-Board_delete1_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" );
	
	int flag = (Integer)request.getAttribute( "flag" );	

	out.println( " <script type='text/javascript'> " );
	if( flag == 0 ) {
		out.println( " alert('글삭제에 성공했습니다.'); " );
		out.println( " location.href='./Controller?action=list' " );
	} else if ( flag == 1 ) {
		out.println( " alert('비밀번호가 틀립니다.'); " );
		out.println( " history.back(); " );
	} else {
		out.println( " alert('글삭제에 실패했습니다.'); " );
		out.println( " history.back(); " );
	}
	out.println( " </script> " );
	
%>

-Board_modify1.jsp

<%@page import="model1.BoardDAO"%>
<%@page import="model1.BoardTO"%>
<%@ 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 = (BoardTO)request.getAttribute( "to" );	

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

<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<title>Insert title here</title>
<link rel="stylesheet" type="text/css" href="./css/board_write.css">

<script type="text/javascript">
 	window.onload = function() {
 		document.getElementById( 'submit2' ).onclick = function() {
 			if ( document.mfrm.subject.value.trim() == '' ) {
 				alert( '제목을 입력해주세요' );
 				return false;
 			}
 			if ( document.mfrm.password.value.trim() == '' ) {
 				alert( '비밀번호를 입력해주세요' );
 				return false;
 			}
 			if ( document.mfrm.content.value.trim() == '' ) {
 				alert( '내용을 입력해주세요' );
 				return false;
 			}
 			
 			document.mfrm.submit();
 		}
 	}
</script>

</head>

<body>
<!-- 상단 디자인 -->
<div class="con_title">
	<h3>게시판</h3>
	<p>HOME &gt; 게시판 &gt; <strong>게시판</strong></p>
</div>
<div class="con_txt">
	<form action="./Controller" method="post" name="mfrm">
		<input type="hidden" name="action" value="modify_ok" />
		<input type="hidden" name="seq" value="<%= seq %>">
		<div class="contents_sub">	
			<!--게시판-->
			<div class="board_write">
				<table>
				<tr>
					<th class="top">글쓴이</th>
					<td class="top" colspan="3"><input type="text" name="writer" value="<%= writer %>" class="board_view_input_mail" maxlength="5" readonly/></td>
				</tr>
				<tr>
					<th>제목</th>
					<td colspan="3"><input type="text" name="subject" value="<%= subject %>" class="board_view_input" /></td>
				</tr>
				<tr>
					<th>비밀번호</th>
					<td colspan="3"><input type="password" name="password" value="" class="board_view_input_mail"/></td>
				</tr>
				<tr>
					<th>내용</th>
					<td colspan="3"><textarea name="content" class="board_editor_area"><%= content %></textarea></td>
				</tr>
				<tr>
					<th>이메일</th>
					<td colspan="3"><input type="text" name="mail1" value="<%= mail[0] %>" class="board_view_input_mail"/> @ <input type="text" name="mail2" value="<%= mail[1] %>" class="board_view_input_mail"/></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='./Controller?action=list'" />
					<input type="button" value="보기" class="btn_list btn_txt02" style="cursor: pointer;" onclick="location.href='./Controller?action=view&seq=<%=seq %>'" />
				</div>
				<div class="align_right">
					<input type="button" id="submit2" value="수정" class="btn_write btn_txt01" style="cursor: pointer;" />
				</div>
			</div>
			<!--//게시판-->
		</div>
	</form>
</div>
<!-- 하단 디자인 -->

</body>
</html>

-Board_modify1_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" );

	int flag = (Integer)request.getAttribute( "flag" );
	String seq = (String)request.getAttribute( "seq" );
	
	out.println( " <script type='text/javascript'> " );
	if( flag == 0 ) {
		out.println( " alert('글수정에 성공했습니다.'); " );
		out.println( " location.href='./Controller?action=view&seq=" + seq + "' " );
	} else if ( flag == 1 ) {
		out.println( " alert('비밀번호가 틀립니다.'); " );
		out.println( " history.back(); " );
	} else {
		out.println( " alert('글수정에 실패했습니다.'); " );
		out.println( " history.back(); " );
	}
	out.println( " </script> " );
	
%>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

[출처]

kic캠퍼스

jsp 웹프로그래밍 - 최범균

728x90
반응형
LIST
Comments