[ Spring MVC Web 적용을 위한 WAS Tomcat 및 환경 설정 ]
- Dynamic web project 생성
- 프로젝트 오른쪽 마우스 클릭 > Java EE Tools > Generate Deployment Discriptor Stub 클릭하여
> web.xml 생성 - 프로젝트 오른쪽 마우스 클릭 > configure > conver to maven project
/pom.xml
<dependencies>
<!-- Spring-Web MVC Framework -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.14.RELEASE</version>
</dependency>
</dependencies>
* 상단에 빨간색 경고가 뜰 경우 C: > 사용자 > 본인 선택 > .m > repository 폴더 삭제
+ 메이븐 업데이트 : alt + F5
원래 최초 서비스를 요청하면 파란 줄로, 두번 째부터는 보라 줄로 진행되는 것이다.
그러나 그렇게되면 맨 처음 서비스를 요청하는 사람의 로딩시간이 길어지는 불편함이 발생할 수 있기 때문에,
<load-on-startup>을 통해 어플리케이션이 최초에 실행될 때, 객체생성, init()의 과정이 진행되도록 하여,
이후 어떤 request가 와도 service(보라색 줄)부터 실행되도록 한다.
/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" version="3.1">
<display-name>SpringMVC1</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- servlet 설정 -->
<servlet>
<!-- servlet-name을 기반으로 spring 파일을 찾는다. -->
<servlet-name>dispatcher</servlet-name>
<!-- Libary 제공 -->
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- load-on-startup
: Serlvet LifeCycle에 의거해서,
어플리케이션 최초 실행 시 해당 servlet을 객체 생성, init()까지 실행되도록 설정
만약 이 태그를 기입해주지 않으면, 클라이언트 최초 요청 시점에 서블릿이 초기화된다. -->
<load-on-startup>1</load-on-startup>
</servlet>
<!-- servlet-mapping 설정 -->
<servlet-mapping>
<!-- DispatcherSerlvet은 자신의 설정 파일(springMVC 설정)을
[serlvet-name]-serlvet.xml로 찾아서 로딩한다. -->
<servlet-name>dispatcher</servlet-name>
<!-- 클라리언트 요청 url이 .action으로 마치는 요청은
모두 DispatcherSerlvet이 처리한다. -->
<url-pattern>*.action</url-pattern>
</servlet-mapping>
</web-app>
[ Spring MVC pattern ]
- DispatcherServlet : FrontController역할 - Spring configure 설정을 통해 dispatcher-servlet.xml으로 설정한다.
- HandlerMapping : 클라이언트의 요청을 처리할 실제 컨트롤러를 연결하는 객체
(담당 Controller를 연결 - RequestMappingHandlerMapping은 연결해주는 방법 중 하나) - Controller : 실제 요청을 처리하는 컨트롤러 로직을 담당
* HttpServletRequest와 HttpServletResponse, HttpSession, Cookie를 이용해
클라이언트의 요청을 분석하고 적절한 응답을 한다. - ModelAndView : view의 url과 attribute를 전달한다. (view-name, attribute-name, attribute-value)
- ViewResolver : 적잘한 view를 찾아 응답하도록 하는 역할 (InternalResourceViewResolver를 사용한다)
- View :JSP(화면) or JSON(Ajax - 데이터)
ex) 제일 처음 web.xml이 동작된다. 이 때, load-on-startup에 의해 서블릿 객체가 생성되고 초기화된다.
그때, 본인의 servlet-name을 찾아, dispatcher-serlvet.xml을 생성한다.
dispatcher-serlvet.xml에서는 HandlerMapping, ViewResolver와 그 외 bean을 DI하여 생성한다.
=> 메모리에 다 로딩시켜둔다.jsp에서 request를 하면, controller에 들어가고, ModelAndView로 반환된다.
ModelAndView는 이동할 jsp(view)의 path와 보낼 정보를 담을 수 있다.
반환된 path는 dispatcher-serlvet의 viewResolver에 따라, /views/[path]/.jsp로 이동한다.
Spring 환경설정
/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 http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- HandlerMapping
: 클라이언트의 요청을 처리할 실제 컨트롤러를 연결하는 객체
* BeanNameUrlHandlerMapping
: controller에서 view name을 ok로 할당해서 반환하면,
/views/ok.jsp로 응답하게 하는 설정이다.
-->
<bean id="handlerMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<!-- ViewResolver
: 컨트롤러가 클라이언트에게 응답할 view에 대한 방식을 담당하는 객체 -->
<bean id="ViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
<bean id="/hello.action" class="org.kosta.controller.HelloController"/>
<bean id="mockDAO" class="org.kosta.model.MockDAO"/>
<bean id="/find.action" class="org.kosta.controller.FIndMemberController">
<constructor-arg ref="mockDAO"/>
</bean>
</beans>
/org.kosta.model
(가상의 DAO 생성)
/MockDAO.java
package org.kosta.model;
public class MockDAO {
public String findMemberById(String id) {
return id+" 아이디에 대한 회원정보 : 아이유";
}
}
/org.kosta.controller
/HelloController.java
package org.kosta.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;
public class HelloController extends AbstractController{
@Override
protected ModelAndView handleRequestInternal(HttpServletRequest request,
HttpServletResponse response)
throws Exception {
ModelAndView mv = new ModelAndView();
//ViewResolver 설정에 의해 views/hello_reslut.jsp로 응답한다.
mv.setViewName("hello_result");
//request 영역에 setAttribute() 하는 것과 동일
//addObject(name, value)
mv.addObject("info", "DAO 연동 결과");
return mv;
}
}
/FindMemberController.java
package org.kosta.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.kosta.model.MockDAO;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;
public class FIndMemberController extends AbstractController{
private MockDAO mockDAO;
//DI방식으로 주입받는다
public FIndMemberController(MockDAO mockDAO) {
super();
this.mockDAO = mockDAO;
}
@Override
protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response)
throws Exception {
//view에서 id 객체 받기
String id = request.getParameter("id");
//model과 연동하여 결과 받기
String memberInfo = mockDAO.findMemberById(id);
//view에 연동 결과 공유 - dispatcher-servlet.xml에 전송
// new ModelAndView(viewName, name, value);
return new ModelAndView("find_result", "memberInfo", memberInfo);
}
}
[ 결과 ]
> index.jsp 화면
> 'Hello Controller Test' 링크 클릭하면,
> id 입력하고 검색하면,
'Java Web Programming > 6. Spring | MyBatis' 카테고리의 다른 글
[Spring] 스프링 IOC/DI Annotation 어노테이션 (0) | 2020.11.05 |
---|---|
[SpringMVC] xml 기반으로 SpringMVC 패턴 적용해보기 (0) | 2020.11.04 |
[Spring/MyBatis] has a (aggregation) 관계 시, 구현방법 연습 (0) | 2020.11.03 |
[Spring/MyBatis] JOIN 구문 연습 (inner join, outer join, group by) (0) | 2020.11.03 |
[Spring/MyBatis] Spring + MyBatis 적용 연습 2 ! (+CDATA, GROUP BY, LIKE, INSERT, Sequence 시퀀스) (0) | 2020.11.02 |