Servlet

02일차_Servlet, JSP 연동(모델2방식), 회원관리

알 수 없는 사용자 2015. 6. 22. 23:20

-------------------------------------

Servlet & JSP 연동 (모델2방식)



1. 모델1 방식 (JSP만 이용하는 경우)

- JSP 페이지와 자바빈 클래스로 구성된 모델.

- JSP 페이지의 역할은 클라이언트와의 데이터 송수신 액션을 담당.

- 자바빈 클래스는 데이터베이스와의 데이터 입출력 액션을 담당.


2. 모델2 방식 (Servlet과 JSP가 혼용된 경우)

- JSP 페이지와 Servlet, 자바빈 클래스로 구성된 모델.

- Servlet은 클라이언트와의 데이터 송수신 액션을 담당. 데이터베이스 액션. 결과를 JSP 페이지로 전달해서 결과 출력.

- JSP 페이지는  받은 결과를 출력하는 액션.

- 자바빈은 Servlet로부터 JSP페이지로 결과를 전달하는 과정에서 결과 저장용 객체 역할.

- MVC 패턴이라고도 한다.


3. 모델2방식 샘플 작성

//Sample01.java -> 서블릿 클래스

package com.test;


import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;


/* 메인 페이지(web.xml의 서블릿 주소 이용해서 요청할 것) */

public class Sample01 extends HttpServlet {


private static final long serialVersionUID = 1L;


@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp)

throws ServletException, IOException {

//사용자 정의 메소드 호출 부분 추가

doGetPost(req, resp);

}


@Override

protected void doPost(HttpServletRequest req, HttpServletResponse resp)

throws ServletException, IOException {

//사용자 정의 메소드 호출 부분 추가

doGetPost(req, resp);

}

//사용자 정의 메소드 (doGet, doPost 메소드에 대한 통합 액션)

private void doGetPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

String msg = "Hello, Model2 World!";

//출력 액션->JSP 페이지 담당

//msg 변수의 데이터를 JSP 페이지로 전송하는 과정 필요

//->변수의 데이터를 자바빈 객체에 저장

//->forward() 메소드

request.setAttribute("msg", msg);

RequestDispatcher dispatcher = request.getRequestDispatcher("Sample01.jsp");

dispatcher.forward(request, response);

}


}






//Sample01.jsp

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

    pageEncoding="UTF-8"%>

<%-- 출력 액션 담당 (직접 요청하지 말 것) --%>    

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>    

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>Insert title here</title>

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>


</head>

<body>

<div>

<%-- 데이터 수신 과정 필요+메시지 출력 부분 추가 --%>

${msg}

</div>

</body>

</html>



//web.xml

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">

 

  <!-- 서블릿 주소 등록 -->

  <servlet>

  <servlet-name>sample01</servlet-name>

  <servlet-class>com.test.Sample01</servlet-class>

  </servlet>

  <servlet-mapping>

  <servlet-name>sample01</servlet-name>

  <url-pattern>/Sample01</url-pattern>

  </servlet-mapping>

 

</web-app>





//요청주소 (JSP 페이지 요청하지 않는다. 서블릿 주소로 요청한다)

http://localhost:8090/Servlet_20141219/Sample01



-----------------------------------------------------

문제) 구구단 중에서 5단 출력(Model2 방식)


5 * 1 = 5

5 * 2 = 10

...

5 * 9 = 45



//Sample02.java -> 서블릿 클래스. 출력을 제외한 나머지 모든 액션 담당.

package com.test;


import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;


/* 메인 페이지(web.xml의 서블릿 주소 이용해서 요청할 것) */

public class Sample02 extends HttpServlet {


private static final long serialVersionUID = 1L;


@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp)

throws ServletException, IOException {

//사용자 정의 메소드 호출 부분 추가

doGetPost(req, resp);

}


@Override

protected void doPost(HttpServletRequest req, HttpServletResponse resp)

throws ServletException, IOException {

//사용자 정의 메소드 호출 부분 추가

doGetPost(req, resp);

}

//사용자 정의 메소드 (doGet, doPost 메소드에 대한 통합 액션)

private void doGetPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

