개발/스프링

7. 스프링 프레임워크-MVC 실습-2[자바웹을 다루는 기술]

괴발자-K 2022. 5. 12. 16:29

지난 시간 SimpleUrlController 이어서 MultiActionController 통해 실습을 진행 하겠습니다.

SimpleUrlCotroller는 요청하는 Url 마다 지정한 Controller를 각각 생성 해줘야 했습니다. 

하지만 MultiActionController를 이용하여 여러 요청명에 대해 한 개의 컨트롤러에서 구현된

각 메서드로 처리가 가능합니다.

 

MulActionController

**알고가면 좋은 스프링에서 제공하느 클래스들

클래스 설명
MultiActionController URL 요청명으로 바로 컨트롤러를 지정해서 사용
PropertiesMethodNameResolver URL 요청명으로 컨트로러러의 설정 파일에서 미리 설정된 메서드를 호출하여 사용
InternalResourceViewResolver 뷰를 생성하는 기능을 제공. 기본적으로 사용하는 view클래스 prefix와 suffix 프로퍼티 사용

1. 필요한 파일

UserController 클래스와, loginForm, result.jsp 그리고 action-servlet.xml 파일을 준비 합니다.

 

2. action-servlet.xml

..........생략

<!--id 가 simpleUrlController인 빈을 생성  -->
<bean id="simpleUrlController" class="com.spring.ex01.SimpleUrlController" />
    <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
           <props>
             <prop key="/test/index.do">simpleUrlController</prop>
           </props>
        </property>
    </bean>
    
<!-- 컨트롤러에서 ModelAndView 인자로 뷰이름이 반환되면 IntervalResourceViewResolver의 prefix 속성에 지정된 /test 폴더에서
      ModelAndView 인자로 넘어온 뷰이름에 해당되는 JSP를 선택해서 DispatcherServlet으로 보냄 -->    
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
     <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
     <property name="prefix" value="/test/"/>
     <property name="suffix" value=".jsp"/>
</bean>


<!--URL 요청명이 /test/*.do로 시작되면 userController를 요청  -->
<bean id="userUrlMapping"
        class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="mappings">
        <props>
            <prop key="/test/*.do">userController</prop>
        </props>
    </property>
</bean>

<!-- methodNameResolver 프로퍼티에  userMethodNameResovler를 주입해서 지정한 요청명에 대해 직접 메서드를 호출  -->
<bean id="userController" class="com.spring.ex02.UserController">
   <property name="methodNameResolver">
      <ref local="userMethodNameResolver"/>
   </property>
</bean>

<!-- PropertiesMethodNameResolver를 이용해 /test/login.do로 요청하면 userController login 메서드를 호출  -->
<bean id="userMethodNameResolver"
         class="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver">
   <property name="mappings">
       <props>
           <prop key="/test/login.do">login</prop>
       </props>
   </property>
</bean>
    
 
</beans>

위에 주석에를 달아 놓았습니다. 흐름에 따라 이해하시는게 좋습니다. 

 

3. UserController.java

//설정 파일의 userMethodNameResolver 프로퍼티를 사용하려면 반드시 MultiActionController를 상속 받아야함
public class UserController extends MultiActionController{
    
	public ModelAndView login(HttpServletRequest request,
			                  HttpServletResponse response) throws Exception{
		String userID="";
		String passwd="";
		String viewName = getViewName(request);
		ModelAndView mav = new ModelAndView();
		request.setCharacterEncoding("utf-8");
		userID = request.getParameter("userID");
		passwd = request.getParameter("passwd");
		//ModelAndView에 로그인 정보를 바인딩
		mav.addObject("userID", userID);
		mav.addObject("passwd",passwd);
		//ModelAndView 객체에 포워딩할 JSP 이름을 설정
		mav.setViewName("result");

		return mav;
	}

MultiActionController를 상속 받아 지정한 요청을 통해 메서드를 호출할 수 있고, ModelAndView를 통해서 

데이터를 바인딩 한 후 포워딩할 JSP 이름을 설정하여 정보를 넘겨 주면 된다. 

 

4. loginForm.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
//컨텍스트명 설정
 <c:set var="contextPath" value="${pageContext.request.contextPath }"/>   
    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인창</title>
</head>
<body> //해당 요청명 지정
    <form action="${contextPath }/test/login.do">
       <table>
           <tr>
              <td>아이디</td>
              <td>비밀번호</td>
           </tr>
            <tr>
              <td><input type="text" name="userID" value="" size="20"/></td>
              <td><input type="password" name="passwd" value="" size="20"/></td> 
            </tr>
            <tr>
              <td colspan="2">
                  <input type="submit" value="로그인">
                  <input type="reset" value="다시입력">
              </td>
            </tr>
            
       </table>
    </form>
</body>
</html>

5. result.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>결과창</title>
</head>
<body>
     <tr align="center">
        <td>아이디</td>
        <td>비밀번호</td>
     </tr>
     <tr>
         //ModelAndView에 바인딩 정보 값 EL태그를 통해 출력
         <td>${userID }</td>
         <td>${passwd }</td>
     </tr>
</body>
</html>

 

#마무리

해당 파트에서는 개인적으로 servlet.xml에서 ViewResolver, handlerMapping, MultiAction 관련해서 이해하려고 했고, 

큰 흐름과 연관관계에 대해서 이해하려고 노력했습니다.