WebServer/Spring

[Spring] MVC 네임스페이스 태그 관련

gangintheremark 2023. 9. 18. 23:45
728x90

@MVC 관련 기능을 활용할 때, 다음 두 가지는 필수 지정

<mvc:annotation-driven />
<mvc:default-servlet-handler />

 

HandlerInterceptor

스프링의 HandlerMappingHandlerInterceptor를 이용해 Controller가 요청을 처리하기 전과 후에 알맞은 기능을 수행하도록 지원

  • boolean preHandle(request, response, object): 클라이언트 요청을 Controller에 전달하기 전 호출
  • void postHandle(request, response, object, mav) : 클라이언트 요청을 처리한 후 호출
  • void afterCompletion(request, response, object, ex): 뷰를 통해 클라이언트에 응답을 전송한 후 호출

HandlerInterceptor를 구현한 뒤에는 반드시 xml에 등록해야 한다.

  • mapping path : 어떤 경로를 요청했을 때 실행할 지를 지정
  • ref bean : 빈으로 등록
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path=" " />
            <ref bean=" " />
        </mvc:interceptor>
    </mvc:interceptors>

 

로그인 여부 체크

주로 preHanlde을 이용하여 로그인 여부 체크 작업을 수행한다.

@Component("xxx")
public class MyHandlerInterceptor extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        HttpSession session = request.getSession();
        LoginDTO dto = (LoginDTO)session.getAttribute("login");
        if(dto==null) {
            response.sendRedirect("/app/loginForm"); // 절대경로
            return false;
        }
        return true;
    }
}
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/loginCheck/*" />
            <ref bean="xxx" />
        </mvc:interceptor>
    </mvc:interceptors>

 

static resources

정적 파일(css, js, image) 경로 매핑 시 사용

<mvc:resources location="/WEB-INF/image/" mapping="/image/**" />
<mvc:resources location="/WEB-INF/css/" mapping="/css/**" />
<mvc:resources location="/WEB-INF/js/" mapping="/js/**" />

 

@RequestBody @ResponseBody

@RequestBody@ResponseBody 는 XML이나 JSON과 같은 메시지 기반의 커뮤니케이션을 위해 사용된다.

 

@ResponseBody가 메서드 레벨에 부여되면 메서드가 리턴하는 객체는 뷰를 통해 결과를 만들어내는 Model로 사용되는 대신, 메시지 Converter를 통해 바로 HTTP 응답의 메시지 본문으로 전환된다.

 

@RequestBody @ResponseBody를 위한 jackson 라이브러리 필요

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.14.2</version>
</dependency>

 

@ResponseBody

Controller에서 응답처리를 JSP로 하지 않고 JSON 형식으로 처리가 가능하다. 즉, 자바클래스를 리턴하면 자동으로 JSON으로 만들어서 반환한다. 주로 자바스크립트 jQuery와 연동하기 위하여 사용

💡 Java 클래스 ➜ JSON
    @RequestMapping(value= {"/yyy"})
    @ResponseBody // LoginDTO -> JSON 으로 변경
    public LoginDTO yyy() {

        LoginDTO dto = new LoginDTO();
        dto.setUserid("옥지");
        dto.setPasswd("1234");
        return dto;
    }

      @RequestMapping(value= {"/zzz"})
    @ResponseBody // ArrayList<LoginDTO> -> JSON 으로 변경
    public ArrayList<LoginDTO> zzz() {

        ArrayList<LoginDTO> list = new ArrayList<LoginDTO>();
        list.add(new LoginDTO("옥지", "1234"));
        list.add(new LoginDTO("빵빵이", "1234"));
        list.add(new LoginDTO("제니", "1234"));
        return list;
    }

main.jsp

<script
	src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<script type="text/javascript">
	$(document).ready(function() {
		// yyy 이벤트
		$("#yyy").on("click", function() {
			//ajax
			$.ajax({
				url : 'yyy',
				type : "get",
				dataType : "json", // 응답데이터 타입
				success : function(data, status, xhr) {
					console.log(data);
					console.log(data.userid);
					// JSON -> str 로 변경
					var str = JSON.stringify(data);
				},
				error : function(xhr, status, error) {

				}
			});//end ajax
		})

		// zzz 이벤트
		$("#zzz").on("click", function() {
			//ajax
			$.ajax({
				url : 'zzz',
				type : "get",
				dataType : "json",
				success : function(data, status, xhr) {
					console.log(data);
					//배열 반복
					$.each(data, function(idx, ele) {
						console.log(ele);
						console.log(ele.userid);
					});
					// JSON -> str 로 변경
					var str = JSON.stringify(data);
				},
				error : function(xhr, status, error) {

				}
			});//end ajax
		});
	});
</script>

 

@RequestBody

브라우저에서 JSON을 전달하면 Controller에서 자바 클래스로 자동으로 변환한다.

💡 JSON ➜ Java 클래스
    @PostMapping("/yyy")
    public String yyy(@RequestBody LoginDTO dto) {
        System.out.println(dto);
        return "main";
    }

    @PostMapping("/zzz")
    public String zzz(@RequestBody ArrayList<LoginDTO> list) {
        System.out.println(list);
        return "main";
    }

main.jsp

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<script type="text/javascript">
    $(document).ready(function() {
        // yyy 이벤트
        $("#yyy").on("click", function() {
            $.ajax({
                url : 'yyy',
                type : "post",
                dataType : "text", // 응답 데이터 타입
                headers : {         // 요청 데이터 타입
                    "Content-Type" : "application/json"
                },
                data : JSON.stringify({
                    userid : "gang",
                    passwd : "1234"
                }),
                success : function(data, status, xhr) {

                },
                error : function(xhr, status, error) {

                }
            });
        });

        // zzz 이벤트
        $("#zzz").on("click", function() {
            //ajax
            $.ajax({
                url : 'zzz',
                type : "post",
                dataType : "text", // 응답 데이터 타입
                headers : {        // 요청 데이터 타입
                    "Content-Type" : "application/json"
                },
                data : JSON.stringify([{
                    userid : "옥지",
                    passwd : "1234"
                }, {
                    userid : "빵빵이",
                    passwd : "1234"
                }]),

                success : function(data, status, xhr) {

                },
                error : function(xhr, status, error) {

                }
            });
        });
    });
</script>

728x90
댓글수0