티스토리 뷰
처음 한번만, 환경설정까지 하나하나 다 해볼 것
(외우지 않아도 됨. 이해만)
1. Spring MVC 개요 | |
2. 실습환경 설정 | Apache 9 사용, 이클립스 등으로 MVC 환경 설정 |
3. 메이븐 프로젝트 생성 | 빈 프로젝트 생성 |
4. Spring Dispatcher를 Front 컨트롤러로 설정 | JSP할 때, 메인 서블릿과 같은 것. 직접 만들지 않음. 자동 생성됨 |
5. 스프링 컨트롤러 IndexController 작성 | 사용자 요청이 왔을 때, 어떤식으로 받아서 처리하는가? 알아볼 것 |
6. 정적파일 서비스 설정 | 스프링이 정적파일을 어떻게 관리하는가? |
7. tiles 설정 | 웹페이지 공통 분모 - 헤드 영역, 메뉴 영역, 푸터 영역 같은 것. (tag include - 디자이너가 웹페이지를 관리할 때) 최근 잘 안 쓰지만...그래도 쓰니까 해볼 것. |
8. 데이터베이스와 Service 객체 사용하기 | 차례차례 DI 하는 법? |
9. 스프링 설정파일 분리하기 | |
10. Anotation을 활용한 서비스 객체 DI | 내가 만든 건 Annotation 해보는 작업. |
1. MVC(Model, View, Controller)
보여지는 부분(View)과 데이터 처리(Controller)를 분리하는 방식. (*모델(Model)은 원래 분리되어 있음)
JSP할 때, DB 바로 접속했었음.
모델 객체 : entity. 데이터베이스 테이블 이름과 같은 것. - 처음부터 분리되어 있음.
XML 설정 | Java 설정 | |
servlet-context.xml | Spring MVC | servletConfig.class |
root-context.xml | Spring Core | rootConfig.class |
MyBatis | ||
DB |
(1) Spring MVC Process
MVC 모델 1 | MVC 모델2 |
JSP가 모든 역할 | JSP는 보여주는 역할 - View |
① 사용자 요청
② 톰캣 : 디스패쳐(Dispatcher)에게 URL에 해당하는 페이지 요청
③ Dispatcher가 요청에 따른 컨트롤러 선택해 실행토록(*요청에 따른 컨트롤러를 선택하도록 하는 것이 <url.mapping>)
④ 처리 결과를 돌려주면, Dispatcher가 뷰(JSP 페이지)를 선택해 결과를 만들어서 사용자에게 응답.
[ 사용자 ] | → | [ 톰캣 ] (web.xml) |
→ | [ Dispatcher ] | → | Controller 1 Controller 2 ... |
디스패쳐 서블릿 Model / View |
<url.mapping> -servlet.xml |
|||||
View(JSP 페이지) |
└Controller : 뷰(View)와 모델(Model)에 데이터를 실어서 디스패쳐에게 돌려줌.
└Dispatcher : 모델에 실어진 데이터를 뷰에 답아서 사용자에게 보여줌.
-JSP : front Servlet = spring : Dispatcher Servlet(스프링은 Dispatcher-servlet 제공)
*처음에만 메이븐 프로젝트로 설정을 하나하나 직접해보지만,
다음부터는 레거시 자동 생성으로 만들어진 것을 사용할 것임.
2. 환경설정
-스프링을 사용할 수 있도록 환경설정 / Java EE 상태
(1) 이클립스
Java EE 상태 >> New Project : Spring : Spring Legacy Project 생성 >> webmvc01 / Spring MVC Project >> download
(이거 먼저하려고 했는데, 안 되서 다른 것부터)
(2) 아파치 톰캣(Apache tomcat)
-톰캣 9 버전으로 사용할 예정(톰캣 설치 안 되어 있으면 9버전 다운 설치하면 되고 다른 버전이 있다면, 9버전 zip 다운받아서 압축해제만 해두면 됨.)
>> 톰캣 9 : 64-bit Windows zip (pgp, sha512)
>> 압축 해제 >> 원하는 경로에 apache-tomcat-9.0.59 폴더 옮겨두기
(집 : D:\setup\apache-tomcat-9.0.59)
(3) Java 11 다운로드 및 환경변수 설정
오라클 >> 제품(Product) >> Java >> Java 11 : 알집파일(.zip) 다운로드 >> 압축 해제
>> 경로 복사(C:\soyun\_setup\jdk-11.0.14_windows-x64_bin\jdk-11.0.14) - 빈 폴더가 보이는 위치까지
>> 고급 시스템 설정 >> 고급 >> 환경변수 >> 새로만들기
└변수 이름 : JAVA_HOME(자바를 여러 개 다운받을 수 있는데... JAVA_HOME은 디폴트값)
└변수 값 : JDK 경로 복사한 것 붙여넣기
>> 시스템 변수 - Path >> 기존의 자바 1.8 삭제 >> 새로만들기 : %JAVA_HOME%\bin 입력 >> 확인
(* 집 : D:\setup\jdk-11.0.14)
(4) Spring Tools 4 for Eclipse(STS) 다운로드
(*기존에 다운받은 STS이 있다면, STS RELEASE의 압축해제한 contents 폴더 삭제 : STS에서 설치하고 설정했던 것 삭제)
(contents.zip 압축 해제 → contents 폴더 >> release 폴더 : 작업환경(workspace) 폴더의 tools 폴더에 옮겨두기)
-새로 다운 및 설치
>> 구글링 STS >> Spring Tools 4 Suit for Eclipse 4.13.1 >> 다운받은 jar 파일 압축 해제 >> content.zip 압축 해제
>> RELEASE 폴더 통채로 워크스페이스(작업환경-spring 작업 프로젝트가 생성될)에 tools 폴더 만들어서 복사 붙여넣기
>> SpringToolSuite4.exe : 작업표시줄 고정, 바탕화면에 바로가기 보내기
>> STS 실행 : 작업환경(workspace) 설정 & 문자인코딩 설정(workspace / HTML / CSS / JSP)
(참고로, 이클립스랑 STS 작업공간을 같은 곳으로 설정할 경우 STS랑 이클립스틑 동시에 실행할 수 없음. )
*STS4는 스프링부트 최적화.
프로젝트 생성할 때, 스프링부트만 만들 수 있음. → 레거시 프로젝트, 메이븐 프로젝트를 오류없이 생성하기 위한 설정
(5) 레거시 프로젝트 생성을 위한 설치 및 환경 설정
(*레거시 프로젝트 : 일일이 설정할 필요없이 자동으로 설정되어 있는 프로젝트?)
예전에는 STS4만 설치하면 레거시 프로젝트는 생성할 수 있었음. JSP만 플러그인 해주면 됐었는데...
버전 업그레이드? 스프링부트 주력화하면서 동기화?가 잘 안 됨. 레거시 생성하려면 따로 플러그인 설치해줘야 함.
(5-1) 설치
-레거시 생성을 위한 설치
STS4 >> workspace 설정 : spring_work >> Help >> Eclipse Marketplace : sts 검색
>> Spring Tools 3 Add-One for Spring Tools4 3.9.21. RELEASE >> Confirm(다음) >> 설치 후 STS 자동 재시작
-JSP 생성을 위한 설치
STS4 >> Help >> Eclipse Marketplace >> Eclipse Web 검색
>> Eclipse Enterprise Java and Web Edveloper Tools 3.24(JSP 포함된 것) : 기본으로 체크된 것만 설치
>> 설치 후 STS 자동 재시작
// 레거시 프로젝트 생성 가능, JSP 파일 정상적 생성 가능
BUT) 스프링 레거시 프로젝트 : Spring MVC Project 생성하려고 하면 오류 → 환경설정
(5-2) 환경설정
-Exception initialize 오류 잡기
sts-4.13.1.RELEASE 폴더 >> SpringToolSuite4.ini 메모장 열기 >>JDK 11 경로를 -vm 새로 입력해서 추가 후 저장
-vm C:\soyun\_setup\jdk-11.0.14_windows-x64_bin\jdk-11.0.14\bin\javaw.exe |
-(JDK를 옮겨두었던) 경로\javaw.exe
(*집 : D:\setup\jdk-11.0.14\bin\javaw.exe)
-Convert 안 되는 오류 잡기
STS4 우클릭 속성 >> 대상 맨끝에 -clean 입력 >> 저장
C:\soyun\work\tools\sts-4.13.1.RELEASE\SpringToolSuite4.exe -clean
(6) 레거시 프로젝트 생성
-위의 과정을 제대로 이행했다면, 생성할 수 없던 오류 사라짐. 생성 가능.
파일 >> 프로젝트 생성 >> 스프링 >> 스프링 레거시 프로젝트 : 스프링 MVC Project 생성 / 이름 : t01
입력 : com.wsy.promvc
기타 설정 입력할 필요없이 알아서 만들어줌. pom.xml
3. 메이븐 프로젝트
-일일이 설정해보는 것. 필요한 것을 하나하나 입력해줌.
(1) 프로젝트 생성 및 설정
-Group Id : com.wsy
-Artifact Id : maven_webmvc
-packaging : WAR
(1-2) pom.xml 오류 잡기
메이븐 프로젝트 생성했을 때, pom.xml의<packaging>war</packaging> Error가 오류났던 이유 :
web.xml이 없어서 오류나는 것. >> 맞는 버전의 톰캣의 WEB-INF 복사 붙여넣기
>> (설치한) 톰캣9 - apache-tomcat-9.0.59 >> webapp >> ROOT >> WEB-INF 폴더 복사
>> STS의 프로젝트(maven_webmvc)의 src/main/webapp 폴더에 붙여넣기
(1-3) pom.xml에 입력 - 필요한 것들 준비하라고
pom.xml >> 아래 탭 메뉴 중 overview >> property : create >>
-Name : maven.compriler.source
-Value : 11
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.wsy</groupId>
<artifactId>maven_webmvc</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<!-- overview에서 create함으로써 자동 생성 -->
<maven.compiler.source>11</maven.compiler.source>
<!-- 위 코드 복붙해서 수정 : source → target -->
<maven.compiler.target>11</maven.compiler.target>
</properties>
</project>
(1-4) maven repository - 필요 라이브러리 추가
구글링 : maven repository >> tomcat-api, spring-webmvc 코드 복사 >> pom.xml
>> </packaging> 태그 아래에 <dependencies> 태그 만들어서 붙여넣기
-tomcat-api : 설치한 톰캣 버전에 맞는 것 : 9.0.59
-spring-webmvc : 최신버전인 5.2.19.RELEASE
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.wsy</groupId>
<artifactId>maven_webmvc</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.apache.tomcat/tomcat-api -->
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-api</artifactId>
<version>9.0.59</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.19.RELEASE</version>
</dependency>
</dependencies>
<properties>
<!-- overview에서 create함으로써 자동 생성 -->
<maven.compiler.source>11</maven.compiler.source>
<!-- 위 코드 복붙해서 수정 : source → target -->
<maven.compiler.target>11</maven.compiler.target>
</properties>
</project>
(*STS >> Window >> perspective > Open perspective > Other : maven repository)
(1-5) Servers(서버) 설정
있다면 그대로 사용해도 되고, 삭제 후 재설정해도 됨.
서버 경로 : bin 폴더가 보이는 곳까지
(*학원 : C:\soyun\_setup\apache-tomcat-9.0.59)
(*집 : D:\setup\apache-tomcat-9.0.59)
(2) JSP 생성
src/main/webapp >> index.jsp 생성
(*만약 포트 충돌나면, 포트번호 수정하면 됨. 8080은 웹 오라클이 쓰는 번호)
>> 결과 출력
Hi |
Hi만 출력되는 이유는 ${ data }의 data 값을 설정하지 않아서.
사용자 요청이 있을 때,
사용자 요청을 받아주는 서블릿(적합한 컨트롤러 실행토록 하고, 결과를 돌려주는)이 필요.
(3) Dispatcher
스프링이 제공하는 Disptacher 사용하겠다고 선언(?)해줘야 함.
프로젝트 >> maven dependencies >> spring-webmvc-5.2.19 RELEASE >> org.springframework.web.servlet
>> DispatcherServlet.class 우클릭 >> copy qualified name
>> 현재 프로젝트 >> src/main/webapp >> web.xml 파일에서 아래와 같이 설정
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0"
metadata-complete="true">
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<!-- 어떤 서블릿 url을 통과시키는가? 통과시킬 ??-->
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<display-name>Welcome to Tomcat</display-name>
<description>
Welcome to Tomcat
</description>
</web-app>
(3-2) url에 맞는 컨트롤러를 선택하도록 하는 작업 : IndexController 클래스 생성
-source folder : maven_webmvc/src/main/java
-package : com.wsy.webmvc.controller
-name : IndexController
>> implements Controller 입력 >> import >> 추상메소드 구현
>>
package com.wsy.webmvc.controller;
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 IndexController implements Controller {
//리턴형이 ModelAndView
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
//객체 생성
ModelAndView mv = new ModelAndView();
mv.addObject("data", "Hello Spring MVC!");
//index.jsp에 입력했던 ${data}에 Hello Spring MVC!를 넣는다는 의미
mv.setViewName("index.jsp");
//index.jsp에 데이터를 보낸다는 의미
//index.jsp 위치 : webapp(루트 폴더)
return mv;
//연결해줘야 함(요즘엔 자동으로 연결해줌.)
//이 컨트롤러를 선택하도록 설정. 로컬호스트(localhost)에서 index입력하면 선택되도록.
}
}
(*경로 설정 : 맨앞에 슬래시(/)를 붙이면 루트 폴더(webapp)에서부터 찾음. 맨앞에 슬래시를 붙여주는게 좋음)
(*메이븐 프로젝트에서 루트 폴더 : webapp)
→ localhost에서 index 입력하면 선택되도록(이 컨트롤러 선택하도록) 설정
(3-3) dispatcher-servlet.xml 생성
src/main/webapp >> WEB-INF : xml 파일 생성 : dispatcher-servlet.xml
(이름 설정 중요함)
<?xml version="1.0" encoding="UTF-8"?>
<!-- 코드는 수업자료에서 복붙 -->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- (4)번에서 만든 IndexController를 빈으로 만듦 -->
<bean id="/index" class="com.wsy.webmvc.controller.IndexController"/>
</beans>
>> 실행(Run As)
index.jsp | Hi |
메이븐 프로젝트 : maven_webmvc 우클릭 >> Run As |
http://localhost:8080/maven_webmvc/index |
Hi Hello Wpring MVC! |
(4) 컨텐트, 리스트 페이지 생성 및 연결
(4-1) JSP 페이지 생성
webapp(루트) 폴더에 생성
<!--List.jsp-->
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>List Page</title>
</head>
<body>
<p>List Page</p>
</body>
</html>
<!--Content.jsp-->
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Content Page</title>
</head>
<body>
<p>Content Page</p>
</body>
</html>
(4-2) Controller 클래스 생성 - ListController.java, ContentController.java
//ListController
package com.wsy.webmvc.controller;
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 ListController implements Controller {
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
return new ModelAndView("list.jsp");
}
}
//ContentController
package com.wsy.webmvc.controller;
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 ContentController implements Controller {
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
return new ModelAndView("content.jsp");
}
}
(6-3) 빈(bean) 등록 - dispatcher-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- 코드는 수업자료에서 복붙 -->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- (4)번에서 만든 IndexController를 빈으로 만듦 -->
<bean id="/index" class="com.wsy.webmvc.controller.IndexController"/>
<!-- (6-3) -->
<bean id="/list" class="com.wsy.webmvc.controller.ListController"/>
<bean id="/content" class="com.wsy.webmvc.controller.ContentController"/>
</beans>
>> 실행(Run As) : 결과 출력
http://localhost:8081/maven_webmvc/list | content | index 확인
→ 페이지 정상적으로 연결되는 것 확인
(7) 외부 접근 차단
원래 실행은 메이븐 프로젝트로 실행(Run As)하는 것 권유.
jsp 파일로도 실행되는데 jsp 파일로 실행되지 않도록 막는 법 : 외부에서 들여다 볼 수 없는 위치 이동.
>> WEB-INF/view/board 폴더 생성 >> list.jsp, content.jsp 옮기기
>> WEB-INF/view 폴더로 index.jsp 이동
>> index.jsp, list.jsp, content.jsp 접근하기위해 Index/List/ContentController 수정
//IndexController
package com.wsy.webmvc.controller;
...import...
public class IndexController implements Controller {
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
ModelAndView mv = new ModelAndView();
mv.addObject("data", "Hello Spring MVC!");
mv.setViewName("/WEB-INF/view/index.jsp");
return mv;
}
}
//ListController
package com.wsy.webmvc.controller;
...import...
public class ListController implements Controller {
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
return new ModelAndView("/WEB-INF/view/board/list.jsp");
}
}
//ContentController
package com.wsy.webmvc.controller;
...import...
public class ContentController implements Controller {
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
return new ModelAndView("/WEB-INF/view/board/content.jsp");
}
}
└import 생략(공간 차지를 줄이기 위해)
└슬래시(/)는 루트 폴더(webapp)부터 적어줌.
>> 출력 : 메이븐 프로젝트 실행(Run As)
http://localhost:8081/maven_webmvc/ (+) index | list | content 입력해서 해당 JSP 페이지로 이동하는지 확인
(8) 경로 간소화
현재 경로 설정하는데 중복이 많음. 그것을 간소화하는 방법
//IndexController
mv.setViewName("/WEB-INF/view/index.jsp");
//ListController
return new ModelAndView("/WEB-INF/view/board/list.jsp");
//ContentController
return new ModelAndView("/WEB-INF/view/board/content.jsp");
>> Controller에서 공통 부분 생략
(8-1) Index/List/ContentController
//IndextController
package com.wsy.webmvc.controller;
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 IndexController implements Controller {
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
ModelAndView mv = new ModelAndView();
mv.addObject("data", "Hello Spring MVC!");
mv.setViewName("index"); //논리 view name
//prefix와 suffix로 진짜 이름 만든다. ResourceViewResolver 이용.
//dispatcher-servlet.xml
return mv;
}
}
//ListController
package com.wsy.webmvc.controller;
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 ListController implements Controller {
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
return new ModelAndView("board/list");
}
}
//ContentController
package com.wsy.webmvc.controller;
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 ContentController implements Controller {
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
return new ModelAndView("board/content");
}
}
(8-2) dispatcher-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- 코드는 수업자료에서 복붙 -->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- xml은 오타를 안 잡아주기 때문에 자바의 자동입력기능 활용 -->
<!-- 임의의 클래스에서 InternalResource... 자동완성 후, import한 것의 일부분 가져오기 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- prefix는 경로, suffix는 확장자 -->
<property name="prefix" value="/WEB-INF/view/"/>
<property name="suffix" value=".jsp"/>
<property name="order" value="1"/>
<!-- 컨트롤러에 의해 리턴받는 방법이 여러 가지가 있는데, 위의 방법을 첫번째로 쓰겠단 의미 -->
<!-- 논리 네임을 찾는 여러 가지 방법 중에서 위의 방법을 첫번째로 쓰겠다는 의미 -->
</bean>
<!-- (4)번에서 만든 IndexController를 빈으로 만듦 -->
<bean id="/index" class="com.wsy.webmvc.controller.IndexController"/>
<!-- (6-3) -->
<bean id="/list" class="com.wsy.webmvc.controller.ListController"/>
<bean id="/content" class="com.wsy.webmvc.controller.ContentController"/>
</beans>
>> 출력 : 메이븐 프로젝트 실행(Run As)
http://localhost:8081/maven_webmvc/ (+) index | list | content 입력해서 해당 JSP 페이지로 이동하는지 확인
(9) 정적인 파일
img나 css 파일 쓰는 법(*mytemplete 자료 이용)
-board 폴더 >> images 폴더 붙여넣기(이미지 자료 함께)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>List Page</title>
</head>
<body>
<p>List Page</p>
<img src="images/kirby1.jpg"/> <!--원래 이미지 참조하는 방식-->
</body>
</html>
└원래 이미지 참조하는 방식으로 하면 경로가 맞게 설정되어 있다고 해도 엑박
왜냐하면, Spring에서는 정적 파일을 막아두었기 때문
<!--web.xml-->
<!-- 어떤 서블릿 rul을 통과시키는가? -->
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
/ | /* |
정적 파일 실행 막음 | 정적 파일 실행 막음 + jsp 파일 실행 막음 |
└정적 파일 실행(막아둔 정적 파일 실행을 해제)하려면 <mvc:resources> 등록
(9-1) 정적인 파일 실행하도록
-dispatcher-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- 코드는 수업자료에서 복붙 -->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/view/"/>
<property name="suffix" value=".jsp"/>
<property name="order" value="1"/>
</bean>
<mvc:resources location="resources" mapping="/**" />
<bean id="/index" class="com.wsy.webmvc.controller.IndexController"/>
<bean id="/list" class="com.wsy.webmvc.controller.ListController"/>
<bean id="/content" class="com.wsy.webmvc.controller.ContentController"/>
</beans>
-list.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>List Page</title>
</head>
<body>
<p>List Page</p>
<!--경로설정 1-->
<img src="resources/images/kirby1.jpg"/>
<!-- dispatcher-servlet : <mvc:resources location="resources" mapping="/**" />
<bean id="/list" class="com.wsy.webmvc.controller.ListController"/>
호출 : http://localhost:8080/maven_webmvc/list -->
<!--경로설정 2--><!--엑박 뜨는데?-->
<img src="../resources/images/kirby1.jpg"/>
<!-- dispatcher-servlet : <mvc:resources location="resources" mapping="/**" />
<bean id="/list" class="com.wsy.webmvc.controller.ListController"/>
호출 : http://localhost:8080/maven_webmvc/list -->
<!--절대 경로-->
<img src="images/kirby1.jpg"/>
<!-- dispatcher-servlet : <mvc:resources location="/resources/" mapping="/**" />
<bean id="/list" class="com.wsy.webmvc.controller.ListController"/>
호출 : http://localhost:8080/maven_webmvc/list -->
</body>
</html>
>> 출력 : 메이븐 프로젝트 실행(Run As)
http://localhost:8081/maven_webmvc/list 입력해서 해당 JSP 페이지로 이동하는지 확인
(경로 2번이 안 되는데? 확인 필요)
(10) tiles
헤더, 푸터, 메뉴는 변하지 않고 내용만 바뀌는 것. <jsp:include >랑 비슷
하나의 레이아웃을 만들어 변경되는 내용만 바꿔치기. 최근에는 잘 안 씀(2017년 이후 업뎃 없음)
→ include 방식 사용(페이지가 바뀔 때마다 공통부분을 include / 기존 모델2 방식)
*페이지 구조를 그리는 게 front로 옮겨가는 게 추세. 타일은 비중 점차 약화?!
(10-1) 소스 복사 붙여넣기
>> mytemplete 자료 사용 : css, js 폴더 복사 >> webapp >> resources 폴더 붙여넣기
>> index, board 폴더의 List, Content HTML 파일 코드를 <head> 이후 복사해서 바꿔치기
>> dispatcher-servlet.xml 경로 수정
<?xml version="1.0" encoding="UTF-8"?>
<!-- 코드는 수업자료에서 복붙 -->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/view/"/>
<property name="suffix" value=".jsp"/>
<property name="order" value="1"/>
</bean>
<mvc:resources location="resources" mapping="/**" />
<bean id="/index" class="com.wsy.webmvc.controller.IndexController"/>
<bean id="/board/list" class="com.wsy.webmvc.controller.ListController"/> <!--★-->
<bean id="/board/content" class="com.wsy.webmvc.controller.ContentController"/> <!--★-->
</beans>
>> Controller는 수정하지 않았음.
//List
package com.wsy.webmvc.controller;
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 ListController implements Controller {
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
return new ModelAndView("board/list");
}
}
//Content
package com.wsy.webmvc.controller;
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 ContentController implements Controller {
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
return new ModelAndView("board/content");
}
}
>> 출력 : 메이븐 프로젝트 실행(Run As)
>> http://localhost:8081/maven_webmvc/ (+) index | list | content 입력해서 해당 JSP 페이지로 이동하는지 확인
(현재 write 만들지 않아서 없음)
(10-2) tiles 지시서 작성 전에, 페이지 쪼개기
-list.jsp 예시)
① <nav> 태그 잘라내기 >> view 폴더 - inc 폴더 생성 >> header.jsp 생성해서 붙여넣기
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<nav class="navbar navbar-expand-lg navbar-light bg-light">
<div class="container">
<a class="navbar-brand" href="/index.html"> <i
class="material-icons align-middle">android</i> <span
class="align-middle">Logo</span>
</a>
<button class="navbar-toggler" type="button" data-toggle="collapse"
data-target="#navbarSupportedContent"
aria-controls="navbarSupportedContent" aria-expanded="false"
aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav mr-auto">
<li class="nav-item active"><a class="nav-link"
href="/index.html">Home</a></li>
<li class="nav-item"><a class="nav-link"
href="/member/join.html">회원가입</a></li>
<li class="nav-item"><a class="nav-link"
href="/member/login.html">로그인</a></li>
<li class="nav-item"><a class="nav-link" href="#">로그아웃</a></li>
<li class="nav-item dropdown"><a
class="nav-link dropdown-toggle" href="#" id="navbarDropdown"
role="button" data-toggle="dropdown" aria-haspopup="true"
aria-expanded="false"> 내정보 관리 </a>
<div class="dropdown-menu" aria-labelledby="navbarDropdown">
<a class="dropdown-item" href="#">비밀번호 변경</a> <a
class="dropdown-item" href="#">내정보 수정</a>
<div class="dropdown-divider"></div>
<a class="dropdown-item" href="#">회원탈퇴</a>
</div></li>
<li class="nav-item dropdown"><a
class="nav-link dropdown-toggle" href="#" id="navbarDropdown"
role="button" data-toggle="dropdown" aria-haspopup="true"
aria-expanded="false"> 게시판 </a>
<div class="dropdown-menu" aria-labelledby="navbarDropdown">
<a class="dropdown-item" href="/board/boardList.html">게시판</a>
<div class="dropdown-divider"></div>
<a class="dropdown-item" href="#">갤러리</a>
</div></li>
<li class="nav-item dropdown"><a
class="nav-link dropdown-toggle" href="#" id="navbarDropdown"
role="button" data-toggle="dropdown" aria-haspopup="true"
aria-expanded="false"> 채팅 서비스 </a>
<div class="dropdown-menu" aria-labelledby="navbarDropdown">
<a class="dropdown-item" href="#">심플 채팅</a>
<div class="dropdown-divider"></div>
<a class="dropdown-item" href="#">채팅방 목록</a>
</div></li>
<li class="nav-item"><a class="nav-link disabled" href="#"
tabindex="-1" aria-disabled="true">Disabled</a></li>
</ul>
<form class="form-inline my-2 my-lg-0">
<input class="form-control mr-sm-2" type="search" placeholder="검색"
aria-label="Search">
<button class="btn btn-outline-success my-2 my-sm-0" type="submit">검색</button>
</form>
</div>
</div>
</nav>
② <footer> 태그 잘라내기 >> view 폴더 > inc 폴더 >> footer.jsp 생성 후 붙여넣기
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<footer class="mt-5 py-5 bg-warning">
<div class="container">
<div class="row">
<div class="col-12 col-md">
<i class="material-icons display-4">android</i> <small
class="d-block mb-3 text-muted">© 2017-2021</small>
</div>
<div class="col-6 col-md">
<h5>Features</h5>
<ul class="list-unstyled text-small">
<li><a class="text-muted" href="#">Cool stuff</a></li>
<li><a class="text-muted" href="#">Random feature</a></li>
<li><a class="text-muted" href="#">Team feature</a></li>
<li><a class="text-muted" href="#">Stuff for developers</a></li>
<li><a class="text-muted" href="#">Another one</a></li>
<li><a class="text-muted" href="#">Last time</a></li>
</ul>
</div>
<div class="col-6 col-md">
<h5>Resources</h5>
<ul class="list-unstyled text-small">
<li><a class="text-muted" href="#">Resource</a></li>
<li><a class="text-muted" href="#">Resource name</a></li>
<li><a class="text-muted" href="#">Another resource</a></li>
<li><a class="text-muted" href="#">Final resource</a></li>
</ul>
</div>
<div class="col-6 col-md">
<h5>About</h5>
<ul class="list-unstyled text-small">
<li><a class="text-muted" href="#">Team</a></li>
<li><a class="text-muted" href="#">Locations</a></li>
<li><a class="text-muted" href="#">Privacy</a></li>
<li><a class="text-muted" href="#">Terms</a></li>
</ul>
</div>
</div>
</div>
</footer>
③ Vertical Nav 태그 잘라내기 >> view 폴더 - board 폴더 - inc 폴더 >> menu.jsp 생성 후 붙여넣기
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<ul class="nav flex-column nav-pills">
<li class="nav-item"><a class="nav-link active" href="#">Active</a>
</li>
<li class="nav-item"><a class="nav-link" href="#">Link</a></li>
<li class="nav-item"><a class="nav-link" href="#">Link</a></li>
<li class="nav-item"><a class="nav-link disabled" href="#"
tabindex="-1" aria-disabled="true">Disabled</a></li>
</ul>
④ list.jsp를 복사해서 view/board/inc 붙여넣기 >> list.jsp 리네임 : layout.jsp
>> Contents area 내용 잘라내기 >> list.jsp에 붙여넣기
<!--layout.jsp-->
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<!-- Google Fonts and Icons -->
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
<!-- Bootstrap CSS -->
<link rel="stylesheet" href="../resources/css/bootstrap.css">
</head>
<body>
<!-- Navbar nav.fixed-top -->
<!-- end of Navbar -->
<!-- middle container -->
<div class="container mt-4">
<div class="row">
<!-- Left Menu -->
<div class="col-sm-3">
<!-- Vertical Nav -->
<!-- end of Vertical Nav -->
</div>
<!-- end of Left Menu -->
<!-- Right area -->
<div class="col-sm-9">
<!-- Contents area -->
<!-- end of Contents area -->
</div>
<!-- end of Right area -->
</div>
</div>
<!-- end of middle container -->
<!-- FOOTER -->
<!-- end of FOOTER -->
<!-- JavaScript -->
<script src="/resources/js/jquery-3.6.0.js"></script>
<script src="/resources/js/bootstrap.js"></script>
</body>
</html>
<!--list.jsp-->
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<div class="border border-info p-4 rounded">
<h5>게시판 글목록</h5>
<hr class="featurette-divider">
<!-- 새글쓰기 버튼 -->
<button type="button" class="btn btn-primary btn-sm float-right my-3"
onclick="location.href = '/board/boardWrite.html';">
<i class="material-icons align-middle">create</i> <span
class="align-middle">새글쓰기</span>
</button>
<div class="clearfix"></div>
<!-- 글목록 테이블 -->
<table class="table table-hover" id="board">
<thead>
<tr>
<th scope="col" class="text-center">번호</th>
<th scope="col" class="text-center">제목</th>
<th scope="col" class="text-center">작성자</th>
<th scope="col" class="text-center">작성일</th>
<th scope="col" class="text-center">조회수</th>
</tr>
</thead>
<tbody>
<tr>
<td class="text-center">10</td>
<td><a href="/board/boardContent.html">Lorem ipsum dolor
sit amet, consectetur adipiscing elit.</a></td>
<td class="text-center">user1</td>
<td class="text-center">2021.08.20</td>
<td class="text-center">15000</td>
</tr>
<tr>
<td class="text-center">9</td>
<td>Vivamus viverra porttitor commodo.</td>
<td class="text-center">user1</td>
<td class="text-center">2021.08.20</td>
<td class="text-center">150</td>
</tr>
<tr>
<td class="text-center">8</td>
<td>In pulvinar fermentum erat a tincidunt. Nulla id magna sit
...</td>
<td class="text-center">user1</td>
<td class="text-center">2021.08.20</td>
<td class="text-center">15000</td>
</tr>
<tr>
<td class="text-center">7</td>
<td>Sed diam velit, dictum a iaculis sed, tempor sed mi.</td>
<td class="text-center">user1</td>
<td class="text-center">2021.08.20</td>
<td class="text-center">150</td>
</tr>
<tr>
<td class="text-center">6</td>
<td>Nullam ac dignissim diam. Mauris vitae magna ipsum,</td>
<td class="text-center">user1</td>
<td class="text-center">2021.08.20</td>
<td class="text-center">15</td>
</tr>
<tr>
<td class="text-center">5</td>
<td>eget vehicula metus. In euismod sollicitudin lorem eu.</td>
<td class="text-center">user1</td>
<td class="text-center">2021.08.20</td>
<td class="text-center">15000</td>
</tr>
<tr>
<td class="text-center">4</td>
<td>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</td>
<td class="text-center">user1</td>
<td class="text-center">2021.08.20</td>
<td class="text-center">1500</td>
</tr>
<tr>
<td class="text-center">3</td>
<td>Vivamus viverra porttitor commodo.</td>
<td class="text-center">user1</td>
<td class="text-center">2021.08.20</td>
<td class="text-center">15</td>
</tr>
<tr>
<td class="text-center">2</td>
<td>In pulvinar fermentum erat a tincidunt. Nulla id magna sit
...</td>
<td class="text-center">user1</td>
<td class="text-center">2021.08.20</td>
<td class="text-center">15</td>
</tr>
<tr>
<td class="text-center">1</td>
<td>Nullam ac dignissim diam. Mauris vitae magna ipsum,</td>
<td class="text-center">user1</td>
<td class="text-center">2021.08.20</td>
<td class="text-center">150</td>
</tr>
</tbody>
</table>
<!-- pagination area -->
<nav aria-label="Page navigation example">
<ul class="pagination justify-content-center my-4">
<li class="page-item disabled"><a class="page-link"
href="#board">이전</a></li>
<li class="page-item active"><a class="page-link" href="#board">1</a></li>
<li class="page-item"><a class="page-link" href="#board">2</a></li>
<li class="page-item"><a class="page-link" href="#board">3</a></li>
<li class="page-item"><a class="page-link" href="#board">4</a></li>
<li class="page-item"><a class="page-link" href="#board">5</a></li>
<li class="page-item"><a class="page-link" href="#board">다음</a></li>
</ul>
</nav>
<!-- end of pagination area -->
<hr class="featurette-divider">
<!-- Search area -->
<form class="form-inline justify-content-center my-4">
<div class="form-group mx-3">
<label for="searchType">검색 조건</label> <select
class="form-control mx-2" id="searchType" name="type">
<option value="" disabled selected>--</option>
<option value="T">제목</option>
<option value="C">내용</option>
<option value="W">작성자</option>
</select>
</div>
<label for="searchKeyword">검색어</label> <input type="search"
class="form-control mb-2 mr-sm-2 mx-2" id="searchKeyword"
placeholder="검색어" name="keyword">
<button type="submit" class="btn btn-primary mb-2">
<i class="material-icons align-middle">search</i> <span
class="align-middle">검색</span>
</button>
</form>
<!-- end of Search area -->
</div>
(+) content.jsp, write.jsp도 똑같이 해주기. contents area만 남기기
(10-3) Tiles 지시서
Apache Tiles - Home >> documentation >> 3.0 >> tutorial >> creating tile page >> create a definition의 코드 복사
>> WEB-INF 폴더 우클릭 >>xml 파일 생성 >> tiles.xml 생성한 뒤 붙여넣기
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE tiles-definitions PUBLIC
"-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN"
"http://tiles.apache.org/dtds/tiles-config_3_0.dtd">
<tiles-definitions>
<!-- 내 프로젝트에 맞게 수정 -->
<!-- Controller 경로 설정에서 슬래시(/)만 점(.)으로 변경 -->
<!-- template="위치/파일이름" -->
<definition name="board.list" template="/WEB-INF/view/board/inc/layout.jsp">
<put-attribute name="title" value="Tiles tutorial homepage" />
<put-attribute name="header" value="/WEB-INF/view/inc/header.jsp" />
<put-attribute name="menu" value="/WEB-INF/view/board/inc/menu.jsp" />
<put-attribute name="body" value="/WEB-INF/view/board/list.jsp" />
<put-attribute name="footer" value="/WEB-INF/view/inc/footer.jsp" />
</definition>
</tiles-definitions>
(10-4) maven_repository
-JSTL
JSTL 검색 >> 4번 JavaServer Pages(TM) Standard Tag Library >> javax.servlet.jsp.jstl >> 버전 1.2 >> 코드 복사 >> pom.xml에 붙여넣기
-Tiles jsp support
tiles jsp support 검색 >> 3.0.8 : 코드 그룹아이디가 org.apache.tiles인 것 >> 코드 복사해서 pom.xml 붙여넣기
→ layout.jsp에서 uri 설정 자동완성됨. (*자동완성된다는 것은 필요한 jstl이 준비되었다는 뜻)
(10-5) layout.jsp에서 tiles 설정하기
tiles.xml에서 설정한 이름과 같아야 함.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles" %>
<!-- pome.xml에 javax.servlet과 tiles 넣어줘야 함. -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<!-- Google Fonts and Icons -->
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
<!-- Bootstrap CSS -->
<link rel="stylesheet" href="../resources/css/bootstrap.css">
</head>
<body>
<!-- Navbar nav.fixed-top -->
<tiles:insertAttribute name="header"/> <!--★-->
<!-- end of Navbar -->
<!-- middle container -->
<div class="container mt-4">
<div class="row">
<!-- Left Menu -->
<div class="col-sm-3">
<!-- Vertical Nav -->
<tiles:insertAttribute name="menu"/> <!--★-->
<!-- end of Vertical Nav -->
</div>
<!-- end of Left Menu -->
<!-- Right area -->
<div class="col-sm-9">
<!-- Contents area -->
<tiles:insertAttribute name="body"/> <!--★-->
<!-- end of Contents area -->
</div>
<!-- end of Right area -->
</div>
</div>
<!-- end of middle container -->
<!-- FOOTER -->
<tiles:insertAttribute name="footer"/> <!--★-->
<!-- end of FOOTER -->
<!-- JavaScript -->
<script src="/resources/js/jquery-3.6.0.js"></script>
<script src="/resources/js/bootstrap.js"></script>
</body>
</html>
>> ListController 수정
package com.wsy.webmvc.controller;
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 ListController implements Controller {
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
// return new ModelAndView("board/list"); //viewResolver 사용
return new ModelAndView("board.list"); //tiles 사용
}
}
>> dispatcher-servlet.xml 수정
(기존에) 요청이 들어오면, 디스패쳐-서블릿이 뷰리졸브로 처리.
타일로 찾아가는 방법은 어떻게?
dispatcher-sevlet.xml에서 xml에서 일일이 치지말고 아무 클래스 가서 자동완성해서 임포트 내용만 카피
urlbaseviewresolver : org.springframework.web.servlet.view.UrlBasedViewResolver
tilesviewresolver : org.springframework.web.servlet.view.tiles3.TilesView
TilesConfigurer : org.springframework.web.servlet.view.InternalResourceViewResolver
<?xml version="1.0" encoding="UTF-8"?>
<!-- 코드는 수업자료에서 복붙 -->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/view/"/>
<property name="suffix" value=".jsp"/>
<property name="order" value="2"/>
</bean>
<bean class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.tiles3.TilesView"/>
<property name="order" value="1"/>
</bean>
<bean class="org.springframework.web.servlet.view.tiles3.TilesConfigurer">
<property name="definitions" value="/WEB-INF/tiles.xml" /> <!-- 파일 위치 -->
</bean>
<mvc:resources location="resources" mapping="/**" />
<bean id="/index" class="com.wsy.webmvc.controller.IndexController"/>
<bean id="/board/list" class="com.wsy.webmvc.controller.ListController"/>
<bean id="/board/content" class="com.wsy.webmvc.controller.ContentController"/>
</beans>
(+) content랑 write까지 변경
(...변경한 내용 추후 추가...)
>> 출력 : 메이븐 프로젝트 실행(Run As)
http://localhost:8081/maven_webmvc/board/ (+) index | list | content 입력해서 해당 JSP 페이지로 이동하는지 확인
(10-6) Content, Write도 tiles로 해보기
...
(10-7) tiles.xml 간단하게 쓰는 법.
...
(10-8) index도 해보기
...
layout 만들어서 잘라내야 함. 위의 과정 반복.
오늘 했던 설정들을
내일은 자동설정으로 사용해볼 것. - legacy Project
END
'수업 > └Spring Framework' 카테고리의 다른 글
[04]웹 게시판 CRUD 클론_1차 (0) | 2022.03.07 |
---|---|
[04]웹 게시판(CRUD)_1차 (0) | 2022.03.04 |
[03_2]Spring MVC - Legacy Project (0) | 2022.03.03 |
[02]의존성 주입 - 인터페이스, XML, Annotation, Java Configuration (0) | 2022.02.25 |
[00]스프링 프레임워크 수업 개요와 개념 (0) | 2022.02.25 |
- Total
- Today
- Yesterday
- 변수
- improt
- 기본선택자
- html a tag
- typeof
- css
- 입력양식
- html atrribute
- 외부구성요소
- border-spacing
- ScriptTag
- html input type
- html layout
- A%B
- selcetor
- 미디어 태그
- 스크립태그
- input type 종류
- html pre
- caption-side
- initialized
- html
- JavaScript
- Java
- empty-cell
- text formatting
- BAEKJOON
- scanner
- html base tag
- CascadingStyleSheet
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |