레이블이 Enterprise Java 4주차인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Enterprise Java 4주차인 게시물을 표시합니다. 모든 게시물 표시

2013년 7월 19일 금요일

(130719) 20일차 (모델 1 구조, 모델 2 구조, MVC 패턴 설명 및 테스트)

 - 모델 1 구조 
 : 클라이언트 요청을 JSP가 받음














 - 모델 2 구조 
: 클라이언트 요청을 Servlet이 받음 (요청시 JSP 소스가 거의 없음)
















 - MVC 패턴 (모델 2 구조)
 : Model(DAO, DTO - 빈클래스) View(JSP - EL, JSTL) Controller
 : Model - 비즈니스 영역의 상태 정보를 처리한다.
 : View - 비즈니스 영역에 대한 프레젠테이션 뷰(즉, 사용자가 보게 될 결과 화면)를 담당한다.
 : Controller - 사용자의 입력 및 흐름 제어를 담당한다.

 : 비즈니스 로직을 처리하는 모델과 결과 화면을 보여주는 뷰가 분리되어 있다.
 : 어플리케이션의 흐름제어나 사용자의 처리 요청은 컨트롤러에 집중한다.

 : 즉, Model은 오직 비즈니스와 관련된 부분을 처리하면 될 뿐 사용자에게 보여질 화면이나 흐름제어에 대해서는 처리할 필요가 없다.
 : 반대로 View는 사용자에게 알맞은 화면을 보여주는 역할만 수행될 뿐, 비즈니스 로직이나 흐름제어 등을 신경 쓸 필요가 없다.
 : 또한 Controller는 사용자의 요청에 대해서 알맞은 모델을 사용하고, 사용자에게 보여줄 뷰를 선택하기만 하면 된다. (Controller가 비즈니스를 관리 - Controller가 비즈니스를 호출해서 JSP에 잘 넘겨주기만 하면 된다.)

 : Controller(Servlet)을 1개 만들어서 여러개의 요청을 한번에 처리하기 위해서 Controller 안에 if문을 구현한다.
 : 서블릿에서 파일을 읽어온다음 Map 객체(DO 파일, JSP 파일 1쌍)에 저장해놓고 호출하는 방식으로 사용
















 - 사진 출처 : http://ihayatesw.tistory.com/161


 - 모델 2 구조 구현 방법은 프로젝트에서

(130719) 20일차 ConnectionTest.jsp 외 2개 (Connection - pool 설명 및 테스트)

 - Eclipse 줄번호 보여주기








































 - Connection - pool
 : Connection들이 모여있는 곳(서버 측)
 : 다중 사용자가 서버에 접근하는 경우, DB에 접근(로그인)할 때 발생한다.
 : Connection이 많을 때 효율성을 위해서 사용한다.
 : Connection - pool을 사용하면 속도가 빨라지고 자원을 아낄 수 있다.


 - Connection - pool 설정































 - Connection - pool 설정 소스
<Resource
name="jdbc/jsptest"
auth="Container"  type="javax.sql.DataSource"
driverClassName="oracle.jdbc.driver.OracleDriver"
loginTimeout="10" maxWait="5000"
username="system" password="123456"
testOnBorrow="true"
url = "jdbc:oracle:thin:@localhost:1521:XE"
/>


<Resource
name="jdbc/jsptest"
    auth="Container"  type="javax.sql.DataSource"
    driverClassName="oracle.jdbc.driver.OracleDriver"
    loginTimeout="10" maxWait="5000"
    username="system" password="123456"
    testOnBorrow="true"
    url = "jdbc:oracle:thin:@localhost:1521:XE"
/>   
</Context>


 - ConnectionTest.jsp 소스
<%@page import="member.MemberBean"%>
<%@page import="java.util.Vector"%>
<%@page import="member.MemberDao"%>
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<% 
MemberDao d = new MemberDao();
Vector<MemberBean> v = d.getAllMember();
out.println(v.size());
%>
</body>
</html>


 - MemberDao.java 소스
package member;

import java.sql.*;
import java.util.Vector;

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

