➡️ 솔루션 Core의 Spring (core, webmvc) 3.2.5 를 기반으로 작성하였습니다
출처: Spring Docs
<web-app>
<servlet>
<servlet-name>Web</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Web</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
....
</web-app>
component-scan의 base-package 하위에 포함되어 있어야 Bean 등록
@Controller
public class HelloWorldController {
@RequestMapping("/hello")
public String helloWorld(Model model) {
model.addAttribute("message", "Hello World!");
return "helloWorld";
}
}
web.xml
<context-param>
<param-name>**contextConfigLocation**</param-name>
<param-value>
....
classpath:/config/**applicationContext-web.xml**
</param-value>
</context-param>
web.xml에 을 정의하여, Servlet 전역에서 사용 가능한 파라미터 값으로 등록할 수 있습니다.
여기서 의 contextConfigLocation는 Spring이 동작하기 위한 설정 파일의 위치를 알려주는 파라미터입니다.
해당 값으로 web 관련 설정을 관리하는 applicationContext-web.xml 을 등록합니다.
applicationContext-web.xml
<!-- ******************************************************************* -->
<!-- * URL CONTROLLER MAPPING * -->
<!-- ******************************************************************* -->
<!--
for spring mvc handlerMapping..
handlerMapping connect each controller.
-->
<import resource="classpath:/config/web/**webContext-controllers.xml**" /> **3-1) Bean 관련 설정 xml**
<bean id="urlMapping" class="org.springframework.web.servlet.handler.**SimpleUrlHandlerMapping**">
<property name="interceptors">
<list>
<ref bean="localeChangeInterceptor"/> **사용자 언어별 i18n(국제화) 다국어 처리**
....
</list>
</property>
<property name="mappings">
<!-- property -->
<bean class="org.springframework.beans.factory.config.**PropertiesFactoryBean**">
<property name="locations">
<list>
<value>classpath:/config/web/**webContext-controllers.properties**</value> **3) 매핑 URL 정의 properties**
....
</list>
</property>
</bean>
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<value>
/simpleUrlExample=example
/*/simpleUrlExample=example
</value>
</property>
</bean>
<bean id="example" class="com.baeldung.ExampleController" />
webContext-controllers.properties 3) 매핑 URL 정의 properties
#------------------------------------------------------------------------------
# Main
#------------------------------------------------------------------------------
/main/main.do=mainController
/mobile/main.do=mobileController
#------------------------------------------------------------------------------
# Auth
#------------------------------------------------------------------------------
/auth/login/loginView.do=loginController
/auth/login/login.do=loginController
/auth/login/checkSessionKey.do=loginController
/auth/login/doAutoLogin.do=loginController
....
3-1. webContext-controllers.xml 3-1) Bean 관련 설정 xml
<!-- for parameter multiaction -->
URL에서, 하단의 Resolver의 <value>에 해당 하는 값으로 메서드에 매핑하는 Spring 객체
<bean id="methodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
<property name="paramName">
<value>method</value>
</property>
</bean>
<!--
**************************************************************************
* DEFAULT Controller
**************************************************************************
-->
<bean name="multiActionFormController" class="destiny.framework.web.mvc.MultiActionFormController" autowire="byName" >
</bean>
<!--
**************************************************************************
* COMMON Controller
**************************************************************************
-->
*String methodName = this.methodNameResolver.getHandlerMethodName(request);*
과 같이 request 에서 메서드 명칭을 추출해 사용한다.최상단 주석 내용.
/**
* MultiActionController는 SimpleFormController의 기능과 다중액션 처리가 가능한
* MultiActionController의 기능을 합친 Controller이다.<br>
* 각각의 메소드 구현시에는 다음과 같은 내용을 포함한다.<br>
*
* 1. 데이터 binding
* 2. 유효성 검사
* 3. 처리
* 4. 결과 Response
*/
.... 중략 ....
1. 아래의 생성자로 인해 초기화
/**
* 생성자
*/
public MultiActionFormController() {
this.delegate = this;
registerHandlerMethods(this.delegate);
}
...
2. private final Map<String, Method> handlerMethodMap 에 등록하여 둠
private void registerHandlerMethod(Method method) {
if (destinyLogger.isDebugEnabled()) {
destinyLogger.debug("Found action method [" + method + "]");
}
this.handlerMethodMap.put(method.getName(), method);
}
........
/**
* Determine a handler method and invoke it.
* request 정보를 사용하여 MethodNameResolver로 메소드명을 찾아 호출한다.
*
* @see MethodNameResolver#getHandlerMethodName
* @see #invokeNamedMethod
* @see #handleNoSuchRequestHandlingMethod
*/
protected ModelAndView process(HttpServletRequest request, HttpServletResponse response) throws Exception {
try {
String methodName = this.methodNameResolver.getHandlerMethodName(request);
return invokeNamedMethod(methodName, request, response);
} catch (NoSuchRequestHandlingMethodException ex) {
return handleNoSuchRequestHandlingMethod(ex, request, response);
}
}
3. process()가 호출되면
-> invokeNamedMethod()
-> Method method = (Method) this.handlerMethodMap.get(methodName);
-> Object returnValue = method.invoke(this.delegate, params.toArray(new Object[params.size()]));
위의 과정과 같이 호출 되어 실행 된다.
“REST API를 호출할 수 있는 Spring 3.0 + 내장 클래스” - 즉, REST 요청을 간단히 하도록 도와주는 도구의 개념으로, 여러 견본 틀(Template)이 들어 있다.
특징
https://jung-story.tistory.com/132
<!-- DriverManagerDataSource는 커넥션(connection pool)을 지원하지 않는다. -->
<!-- 그러므로 Apache가 제공하는 BasicDataSource를 사용한다. -->