StringBuilder sb = new StringBuilder();

int gugudan = 5;

for (int i=1; i<=9; i++) {

sb.append(String.format("%d * %d = %d <br>%n"

, gugudan, i, (gugudan*i)));

}

System.out.println(sb.toString());

//출력 액션->JSP 페이지 담당

//sb 변수의 데이터를 JSP 페이지로 전송하는 과정 필요

//->변수의 데이터를 자바빈 객체에 저장

//->forward() 메소드

request.setAttribute("sb", sb);

RequestDispatcher dispatcher = request.getRequestDispatcher("Sample02.jsp");

dispatcher.forward(request, response);

}


}







//Sample02.jsp -> JSP 페이지. 출력 액션 담당.

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

    pageEncoding="UTF-8"%>

<%-- 출력 액션 담당 (직접 요청하지 말 것) --%>       

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>    

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>Insert title here</title>

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>


</head>

<body>

<div>

<%-- 데이터 수신 과정 필요+메시지 출력 부분 추가 --%>

${sb}

</div>

</body>

</html>






//web.xml -> 서블릿 주소 등록

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">

  <display-name>SampleProject</display-name>

  <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>서블릿식별자</servlet-name>

  <servlet-class>패키지이름.클래스이름</servlet-class>

  </servlet>

  <servlet-mapping>

  <servlet-name>서블릿식별자</servlet-name>

  <url-pattern>/사용자요청주소</url-pattern>

  </servlet-mapping>

  -->  

  

  <servlet>

  <servlet-name>sample02</servlet-name>

  <servlet-class>com.test.Sample02</servlet-class>

  </servlet>

  <servlet-mapping>

  <servlet-name>sample02</servlet-name>

  <url-pattern>/Sample02</url-pattern>

  </servlet-mapping>



</web-app>





//요청주소 (JSP 페이지 요청하지 않는다. 서블릿 주소로 요청한다)

http://localhost:8090/Servlet_20141219/Sample02





--------------------------------------

데이터 송수신 테스트(Model2 방식)



1. 클라이언트가 작성한 데이터를 서버로 전송하고, Servlet 프로그램을 통해서 수신하는 과정.


2. POST, GET 방식 전송 방법중 하나를 선택.


POST 방식 전송인 경우 form 태그에서 method="" 속성을 post로 지정.

다량의 데이터 전송시 사용.

한글 데이터 전송시 이 방법을 사용해야 올바르게 전송 및 수신할 수 있다.

<form action="서블릿주소" method="post">

<!--회원가입 항목 준비-->

<input type="text" name="식별자">

<input type="submit" value="회원가입">

</form>




action="" 속성에서 서블릿주소를 아래와 같은 방법으로 기입.

상대 URL -> 현재 서블릿주소를 기준으로 상대적 위치를 표시하고 요청 주소를 적는 것.

예를 들어,

현재 서블릿주소와 요청 주소 페이지가 같은 디렉토리에 존재한다면

action="서블릿주소"



name="식별자" 속성은 서버에서 데이터 수신시 식별자로 사용한다. 

예를 들어,

String 변수 = request.getParameter("식별자");


<input type="submit"> 클라이언트가 입력한 데이터를 서버로 전송하는 액션 전용 버튼. 대체 수단으로 Javascript에서 submit() 메소드를 이용할 수 있다.



GET 방식 전송인 경우 a 태그에서 href="" 속성에 요청 주소 작성시

"서블릿주소?식별자=데이터&식별자=데이터 ..." 형식으로 작성.

? 이후 문자열에는 특수문자나, 공백등을 삽입하면 수신하는 과정에서 인식 불가.

예를 들어,

<a href="http://news.naver.com/main/read.nhn?mode=LSD&mid=shm&sid1=105&oid=001&aid=0006938838">네이버 뉴스 페이지</a>


GET 방식으로 전송된 데이터를 서버에서 데이터 수신시 식별자를 사용한다. 

예를 들어,

String 변수 = request.getParameter("식별자");



3. 서블릿 페이지에서 데이터를 수신하려면 doGet(), doPost() 메소드에서 지정한 HttpServletRequest 객체를 사용.


protected void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

