728x90
@MVC 관련 기능을 활용할 때, 다음 두 가지는 필수 지정
<mvc:annotation-driven />
<mvc:default-servlet-handler />
HandlerInterceptor
스프링의 HandlerMapping
은 HandlerInterceptor
를 이용해 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
'WebServer > Spring' 카테고리의 다른 글
[Spring] @RequestBody 와 @ResponseBody (1) | 2023.09.25 |
---|---|
[Spring] Spring 기반의 파일업로드(File Upload) (0) | 2023.09.19 |
[Spring] 스프링의 포워드(forward)와 리다이렉트(redirect) + RedirectAttributes (1) | 2023.09.17 |
[Spring] 스프링 MVC의 Controller (0) | 2023.09.17 |
[Spring] Spring MVC 구조와 컴포넌트 (0) | 2023.09.16 |