public class MemberDao {

Connection con;
PreparedStatement pstmt;
ResultSet rs;

// 데이터 베이스에 접근하는 메소드
public void con(){
try {
// 이렇게 하면 서버가 관리하기 때문에 자원반납 과정이 필요 없어짐 - close.con()

// 서버의 환경설정 파일을 읽어드리기 위해서 Context 객체를 생성
Context initctx = new InitialContext();
// jsp 톰캣 서버 환경설정파일을 불러옴
Context envctx = (Context) initctx.lookup("java:comp/env");
// jsp 서버에 설정된 Datasource 객체 이름을 불러옴
DataSource ds = (DataSource) envctx.lookup("jdbc/jsptest");
// 데이터 소스에 이미 url, id, pass, classname이 모두 설정되어있음.
con = ds.getConnection();

} catch (Exception e) {
e.printStackTrace();
}
}

// 멤버 데이터를 저장하는 메소드
public void insertMember(MemberBean mbean){
// 데이터베이스에 접근
this.con();
// 쿼리 준비
String sql = "insert into member values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
try {
// 쿼리를 날리기위한 객체를 선언
pstmt = con.prepareStatement(sql);

// 데이터 입력
pstmt.setString(1, mbean.getId());
pstmt.setString(2, mbean.getPass());
pstmt.setString(3, mbean.getName());
pstmt.setString(4, mbean.getGender());
pstmt.setString(5, mbean.getHobby1());
pstmt.setString(6, mbean.getHobby2());
pstmt.setString(7, mbean.getAddress());
pstmt.setString(8, mbean.getEmail());
pstmt.setString(9, mbean.getPhone1());
pstmt.setString(10, mbean.getPhone2());
pstmt.setString(11, mbean.getPhone3());
pstmt.setString(12, mbean.getIntroduce());

// 쿼리실행
pstmt.executeUpdate();

// 자원을 닫음
pstmt.close();
con.close();

} catch (Exception e) {
e.printStackTrace();
}
}

// 모든 회원에 대한 정보를 가져오는 메소드
public Vector<MemberBean> getAllMember(){
Vector<MemberBean> vector = new Vector<>();
MemberBean bean;
// 커넥션 연결
this.con();
// 쿼리 준비
String sql = "select * from member";
 
try{
// 쿼리 실행
pstmt = con.prepareStatement(sql);
// 쿼리 실행 후 결과를 resultset이 받아줌
rs = pstmt.executeQuery();
// 반복문을 이용하여 데이터를 빈클래스에 담은후에 그 Bean 클래스를 벡터에 저장
while(rs.next()){
bean = new MemberBean();
bean.setId(rs.getString(1));
bean.setPass(rs.getString(2));
bean.setName(rs.getString(3));
bean.setGender(rs.getString(4));
bean.setHobby1(rs.getString(5));
bean.setHobby2(rs.getString(6));
bean.setAddress(rs.getString(7));
bean.setEmail(rs.getString(8));
bean.setPhone1(rs.getString(9));
bean.setPhone2(rs.getString(10));
bean.setPhone3(rs.getString(11));
bean.setIntroduce(rs.getString(12));
// 빈클래스에 담은 데이터를 백터에 추가
vector.add(bean);
}
con.close();
pstmt.close();
rs.close();
 
} catch(Exception e){
e.printStackTrace();
}
return vector;
}

// 선택한 회원에 대한 정보를 가져오는 메소드
public MemberBean getSelectMember(String id){
MemberBean bean = new MemberBean();
// 커넥션 연결
this.con();
// 쿼리 준비
String sql = "select * from member where id = ?";
 
try{
// 쿼리 실행
pstmt = con.prepareStatement(sql);
pstmt.setString(1, id);
 
// 쿼리 실행 후 결과를 resultset이 받아줌
rs = pstmt.executeQuery();
 
rs.next();
bean.setId(rs.getString(1));
bean.setName(rs.getString(3));
bean.setAddress(rs.getString(7));
bean.setEmail(rs.getString(8));
bean.setPhone1(rs.getString(9));
bean.setPhone2(rs.getString(10));
bean.setPhone3(rs.getString(11));
bean.setIntroduce(rs.getString(12));
 
con.close();
pstmt.close();
rs.close();
 
} catch(Exception e){
e.printStackTrace();
}
return bean;
}

// 멤버 데이터를 수정하는 메소드
public void updateMember(String phone1, String phone2, String phone3, String email, String id){
// 데이터베이스에 접근
this.con();
// 쿼리 준비

String sql="update member set phone1 = ?, phone2 = ?, phone3 = ?, email = ?  where id = ?";
try {
// 쿼리를 날리기위한 객체를 선언
pstmt = con.prepareStatement(sql);

pstmt.setString(1, phone1);
pstmt.setString(2, phone2);
pstmt.setString(3, phone3);
pstmt.setString(4, email);
pstmt.setString(5, id);

// 쿼리실행
pstmt.executeUpdate();

// 자원을 닫음
pstmt.close();
con.close();

} catch (Exception e) {
e.printStackTrace();
}
}

// 멤버 데이터를 삭제하는 메소드
public void deleteMember(String id){
// 데이터베이스에 접근
this.con();
// 쿼리 준비

String sql="delete from member where id = ?";
try {
// 쿼리를 날리기위한 객체를 선언
pstmt = con.prepareStatement(sql);

pstmt.setString(1, id);

// 쿼리실행
pstmt.executeUpdate();

// 자원을 닫음
pstmt.close();
con.close();

} catch (Exception e) {
e.printStackTrace();
}
}

}


 - MemberBean.java 소스
