[2022/10/27 THU] MVC - HttpServlet 클래스

kangsun·2022년 10월 27일

JSP

목록 보기
16/16

MVC





HttpServlet 클래스

myweb에서는 JSP만 가지고 페이지를 제작했다.

HttpServlet 클래스를 상속받아서 활용한다.
HttpServlet 클래스 - 이미 만들어진 것을 잘 활용하면 된다.

요청받고 응답만 잘하면 된다.

class httpservlet 검토해보기
https://docs.oracle.com/javaee/7/api/






웹사이트들의 url을 보면 페이지를 페이지명으로 요청할 수 있지만 명령어로도 요청할 수 있다.

- welcome.jsp(.asp, .php)은 페이지명으로 요청한 것이고
- index.do, search.naver은 명령어로 요청한 것이다.
→ httpservlet을 사용




httpservlet을 사용해서 페이지명을 명령어로 바꾸기

control/welecome.jsp


- 페이지명 .jsp로 요청한 페이지 준비


net.control package 생성 → Welcome class 생성하기

참조 https://docs.oracle.com/javaee/7/api/

  • HttpServlet 클래스
    - http 프로토콜 기반의 요청과 응답을 처리해주는 클래스

  • 결과확인

  • http://localhost:9090/basic05_mvc/wel.do
    → wel.do를 어딘가에 저장해두고 사용해야 한다.

  • Welcome 서블릿 클래스
    - web.xml (배치관리자)에 등록해야한다.

web.xml에 wel.do 등록하기

  • servlet 태그를 ctrl+space로 불러올 수 있다.

  • class에는 package이름도 작성해줘야한다.

  • 이 부분이 한 부분이라는 걸 servletname 태그에 동일하게 작성해준다.

  • 클래스 안에 커서 놓고 source로 override 자동등록하기



    - doGet, doPost 체크한다.
    - override 부모가 가진 걸 사용하겠다는 것.

doGet() 함수 작성하기

  • HTML 문서 구조로 응답


    - welcome.jsp에 있는 contentType을 넣어주면 된다.

  • 요청한 사용자에게 응답하기 위한 출력 객체
    PrintWriter out=resp.getWriter();


    🤔 html을 이렇게 불편하게 작성해야 하는것인가..?..
    -> JSP는 backend단을 구성하기 힘들고, servlet은 frondend단을 구성하기가 힘들다는 걸 알 수 있다..

    ▷ 따라서 이 두가지를 섞어서 유효적절하게 사용해야한다.

  • 결과확인

    http://localhost:9090/basic05_mvc/control/welcome.jsp
    http://localhost:9090/basic05_mvc/wel.do
    → 이 두가지 링크 모두 똑같은 화면이 나와야 한다.

💡 이런 불편함을 개선할 수 있는 방법 ?!?

→ class가 있다!
참고 : 교재 2.2.5 콜백메소드와 서블릿객체의 생명주기

servlet 생명주기 LifeCycle

  • HttpServlet 클래스의 계층도
    class GenericServlet {}
    class HttpServlet extends GenericServlet {}
    class LifeCycle extends HttpServlet{}

  • web.xml에 LifeCycle서블릿 등록

    ※ 주의사항 : web.xml등록 후 서버 종료후 다시 켜야한다.

  • LifeCycle.java override시키기
    * 생명주기에서 핵심적인 역할을 수행하는 클래스 5가지
    - HttpServlet : doGet(), doPost(), sevice()
    - GenericServlet : destroy(), init()

  • override 하고 확인을 위한 출력 코드 작성

  • 결과확인

    1) http://localhost:9090/basic05_mvc/life.do 링크로 접속한다.

    2) 새로고침을 3-5번 누르고 콘솔창에 호출된 것 확인한다.

    3) 서버 중지시키고 콘솔창 확인한다.


- init은 1번 호출
- doGet, service는 여러번 호출
- destry는 중단했을 때 1번 호출

생명주기 클래스 5가지의 특징

  • init()
    서블릿이 최초로 호출될 때 1번만 호출
    초기 환경 설정할 때 사용
  • destroy()
    서버가 중지되면 자동으로 1번만 호출
  • service()

    - 인터넷 페이지에서 어떤 페이지 요청할 때 -> 서비스를 요청한다라고 표현.
    - 누군가로부터 계속 요청이 들어오는 것을 service가 항상 받는다.
    - URL을 통해서 요청이 들어오면 (새로고침) 전송방식이 method=get 또는 method=post 방식으로 서비스를 요청했는지 판단해서
    - doGet()과 doPost()함수를 구분해서 호출해주는 함수
  • doGet()
    method=get방식으로 요청하면 service()함수가 doGet()을 호출한다.
  • doPost()
    method=post방식으로 요청하면 service()함수가 doPost()을 호출한다.





페이지이동

1) http://localhost:9090/basic05_mvc/control/loginForm.jsp

resp.sendRedirect("control/loginForm.jsp");

loginForm.jsp 생성하기

loginForm.java 생성하기

doGet(), doPost() 오버라이드 한 후 페이지 이동하는 함수 senRedirect()로 페이지경로 불러오기

web.xml에 jsp호출하는 서블릿 등록

결과확인

http://localhost:9090/basic05_mvc/login.do 로 검색하면 jsp주소 http://localhost:9090/basic05_mvc/control/loginForm.jsp 이 경로로 나옴.


2) http://localhost:9090/basic05_mvc/control/loginForm.jsp

loginForm.java

결과확인

1번과 경로가 달라진다.





로그인 폼 전송하기

action="loginproc.do" .do로 액션 취하기
※주의사항 : http://localhost:9090/basic05_mvc/login.do
여기페이지로 들어가야함.

class 만들고, web.xml 등록하기

LoginProc.java에 doPost()함수 작성


method="post" 이므로 doPost로 전송받는다.

결과확인

http://localhost:9090/basic05_mvc/login.do
→ login.do로 접속한다.


폼 전송 완료




HttpServlet에서 front단 구성시 불편함 개선방법

  • 원래 front단 출력 방법

  • 자식 페이지에서 부모페이지의 변수를 사용할 수 있도록 해준다.


    - 우리는 밑에있는 2번 코드를 사용할 것이다.
    - 왜냐하면 자식페이지에도 사용할 수 있도록 하기 위해선 변수에 담아줘야 한다.
    - 2번에선 req 변수를 담아놓았기 때문에 사용할 수 있다.


    - 부모페이지와 자식페이지 관계이다.
    - 부모페이지에 생성된 req변수를 자식페이지인 form.jsp에서 사용할 수 있다.


1) 먼저 백업파일 만들어놓기

2) LoginProc.java 페이지 만들기

- dispatcher로 자식페이지게 값을 넣어주는 것이다.
- "control/loginResult.jsp" 이 페이지로 넣어주는 것

- 페이지 이동해주는 RequestDispatcher를 사용해서 자식페이지에서 값을 사용할 수 있도록 해준다.

3) loginResult.jsp
가져온 값을 넣어준다.

4) 결과확인

  • itwill/1234 (참)

  • ITWILL/1234(거짓)


    - 이렇게 하면 워드형식으로 작성하지 않고 작성한 form페이지를 그대로 가져올 수 있다.
profile
코딩 공부 💻

0개의 댓글