memberlist.action ->Spring 컨테이너 web.xml
->*.action -> dispatcher-servlet.xml
->/memberlist.action -> memberlistController
->DB접근 & MID,이름,전화번호 .addObject
->MEmberList.jsp ->우리눈앞에는 DB에있던 데이터가 보일거고
입력시 memberinsert.action 으로 이동 -> Spring 컨테이너 web.xml -> .action -> dispatcher-servlet.xml -> /memberinsert.action -> memberinsertController-> dao.add(MID,이름,전화번호)를 통해 DB에 접근 및 입력 -> .view("redirect:memberlist.action") ->memberlist.action ->Spring 컨테이너 web.xml
->.action -> dispatcher-servlet.xml
->/memberlist.action -> memberlistController
->DB접근 & MID,이름,전화번호 .addObject
->MEmberList.jsp ->우리눈앞에는 DB에있던 데이터가 보일거고
DTO클래스 정의
package com.test.mvc;
public class MemberDTO
{
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;
}
}
package com.test.mvc;
import java.sql.SQLException;
import java.util.ArrayList;
public interface IMemberDAO
{
public ArrayList<MemberDTO> list() throws SQLException ;
public int add(MemberDTO member) throws SQLException;
public int count() throws SQLException;
}
/*=============================
MemberDAO.java
-데이터 액션 처리 클래스
- IMemberDAO 인터페이스를 implements 하는 클래스
→ IMemberDAO 인터페이스에 선언된 메소드 재정의.
- Connection 객체에 대한 의존성 주입을 위한 준비
→setter injection
① 인터페이스 형태의 데이터타입을 취하는 멤버 구성(변수 선언)
② setter 구성 (setter 메소드 정의)
88888888888888888888888888888888*/
package com.test.mvc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import javax.sql.DataSource;
public class MemberDAO implements IMemberDAO
{
// 우리는 여기서 쿼리문 필요 → 작업객체 필요
//→ 작업객체는 Connection 통해서 생성 가능 but 지금 Connection 없음
// spring이 쓰는 Connection 쓸것이다. (dataSource)
// 어떤 계정 정보, 어떤 ip 등의 정보는 dataSource bean 등록하는 과정에서
// 속성값으로 xml 에서 넘겨주게 될 것이다.
// 그러면 그걸 spring container 에서 주입받아서 connection 이루어 질 것이고
// 그걸로 작업객체 생성하고, 그 작업객체 통해서 쿼리문 수행할 것이다.
//※ Connection 객체에 대한 의존성 주입을 위한 준비
//① 인터페이스 형태의 데이터타입
private DataSource datasource;
public void setDatasource(DataSource datasource)
{
this.datasource = datasource;
}
@Override
public ArrayList<MemberDTO> list() throws SQLException
{
// 커넥션 객체
Connection dbconn = datasource.getConnection();
ArrayList<MemberDTO> result = new ArrayList<MemberDTO>();
String sql = "SELECT MID, NAME, TELEPHONE FROM TBL_MEMBERLIST ORDER BY MID";
PreparedStatement pstmt = dbconn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();
while (rs.next())
{
MemberDTO dto = new MemberDTO();
dto.setMid(rs.getInt("MID"));
dto.setName(rs.getString("NAME"));
dto.setTelephone(rs.getString("TELEPHONE"));
result.add(dto);
}
rs.close();
pstmt.close();
dbconn.close();
return result;
}
@Override
public int add(MemberDTO member) throws SQLException
{
Connection dbconn = datasource.getConnection();
int result = 0;
String sql="INSERT INTO TBL_MEMBERLIST(MID, NAME, TELEPHONE) VALUES(MEMBERLISTSEQ.NEXTVAL, ? , ?)";
PreparedStatement pstmt = dbconn.prepareStatement(sql);
pstmt.setString(1, member.getName());
pstmt.setString(2, member.getTelephone());
result = pstmt.executeUpdate();
pstmt.close();
dbconn.close();
return result;
}
@Override
public int count() throws SQLException
{
int result =0;
Connection dbconn = datasource.getConnection();
//sql 작성
String sql="SELECT COUNT(*) AS COUNT FROM TBL_MEMBERLIST";
//작업객체 생성
Statement stmt = dbconn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
if(rs.next())
{
result = rs.getInt("COUNT");
}
rs.close();
stmt.close();
dbconn.close();
return result;
}
}
/*
MemberListController.java
- 사용자 정의 컨트롤러 클래스
- 회원들의 목록(리스트) 출력 액션.
- DAO 객체에 대한 의존성 주입을 위한 준비.
→setter injection
① 인터페이스 형태의 자료형
② setter구성
*/
package com.test.mvc;
import java.util.ArrayList;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
public class MemberListController implements Controller
{
// 인터페이스 자료형을 취하는 속성 구성
private IMemberDAO dao;
// setter 메소드 구성
public void setDao(IMemberDAO dao)
{
this.dao = dao;
}
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception
{
// 액션 코드
ModelAndView mav = new ModelAndView();
int count = 0;
ArrayList<MemberDTO> memberList = new ArrayList<MemberDTO>();
try
{
count = dao.count();
memberList = dao.list();
} catch (Exception e)
{
System.out.println(e.toString());
}
mav.setViewName("/WEB-INF/view/MemberList.jsp");
mav.addObject("count", count); //"count"라는 이름으로 count를 넘겨줄게
mav.addObject("memberList", memberList); //"memberList"라는 이름으로 memberList를 넘겨줄게
return mav;
}
}
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
request.setCharacterEncoding("UTF-8");
String cp = request.getContextPath();
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MemberList.jsp</title>
<link rel="stylesheet" type="text/css" href="<%=cp %>/css/main.css">
<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>
<script type="text/javascript">
$(function()
{
$("#submitBtn").click(function()
{
//alert("버튼");
$("#error").css("display","none");
if($("#name").val()=="" || $("#telephone").val()=="")
{
$("#error").css("display","inline");
return;
}
$("#memberForm").submit();
});
});
</script>
</head>
<body>
<div>
<h1>회원 관리(MemberList.jsp)</h1>
<hr>
</div>
<div>
<form id="memberForm" action="memberinsert.action" method="post">
이름 : <input type="text" name="name" id="name" class="control txt"><br>
전화 : <input type="text" name="telephone" id="telephone" class="control txt">
<br>
<button type="button" id="submitBtn" class="btn">회원 추가</button><br>
<span id="error">모든 항목을 입력해야 합니다.</span>
</form>
<br><br>
<p>전체 인원 수 : ${count }명</p>
<table id="customers" style="width: 500px;" class="table">
<tr>
<th>번호</th> <th>이름</th> <th>전화번호</th>
</tr>
<!-- EL, JSTL 표현에 의한 회원 리스트 출력 부분 -->
<c:forEach var = "member" items="${memberList }">
<tr>
<%-- MemberDTO 객체의 getMid() - getTelephone() 메소드 호출할 수 있는 EL 표현 활용 부분 --%>
<td>${member.mid }</td>
<td>${member.name }</td>
<td>${member.telephone }</td>
</tr>
</c:forEach>
</table>
</div>
</body>
</html>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:component-scan
base-package="org.springframework.samples.petclinic.web" />
<!-- ※ 『dispatcher-servlet.xml』 의 기본 샘플코드 -->
<!-- 이코드는 기본설정에 대한 템블릿을 복사하기 위해 스프링 doc를 참조하여 작성한다. -->
<!-- ① 『C:\Downloads\s-f-3.0.2-with-docs\spring-framework-3.0.2.RELEASE\docs\spring-framework-reference\htmlsingle』경로로 이동-->
<!-- ②『spring-framework-reference.html』파일 실행-->
<!-- ③pdf의 경우 본문페이지 425페이지 찾아서 이동 450/ 805 페이지로 이동-->
<!-- ④ 페이지 하단의 XML 파일 샘플코드 복사 & 붙여넣기 -->
<!-- ※ 사용자 정의 Controller 객체 등록 및 요청 URL 매핑 주소 등록 -->
<!-- URL 매핑하려면 bean의 name 속성 -->
<!-- SimpleDriverDataSource -->
<bean id="localDataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
<property name="driverClass" value="oracle.jdbc.driver.OracleDriver"></property>
<property name="url" value="jdbc:oracle:thin:@----------:1521:xe"></property>
<property name="username" value="scott"></property>
<property name="password" value="tiger"></property>
</bean>
<!-- MemberDAO -->
<bean id="memberDAO" class="com.test.mvc.MemberDAO">
<property name="datasource">
<ref bean="localDataSource"/>
</property>
</bean>
<!-- MemberListController -->
<bean name="/memberlist.action" class="com.test.mvc.MemberListController">
<property name="dao">
<ref bean="memberDAO"/>
</property>
</bean>
</beans>
현재 의존 관계 Controller > DAO > Connection
SimpleDriverDataSource : DAO 에서 필요한 Connection 객체
/*=================================
MemberInsertController.java
- 사용자 정의 컨트롤러 클래스
- 회원 데이터 추가 액션 처리 클래스
- DAO 객체에 대한 의존성 주입을 위한 준비.
→ setter injection
① 인터페이스 형태의 자료형 구성
② setter 구성
==================================*/
package com.test.mvc;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
//※ Spring 이 제공하는 『Controller』 인터페이스를 구현함으로써
// 사용자 정의 컨트롤러 클래스를 구성한다.
// implements Controller 또는 extends AbstractController
// -- 서블릿에서 HttpServlet 을 상속받은 서블릿 객체 역할
public class MemberInsertController implements Controller
{
//Spring 이 제공하는
//Controller 인페이스의 handleRequest()메소드 재정의
private IMemberDAO dao;
public void setDao(IMemberDAO dao)
{
this.dao = dao;
}
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception
{
//하는 일은 doGet , doPost 와 같다.
//컨트롤러 내부 액션 처리 코드
int result = 0;
request.setCharacterEncoding("UTF-8");
String name = request.getParameter("name");
String telephone = request.getParameter("telephone");
try
{
MemberDTO member = new MemberDTO();
member.setName(name);
member.setTelephone(telephone);
result = dao.add(member);
} catch (Exception e)
{
System.out.println(e.toString());
}
ModelAndView mav = new ModelAndView();
//mav.setViewName("/WEB-INF/view/MemberList.jsp");
//→MemberListController 가 일을 할 수 있도록 처리
// → 이 컨트롤러에 의해 MemberList.jsp가 클라이언트를 만남
mav.setViewName("redirect:memberlist.action");
//Spring에게 이것이 리다이렉트를 하는것이니 클라이언트에게 memberlist.action으로 안내해줘라는 의미
return mav;
}
}
memberlist.action으로 요청하는 이유 : MemberList.jsp는 받은 데이터를 출력하는 기능일뿐 데이터를 넘겨주지 않는다. 그러므로 memberlist.action을 요청하여 다시 DB에 접근해 데이터를 읽어오고 읽어온 데이터를 .addObject로 담아 MemberList.jsp를 요청하도록 해야한다.