즐겁게 하하하 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