package member;

public class MemberBean {
// form 데이터의 name과 똑같은 이름의 멤버변수를 만듬
private String id;
private String pass;
private String name;
private String gender;
private String hobby1;
private String hobby2;
private String address;
private String email;
private String phone1;
private String phone2;
private String phone3;
private String introduce;

public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPass() {
return pass;
}
public void setPass(String pass) {
this.pass = pass;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getHobby1() {
return hobby1;
}
public void setHobby1(String hobby1) {
this.hobby1 = hobby1;
}
public String getHobby2() {
return hobby2;
}
public void setHobby2(String hobby2) {
this.hobby2 = hobby2;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPhone1() {
return phone1;
}
public void setPhone1(String phone1) {
this.phone1 = phone1;
}
public String getPhone2() {
return phone2;
}
public void setPhone2(String phone2) {
this.phone2 = phone2;
}
public String getPhone3() {
return phone3;
}
public void setPhone3(String phone3) {
this.phone3 = phone3;
}
public String getIntroduce() {
return introduce;
}
public void setIntroduce(String introduce) {
this.introduce = introduce;
}
}


 - 결과

2013년 7월 18일 목요일

(130718) 19일차 BoardWrite.jsp 외 4개 (JSP에서 Servlet 호출을 이용한 게시판 예제)

 - BoardWrite.jsp 소스
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<center> <h2> 글 쓰 기 </h2>

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

<table width="500" border="1" cellpadding="5" cellspacing="2">
    <tr>
    <th width="70" align="center" bgcolor="FFFFFFF"> 이 름 </th>
    <td width="330"> <input type="text" name="writer" size="25"> </td>
    </tr>
   
    <tr>
    <th width="70" align="center" bgcolor="FFFFFFF"> 제 목  </th>
    <td width="330"> 
    <input type="text" name="subject" size="25">
    </tr>
   
    <tr>
    <th width="70" align="center" bgcolor="FFFFFFF"> Email </th>
    <td width="330"> <input type="text" name="email" size="25"> </td>
    </tr>

    <tr>
    <th width="70" align="center" bgcolor="FFFFFFF"> 내 용  </th>
    <td width="330"> <textarea name="content" rows="13" cols="40"></textarea> </td>
    </tr>

    <tr>
    <th width="70" align="center" bgcolor="FFFFFFF"> 비밀번호 </th>
    <td width="330"> <input type="password" name="passwd" size="25"> </td>
    </tr>
    </table>
   
    <table width="180" border="0" cellpadding="5">
    <tr>
    <td> <input type="submit" value="쓰기"> </td>
    <td> <input type="reset" value="취소"> </td>
    <td> <input type="button" value="목록" onclick="window.location='BoardList.jsp'"> </td>    
    </tr>
  </table>
  </form> 
</center>
</body>
</html>


 - ServletB.java 소스
package board;

import java.io.IOException;

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("/ServletB")
public class ServletB extends HttpServlet {
private static final long serialVersionUID = 1L;
    

protected void doGet(HttpServletRequest req, HttpServletResponse res) 
throws ServletException, IOException {
jspProcess(req, res);
}

protected void doPost(HttpServletRequest req, HttpServletResponse res) 
throws ServletException, IOException {
jspProcess(req, res);
}

private void jspProcess(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {

res.setCharacterEncoding("euc-kr");
req.setCharacterEncoding("euc-kr");
String writer = req.getParameter("writer");
String passwd = req.getParameter("passwd");
String subject = req.getParameter("subject");
String content = req.getParameter("content");
String email = req.getParameter("email");


// jsp를 호출하여 화면에 출력하시오.
// Request 객체의 데이터를 떠 안고
req.setAttribute("writer", writer);
req.setAttribute("passwd", passwd);
req.setAttribute("subject", subject);
req.setAttribute("content", content);
req.setAttribute("email", email);
RequestDispatcher dispatcher = req.getRequestDispatcher("WriteProc.jsp");
// RequestDispatcher의 WriteProc.jsp로 넘겨줌
dispatcher.forward(req, res);
}
}


 - BoardBean.java 소스
package board;

import java.util.Date;

public class BoardBean {
private int num;
private String writer;
private String passwd;
private String subject;
private String content;
private String email;
private int ref;
private int re_level;
private int re_step;
private Date reg_date;
private int readcount;
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getWriter() {
return writer;
}
public void setWriter(String writer) {
this.writer = writer;
}
public String getPasswd() {
return passwd;
}
public void setPasswd(String passwd) {
this.passwd = passwd;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public int getRef() {
return ref;
}
public void setRef(int ref) {
this.ref = ref;
}
public int getRe_level() {
return re_level;
}
public void setRe_level(int re_level) {
this.re_level = re_level;
}
public int getRe_step() {
return re_step;
}
public void setRe_step(int re_step) {
this.re_step = re_step;
}
public Date getReg_date() {
return reg_date;
}
public void setReg_date(Date reg_date) {
this.reg_date = reg_date;
}
public int getReadcount() {
return readcount;
}
public void setReadcount(int readcount) {
this.readcount = readcount;
}
}


 - BoardDao.java 소스
package board;
import java.sql.*;
import java.util.Vector;

public class BoardDao {

String url="jdbc:oracle:thin:@127.0.0.1:1521:XE";
String id="system";
String pass="123456";
Connection con;
PreparedStatement pstmt;
ResultSet rs;

// 데이터 베이스에 접근하는 메소드 
public void con(){
try {
// 1.어느 데이터 베이스를 사용할건지를 설정 
Class.forName("oracle.jdbc.driver.OracleDriver");
// 2.실제 데이터 베이스에 접근하기위한 소스를 작성 == 접속완료되면 커넥션을 리턴
con = DriverManager.getConnection(url, id, pass); 

} catch(Exception e){
}

// 하나의 게시글을 저장하는 메소드
public void insertBoard(BoardBean bbean){
try {
// 데이터 베이스에 접근
this.con();
// 쿼리준비 (nextval를 이용해서 자동적으로 값을 증가시킴, sysdate를 이용해서 현재 날짜를 입력함)
String sql ="insert into bboard values(board_seq.nextval,?,?,?,?,?,0,0,0,sysdate,0)";
// 쿼리 실행객체 준비
pstmt = con.prepareStatement(sql);
// ?에 데이터 입력
pstmt.setString(1, bbean.getWriter()); 
pstmt.setString(2, bbean.getPasswd());
pstmt.setString(3, bbean.getSubject()); 
pstmt.setString(4, bbean.getContent()); 
pstmt.setString(5, bbean.getEmail()); 
// 쿼리를 실행 하시오
pstmt.executeUpdate();
// 자원 반납
pstmt.close();
con.close();
} catch (Exception e) {
}
}
}


 - WriteProc.jsp 소스
<%@page import="board.BoardDao"%>
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
    <% request.setCharacterEncoding("euc-kr"); %>
    <!-- 빈클래스 생성 -->
    <jsp:useBean id = "bbean" class = "board.BoardBean"></jsp:useBean>
    <!-- 빈클래스에 데이터를 추가 -->
    <jsp:setProperty property = "*" name = "bbean"/>
   
    <!-- 데이터를 추가 -->
    <%
    BoardDao bdao = new BoardDao();

    // 데이터를 추가하는 메소드 호출
    bdao.insertBoard(bbean);
  
    // 데이터를 추가 후 제어권을 BoardListList로 넘겨줌
    response.sendRedirect("BoardList.jsp");
    %>

</body>
</html>


 - BoardList.jsp 소스
<%@page import="java.util.Vector"%>
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<center>
<h2> 게 시 판 목 록 </h2>
<table border = "1" width = "740" cellpadding="1" cellspacing="2">
<tr bgcolor = "FFFFFFF">
  <th width = "50"> 번호 </th>
  <th width = "330"> 제목 </th>
  <th width = "130"> 작성자 </th>
  <th width = "130"> 날짜 </th>
  <th width = "80"> 조회수 </th>
</tr>
 
  <!-- 커넥션 설정 -->
  <sql:setDataSource
  url = "jdbc:oracle:thin:@127.0.0.1:1521:XE"
  driver = "oracle.jdbc.driver.OracleDriver"
  user = "system"
  password = "123456"
  var = "ds"
  />
 
  <!-- 데이터 베이스에서 가져올 쿼리 설정 및 실행 -->
  <sql:query var = "rs" dataSource = "${ds}">
  select num, subject, writer, reg_date, readcount from bboard
  </sql:query>
 
  <!-- rowsByIndex는 해당 개수만큼의 row - 열을 얻어오는 것 -->
  <c:forEach var = "row" items="${rs.rowsByIndex}">
  <tr>
  <!-- 각 해당 열의 col - 행을 출력 -->
  <c:forEach var = "col" items="${row}">
  <td> <c:out value="${col}"/> </td>
  </c:forEach>
</tr>
</c:forEach>
    </table>
</center>
</body>
</html>


 - 결과