記錄

Spring+Mybatis+Tiles 3) Controller 본문

Web/Spring framework

Spring+Mybatis+Tiles 3) Controller

surhommejk 2018. 5. 6. 12:32


MasterController.java (Master는 내가 그냥 붙인거고 클래스명은 무관)

// @Controller를 통해 DispatcherServlet이
// 이를 controller로 인식하고 모든 처리를 여기로 요청한다
@Controller
public class MasterController {

// type으로 찾아 bean으로 생성
// root-context.xml에 이미 bean으로 설정은 마친 상태
    @Autowired
    private SqlSession sqlsession;
    

// 요청 주소를 mapping
// 일단 .htm은 모두 이곳으로 요청되도록 설정된 상태이고
// 정확한 요청 주소를 보고 @RequestMapping 설정에 따라
// 알맞은 메소드로 요청이 들어간다
    @RequestMapping("showallemp.htm")
    public String showAllEmp(Model model) {
        
        EmpDao dao = sqlsession.getMapper(EmpDao.class);
        List<EmpDto> list = dao.getEmpList();
        model.addAttribute("list", list);
        
        return "emp.showAllEmp";
    }
    

// 동일 주소로 요청하지만 두 가지 방식(GET방식과 POST방식) 모두 처리해야 할 때
// 아래와 같이 (value="~", method= ) 로 처리한다
    @RequestMapping(value="searchEmp.htm" , method=RequestMethod.GET)
    public String searchEmp1() {

        return "emp.searchEmp";
        
    }
    

    @RequestMapping(value="searchEmp.htm" , method=RequestMethod.POST)
// 특별한 설정이 없어도 .jsp에서 form으로 태워 보내는
// input tag의 name값을 메소드의 파라미터의 명과 일치시키면
// 아래와 같이 파라미터로 값이 들어오게 된다

// form tag 말고 get 방식으로 파라미터를 보내는 방식도 있는데
// 이는 밑에 있는 "updateEmpview.htm" 요청 메소드에서 설명한다
    public String searchEmp2(String column, String KEYVALUE, Model model) {
        
// java 내에서 제공하는 validator 기능으로
// 숫자 패턴인지를 파악하는 코드이다
         Pattern p = Pattern.compile("(^[0-9]*$)");
         Matcher m = p.matcher(KEYVALUE);
            
         if(column.equals("EMPNO")) {
            
// m의 패턴이 아니라면 = 숫자가 아니라면
             if(!m.find()) {
                 KEYVALUE = "0";
             }
         }

// 다중의 파라미터를 보내야 하므로 map 에 담아서 보내게 되며
// mapper에서 이를 받을 때 key 값을 기준으로 value를 뽑는다
        HashMap<String, String> map = new HashMap();
        map.put("column", column);
        map.put("KEYVALUE", KEYVALUE);
        
// 아래는 DAO 실행 결과로 받은 DTO를
// model에 태워서 .jsp로 보내는 코드이다
        EmpDao dao = sqlsession.getMapper(EmpDao.class);
        EmpDto dto = dao.getEmp2(map);
        model.addAttribute("emp", dto);
        
// Tiles.xml 설정에 따라 model에 태운 DTO를 받을
// JSP에서 EL을 이용해서 적절하게 값을 뿌려주면 된다
        return "emp.searchEmp";
    }
    

    @RequestMapping("searchLikeEmp.htm")
    public String showAllEmp2(String KEYVALUE, Model model) {
        
        Pattern p = Pattern.compile("(^[0-9]*$)");
        Matcher m = p.matcher(KEYVALUE);
            
        if(!m.find()) {
                 KEYVALUE = "00000";
        }
        
        EmpDao dao = sqlsession.getMapper(EmpDao.class);
        List<EmpDto> list = dao.getEmpList2(KEYVALUE);
        model.addAttribute("list", list);
        return "emp.searchEmp";
    }
    