String 변수 = request.getParameter("식별자");

}



protected void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

String 변수 = request.getParameter("식별자");

}


4. 프로그램 구성

-----------------------------------------

이름 전송 및 수신 테스트(Model2 이용)


//YourName.java -> 서블릿 클래스. 요청 액션 처리.

//YourName.jsp -> JSP 페이지. 입력 폼 구성.


//Hi.java -> 서블릿 클래스. 요청 액션, 데이터 수신 액션 처리.

//Hi.jsp -> JSP 페이지. 결과 출력 페이지.


//web.xml -> 서블릿 주소 등록


//요청주소 (JSP 페이지 요청하지 않는다. 서블릿 주소로 요청한다)

http://localhost:8090/Servlet_20141219/YourName


5. 프로그램 소스 코드

//YourName.java -> 서블릿 클래스. 요청 액션 처리.

package com.test;


import java.io.*;


import javax.servlet.*;

import javax.servlet.http.*;


/* 메인 페이지(web.xml의 서블릿 주소 이용해서 요청할 것) */

public class YourName extends HttpServlet {


private static final long serialVersionUID = 1L;


@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp)

throws ServletException, IOException {

//사용자 정의 메소드 호출 부분 추가

doGetPost(req, resp);

}


@Override

protected void doPost(HttpServletRequest req, HttpServletResponse resp)

throws ServletException, IOException {

//사용자 정의 메소드 호출 부분 추가

doGetPost(req, resp);

}

//사용자 정의 메소드 (doGet, doPost 메소드에 대한 통합 액션)

private void doGetPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

//YourName.jsp 페이지 연결

RequestDispatcher dispatcher = request.getRequestDispatcher("YourName.jsp");

dispatcher.forward(request, response);

}


}







//YourName.jsp -> JSP 페이지. 입력 폼 구성.

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

    pageEncoding="UTF-8"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>    

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>Insert title here</title>

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>


</head>

<body>

<div>

<form action="Hi" method="post">

이름 <input type="text" name="yourName">

<input type="submit">

</form>

</div>

</body>

</html>






//Hi.java -> 서블릿 클래스. 요청 액션, 데이터 수신 액션 처리.

package com.test;


import java.io.*;


import javax.servlet.*;

import javax.servlet.http.*;


public class Hi extends HttpServlet {


private static final long serialVersionUID = 1L;


@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp)

throws ServletException, IOException {

//사용자 정의 메소드 호출 부분 추가

doGetPost(req, resp);

}


@Override

protected void doPost(HttpServletRequest req, HttpServletResponse resp)

throws ServletException, IOException {

//사용자 정의 메소드 호출 부분 추가

doGetPost(req, resp);

}

//사용자 정의 메소드 (doGet, doPost 메소드에 대한 통합 액션)

private void doGetPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

//데이터 수신(한글 인코딩)

request.setCharacterEncoding("UTF-8");

String yourName = request.getParameter("yourName");

//Hi.jsp 페이지 연결

request.setAttribute("yourName", yourName);

RequestDispatcher dispatcher = request.getRequestDispatcher("Hi.jsp");

dispatcher.forward(request, response);

}


}





//Hi.jsp -> JSP 페이지. 결과 출력 페이지.

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

    pageEncoding="UTF-8"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>    

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>Insert title here</title>

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>


</head>

<body>

<div>

안녕하세요, ${yourName}님!

</div>

</body>

</html>






//web.xml -> 서블릿 주소 등록

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">

  <display-name>SampleProject</display-name>

  <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>서블릿식별자</servlet-name>

  <servlet-class>패키지이름.클래스이름</servlet-class>

  </servlet>

  <servlet-mapping>

  <servlet-name>서블릿식별자</servlet-name>

  <url-pattern>/사용자요청주소</url-pattern>

  </servlet-mapping>

  -->  

  

  <servlet>

  <servlet-name>yourName</servlet-name>

  <servlet-class>com.test.YourName</servlet-class>

  </servlet>

  <servlet-mapping>

  <servlet-name>yourName</servlet-name>

  <url-pattern>/YourName</url-pattern>

  </servlet-mapping>


  <servlet>

  <servlet-name>hi</servlet-name>

  <servlet-class>com.test.Hi</servlet-class>

  </servlet>

  <servlet-mapping>

  <servlet-name>hi</servlet-name>

  <url-pattern>/Hi</url-pattern>

  </servlet-mapping>



