Spring은 HandlerMapping을 이용해서 jsp 파일과 Bean 파일을 일일이 연결시켜줘야하는데
상당히 귀찮은 작업이다.
예를 들면 아래와 같다.
어제 세션을 이용한 로그인 예제를 만들면서 사용했던 Controller쪽 소스코드이다.
@Controller
public class LoginController {
@Autowired
private LoginBO loginBO;
// 세션 사용 안하는 화면
@RequestMapping("page1")
public String page1() {
return "page1";
}
// 세션 사용 안하는 화면
@RequestMapping("page2")
public String page2() {
return "page2";
}
// 로그인 화면
@RequestMapping("login")
public String login() {
return "login";
}
...
}
샘플 jsp 페이지를 login.jsp, page1.jsp, page2.jsp 이렇게 만들었다.
page1.jsp와 page2.jsp는 굳이 Bean이 없어도 되는 파일인데 불필요하게 컨트롤러에서 mapping처리 해줬다.
지금이야 파일수가 적어서 일일이 이렇게 처리 했지만(사실 이 땐 잘 몰라서 이렇게 했다 -_-)
파일수 많아지면 엄청 귀찮은 작업이다. 그래서 조금 더 알아보니 아래와 같이 조금 더 간단하게 처리하는 방법이 있었다.
page1을 예시로 든다면 return문에 jsp파일명 반환할 필요 없이 그냥 새로운 ModelAndView객체 반환하면 된다.
@RequestMapping
public ModelAndView page1() {
return (new ModelAndView());
}
위 방법은 역시 근본적인 해결책은 못된다. 여전히 파일명으로 메서드를 만들어야하는 불편함이 있다.
이런 불편함을 해소하기 위해서 박재성씨의 spring 프레임워크 워크북이나 블로그에서
이를 해결한 예제 소스코드가 있다.
근본 개념은 간단하다.
컨트롤러에 mapping된 URL이 있으면 해당 컨트롤러를 이용하고
그렇지 않은 URL("일반 jsp, html등등 굳이 Bean과 연동할 필요 없는 페이지들)은 공통컨트롤러를 이용해
URL 과 동일한 디렉토리의 jsp파일을 호출하도록 하는것이다.
소스코드는 다음과 같다.
StaticViewController.java
package com.mungchung.sample.login;
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 StaticViewController implements Controller {
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
String ctxRoot = request.getContextPath();
String uri = request.getRequestURI();
int len = 0;
if(ctxRoot != null && ctxRoot.length() > 0) {
len = uri.indexOf(ctxRoot) + ctxRoot.length();
}
uri = uri.substring(len);
if(uri.split("/").length < 2) {
response.sendError(HttpServletResponse.SC_NOT_FOUND);
return null;
}
return new ModelAndView(uri.substring(1));
}
}
root-context.xml
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
<bean id="staticViewController" class="com.mungchung.sample.login.StaticViewController" />
<bean id="staticHandlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="order"><value>1</value></property>
<property name="mappings">
<value>
/**=staticViewController
</value>
</property>
</bean>
servlet-context.xml
<annotation-driven />
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/views/" />
<beans:property name="suffix" value=".jsp" />
</beans:bean>
위와 같이 소스코드 수정 한 후에 LoginController.java 파일에서
page1(), page2(), login() 3개의 메서드는 삭제처리하고나서 실행해보면 문제없이 잘 동작한다.
참고로, servlet-context.xml은 수정할 필요 없다. <annotation-driven /> 선언이 필요함을 강조하기 위해서 위에 코드적어둔것이다.
**) 소스코드에 대한 자세한 설명은 자바지기 블로그 의 글을 참고하면 된다. -_-