    @RequestMapping(value="insertEmp.htm",method=RequestMethod.GET)
    public String insertEmp1() {
    
        return "emp.addEmp";
    }
    

// return "redirect:/~" 은 클라이언트로 하여금 ~ 주소로 재요청하게 만드는 기능이다
// DB처리를 통해 어떠한 데이터를 받아와서 뿌려줘야 하는 상황이 아니고
// DB처리가 끝나고 갱신된 페이지를 보여주고 싶을 경우
// 그냥 client 단에서 재요청하기를 원하는 주소를 redirect:/ 뒤에 붙여주기만 하면 된다
// 즉, 원하는 처리는 끝났으니 깔끔하게 다시 요청하도록 강제하는 것이 redirect:/ 이다
    @RequestMapping(value="insertEmp.htm",method=RequestMethod.POST)
    public String insertEmp2(EmpDto dto) {
        System.out.println(dto);
        EmpDao dao = sqlsession.getMapper(EmpDao.class);
        dao.insertEmp(dto);
        
        return "redirect:/showallemp.htm";
    }
    

// 클라이언트가 요청과 동시에 보낸 데이터를 받는 첫번째 방식으로

// form에서 보낸 데이터를 받는 방법을 설명하며

// input tag의 name값과 메소드의 파라미터 변수명을 일치시키는 방법에 대해서 위에 정리했다


// 클라이언트가 요청과 동시에 보낸 데이터를 받는 두번째 방식으로

// <a>href="updateEmpview.htm?empno=${list.EMPNO}">수정하기</a> 처럼

// 주소값에 붙여 보내고 이를 받는 방식이 있다


// 첫번째 방식과 받는 방식은 똑같다. 요청을 처리하는 메소드에서 파라미터 명을 일치시키면 된다

 // 보낼 때는 저렇게 요청 주소 옆에 ?key=value로 보내면 된다

 // 다수의 값을 보내고 싶을 경우 ?key1=value1&key2=value2&key3=value3 과 같이 보내면 된다

    @RequestMapping("updateEmpview.htm")
    public String showEditEmp(int empno, Model model) {
        
        EmpDao dao = sqlsession.getMapper(EmpDao.class);
        EmpDto dto = dao.getEmp(empno);
        
        model.addAttribute("emp", dto);
        
        return "emp.updateEmp";
    }
    

    @RequestMapping(value="updateEmp.htm", method=RequestMethod.POST)
    public String updateEmp(EmpDto dto) {
        
        EmpDao dao = sqlsession.getMapper(EmpDao.class);
        dao.updateEmp(dto);
        
        return "redirect:/showallemp.htm";
    }


    @RequestMapping("deleteEmp.htm")
    public String deleteEmp(int empno) {
        
        EmpDao dao = sqlsession.getMapper(EmpDao.class);
        dao.deleteEmp(empno);
        
        return "redirect:/showallemp.htm";
    }
    
}







<.jsp 에서 컨트롤러로 값을 보내는 방식 정리>


1. form 태그 내부의 input tag의 name과 해당 주소의 요청을 처리할 controller의 메소드가 갖는 parameter의 변수명을 일치 시킨다


2. 값을 controller로 보낼 때 주소값에 ?key=value 와 같은 식으로 붙여서 보내고 controller에서는 1번과 같은 방식으로 메소드의 파라미터 변수명을 key와 일치시켜서 값을 받는다


3. form태그 내부의 input tag 들이 갖는 name 값들DTO에서 정의한 변수명들을 모두 대소문자까지 정확히 일치 시켜서 controller에서 이를 DTO 타입 자체로 받아들여서 DTO가 통째로 넘어오게 한다

(+a 수업시간에 배우기로 DTO에서 정의한 변수명이 하나라도 일치하는 것이 있으면 해당 변수명만 받아서 DTO가 넘어온다고 배웠다. 다시 말하자면 input tag의 name들 중 DTO에서 정의한 변수명과 하나라도 일치하는 것이 있으면 그 값만 DTO가 받아서 controller 메소드의 파라미터로 들어간다는 의미이다. 나혼자 따로 실험은 해보지 않았으나 일단 이렇게 배웠다)

Comments