</web-app>




//요청주소 (JSP 페이지 요청하지 않는다. 서블릿 주소로 요청한다)

http://localhost:8090/Servlet_20141219/YourName










---------------------------------------------------

Servlet에서의 오라클 연동 테스트 (Model2 이용)

- ojdbc6.jar 파일 WebContent>WEB-INF>lib 폴더 하위에 복사할 것.



//DBConn.java

package com.test;


import java.sql.*;


public class DBConn {


//Connection(데이터베이스 연결) 객체 저장용 변수 선언

private static Connection conn = null;

//1. 데이터베이스 연결 과정

public static Connection getConn() 

throws ClassNotFoundException, SQLException {


//Connection 객체가 생성되지 않은 경우에만

//신규 객체를 생성한다. -> SingleTone

if (conn == null) {

//데이터베이스 연결 액션(로그인 과정)

Class.forName("oracle.jdbc.driver.OracleDriver");

String url = "jdbc:oracle:thin:아이디/패스워드@211.63.89.XX:1521:xe";

conn = DriverManager.getConnection(url);

}

return conn;

}

//2. 데이터베이스 연결 종료 과정

public static void close() throws SQLException {

if (conn != null) {

conn.close();

}

conn = null; //멤버변수를 NULL 값으로 초기화

}

}






//DAOTest.java -> 서블릿 클래스. 데이터베이스 연결 액션.

package com.test;


import java.io.*;


import javax.servlet.*;

import javax.servlet.http.*;


import java.sql.*;


/* 메인 페이지(web.xml의 서블릿 주소 이용해서 요청할 것) */

public class DAOTest extends HttpServlet {


private static final long serialVersionUID = 1L;


@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp)

throws ServletException, IOException {

//사용자 정의 메소드 호출 부분 추가

doGetPost(req, resp);

}


@Override

protected void doPost(HttpServletRequest req, HttpServletResponse resp)

throws ServletException, IOException {

//사용자 정의 메소드 호출 부분 추가

doGetPost(req, resp);

}

//사용자 정의 메소드 (doGet, doPost 메소드에 대한 통합 액션)

private void doGetPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

Connection conn = null;

PreparedStatement pstmt = null;

try {

//Connection 객체 얻는 방법

conn = DBConn.getConn();

if (conn != null) {

System.out.println("오라클 연결 성공!");

}

} catch (ClassNotFoundException e) {

e.printStackTrace();

} catch (SQLException e) {

e.printStackTrace();

}finally {

   try{

    if (pstmt != null) {

    pstmt.close();

    }

//연결 종료시 conn.close(); 사용하면 안됨. 

DBConn.close();

   }catch(SQLException se){

      se.printStackTrace();

   }

}

//DAOTest.jsp 페이지 연결

RequestDispatcher dispatcher = request.getRequestDispatcher("DAOTest.jsp");

dispatcher.forward(request, response);

}


}





//DAOTest.jsp -> JSP 페이지. 결과 출력.

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

    pageEncoding="UTF-8"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>    

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>Insert title here</title>

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>


</head>

<body>

<div>

오라클 연결 테스트!

</div>

</body>

</html>





//web.xml -> 서블릿 주소 등록.

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">

  <display-name>SampleProject</display-name>

  <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>서블릿식별자</servlet-name>

  <servlet-class>패키지이름.클래스이름</servlet-class>

  </servlet>

  <servlet-mapping>

  <servlet-name>서블릿식별자</servlet-name>

  <url-pattern>/사용자요청주소</url-pattern>

  </servlet-mapping>

  -->  

 

  <servlet>

  <servlet-name>daoTest</servlet-name>

  <servlet-class>com.test.DAOTest</servlet-class>

  </servlet>

  <servlet-mapping>

  <servlet-name>daoTest</servlet-name>

  <url-pattern>/DAOTest</url-pattern>

  </servlet-mapping>


