본문 바로가기

Spring

Spring 의 Controller

1. Controller 에서 메소드 사용 시 규칙

즉시실행 사용하지 않음
response 를 사용할 경우script를 무조건 활용
void 메소드일 경우 기본으로 view (jsp) 발동함. 해당 jsp를 사용하기 싫을 경우 printwriter를 사용
⑷ void 메소드 외 return 이 있는 메소드는 언제사용?? jsp와 무조건 사용
          - View페이지가 없을 경우 : 주로 void 메소드 활용
          - View페이지가 있을 경우 : 주로 return 메소드 활용 (script 를 사용하지 X)
⑸ 일반 자료형 메소드와 ModelAndView 자료형 메소드는 return null 에서 서로 다른 결과가 발생함
⑹ ModelAndView는 자료형이 ModelAndView일 때만 사용가능
⑺ ModelAndView 외에 return 이 있는 메소드 모두 Model 이라는 ui를 이용해서 JSTL형태로 출력함
⑻ JSP 파일 안에 JSTL 과 JSP 둘다 같이 쓸 수는 있지만, <%%>안에 ${} 를 사용하지 못함

 

2. Controller 생성

1. 새롭게 class 생성 후 @Controller 작성
2. webpage.xml 로 가서 생성한 클래스 명(ex:mainpage2)을 입력
3. 서버 재실행

 

3. void 메소드

1-1. 특징
① 기본적으로 Spring은 controller가 있으면 View(.jsp)를 무조건 찾는다

1-2. PrintWriter 쓰기 위한 response 사용 +  response 언어셋
① response 만 따로 언어셋 설정하는 이유
     => controller 에서는 HttpServletResponse 를 printwriter 쓸 때를 제외하고는 쓰지 않으므로
          xml 에서 언어셋 설정시 response는 설정하지 않았기 때문에 추가로 해줘야함
② 코드 예시
    @Controller
    public class mainpage {
        @RequestMapping("/mainpage2.do")
        public void main2(HttpServletRequest req, HttpServletResponse res) 
        						throws IOException{	
            String mid = req.getParameter("mid");
            String mpass = req.getParameter("mpass");
            res.setContentType("text/html;charset=utf-8");
            PrintWriter pw = res.getWriter();

            if(mid.equals("")) {
                System.out.println("test");
            }else {
                pw.write("<script>"
                        + "alert('로그인 되셨습니다.');"
                        + "location.href='./test.jsp';"
                        + "</script>");
            }
            pw.close();
        }
    }​

 

4. (자료형이) ModelAndView 인 메소드

1. addObject 와 setView
     - mv.setView(null) 일 때 null 은 Mapping 이름과 동일한 jsp를 찾게 됨
     - 코드예시
    @Controller
    public class mainpage {
        @RequestMapping("/mainpage3.do")
        public ModelAndView main3(HttpServletRequest req) {
            String mid = req.getParameter("mid");
            String mpass = req.getParameter("mpass");
            ModelAndView mv = new ModelAndView(); //필드에 올려놔도 정상작동함
            mv.addObject("mid",mid);
            mv.setView(null); //null 은 Mapping 이름과 동일한  jsp를 찾게 됨
            return mv; 		
        }
    }​


 

 

5. 배열 메소드

1. 코드 활용법 (JSTL로 출력해봄)
     - Model 이라는 ui 인터페이스를 사용해야 출력 됨
     - 코드 예시
         ① mainpage4.do
    @Controller
    public class mainpage {
        public ArrayList<Integer> main4(HttpServletRequest req, Model m) {		
            String mid = req.getParameter("mid");
            String mpass = req.getParameter("mpass");
            ArrayList<Integer> al = new ArrayList<Integer>();
            al.add(25);
            al.add(35);
            al.add(45);

            m.addAttribute("mid",mid);
            m.addAttribute("al",al);
            return null;
        }
    }​

         ② login.jsp (입력 파트)
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Spring-로그인(모든 메소드를 활용하는 페이지)</title>
    </head>
    <body>
    <form id="frm">
    아이디 : <input type="text" name="mid"><br>
    패스워드 : <input type="text" name="mpass"><br>
    <input type="button" value="전송" onclick="abc()">
    </form>
    </body>
    <script>
    function abc() {
        frm.method = "post";
        frm.action="./mainpage4.do";
        frm.submit();
    }
    </script>
    </html>​

         ③ mainpage4.jsp (출력 파트)
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>View</title>
    </head>
    <body>
    ${al}
    <br><br>
    ${mid }
    </body>
    </html>​
