-------------------------------------
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
-------------------------------------------
'Servlet' 카테고리의 다른 글
01일차_서블릿 개요, 데이터 송수신, 오라클 연결 테스트 (0) | 2015.06.22 |
---|