</web-app>




//요청주소 (JSP 페이지 요청하지 않는다. 서블릿 주소로 요청한다)

http://localhost:8090/Servlet_20141219/DAOTest








---------------------------------------------

회원관리 Servlet(JDBC) 프로그램(4)

-> Model2 방식 (MVC 패턴)

-> 자료형 클래스(자바빈) 및 데이터베이스 액션, 서블릿 클래스, JSP 페이지, web.xml


1. 기능 구현

- 이름, 전화번호 입력 받아서 데이터베이스 저장

- 이름, 전화번호를 데이터베이스에서 읽어내서 화면에 출력


2. 데이터베이스 준비

--테이블 생성

CREATE TABLE memberList (

mid NUMBER  --PK

,name NVARCHAR2(30) --한글 저장 

,telephone VARCHAR2(30)

);


--제약 조건 추가

ALTER TABLE 테이블이름

ADD CONSTRAINT 제약이름 제약종류(제약대상);

ALTER TABLE 테이블이름

DROP CONSTRAINT 제약이름;


ALTER TABLE memberList

ADD CONSTRAINT memberList_mid_pk PRIMARY KEY(mid);


CREATE SEQUENCE memberListSeq;


--입력 샘플 쿼리 (프로그램에서 사용 예정)

INSERT INTO memberList (mid, name, telephone) VALUES (memberListSeq.nextval, 'kim', '010-123-1234');

COMMIT;


--권장하지 않는 표현. 컬럼 리스트에서 * 사용하지 않는다.

SELECT * FROM memberList; 


--전체 명단 출력 쿼리 (프로그램에서 사용 예정)

--권장하는 표현

SELECT mid, name, telephone FROM memberList ORDER BY mid; 


--인원수 출력 쿼리 (프로그램에서 사용 예정)

--함수 사용시 반드시 별칭 사용.

SELECT COUNT(mid) AS count FROM memberList; 



3. 화면 구성

-----------------------------------------------------------

[회원 관리]


이름 : hong             -> <input type="text">

전화 : 010-123-1234     -> <input type="text">

회원추가버튼                -> <input type="submit">


전체 인원수 : 2명              -> <p> ... </p>

----------------------------   -> <table>...</table>

번호 이름 전화

1   hong   010-123-1234

2   kim    010-222-2222

----------------------------



4. 프로그램 구성

//DBConn.java

//Member.java -> 자료형 클래스

//MemberDAO.java -> 데이터베이스 액션 처리. 메소드 단위로 액션 처리.


//MemberMain.java -> 서블릿 클래스. 메인 페이지. forward() 메소드 -> JSP 페이지

//MemberMain.jsp -> 회원 명단 출력. 회원 추가 폼 화면. 출력 액션.


//MemberInsert.java -> 서블릿 클래스. 회원 추가 액션. sendRedirect() 메소드 -> 서블릿 주소.


//web.xml -> 서블릿 주소 등록


//요청주소 (JSP 페이지 요청하지 않는다. 서블릿 주소로 요청한다)

http://localhost:8090/프로젝트이름/MemberMain



5. 프로그램 소스 코드

//DBConn.java

package com.test;


import java.sql.*;


public class DBConn {


//Connection(데이터베이스 연결) 객체 저장용 변수 선언

private static Connection conn = null;

//1. 데이터베이스 연결 과정

public static Connection getConn() 

throws ClassNotFoundException, SQLException {


//Connection 객체가 생성되지 않은 경우에만

//신규 객체를 생성한다. -> SingleTone

if (conn == null) {

//데이터베이스 연결 액션(로그인 과정)

Class.forName("oracle.jdbc.driver.OracleDriver");

String url = "jdbc:oracle:thin:아이디/패스워드@211.63.89.XX:1521:xe";

conn = DriverManager.getConnection(url);

}

return conn;

}

//2. 데이터베이스 연결 종료 과정

public static void close() throws SQLException {

if (conn != null) {

conn.close();

}

conn = null; //멤버변수를 NULL 값으로 초기화

}

}







//Member.java -> 자료형 클래스

package com.test;


