Spring
04일차_Spring MVC, 데이터송수신, 회원관리.txt
알 수 없는 사용자
2015. 7. 1. 17:35
---------------------------------------------------------- Spring MVC 1. 웹 개발을 위한 MVC 패턴이 적용된 Spring 프레임워크. Spring 에서는 DispatcherServlet 클래스가 컨트롤러 역할을 합니다. 2. SpringMVC 의 주요 구성 요소 - DispatcherServlet - HandlerMapping - Controller : 사용자 작성. 액션 처리. - ModelAndView - ViewResolver - View : 사용자 작성. 결과 출력. - web.xml : DispatcherServlet 서블릿 객체 등록. 사용자 작성. - dispatcher-servlet.xml : Controller 객체 등록. 사용자 작성. 3. SpringMVC의 실행 흐름 - 사용자 요청 -> DispatcherServlet - DispatcherServlet -> HandlerMapping에 주소 분석 요청 - DispatcherServlet -> 특정 Controller 객체 호출 및 결과 수신. 결과는 ModelAndView 객체. ModelAndView 객체는 View 객체 정보와 결과값이 들어있는 객체임. - DispatcherServlet -> ViewResolver에 View 객체 분석 요청 - DispatcherServlet -> 특정 View 객체에 Model 객체를 넘겨주고 결과 출력. 4. SpringMVC에서 사용자 역할 - Controller : 액션 처리를 담당하는 Controller 클래스 작성. Controller 인터페이스를 상속받아서 구현. - web.xml : 서블릿 주소와 DispatcherServlet 클래스 등록 - View : 결과 출력용 JSP 페이지 작성 - dispatcher-servlet.xml : 사용자가 작성한 Controller 객체 등록. URL 매핑 주소 등록. 5. SpringMVC 프로젝트 생성 - 다이나믹 웹 프로젝트 생성 - 톰캣 서버 등록 - SpringMVC 환경 설정을 위한 라이브러리 등록 (WebContent>WEB-INF>lib) 경로1: spring-docs\spring-framework-3.0.2.RELEASE\dist org.springframework.aop-3.0.2.RELEASE.jar org.springframework.asm-3.0.2.RELEASE.jar org.springframework.beans-3.0.2.RELEASE.jar org.springframework.context-3.0.2.RELEASE.jar org.springframework.core-3.0.2.RELEASE.jar org.springframework.expression-3.0.2.RELEASE.jar org.springframework.web-3.0.2.RELEASE.jar org.springframework.web.servlet-3.0.2.RELEASE.jar org.springframework.jdbc-3.0.2.RELEASE.jar org.springframework.transaction-3.0.2.RELEASE.jar 경로2: spring-de-framework-3.0.2.RELEASEpendencies\org.apache.commons\com.springsource.org.apache.commons.logging\1.1.1 com.springsource.org.apache.commons.logging-1.1.1.jar ojdbc6.jar, javax.servlet.jsp.jstl-1.2.1.jar, javax.servlet.jsp.jstl-api-1.2.1.jar 파일도 추가해야 합니다. 6. 처리 과정 1) 외부 요청 2) DispatcherServlet 요청 접수 - web.xml에서 DispatcherServlet 등록 //web.xml (WebContent>WEB-INF 폴더 하위에 생성) <?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> <!-- Spring MVC DispatcherServlet 등록 --> <!-- <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>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>*.it</url-pattern> </servlet-mapping> </web-app> - dispatcher-servlet.xml에서 URL 패턴 등록 - 사용자 요청 분석 3) 컨트롤러의 특정 메소드 호출 (액션 처리, 모델과 뷰 객체 리턴) - 사용자 요청에 맞는 액션 처리 - 결과 데이터가 들어있는 모델 객체 준비 - 뷰 정보(JSP 페이지 정보-객체가 아니라 View 페이지 이름) 리턴 4) 뷰 페이지에서 최종 웹페이지를 작성. - JSP 페이지 내에서 EL, JSTL 표기 사용. 5) 응답 완료. ---------------------------------------- JSP 템플릿 등록 <%@ page language="java" contentType="text/html; charset=${encoding}" pageEncoding="${encoding}"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html> <html> <head> <meta charset="${encoding}"> <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> ----------------------------------------------- Hello, World! 메시지 출력 //web.xml (WebContent>WEB-INF 폴더 하위에 생성) <?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> <!-- Spring MVC DispatcherServlet 등록 --> <!-- <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>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>*.it</url-pattern> </servlet-mapping> </web-app> //HelloController.java (com.test 패키지 하위에 생성) package com.test; 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 Hello implements Controller { @Override public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { //액션 코드 String result = "Hello, SpringMVC World!"; ModelAndView mav = new ModelAndView(); mav.addObject("result", result); mav.setViewName("/WEB-INF/source/Hello.jsp"); return mav; } } //Hello.jsp (WebContent>WEB-INF/source 폴더 하위에 생성) <%@ 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> ${result} </div> </body> </html> </body> </html> //dispatcher-servlet.xml (WebContent>WEB-INF 폴더 하위에 생성) <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <bean name="/Hello.it" class="com.test.HelloController"></bean> </beans> //요청주소 http://localhost:8090/프로젝트이름/Hello.it -------------------------------------- 데이터 송수신 테스트 - Spring MVC 버전 1. 프로그램 구성 //SendController.java -> 컨트롤러 객체. //Send.jsp -> 뷰 객체 //ReceiveController.java -> 컨트롤러 객체. //Receive.jsp -> 뷰 객체 //dispatcher-servlet.xml -> 컨트롤러 객체 등록. URL 매핑 주소 등록. Send.it -> SendController.java -> Send.jsp Receive.it -> ReceiveController.java -> Receive.jsp //요청주소 http://localhost:8090/프로젝트이름/Send.it 2. 프로그램 소스 코드 //SendController.java -> 컨트롤러 객체. package com.test; 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 SendController implements Controller { @Override public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { ModelAndView mav = new ModelAndView(); mav.setViewName("/WEB-INF/src/Send.jsp"); return mav; } } //Send.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="Receive.it" method="post"> 이름 <input type="text" name="yourName"> <input type="submit"> </form> </div> </body> </html> //ReceiveController.java -> 컨트롤러 객체. package com.test; 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 ReceiveController implements Controller { @Override public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { //데이터 수신 (yourName, 한글 인코딩) request.setCharacterEncoding("UTF-8"); String yourName = request.getParameter("yourName"); ModelAndView mav = new ModelAndView(); mav.addObject("yourName", yourName); mav.setViewName("/WEB-INF/src/Receive.jsp"); return mav; } } //Receive.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> //dispatcher-servlet.xml -> 컨트롤러 객체 등록. URL 매핑 주소 등록. <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <!-- name="" 속성에는 사용자 요청 주소 등록 class="" 속성에는 컨트롤러 클래스 등록 --> <bean name="/Hello.it" class="com.test.HelloController"></bean> <bean name="/Send.it" class="com.test.SendController"></bean> <bean name="/Receive.it" class="com.test.ReceiveController"></bean> </beans> //요청주소 http://localhost:8090/프로젝트이름/Send.it --------------------------------------------- 회원관리 Spring MVC 버전 - SimpleDriverDataSource 클래스 이용 - jdbc 모듈 추가 1. 기능 구현 - 이름, 전화번호 입력 받아서 데이터베이스 저장 - 이름, 전화번호를 데이터베이스에서 읽어내서 화면에 출력 2. 데이터베이스 준비 CREATE TABLE memberList( mid NUMBER --PK ,name VARCHAR2(30) ,telephone VARCHAR2(30) ); CREATE SEQUENCE memberListSeq; ALTER TABLE memberList ADD CONSTRAINT memberList_mid_pk PRIMARY KEY(mid); INSERT INTO memberList (mid, name, telephone) VALUES (memberListSeq.nextval, 'kim', '010-123-1234'); COMMIT; 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="button"> 전체 인원수 : 2명 -> <p> ... </p> ---------------------------- -> <table>...</table> 번호 이름 전화 1 hong 010-123-1234 2 kim 010-222-2222 ---------------------------- 4. Spring MVC + JDBC 환경 jar 파일 목록 com.springsource.org.apache.commons.logging-1.1.1.jar javax.servlet.jsp.jstl-1.2.1.jar javax.servlet.jsp.jstl-api-1.2.1.jar ojdbc6.jar org.springframework.aop-3.0.2.RELEASE.jar org.springframework.asm-3.0.2.RELEASE.jar org.springframework.beans-3.0.2.RELEASE.jar org.springframework.context-3.0.2.RELEASE.jar org.springframework.core-3.0.2.RELEASE.jar org.springframework.expression-3.0.2.RELEASE.jar org.springframework.jdbc-3.0.2.RELEASE.jar org.springframework.transaction-3.0.2.RELEASE.jar org.springframework.web-3.0.2.RELEASE.jar org.springframework.web.servlet-3.0.2.RELEASE.jar 5. 프로그램 구성 //Member.java -> 사용자 정의 자료형 클래스 //MemberDAO.java -> 데이터베이스 액션 클래스. Connection 객체에 대한 의존성 주입. setter 메소드 추가 //MemberList.jsp -> 회원 명단 출력. 회원 추가 폼 화면 구성. //MemberListController.java -> 컨트롤러 클래스. 출력 액션. DAO 객체에 대한 의존성 주입. setter 메소드 추가 //MemberInsertController.java -> 컨트롤러 클래스. 회원 추가 액션. DAO 객체에 대한 의존성 주입. setter 메소드 추가 //dispatcher-servlet.xml -> 컨트롤러 객체 등록. 사용자 요청 주소 등록. SimpleDriverDataSource 객체 등록. 의존 객체 주입 설정. DAO 객체 등록. //요청주소 http://localhost:8090/프로젝트이름/MemberList.it 6. 프로그램 소스코드 //Member.java -> 사용자 정의 자료형 클래스 package com.test; public class Member { private String mid, name, telephone ; public String getMid() { return mid; } public void setMid(String 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 -> 데이터베이스 액션 클래스. Connection 객체에 대한 의존성 주입. setter 메소드 추가 package com.test; import java.sql.*; import java.util.*; import javax.sql.DataSource; public class MemberDAO { //의존객체 주입(DI) 준비 private DataSource dataSource; public void setDataSource(DataSource dataSource) { this.dataSource = dataSource; } public ArrayList<Member> list() { ArrayList<Member> result = new ArrayList<Member>(); Connection conn = null; PreparedStatement pstmt = null; try { //Connection 객체 얻는 방법 conn = dataSource.getConnection(); String sql = "SELECT mid, name, telephone FROM memberList ORDER BY mid"; pstmt = conn.prepareStatement(sql); ResultSet rs = pstmt.executeQuery(); while(rs.next()) { Member member = new Member(); member.setMid(rs.getString("mid")); member.setName(rs.getString("name")); member.setTelephone(rs.getString("telephone")); result.add(member); } rs.close(); } catch (SQLException e) { e.printStackTrace(); }finally { try{ if (pstmt != null) { pstmt.close(); } conn.close(); }catch(SQLException se){ se.printStackTrace(); } } return result; } //전체 회원수 출력 액션 처리 public int count() { int result = 0; Connection conn = null; PreparedStatement pstmt = null; try { //Connection 객체 얻는 방법 conn = dataSource.getConnection(); String sql = "SELECT COUNT(mid) AS count FROM memberList"; pstmt = conn.prepareStatement(sql); ResultSet rs = pstmt.executeQuery(); while(rs.next()) { result = rs.getInt("count"); } rs.close(); } catch (SQLException e) { e.printStackTrace(); }finally { try{ if (pstmt != null) { pstmt.close(); } conn.close(); }catch(SQLException se){ se.printStackTrace(); } } return result; } //회원 추가 액션 처리 public int add(Member member) { int result = 0; Connection conn = null; PreparedStatement pstmt = null; try { //Connection 객체 얻는 방법 conn = dataSource.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()); pstmt.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); }finally { try{ if (pstmt != null) { pstmt.close(); } conn.close(); }catch(SQLException se){ se.printStackTrace(); } } return result; } } 문제) 아래 나머지 소스 코드 작성할 것. //MemberListController.java -> 컨트롤러 클래스. 출력 액션. DAO 객체에 대한 의존성 주입. setter 메소드 추가 package com.test; 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 { //의존객체 주입(DI) 준비 private MemberDAO dao; public void setMemberDAO(MemberDAO dao) { this.dao = dao; } @Override public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { //액션 코드 추가 //데이터베이스 액션 -> count(), list() 메소드 호출 int count = dao.count(); ArrayList<Member> list = dao.list(); ModelAndView mav = new ModelAndView(); mav.addObject("count", count); mav.addObject("list", list); mav.setViewName("/WEB-INF/src/MemberList.jsp"); return mav; } } //MemberList.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>회원관리</title> <link rel="stylesheet" type="text/css" href="MyTable.css"> <style type="text/css"> #error { display: none; color: red; } </style> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> <script type="text/javascript"> $(document).ready(function() { $("#myForm").submit(function() { $("#error").css("display", "none"); if ($("#name").val()=="" || $("#telephone").val()=="") { $("#error").css("display", "inline"); return false; } return true; }); $("#name").keyup(function(){ $("#nameLength").html($(this).val().length); }); $("#telephone").keyup(function(){ $("#telephoneLength").html($(this).val().length); }); }); </script> </head> <body> <div> <h1>[회원 관리]</h1> <%-- action="" 속성에서 서블릿 주소 지정 (*.it) --%> <form action="MemberInsert.it" method="post" id="myForm"> <table> <tr> <th>이름*</th> <td> <input type="text" id="name" name="name" required="required"> ( <span id="nameLength">0</span> / 30 ) </td> </tr> <tr> <th>전화*</th> <td> <input type="text" id="telephone" name="telephone" required="required"> ( <span id="telephoneLength">0</span> / 30 ) </td> </tr> <tr> <th></th> <td> <input type="submit"> <span id="error">모든 항목을 채워야 합니다.</span> </td> </tr> </table> </form> <h2> 전체 인원수 : ${count} 명 </h2> <table id="customers"> <tr> <th>번호</th><th>이름</th><th>전화</th> </tr> <c:forEach var="member" items="${list}"> <tr> <td>${member.mid}</td> <td>${member.name}</td> <td>${member.telephone}</td> </tr> </c:forEach> </table> </div> </body> </html> //MemberInsertController.java -> 컨트롤러 클래스. 회원 추가 액션. DAO 객체에 대한 의존성 주입. setter 메소드 추가 package com.test; 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 MemberInsertController implements Controller { //의존객체 주입(DI) 준비 private MemberDAO dao; public void setMemberDAO(MemberDAO dao) { this.dao = dao; } @Override public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { //액션 코드 추가 //데이터 수신 (한글 인코딩) request.setCharacterEncoding("UTF-8"); String name = request.getParameter("name"); String telephone = request.getParameter("telephone"); //데이터베이스 액션 Member member = new Member(); member.setName(name); member.setTelephone(telephone); dao.add(member); ModelAndView mav = new ModelAndView(); mav.setViewName("redirect:MemberList.it"); return mav; } } //dispatcher-servlet.xml -> 컨트롤러 객체 등록. 사용자 요청 주소 등록. SimpleDriverDataSource 객체 등록. 의존 객체 주입 설정. DAO 객체 등록. <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <bean id="remoteDataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource"> <property name="driverClass" value="oracle.jdbc.driver.OracleDriver" /> <property name="url" value="jdbc:oracle:thin:@211.63.89.72:1521:xe" /> <property name="username" value="username" /> <property name="password" value="password" /> </bean> <bean id="memberDAO" class="com.test.MemberDAO"> <property name="dataSource"> <ref bean="remoteDataSource" /> </property> </bean> <bean name="/MemberList.it" class="com.test.MemberListController"> <property name="memberDAO"> <ref bean="memberDAO" /> </property> </bean> <bean name="/MemberInsert.it" class="com.test.MemberInsertController"> <property name="memberDAO"> <ref bean="memberDAO" /> </property> </bean> </beans> //요청주소 http://localhost:8090/프로젝트이름/MemberList.it --------------------------------------