출력 결과

 

6. Mapping

1. @GetMapping("가상의 do") 
     - GET 만 받음

2. @PostMapping("가상의 do")
     - POST 만 받음

3. @RequestMapping
     - 일반적으로 post 와 get 둘 다 받을 수 있음
     - 인자값 받을 때 HttpServletRequest 안써도 됨.
     - form 에서 name 값 전송 시 Spring 은 인자값으로 모든 핸들링이 가능함
     - @RequestMapping ( value="가상의 url",method = RequestMethod.(GET or POST)
       => 이런식으로 지정해서 쓸 수도 있음

     - 코드 예시 ) 
telok.do (값을 넘겨 받는 파트)
   - name 값을 인자로 바로 받음
    @Controller
    public class mainpage2 {
        @RequestMapping(value="/admin/telok.do",method =RequestMethod.POST)
        public String telok(String tel,String email[]) {
            System.out.println(tel);
            System.out.println(email[0]);
            System.out.println(email[1]);
            return null;
        }
    }​

 
tel.jsp (값을 입력하는 파트) 
   - name 'tel'과 'email' 로 설정 -> email name 은 배열로 받았으나 이 경우 값을 필수로 받을 수 없음

    <title>전화번호 인증 페이지(Spring-RequestMapping)</title>
    </head>
    <body>
    <form id="frm" method="post" action="./telok.do">
    연락처 : <input type="text" name="tel"><br><br>
    이메일 : <input type="text" name="email">@<input type="text" name="email">
    <input type="button" value="전송" onclick="telok()">
    </form>
    </body>
    <script>
    function telok() {
        frm.submit();
    }
    </script>
    </html>​

 

7. Checkbox 핸들링

- 인자값으로 @RequestParamdefaultValue 를 이용해 넘겨받음
- @RequestParam: 인자값에 적용하는 어노테이션 이며 값이 없을 경우 defaultValue를 이용하여
  기본 default 값을 적용할 수 있음
- required = true : name 필수로 사용 / required = false : name 값이 필수가 아님
  => false 일 때는 앞의 agree 의 name 값이 바뀌어도 값을 가져오나,
       true 일 경우는 name값이 인자값과 동일해야 제대로 값을 가져오는 것을 확인함

- 코드 예시 )

ⓐ telok.do (값을 넘겨 받는 파트)
    @Controller
    public class mainpage2 {
        @RequestMapping(value="/admin/telok.do",method =RequestMethod.POST)
        public String telok(
        @RequestParam(defaultValue = "N",required =false ) String agree,
        String tel,
        String email[]) {
            System.out.println(tel);
            System.out.println(email[0]);
            System.out.println(email[1]);
            System.out.println(agree);
            return null;
        }
    }​
 tel.jsp (값을 입력하는 파트) 
    <title>전화번호 인증 페이지(Spring-RequestMapping)</title>
    </head>
    <body>
    <form id="frm" method="post" action="./telok.do">
    연락처 : <input type="text" name="tel"><br><br>
    이메일 : <input type="text" name="email">@<input type="text" name="email"><br>
    개인정보 동의함 : <input type="checkbox" value="Y" name="agree">
    <input type="button" value="전송" onclick="telok()">
    </form>
    </body>
    <script>
    function telok() {
        frm.submit();
    }
    </script>


 

8. Controller 에 있는 변수 모듈에서 출력하는 방법

# Controller에 있는 static 변수를 가져옴
 
 ⑴ Controller 에서 필드에 static으로 변수 선언
    @Controller
    public class shop_main2 {
        public static int gidx;
        }​

 


   ⑵ Module 에서 가져와서 console에 출력
    public class gallery_select {
        //필드에 controller 로드
        shop_main2 sm; //방법1
        shop_main2 sm = new shop_main2(); //방법2

        public String test1(){
            System.out.println(sm.gidx);   
        }
    }​

'Spring' 카테고리의 다른 글

Database 연결 (Spring)  (0) 2024.07.09
JSTL 사용법  (0) 2024.07.09
웹 경로에서 프로젝트 명 빼기  (0) 2024.07.08
Spring 기초  (0) 2024.07.08
Spring 설치 / 세팅 (Dynamic web project)  (0) 2024.07.08