Everything has an expiration date
[SpringMVC] 20240110 [프로그램 소스] 본문
SpringMVCStudy - Mvc01
※ 참고 사항
① [eclipse 실행시, 실행 경로 지정 안내창]
실수로 시작 경로 설정창 안 물어보도록 설정했을 때
`window > preperences > workspace > Prompt for workspace on startup` 체크박스 체크
② [apache-tomcat 참고사항]
apache 와 tomcat 은 따로이다.
apache 리소스와 tomcat 리소스가 분리되어 있는데
우리가 사용하는 것은 tomcat 이다.
③ [★이클립스 서버 실행시 유의사항 - `metadata` 파일 엉킴 현상]
이를 알지 못하여, eclipse 실행경로가 WebStudy인 창과, FrameworkStudy 인 창을
동시에 열어서 작업하였다가 `metadata` 파일이 엉키게 되어
`WebStudy` 프로젝트가 제대로 실행되지 않았었다.
현재 이클립스에서 아파치 톰캣(`apache-tomcat-8.5.54`) 서버 하나만 사용하고 있기 때문에
★ SpringMVC 기반으로 tomcat 을 돌려놓은 상태에서
다른 이클립스 창으로 또다시 이 톰캣 리소스(서버)를 사용하게 되면 충돌이 발생하게 된다.
서버는 xml을 기반으로 움직이기 때문에`metadata` 에서 하나의 프로젝트에 리소스를 몰아서 전달해야 하는데...
동시에 두 개의 창에서 하나의 서버를 사용하게 되면,
서버가 시작되지 않은 두 번째 파일에 첫 번째 프로젝트의 리소스가 밀어넣어져서
서버 자체의 리소스가 헝클어져 버리기 때문이다.
[ ※ 시도해 봐야 할 해결 방법 ※ ]
결과적으로, `metadata` 파일이 엉키게 된 것이므로
ⓐ 컴퓨터 재부팅을 해 보거나
ⓑ apache-tomcat 을 삭제한 후, 재설치 해 보아야 한다.
이번 실습에서의 프로그램 실행 흐름 정리
[web.xml]
① 클라이언트가 *.action url 로 접근하게 되면
web.xml 의 DispatcherServlet 클래스가 동작한다.
[dispatcher-servlet.xml]
② 이 DispatcherServlet xml 파일의 빈(Bean) 객체 중
name 에 해당하는 url을 클라이언트가 접근 시도 했을 경우
com.test.mvc 패키지 내부에 있는
HelloController 컨트롤러가 동작하게 된다.
[HelloController.java]
③ HelloController 컨트롤러에서는 클라이언트의 요청을 핸들링한다.
먼저, 인터페이스인 Controller 를 구현한 후에
추상 메소드인
`ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)`를
`@Override` 한다.
→ ModelAndView mav 인스턴스를 생성한다.
→ ModelAndView 객체에 setAttribute를 하는 것과 같이
`mav.addObject("객체명", 객체);` 메소드를 통해
객체를 저장하고
→ ModelAndView 객체가 저장한 객체를 넘겨줄 페이지를
`mav.setViewName("데이터 전송할 페이지 URL");` 메소드를 통해 (forwarding 처리)
저장한 객체를 전달한 후
→ ModelAndView 객체를 return 한다.
[Hello.jsp]
④ HelloController 에서 전달한 객체를 수신하여
EL 을 통해 페이지에서 보여지도록 처리해 준다.
→ `${message }`
■■■ Spring MVC 프로젝트 실습 01 ■■■
○ Prespective
: JavaEE
○ 다이나믹 웹 프로젝트 생성 (비STS 버전)
: Mvc01
○ 톰캣 서버 등록 및 포트(port) 설정 (인코딩 필터 적용 이전)
: port 3306 / URIEncoding="UTF-8"
○ 기타 환경 설정
: 기본 환경 설정은 『web_standard.epf』 를 통해 구성
(폰트, 줄번호, 편집포맷, 인코딩방식, 템플릿 등...)
○ Spring MVC 환경 설정을 위한 라이브러리 등록
: WebContent > WEB-INF > lib 경로에 등록
- 경로 1 → C:\s-f-3.0.2-with-docs\dist
·파일 1 → org.springframework.aop-3.0.2.RELEASE.jar
·파일 2 → org.springframework.asm-3.0.2.RELEASE.jar
·파일 3 → org.springframework.beans-3.0.2.RELEASE.jar
·파일 4 → org.springframework.context-3.0.2.RELEASE.jar
·파일 5 → org.springframework.core-3.0.2.RELEASE.jar
·파일 6 → org.springframework.expression-3.0.2.RELEASE.jar
·파일 7 → org.springframework.jdbc-3.0.2.RELEASE.jar
·파일 8 → org.springframework.transaction-3.0.2.RELEASE.jar
·파일 9 → org.springframework.web.servlet-3.0.2.RELEASE.jar
·파일10 → org.springframework.web-3.0.2.RELEASE.jar
- 경로 2 → C:\s-f-3.0.2-dependencies\org.apache.commons
\cohttp://m.springsource.org.apache.commons.logging\1.1.1
·파일11 → cohttp://m.springsource.org.apache.commons.logging-1.1.1.jar
- 경로 3 → C:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib
(오라클 설치 경로)
·파일12 → ojdbc6.jar
- 경로 4 → C:\Downloads\12_JSTL\jakarta-taglibs-standard-1.1.2\lib
·파일13 → jstl.jar
·파일14 → standard.jar
○ 물리적 파일 구성
- HelloController.java
- Hello.jsp
- dispatcher-servlet.xml (파일 이름 변경 불가)
- web.xml (dispatcher-servlet 프론트 컨트롤러 등록)
- hello.action
※ 『dispatcher-servlet.xml』 파일의 기본 설정 내용(템플릿)을 구성하기 위해
스프링 DOC의 내용을 참고해서 작성할 수 있도록 한다.
·경로 → C:\s-f-3.0.2-with-docs\docs\spring-framework-reference\pdf
·파일 → spring-framework-reference.pdf
·내용(위치) → 해당 pdf 문서의 페이지 번호 상 425 페이지
파일 구조의 바로가기 인덱스 상 450/805 페이지
·해당 위치로 이동하면 XML 파일에 대한 샘플(템플릿) 코드가 있다.
이 내용을 복사하여 dispatcher-servlet.xml 파일의 기본 내용으로 작성한다.
○ 사용자 최초 요청 주소
http://localhost:3306/Mvc01/hello.action
※ 우리가 작성한 Mvc01 프로젝트의 실행 및 처리 과정 정리
① 외부 요청
http://localhost:3306/Mvc01/hello.action
===========================
http://www.test.co.kr
→ web.xml 관여
(→ Front Controller 등록 → DispatcherServlet 등록)
② DispatcherServlet 요청 접수
→ web.xml → DispatcherServlet 등록
web.xml → URL 패턴 등록
→ 사용자 요청 분석 → 특정 컨트롤러 지정
③ 해당 컨트롤러의 특정 메소드 호출(액션 처리, ModelAndView 객체 반환)
→ 사용자의 요청에 맞는 액션 처리
→ 결과 데이터가 들어있는 모델 객체 준비
→ 뷰 정보(JSP 페이지 정보) 반환
※ JSP 페이지 정보
- 여기서는 객체가 아닌 경로 포함된 View 페이지의 이름
④ 뷰 페이지에서 최종 웹 페이지를 작성
→ JSP 페이지 내에서 El 이나 JSTL 등의 표기 사용 가능
⑤ 응답 완료~!!!
전체적인 프로그램 실행 흐름 정리 - 내 정리
[web.xml]
① 클라이언트가 `*.action url` 로 접근하게 되면
web.xml 의 DispatcherServlet 클래스가 동작한다.
[dispatcher-servlet.xml]
② 이 DispatcherServlet xml 파일의 빈(Bean) 객체 중
name 에 해당하는 url을 클라이언트가 접근 시도 했을 경우
com.test.mvc 패키지 내부에 있는
HelloController 컨트롤러가 동작하게 된다.
[HelloController.java]
③ HelloController 컨트롤러에서는 클라이언트의 요청을 핸들링한다.
먼저, 인터페이스인 Controller 를 구현한 후에
추상 메소드인
ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)를
@Override 한다.
→ ModelAndView mav 인스턴스를 생성한다.
→ ModelAndView 객체에 setAttribute를 하는 것과 같이
mav.addObject("객체명", 객체); 메소드를 통해
객체를 저장하고
→ ModelAndView 객체가 저장한 객체를 넘겨줄 페이지를
mav.setViewName("데이터 전송할 페이지 URL"); 메소드를 통해 (포워딩처리)
저장한 객체를 전달한 후
→ `ModelAndView` 객체를 return 한다.
[Hello.jsp]
④ HelloController 에서 전달한 객체를 수신하여
EL 을 통해 페이지에서 보여지도록 처리해 준다.
→ `${message }`
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>Mvc00</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>
※ 『dispatcher-servlet.xml』 파일의 기본 설정 내용(템플릿)을 구성하기 위해
스프링 DOC의 내용을 참고해서 작성할 수 있도록 한다.
·경로 → C:\s-f-3.0.2-with-docs\docs\spring-framework-reference\pdf
·파일 → spring-framework-reference.pdf
·내용(위치) → 해당 pdf 문서의 페이지 번호 상 425 페이지
파일 구조의 바로가기 인덱스 상 450/805 페이지
·해당 위치로 이동하면 XML 파일에 대한 샘플(템플릿) 코드가 있다.
이 내용을 복사하여 dispatcher-servlet.xml 파일의 기본 내용으로 작성한다.
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="/hello.action" class="com.test.mvc.HelloController"></bean>
</beans>
HelloController.java (src - com.test.mvc)
/*=================================
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 의 『Controller』 인터페이스를 구현하는 방법을 통해
// 사용자 정의 컨트롤러 클래스를 구성한다.
// cf. Controller Annotation 활용
public class HelloController implements Controller
{
// 요청을 핸들링 하겠다는 메소드.
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception
{
// 원래는, 컨트롤러로 모델과 뷰를 분리(결합을 막는다.)시켜야 하지만...
// 문 손잡이를 모두 분리시켜서 부품화시키지 않고
// 공통된 부분을 합쳐놓는 것 → 『ModelAndView』 이다!
// 액션 코드
ModelAndView mav = new ModelAndView();
// 문자열 변수 생성.
String message = "Hello, SpringMVC World~!!!";
// setAttribute() 를 한 것과 마찬가지.
// request.setAttribute()를 사용해도 되지만
// 스프링에서는 같은 환경에서 정해진 틀을 지켜야 하므로...
// [ModelAndView] 객체를 사용하도록 약속했으므로.
mav.addObject("message", message);
// ======= =======
// 객체명 객체
mav.setViewName("/WEB-INF/view/Hello.jsp");
// RequestDispatcher 를 통해 포워딩하는 처리와 유사하다.
// 파일의 url을 넘겨주는 것만으로도
// 객체를 넘기는 대상 뷰 객체를 지정해 주는 것이다.
return mav;
}
}
Hello.jsp (WebContent - WEB-INF - view)
<%@ 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>Hello.jsp</title>
<link rel="stylesheet" type="text/css" href="css/main.css">
</head>
<body>
<div>
<h1>${message }</h1>
</div>
</body>
</html>
※ 우리가 작성한 Mvc01 프로젝트의 실행 및 처리 과정 정리
① 외부 요청
http://localhost:3306/Mvc01/hello.action
===========================
http://www.test.co.kr
→ web.xml 관여
(→ Front Controller 등록 → DispatcherServlet 등록)
② DispatcherServlet 요청 접수
→ web.xml → DispatcherServlet 등록
web.xml → URL 패턴 등록
→ 사용자 요청 분석 → 특정 컨트롤러 지정
③ 해당 컨트롤러의 특정 메소드 호출(액션 처리, ModelAndView 객체 반환)
→ 사용자의 요청에 맞는 액션 처리
→ 결과 데이터가 들어있는 모델 객체 준비
→ 뷰 정보(JSP 페이지 정보) 반환
※ JSP 페이지 정보
- 여기서는 객체가 아닌 경로 포함된 View 페이지의 이름
④ 뷰 페이지에서 최종 웹 페이지를 작성
→ JSP 페이지 내에서 El 이나 JSTL 등의 표기 사용 가능
⑤ 응답 완료~!!!
SpringMVCStudy - Mvc02
■■■ Spring MVC 프로젝트 실습 02 ■■■
○ Prespective
: JavaEE
○ 다이나믹 웹 프로젝트 생성 (비STS 버전)
: Mvc02
○ 기본 환경 구성 및 라이브러리 설정
: Mvc00 (우리가 임의로 구성해둔 샘플)로 부터
src, WebContent 디렉터리 복사 & 덮어쓰기
○ 실습 성격
: 데이터 송수신 관련 실습(Spring MVC 버전)
○ 물리적 파일 구성
- SendController.java → 컨트롤러 객체
- Send.jsp → 뷰 객체
- ReceiveController.java → 컨트롤러 객체
- Receive.jsp → 뷰 객체
- web.xml → DispatcherServlet 객체 등록 / URL 매핑 주소 등록
- dispatcher-servlet.xml → 컨트롤러 객체 등록 / URL 매핑 주소 등록
- send.do → 이클립스 실행 과정에서 요청을 위한 빈 파일
○ 사용자 최초 요청 주소
http://localhost:3306/Mvc02/send.do
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>Mvc00</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 객체 등록 -->
<!-- ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ -->
<!-- DispatcherServlet 을 사용할 때,
<servlet-name> 의 이름은 반드시 dispatcher 로 사용하도록 하자!-->
<!-- ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ -->
<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>*.do</url-pattern>
</servlet-mapping>
</web-app>
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.do" class="com.test.mvc.SendController"></bean>
<bean name="/receive.do" class="com.test.mvc.ReceiveController"></bean>
</beans>
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 의 『Controller』 인터페이스를 구현하는 방법을 통해
// 사용자 정의 컨트롤러 클래스를 구성한다.
// cf. Controller Annotation 활용
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="css/main.css">
</head>
<body>
<div>
<h1>Spring MVC 데이터 송수신 실습</h1>
<hr>
</div>
<div>
<form action="receive.do" method="post">
이름 <input type="text" name="userName">
<button type="submit">submit</button>
</form>
</div>
<!-- receive.do -->
<!-- → 안녕하세요, 홍길동님 반갑습니다. -->
</body>
</html>
ReceiveController.java
/*=================================
ReceiveController.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 의 『Controller』 인터페이스를 구현하는 방법을 통해
// 사용자 정의 컨트롤러 클래스를 구성한다.
// cf. Controller Annotation 활용
public class ReceiveController implements Controller
{
// 요청을 핸들링 하겠다는 메소드.
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception
{
// 액션 코드
ModelAndView mav = new ModelAndView();
request.setCharacterEncoding("UTF-8");
String name = request.getParameter("userName");
String result = String.format("안녕하세요, %s님 반갑습니다.", name);
mav.addObject("result", result);
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="css/main.css">
</head>
<body>
<!-- <h1>안녕하세요, ${name }님 반갑습니다.</h1> -->
<!-- 위와 같이 처리해도 괜찮다. -->
<div>
<h1>Spring MVC 데이터 송수신 실습</h1>
<hr>
</div>
<%--
<div>
<h2>데이터 수신 결과</h2>
<h2>안녕하세요, ${userName }님 반갑습니다.</h2>
</div>
--%>
<div>
<h1>${result }</h1>
</div>
</body>
</html>
'[Spring] > Program source (Spring)' 카테고리의 다른 글
[Spring] 20240109 [프로그램 소스] (1) | 2024.01.09 |
---|---|
[Spring] 20240108 [프로그램 소스] (1) | 2024.01.08 |
[Spring] 20240105 - [프로그램 소스] (0) | 2024.01.07 |