프로그래밍/- 남굼성의 Spring 교육
Filter
즐겁게 하하하
2022. 1. 14. 10:11
728x90
Filter : 공통적인 요청 전처리와 응답 후처리에 사용, 로깅, 인코딩 등..

package com.web.ch3;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
// 필터를 적용할 요청의 패턴 지정 - 모든 요청에 필터를 적용.
@WebFilter(urlPatterns="/*")
public class PerformanceFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 초기화 작업
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 1. 전처리 작업
long startTime = System.currentTimeMillis();
// 2. 서블릿 또는 다음 필터를 호출( 수정 X )
chain.doFilter(request, response);
// 3. 후처리 작업
HttpServletRequest req = (HttpServletRequest)request;
String referer = req.getHeader("referer");
String method = req.getMethod();
System.out.println("["+ referer +"] =>>" + method + "[" + req.getRequestURI() + "]");
System.out.println(" 소요시간="+(System.currentTimeMillis()-startTime)+"ms");
}
@Override
public void destroy() {
// 정리 작업
}
}
@RequestParam
public String main( @RequestParam( name="year", required=false ) int year ){
http://localhost/ch2/requestParam
---->> year=null
http://localhost/ch2/requestParam?year
---->> year=""
private ModelAndView request_TEST(
@RequestParam(value="test", required=false, defaultValue= "0") int num,
@RequestParam("test2") String str)
){
:: required=false로 지정하면 해당 키값이 존재하지 않다고 해서
BadRequest가 발생하지 않게 됩니다.
:: 존재하지 않는다면 num변수에 default로 0이 들어가게됩니다.
}
_________________________________________________-
package com.fastB.ch2;
import java.util.Calendar;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class YoilTellerMVC2 {
@ExceptionHandler(Exception.class)
public String catcher(Exception ex) {// 이 컨트롤러 에서 발생한 예외 모두 잡음
return "yoilError";
}
@RequestMapping("/getYoilMVC2") // http://localhost/ch2/getYoilMVC2
public String main(@RequestParam(required=true) int year,
@RequestParam(required=true) int month,
@RequestParam(required=true) int day, Model model) {
// 1. 유효성 검사
if(!isValid(year, month, day))
return "yoilError"; // 유효하지 않으면, /WEB-INF/views/yoilError.jsp로 이동
// 2. 처리
char yoil = getYoil(year, month, day);
// 3. Model에 작업 결과 저장
model.addAttribute("year", year);
model.addAttribute("month", month);
model.addAttribute("day", day);
model.addAttribute("yoil", yoil);
// 4. 작업 결과를 보여줄 View의 이름을 반환
return "yoil"; // /WEB-INF/views/yoil.jsp
}
private char getYoil(int year, int month, int day) {
Calendar cal = Calendar.getInstance();
cal.set(year, month - 1, day);
int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
return " 일월화수목금토".charAt(dayOfWeek);
}
private boolean isValid(int year, int month, int day) {
if(year==-1 || month==-1 || day==-1)
return false;
return (1<=month && month<=12) && (1<=day && day<=31); // 간단히 체크
}
}
@ModelAttribute
- 반환타입 또는 컨트롤러 메서드의 매개변수에 적용가능
- public String main(@ModelAttribute("fa") Familly familly ){ return "/board/familly" }
- jsp > ${fa.father} 라고 지정하여 model을 불러 올 수 있다.
package com.fastB.ch2;
import java.util.Calendar;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class YoilTellerMVC5 {
@ExceptionHandler(Exception.class)
public String catcher(Exception ex) {
System.out.println("ex="+ex);
return "yoilError";
}
@RequestMapping("/getYoilMVC5") // http://localhost/ch2/getYoilMVC5?year=2021&month=10&day=1
// public String main(@ModelAttribute("myDate") MyDate date, Model m) { // 아래와 동일
public String main(@ModelAttribute MyDate date, Model m) { // @ModelAttribute사용, 반환 타입은 String
System.out.println("myDate="+date);
// view > yoil.jsp 에서 매개변수 받을때
// key = myDate (MyDate 에서 맨앞 소문자로)
// value = date
// 1. 유효성 검사
if(!isValid(date))
return "yoilError";
// 2. 처리
// char yoil = getYoil(date);
// 3. Model에 작업한 결과를 저장
// @ModelAttribute 덕분에 MyDate를 저장안해도 됨. View로 자동 전달됨.
// m.addAttribute("myDate", date);
// m.addAttribute("yoil", yoil);
// 4. 작업 결과를 보여줄 뷰의 이름을 반환
return "yoil";
}
private @ModelAttribute("yoil") char getYoil(MyDate date) {
return getYoil(date.getYear(), date.getMonth(), date.getDay());
}
private char getYoil(int year, int month, int day) {
Calendar cal = Calendar.getInstance();
cal.set(year, month - 1, day);
int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
return " 일월화수목금토".charAt(dayOfWeek);
}
private boolean isValid(MyDate date) {
return isValid(date.getYear(), date.getMonth(), date.getDay());
}
private boolean isValid(int year, int month, int day) {
if(year==-1 || month==-1 || day==-1)
return false;
return (1<=month && month<=12) && (1<=day && day<=31); // 간단히 체크
}
}
WebDataBinder
- public String main( @ModelAttribute MyDate date , BindingResult result ){
BindingResult :: 바인딩할 객체 바로 뒤에 와야 된다.
- 브라우저를 통해서 요청받은 값이 실제 객체에 바인딩 될때 중간역할을 하는게 DataBinder
- DataBinder: 타입변환, 데이터 검증하고 그 결과를 BindingResult에 담아서 컨트롤러에
넘겨주어서 컨트롤러가 그 결과를 볼 수있다.
728x90