public class Member {

private int mid;

private String name, telephone;


public int getMid() {

return mid;

}

public void setMid(int mid) {

this.mid = mid;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getTelephone() {

return telephone;

}

public void setTelephone(String telephone) {

this.telephone = telephone;

}


}







//MemberDAO.java -> 데이터베이스 액션 처리. 메소드 단위로 액션 처리.

package com.test;


import java.sql.*;

import java.util.*;


//데이터베이스 액션 클래스

public class MemberDAO {


public int count() {

int result = 0;

Connection conn = null;

PreparedStatement pstmt = null;

try {

conn = DBConn.getConnection();

String sql = String.format("SELECT COUNT(*) AS \"count\" FROM memberList");

pstmt = conn.prepareStatement(sql);

ResultSet rs = pstmt.executeQuery();

while(rs.next()) {

result = rs.getInt("count");

}

rs.close();

}catch(Exception e){

e.printStackTrace();

}finally{

try {

if (pstmt != null) {

pstmt.close();

}

}catch(Exception e){

}

DBConn.close();

}

return result;

}

public ArrayList<Member> list() {

ArrayList<Member> result = new ArrayList<Member>();

Connection conn = null;

PreparedStatement pstmt = null;

try {


conn = DBConn.getConnection();

String sql = "SELECT mid, name, telephone FROM memberList ORDER BY mid";

pstmt = conn.prepareStatement(sql);

ResultSet rs = pstmt.executeQuery();

while(rs.next()) {

String mid = rs.getString("mid");

String name = rs.getString("name");

String telephone = rs.getString("telephone");

Member member = new Member();

member.setMid(mid);

member.setName(name);

member.setTelephone(telephone);

result.add(member);

}

rs.close();

}catch(Exception e){

e.printStackTrace();

}finally{

try {

if (pstmt != null) {

pstmt.close();

}

}catch(Exception e){

}

DBConn.close();

}

return result;

}

public int add(Member member) {

int result = 0;


Connection conn = null;

PreparedStatement pstmt = null;

try {


conn = DBConn.getConnection();

String sql = "INSERT INTO memberList (mid, name, telephone) VALUES (memberListSeq.nextval, ?, ?)";

pstmt = conn.prepareStatement(sql);

pstmt.setString(1, member.getName());

pstmt.setString(2, member.getTelephone());

result = pstmt.executeUpdate();

}catch(Exception e){

e.printStackTrace();

}finally{

try {

if (pstmt != null) {

pstmt.close();

}

}catch(Exception e){

}

DBConn.close();

}

return result;

}

}







//MemberMain.java

package com.test;


import java.util.*;


import java.io.IOException;


import javax.servlet.*;

import javax.servlet.http.*;


public class MemberMain extends HttpServlet {


private static final long serialVersionUID = 1L;


@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp)

throws ServletException, IOException {

doGetPost(req, resp);

}


@Override

protected void doPost(HttpServletRequest req, HttpServletResponse resp)

throws ServletException, IOException {

doGetPost(req, resp);

}

private void doGetPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

//사용자 요청은 먼저 서블릿을 요청한다.

//서블릿은 내부적으로 MemberMain.jsp 페이지 연결


//데이터베이스 액션 -> count(), list() 메소드 호출

MemberDAO dao = new MemberDAO();

int count = dao.count();

ArrayList<Member> list = dao.list();

//데이터 전달 및 JSP 페이지 연결

request.setAttribute("count", count);

request.setAttribute("list", list);

RequestDispatcher dispatcher 

= request.getRequestDispatcher("MemberMain.jsp");

dispatcher.forward(request, response);

}

}






//MemberMain.jsp

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

    pageEncoding="UTF-8"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>    

<%-- 

서블릿 Model2 방식 사용시 

JSP 페이지에서 스크립트릿 표현(액션 처리) 사용 금지

--%>   

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>Insert title here</title>


<link rel="stylesheet" type="text/css" href="TableStyle.css">

<link rel="stylesheet" type="text/css" href="DivStyle.css">


<script type="text/javascript">


//Javascript 버전

