Spring boot 없이 Maven 프로젝트에 톰캣, jsp, Spring 얹어 웹 개발하기
1. javaEE로 Maven 프로젝트 생성
(기본아키타입, package war로 변경)
2. 톰캣 web.xml 파일 복사해서 web-inf 경로에 위치
(pom.xml에 톰캣api DI)
(라이브러리 설치 편하게 하기 위해 미리 maven index 리빌드)
3. pom.xml에서 jdk 버전 설정
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
pom.xml에 이러한 에러가 뜰 경우
1 line : Could not initialize class org.apache.maven.plugin.war.util.WebappStructureSerializer
<build>
<plugins>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
</plugin>
</plugins>
</build>
빌드에 maven.plugin.war을 넣어준다. (maven update)
4. 프로젝트 설정에서 루트 웹 경로에서 프로젝트명 제거 (/프로젝트 => /)
(이미 서버 실행환경을 구성했다면 서버를 지우고 다시 구성해준다)
5. 프로젝트 설정 리소스 인코딩 방식 utf-8로 변경. Window preference 설정에서 html,css,jsp 파일 인코딩 생성 방식도 모두 변경
6. 실험삼아 webapp에 index.jsp 만들어서 실행(하는 김에 톰캣 서버 실행환경 구축도 해줌)
-브라우저 맘에 안들면 window 탭에서 브라우저 변경
7. Spring web을 DI 해야하는데 Spring web MVC 찾아서 DI 하면 web도 필요해서 알아서 필요한 라이브러리들 다 찾아서 설치해줌
8. 그외 jsp, jstl 등 없으면 필요한거 찾아서 설치해주고 Spring mvc 방식에 따라 주소 맵핑시켜주면 됨
Spring MVC
MVC model2 방식의 변화 : Dispatcher를 집중화 한 후의 모델
View(jsp), Dispatcher(dispatcher-servlet.xml), Controller로 나누기
(POJO : Plain Old Java Object)
-특정한 라이브러리나 프레임워크에 종속되지 않은 순수한 자바 객체 (getter,setter 등만 사용하는)
web.xml에서 모든 url을 dispatcher-servlet로 던져주고 dispatcher-servlet에서 url들을 맵핑시킨다.
(Controller와 View(jsp(url))을 dispatcher-servlet으로 객체화, 부품화 시켜 모듈화 할 수 있게 해주겠다는 것)
먼저 WEB-INF에 dispatcher-servlet.xml 이라는 파일을 만들어준다
https://docs.spring.io/spring-framework/docs/
dispatcher-servlet.xml 작성 레퍼런스 참조 사이트
사용하는 Spring framework 버전을 찾아 ref document 웹페이지를 찾아 들어간다
(버전마다 다르므로 자신이 pom에 더함충한 Spring version을 알아보자)
DI를 하는 부분이므로 Core > Ioc container 관련된 탭을 뒤져서 Configuration Metadata를 뒤적거리면 example을 찾아 볼 수 있다
ex)
https://docs.spring.io/spring-framework/docs/5.2.x/spring-framework-reference/core.html#beans-factory-metadata
The following example shows the basic structure of XML-based configuration metadata:
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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="..." class="...">
<!-- collaborators and configuration for this bean go here -->
</bean>
<bean id="..." class="...">
<!-- collaborators and configuration for this bean go here -->
</bean>
<!-- more bean definitions go here -->
</beans>
복 to the 붙 필요없는 <bean id="..." class="..."> 이딴건 지우고 XML로 DI 하는 방식으로 쓰면된다
[ example ]
<bean name="/index" class="com.newlecture.web.controller.IndexController" />
<bean name="/notice/list" class="com.newlecture.web.controller.notice.ListController">
<property name="noticeService" ref="noticeService" />
</bean>
<bean name="/notice/detail" class="com.newlecture.web.controller.notice.DetailController" />
다른 점은 bean의 name이 객체의 사용하려는 변수가 아닌 바로 url이 됨
class 속성이 class 경로인건 똑같다
아직 톰캣의 web.xml이 url을 받아 처리하고 있으니 spring에서 지원하는 dispatcher로
url을 맵핑 시켜줘야 한다
[ web.xml ]
<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>/</url-pattern>
</servlet-mapping>
org.springframework.web.servlet.DispatcherServlet.class
-spring MVC 지원 라이브러리
<servlet-name>은 원하는대로 작성해도 된다
원하는 컨트롤러 클레스에 Controller 인터페이스를 implements 한 뒤 ModelAndView 타입의 handleRequest 메소드로 view와 url을 맵핑 시켜줄 때, 일일히 생성자 안에다 /WEB-INF/view/페이지이름.jsp 해주는 건 귀찮으므로 ViewResolver 기능을 사용해주자
(handleRequest는 서블렛에 디스패처 포워드가 합쳐져있다)
(ModelAndView 인스턴스를 만들어 setViewName 메소드로 view 경로를 설정해줘도 되고, 생성자가 오버로드 되어 있으므로 인스턴스 생성시에 생성자 안에 view 경로를 적어줘도 맵핑시켜준다)
( 인스턴스.addObject(변수, 보낼거)를 하면 쉽게 view로 데이터를 전달할 수 있다 )
- ViewResolver -
[ dispatcher-servlet.xml ]
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/view/"/>
<property name="suffix" value=".jsp"/>
</bean>
설정이 끝나면 view 파일들을 WEB-INF/view 폴더에 넣어 은닉화 시켜주자
사용자가 view 파일을 직접 요청하여 볼 수 있게 하는 것은 절차상으로 일어나서는 안된다
view는 오로지 controller에 의해서만 랜더링 되고 보여져야 한다
번외)
/WEB-INF/view/index.jsp 절대주소
WEB-INF/view/index.jsp 상대주소
dispatcher로 맵핑 되어 있을 때 상대 주소를 쓰면 맵핑된 주소에서 인자로 받은 주소를 추가해서 스캔한다
예를들어 dispatcher에서 /aa/index로 맵핑시켜놨다면 /aa/WEB-INF/view/ 에서 index.jsp를 찾는다
절대 경로로 view 파일을 찾고 싶다면 앞에 / 를 붙여줘야한다
'Development > Java' 카테고리의 다른 글
Tiles #5 (0) | 2022.08.28 |
---|---|
Spring MVC에서 정적 파일 서비스하기 #4 (0) | 2022.08.26 |
DI, AOP #2 (0) | 2022.08.25 |
Maven 사용법 (0) | 2022.08.24 |
Spring Framework, DI, IoC container #1 (0) | 2022.08.23 |