-
[Spring] 006. Spring MVC 관찰(2)SsY/Class 2023. 7. 3. 12:21728x90
mvc02
■■■ Spring MVC 프로젝트 실습02 ■■■ ○ Perspective : JavaEE ○ 다이나믹 웹 프로젝트 생성 : mvc02 (STS - 스프링 / 스프링 레거시 / 스프링 부트 / 스프링 MVC ...) ○ 기본 환경 구성 및 라이브러리 설정 : mvc00 으로부터 src, WebContent 디렉터리 복사 & 붙여넣기 (→ 우리가 임의로 만들어둔 샘플) ○ 실습 성격 : 데이터 송수신 관련 실습(Spring MVC 버전) ○ 물리적 파일 구성 - SendController.java → 컨트롤러 객체 - Send.jsp → 뷰 객체 - ReceiveController.java → 컨트롤러 객체 - Receive.jsp → 뷰 객체 - dispatcher-servlet.xml → 컨트롤러 객체 등록 / URL 매핑 주소 등록 - web.xml → DispatcherServlet 객체 등록 / URL 매핑 주소 등록 (Front Controller) - send.action → 요청 및 실습 편의성을 위한 빈 파일 ○ 사용자 최초 요청 주소 http://localhost:3306/mvc02/send.action → receive.action
※ 필터와 같은 추가 기능 구현에 대한 적용을 하기 전까지 당분간 그대로 사용하게 될 web.xml 코드
- SendController.java
/*================================= SendController.java - 사용자 정의 컨트롤러 클래스 ================================= */ 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 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/view/Send.jsp"); return mav; } }
- Send.jsp
<%@ 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>Send.jsp</title> <link rel="stylesheet" type="text/css" href="<%=cp %>/css/main.css"> </head> <body> <div> <h1>Spring MVC 데이터 송수신 실습</h1> <hr /> </div> <div> <!-- 모델 1방식 <form action="Receive.jsp" method="post"> --> <!-- 모델 서블릿 <form action="receive" method="post"> --> <form action="receive.action" method="post"> 이름 <input type="text" name="userName"/> <button type="submit">submit</button> </form> </div> </body> </html>
- ReceiveController.java
/*================================= HelloController.java - 사용자 정의 컨트롤러 클래스 ================================= */ 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 MVC 『Controller』 인터페이스를 구현하는 방법을 통해 // 사용자 정의 컨트롤러 클래스를 구성한다. public class ReceiveController implements Controller { @Override public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { // 액션 코드 ModelAndView mav = new ModelAndView(); // 한글 깨짐 방지 request.setCharacterEncoding("UTF-8"); String str = "안녕하세요. 제 이름은" + request.getParameter("userName") + "입니다."; mav.addObject("name", str); mav.setViewName("/WEB-INF/view/Receive.jsp"); return mav; } }
- Receive.jsp
<%@ 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>Receive.jsp</title> <link rel="stylesheet" type="text/css" href="<%=cp %>/css/main.css"> </head> <body> <div> <h1>Spring MVC 데이터 송수신 실습</h1> <hr /> </div> <div> ${name} </div> </body> </html>
- dispatcher-servlet.xml
<?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" /> <!-- ※ 사용자 정의 Controller 객체 등록 및 URL 매핑 주소 등록 --> <!-- - 『name=""』 속성에 매핑 주소를 등록한다. --> <!-- 이 과정에서 Front Controller 가 갖고있는 확장자의 형태로 구성한다. --> <!-- - 『class=""』 속성은 Controller 객체의 클래스 경로 및 이름을 등록한다. --> <bean name="/send.action" class="com.test.mvc.SendController"></bean> <bean name="/receive.action" class="com.test.mvc.ReceiveController"></bean> </beans>
- web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> <display-name>mvc01</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 Framework 등록 --> <!-- → Front Controller 등록 --> <!-- → DispatcherServlet 등록 --> <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>*.action</url-pattern> </servlet-mapping> <!-- ※ 필터와 같은 추가 기능 구현에 대한 적용을 하기 전까지 --> <!-- 당분간 그대로 사용하게 될 코드 --> </web-app>
- send.action : 최초 요청 주소 빈 파일
mvc03
- mvc03_scott.sql
- MemberDTO.java
/*=============================== MemberDTO.java - 사용자 정의 자료형 클래스 ================================ */ package com.test.mvc; public class MemberDTO { // 주요 속성 구성 private int mid; private String name, telphone; // getter / setter 구성 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 getTelphone() { return telphone; } public void setTelphone(String telephone) { this.telphone = telphone; } }
- IMemberDAO.java
/*====================== IMemberDAO.java - 인터페이스 ====================== */ package com.test.mvc; import java.sql.SQLException; import java.util.ArrayList; public interface IMemberDAO { // 회원 데이터 추가 메소드 선언 public int add(MemberDTO member) throws SQLException; // 전체 인원수 확인 메소드 선언 public int count() throws SQLException; // 회원 목록 확인 메소드 선언 public ArrayList<MemberDTO> list() throws SQLException; }
- MemberDAO.java
/*==================================================== MemberDAO.java - DB 액션 처리 클래스 - IMemberDAO 인터페이스 구현 클래스 - Connection 객체에 대한 의존성 주입을 위한 준비 → 인터페이스, setter ==================================================== */ package com.test.mvc; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import javax.sql.DataSource; public class MemberDAO implements IMemberDAO { // ※ Connection 객체에 대한 의존성 주입을 위한 준비 // --------------- DataSource 활용 // ① 인터페이스 형태의 데이터타입을 취하는 속성 구성 private DataSource dataSource; //-- 스프링에서 제공 // ② setter 구성 public void setDataSource(DataSource dataSource) { this.dataSource = dataSource; } // ※ IMemberDAO 인터페이스의 메소드 오버라이딩 @Override public int add(MemberDTO member) throws SQLException { int result = 0; Connection conn = dataSource.getConnection(); String sql = "INSERT INTO TBL_MEMBERLIST(MID, NAME, TELPHONE)" + " VALUES(MEMBERLISTSEQ.NEXTVAL, ?, ?)"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setString(1, member.getName()); pstmt.setString(2, member.getTelphone()); result = pstmt.executeUpdate(); pstmt.close(); conn.close(); return result; } @Override public int count() throws SQLException { int result = 0; Connection conn = dataSource.getConnection(); String sql = "SELECT COUNT(*) AS COUNT FROM TBL_MEMBERLIST"; PreparedStatement pstmt = conn.prepareStatement(sql); ResultSet rs = pstmt.executeQuery(); if (rs.next()) result = rs.getInt("COUNT"); rs.close(); pstmt.close(); conn.close(); return result; } @Override public ArrayList<MemberDTO> list() throws SQLException { ArrayList<MemberDTO> result = new ArrayList<MemberDTO>(); Connection conn = dataSource.getConnection(); String sql = "SELECT MID, NAME, TELPHONE FROM TBL_MEMBERLIST ORDER BY MID"; PreparedStatement pstmt = conn.prepareStatement(sql); ResultSet rs = pstmt.executeQuery(); while (rs.next()) { MemberDTO member = new MemberDTO(); member.setMid(rs.getInt("MID")); member.setName(rs.getString("NAME")); member.setTelphone(rs.getString("TELPHONE")); result.add(member); } rs.close(); pstmt.close(); conn.close(); return result; } }
- MemberListController.java
/*============================================== MemberListController.java - 사용자 정의 컨트롤러 클래스 - 리스트 출력 액션 - DAO 객체에 대한 의존성 주입을 위한 준비 → 인터페이스 자료형 / 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; // ※ Spring 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 { //-- 모델 계층을 만들어 처리하여도 되지만, //-- 이를 위해서는 모델객체, 자료형 등 추가적으로 더 구성해야하기 때문에 //-- 간단하게 controller 에서 처리 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); mav.addObject("memberList", memberList); return mav; } }
- MemberList.jsp
<%@ 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"> <style type="text/css"> *{line-height: 150%;} #customers {border: 1px solid gray;} #customers td { text-align: center; border: 1px solid gray; } #submitBtn { height: 150%; width: 250px; font-size: 18px; font-weight: bold; font-family: 맑은 고딕; color: #343; } #err { color: red; font-size: small; display: none; } </style> <script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script> <script type="text/javascript"> $(function() { $("#submitBtn").click(function() { // 확인 //alert("확인"); // 두 항목이 묶여서 처리되고 있는 상황이기 때문에... 생략 가능 $("#err").css("display","none"); if ($("#name").val()=="" || $("#telphone").val()=="") { $("#err").css("display","inline"); return; } $("#memberForm").submit(); }); }); </script> </head> <body> <div> <h1>회원 관리</h1> <hr /> </div> <div> <form action="memberinsert.action" method="post" id="memberForm"> 이름 <input type="text" name="name" id="name" class="control" required="required" /> <br> 전화 <input type="text" name="telphone" id="telphone" class="control" required="required" /> <br> <button type="button" id="submitBtn">회원 추가</button> <span id="err">모든 항목을 입력해야 합니다.</span> </form> <br> <!-- <p>전체 인원 수 : 3 명</p> --> <!-- EL 표현에 의한 인원 수 출력 부분 --> <p>전체 인원 수 : ${count } 명</p> <table id="customers" style="width: 500px;"> <tr> <th>번호</th><th>이름</th><th>전화번호</th> </tr> <!-- <tr> <td>1</td> <td>별희강</td> <td>010-0000-0000</td> </tr> <tr> <td>2</td> <td>리서최</td> <td>010-0111-0111</td> </tr> <tr> <td>3</td> <td>키민킴</td> <td>010-0222-0222</td> </tr> --> <%-- EL, JSTL 표현에 의한 회원 명단 출력 부분 --%> <c:forEach var="member" items="${memberList }"> <tr> <%-- MemberDTO 객체의 getMid(), getName(), getTlephone() 메소드를 호출하는 구문 --%> <td>${member.mid }</td> <td>${member.name }</td> <td>${member.telphone }</td> </tr> </c:forEach> </table> </div> </body> </html>
- MemberInsertController.java
/*============================================= MemberInsertController.java - 사용자 정의 컨트롤러 클래스 - 회원 데이터 추가 액션 처리 클래스 - DAO 객체에 대한 의존성 주입을 위한 준비 ============================================= */ 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; // ※ 『implements Controller』 혹은 『extends AbstractController』 //-- 서블릿에서 HttpServlet 을 상속받은 서블릿 객체 역할 // ※ Spring MVC 『Controller』 인터페이스를 구현하는 방법을 통해 // 사용자 정의 컨트롤러 클래스를 구성한다. public class MemberInsertController implements Controller { // dao 관련 속성 구성 → 인터페이스 형태 (인터페이스 자료형을 취하는 속성 구성) 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(); // 한글 깨짐 방지 request.setCharacterEncoding("UTF-8"); // 이전 페이지로부터 넘어온 (폼)데이터 수신 String name = request.getParameter("name"); String tel = request.getParameter("telphone"); int count = 0; ArrayList<MemberDTO> memberList = new ArrayList<MemberDTO>(); try { // add() 메소드에 넘겨줄 형태로 DTO 구성 MemberDTO member = new MemberDTO(); member.setName(name); member.setTelphone(tel); dao.add(member); } catch (Exception e) { System.out.println(e.toString()); } // 뷰 지정하기 //mav.setViewName("/WEB-INF/view/MemberList.jsp"); //-- 이렇게 하면 추가 후 list 를 불러올 수가 없음 // ※ memberlist.action 을 다시 요청 할 수 있도록 안내 // → sendRedirect() → memberlist.action // check! mav.setViewName("redirect:memberlist.action"); //mav.setViewName("memberlist.action"); //-- 동일한 구문이나 redirect: 접두어를 붙이는 이유는 //-- 추후 redirect: 로 처리한 구문들을 모아서 확인할 수 있는 방법이 있기 때문 return mav; } }
- dispatcher-servlet.xml
<?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" /> <!-- ※ 사용자 정의 Controller 객체 등록 및 URL 매핑 주소 등록 --> <!-- - 『name=""』 속성에 매핑 주소를 등록한다. --> <!-- 이 과정에서 Front Controller 가 갖고있는 확장자의 형태로 구성한다. --> <!-- - 『class=""』 속성은 Controller 객체의 클래스 경로 및 이름을 등록한다. --> <!-- DataSource → SimpleDriverDataSource 활용 (→직접 설계한 자원이 아님) --> <!-- MemberDAO 에서 필요한 dataSource 를 건네주기 위한 준비 --> <bean id="localDataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource"> <!-- 여기서 구성하는 속성들은 DBConn 작성시 작성했던 것들! --> <property name="driverClass" value="oracle.jdbc.driver.OracleDriver"></property> <property name="url" value="jdbc:oracle:thin:@211.238.142.49:1521:xe"></property> <property name="username" value="scott"></property> <property name="password" value="tiger"></property> </bean> <!-- 즉, 아래 처럼 위와 다른 데이터 베이스에도 연동하기 위해서 활용하는 것 --> <!-- 등록은 했으나 인스턴스 생성은 함 (localDataSource 만 사용하고 있기 때문에) --> <bean id="remoteDataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource"> <!-- 여기서 구성하는 속성들은 DBConn 작성시 작성했던 것들! --> <property name="driverClass" value="oracle.jdbc.driver.OracleDriver"></property> <property name="url" value="jdbc:oracle:thin:@211.238.142.50:1521:xe"></property> <property name="username" value="scott"></property> <property name="password" value="tiger"></property> </bean> <!-- MemberDAO --> <!-- 아래에서 필요한 DAO 속성을 넘겨주기 위한 것으로 name 속성이 아닌 id 속성으로 구성해야한다 --> <bean id="memberDAO" class="com.test.mvc.MemberDAO"> <property name="dataSource"> <!-- 필요한 속성인 dataSource 넘겨주기 --> <ref bean="localDataSource"/> </property> </bean> <!-- MemberListController --> <bean name="/memberlist.action" class="com.test.mvc.MemberListController"> <property name="dao"> <!-- 필요한 속성인 MemberDAO 넘겨주기 --> <ref bean="memberDAO"/> </property> </bean> <!-- MemberInsertController --> <bean name="/memberinsert.action" class="com.test.mvc.MemberInsertController"> <property name="dao"> <ref bean="memberDAO"/> </property> </bean> </beans>
- web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> <display-name>mvc01</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 Framework 등록 --> <!-- → Front Controller 등록 --> <!-- → DispatcherServlet 등록 --> <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>*.action</url-pattern> </servlet-mapping> <!-- ※ 필터와 같은 추가 기능 구현에 대한 적용을 하기 전까지 --> <!-- 당분간 그대로 사용하게 될 코드 --> </web-app>
- memberlist.action
- 최초 요청 페이지(빈 파일)
728x90'SsY > Class' 카테고리의 다른 글
[Spring] 008. Annotation(어노테이션) 개요 (0) 2023.07.14 [Spring] 007. Spring MVC 관찰(3) : 직원 관리 프로그램 (0) 2023.07.12 [Spring] 005. Spring MVC 의 개요 (0) 2023.06.29 [jQuery] 002. jQuery 관찰 실습(2) (0) 2023.06.13 [jQuery] 001. jQuery 의 개요 (0) 2023.06.12