/* 

window.onload=function() {


var myForm = document.getElementById("myForm");

var name = document.getElementById("name");

var telephone = document.getElementById("telephone");

var errorMsg = document.getElementById("errorMsg");

document.getElementById("myForm").onsubmit=function(){

//서브밋 액션을 계속 하거나(return true;), 중단(return false;)하는 것을 선택할 수 있다.

if(name.value == ""){

errorMsg.innerHTML = "이름을 입력하시오.";

return false;

}

if(name.value.length > 30){

errorMsg.innerHTML = "이름을 30자 이내로 입력하시오.";

return false;

}

if(telephone.value.length > 30){

errorMsg.innerHTML = "전화번호를 30자 이내로 입력하시오.";

return false;   

}

return true;

};

};

*/


//문제) jQuery 버전 작성



</script>


</head>

<body>

<div>

<h1>회원 관리</h1>

<h2>[입력]</h2>


<!-- 요청 주소는 서블릿 형태의 주소 사용. .jsp 사용 금지 -->

<form action="MemberInsert"  method="post" id="myForm">

이름(30자 이내)* <input type="text" name="name" id="name">

전화번호(30자 이내) <input type="text" name="telephone" id="telephone">

<input type="submit" value="회원 추가">

<span id="errorMsg" style="color:red;"></span>

</form>

<h2>[출력]</h2>

<!-- <p>인원수 :  1 명</p> -->

<%-- 

서블릿 Model2 방식 사용시

결과 출력은 EL, JSTL 표기 사용

--%>

<p>인원수 :  ${count} 명</p>

<table id="t01">

<tr>

<th>번호</th><th>이름</th><th>전화번호</th>

</tr>

<!-- 

<tr>

<td>1</td><td>hong</td><td>010-123-1234</td>

</tr>

-->

<%-- 컬렉션 데이터 수신하는 경우

반복문 지정 필요. JSTL 표기 사용.  --%>

<%-- items="" 속성에 컬렉션 데이터가 들어있는 식별자 추가 --%>

<%-- var="" 속성에 임시 변수 지정 --%>

<%-- 임시 변수에 컬렉션의 개별 데이터 저장되면

하위 항목을 . 연산자로 접근 --%>

<%-- 하위 항목은 자료형 클래스의 멤버변수 이름 사용 --%>

<c:forEach var="m" items="${list}">

<tr>

<td>${m.mid}</td>

<td>${m.name}</td>

<td>${m.telephone}</td>

</tr>

</c:forEach>

</table>

</div>

</body>

</html>





//MemberInsert.java

package com.test;


import java.io.IOException;


import javax.servlet.*;

import javax.servlet.http.*;


public class MemberInsert extends HttpServlet {


private static final long serialVersionUID = 1L;


@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp)

throws ServletException, IOException {

doGetPost(req, resp);

}


@Override

protected void doPost(HttpServletRequest req, HttpServletResponse resp)

throws ServletException, IOException {

doGetPost(req, resp);

}

private void doGetPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

//문제) 회원 입력 액션 추가

//데이터 수신(한글 인코딩 추가)

//데이터베이스 액션-> MemberDAO 클래스 담당


//강제 페이지 전환 

//-> sendRedirect() 메소드 호출

//-> 요청 주소 지정시 서블릿 형태의 주소 사용

//-> 요청 주소 지정시 .jsp 확장자 사용 금지


}


}








//web.xml -> 서블릿 주소 등록

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">

  <display-name>Temp</display-name>

  <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></servlet-name>

<servlet-class></servlet-class>

</servlet>  

<servlet-mapping>

<servlet-name></servlet-name>

<url-pattern></url-pattern>

</servlet-mapping>

 -->

  <servlet>

<servlet-name>memberMain</servlet-name>

<servlet-class>com.test.MemberMain</servlet-class>

</servlet>  

<servlet-mapping>

<servlet-name>memberMain</servlet-name>

<url-pattern>/MemberMain</url-pattern>

</servlet-mapping>



<!-- 문제) 서블릿 주소 등록 (MemberInsert) -->




   

</web-app>




//요청주소 (JSP 페이지 요청하지 않는다. 서블릿 주소로 요청한다)

http://localhost:8090/프로젝트이름/MemberMain



-------------------------------------------