본문 바로가기

Servlet&JSP 프로그래밍

뉴렉처[Servlet/JSP] 강의 복습 34강~50강

34강 - 동적인 페이지(서버 페이지)의 필요성

동적인 문서를 만들기 위해서 redirect할때 처음 요청했을떄 누적한 데이터(쿠키)를 포함한 Servlet을 클라이언트에게

보여준다.

35강 - 처음이자 마지막으로 동적인 페이지 서블릿으로 직접 만들기

서블릿으로 동적인 페이지를 만들려면 모든 코드에 out.write(""); 를 추가해주어야하는 엄청난 수고가 발생한다.

따라서 앞으로 동적인 페이지를 서블릿으로 만들지 않고 JSP로 동적인 페이지를 만든다.

 

36강 - 계산기 서블릿 완성하기

 

37강 - 쿠키 삭제하기

Cookie expCookie = new Cookie("exp", exp); //exp(식)을 저장하는 쿠키생성

* 쿠키 삭제: expCookie.setMaxAge(0);

 

38강 - GET/POST에 특화된 서비스 함수

1) 클라이언트로부터 요청받은 함수가 GET인지 POST인지 비교

if(req.getMethod().equals("GET")){ //비교할때는 대문자 GET, POST로 써야한다.

   System.out.println("GET요청이 왔습니다.");

}else if(req.getMethod().equals("POST")){

   System.out.println("POST");

}

 

2) 특화된 서비스 함수 오버라이드 재정이하기(doGet(), doPost())

사용자 요청이 왔을때 ①Service함수 호출이 되고 요청 메서드가 GET인지 POST인지에 따라

②오버라이드 된 doGet() / doPost() 메소드를 호출한다.

따라서 3가지 케이스로 요청을 처리할 수 있다.

case1) GET요청만 처리하고 싶을때 ==> doGet()메서드를 오버라이드해서 사용

case2) POST요청만 처리하고 싶을때 ==> doPost()메서드를 오버라이드해서 사용

case3) GET요청과 POST요청 둘다 처리하고 싶을때 ==> service() 함수에서 처리

 

[사용예시]

protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

if(req.getMethod().equals("GET")) {

System.out.println("GET요청이 왔습니다.");

} else if(req.getMethod().equals("POST")) {

System.out.println("POST요청이 왔습니다.");

}

 

super.service(req, resp); //이 메소드가 doGet()/doPost() 를 호출한다.

}

 

@Override

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

System.out.println("doPOST 메소드가 호출 되었습니다.");

}

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

System.out.println("doGET 메소드가 호출 되었습니다.");

}

 

39강 - 계산기 프로그램 하나의 서블릿으로 합치기

 

40강 - JSP(닉네임: 제스퍼)를 이용한 자바 웹 프로그래밍

제스퍼라는 알바생은 html, css에 out.write()함수를 붙여서 서블릿 코드로 바꿔주는 작업을 한다.

제스퍼에게 일을 시키는 방법은 확장자 .jsp를 붙여주면 된다.

==> add.jsp 파일 ---> add_jsp.java 로 uri를 변경하고 서블릿 코드로 만들어준다.

(C:\jsp\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\ROOT\org\apache\jsp\add_jsp.java)

* <% %> 를 붙여주면 제스퍼에게 블록 내부에 있는 코드는 자바 코드니깐 out.write();로 변환하지말고 서블릿 코드에 단순히 삽입만 해달라고 하는 것과 같다.

 

41강 - JSP의 코드 블록

 

코드 블록의 종류 1) 자바 코드를 삽입하기 - <% %>

 

코드 블록의 종류 2) 화면에 출력 코드 + 자바 코드 - <% %>

                            (y의 값은:)          (y변수의 값 출력)

  ==>                      y의 값은 :  <% out.print(y) %> 

---> 좀 더 쉽게 표현하기 위해서 y의 값은: <%=y %>로 표현 가능하다.

* out.write()함수 와 out.print()함수의 차이

out.write()함수는 문자열을 출력하는 함수이다.

out.print()함수는 다양한 형태의 자료형(정수, 실수, 문자열 등)을 출력해주는 함수이다.

 

코드 블록의 종류 3) 선언부(Declaration)로 표현 - <%! %>

sum(int a, int b)라는 멤버 메서드를 정의하고 싶을때 단순히 <%  %> 코드블럭을 사용하면 에러가 발생된다.

Why?

코드블럭(<% %>)을 사용하면 sum(int a, int b) 멤버 메서드는 service()함수로 들어간다.

service()함수에 sum() 메서드를 넣으면 메서드 안에서 메서드를 정의하는 꼴이 된다.

자바에서는 메서드 안에서 메서드를 정의할 수 없기때문에 구문 에러가 발생한다.

 

따라서! 멤버 메서드를 정의할때는 클래스의 멤버를 정의하는 곳에 두어야 한다.

<%! %> 와 같이 블럭코드 안에 !(느낌표)를 붙여 줌으로써 멤버를 정의하는 곳에 두도록 설정한다.

코드 블록의 종류 4) 초기 설정을 위한 Page 지시자 설정 - <%@ %>

<% page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> 의 의미는 과거에 배웠던

<%  
     response.setCharacterEncoding("UTF-8"); // 내가(클라이언트) 앞으로 화면에 출력(보내는)하는 컨텐츠는

                                                         // UTF-8 이다.
     response.setContentType("text/html' charset=UTF-8"); //서버에서 컨텐츠를 보내는데 클라이언트(브라우저)에서
                                             // UTF-8로 읽어야한다. "text/html"은 컨텐츠의 타입이 html 문서이다 라고 명시
%>

 

설정과 같은 것이다.

 

42강 - JSP의 내장객체 간단히 알아보기

내장 객체에서 사용하는 변수와 중복된 변수 선언을 하지 않게 알아두고 있어야한다.

[내장객체에 사용되는 변수]

[입력도구]

[출력도구]

[Session객체]

 

43강- JSP로 만드는 Hello 서블릿

*nana.jsp 라는 jsp파일 생성시 소문자로 하는게 좋다.

(why? nana.jsp 라는게 uri로 매핑된 이름이기 때문이다.)

 

nana.jsp파일

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<% for(int i = 0; i < 10; i++) {%>
안녕 Servlet~~~~ <br />
<% }%>
</body>
</html>

 

실행시 nana.jsp파일을 서블릿 코드(out.println("")을 붙여서)로 출력해준다.


<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
out.println("<!DOCTYPE html>");
out.println("<html>");
out.println("<head>");
out.println("<meta charset="UTF-8">");
out.println("<title>Insert title here</title>");
out.println("</head>");
out.println("<body>");
<% for(int i = 0; i < 10; i++) {%>
out.println("안녕 Servlet~~~~ <br />");
<% }%>
out.println("</body>");
out.println("</html>");

 

44강 - 스파게티 코드를 만드는 JSP

코드 블럭이 난잡하게 중간에 삽이되어 있어 스파게티 코드가 되는 경향이 있어 유지보수하기 힘들게 된다.

 

45강 - MVC model1

입력 코드와 출력 코드를 나눔으로써 난잡했던 코드를 정리할 수 있게 된다.

따라서 코드를 작성할때는 최대한 코드 블럭을 한 곳에 몰아 놓고 그 결과 값을 가져다가 변수에 담아서 출력해주는 것이 좋다.

46강 - JSP MVC model을 model2 방식으로 Controller, Model과 View를 물리적으로 나눈다.

 

*나눔으로써의 장점

사용자 요청이 있을시 View단에 있는 것만 서블릿 코드로 만들어서 출력해줌으로써 서블릿으로 바꿀 양을 줄여준다.

Controller와 Model 부분을 미리 컴파일해서 배치시켜놓으면 실행 속도가 향상 된다.

Controller와 View를 나눔으로써 유지보수시 좋다.

 

* rediect와 forward의 차이점

redirect: 현재 작업했던 내용이 버려지고 새롭게 요청한다.

forward: 현재 작업했던 내용을 dispatcher로 등록한 uri로 이어지게 해준다.

(request, response를 활용해서 데이터를 가져올 수 있다.)

 

==> request객체(저장소)는 두개 이상의 서블릿이 어떤 값을 공유하고 싶을때 저장하는 저장소이다.

ex. Spag.java에서 저장한 변수 result를 spag.jsp에서도 이어지게 해주기 위해서 request저장소를 사용한다.

    (*Controller)                                (*View)

Spag.java(*Controller)에서 request.setAttribute("result", result); 로 result값 저장(꺼낼때 result로 꺼낸다.)

spag.jsp(*View)에서 request에서 result값을 꺼내려면 <%=request.getAttribute("result") %>로 꺼낼수있다.

 

47강 - View를 위한 데이터 추출 표현식 EL (Expression Language)

EL 표기법 - ${키워드}로 간단히 사용함으로써 View단에서 자바 코드를 없앨 수 있다.

 

일반 변수일때 꺼내는 방법, List에 담았을때 꺼내는 방법
Map에 담았을때 꺼내는 방법

48강 - EL의 데이터 저장소

저장 객체에서 값을 추출하는 우선순위는 page객체 -> request객체 -> session객체 -> application객체 순이다.

여기서 cnt라는 키워드(변수)가 page저장소, request저장소, session저장소, application저장소에 있다고 가정해보자!

${cnt}를 호출했을때 충돌 에러가 날 것인가? 아니면 정상적으로 값을 가져올까?

==> 에러가 나지 않고 정상적으로 값을 가져온다. 정상적으로 값을 가져올때 4개의 저장소 중에서 어디서 가져올까?

==> 우선순위 값으로 가져온다. (page객체 -> request객체 -> session객체 -> application객체)

 

만약 session저장소에 있는 cnt값을 가져오고 싶다면 어떻게 해야할까? ==> "Scope" 키워드를 붙여준다.

--> ${sessionScope.cnt}

나머지 저장소도 마찬가지로 pageScope.cnt, request.Scope, applicationScope를 이용해서 특정 위치의 저장소에 값을 가져올 수 있다.

49강 - EL 연산자

* 왜 꺽음쇄(<, >, <=, >=)를 안쓰고 lt(<), gt(>), le(<=), ge(>=)를 쓰는가? (ex. ${param.n gt 3})

==> html이 기본적으로 꺽음쇄(<>)를 가지고 있기 때문에 비교연산자를 쓸때 꺽음쇄를 쓰는건 바람직한 것이 아니기 때문이다.

일반적으로는 편한 꺽음쇄를 사용하고, 꺽음쇄를 연산자로 쓸 수 없는 환경에서 lt, gt, le, ge를 사용하자.

 

*empty 사용법

param.n의 값이 null이거나 빈문자열임을 확인하기 위해서 ${param.n == null || param.m == ''}와 같이 사용한다.

위와 같은 것을 한번에 ${empty param.n} 으로 작성 가능하다.(또는 ${not empty param.n})

#응용해서 삼항연사자로도 쓸 수 있다.

ex. ${empty param.n?'값이 비어있습니다':param.n}

 

*${param.n/2} 일때 파라미터로 넘오은 값(n)이 3인 경우(n=3) view에서는 어떻게 출력할까?

case1) 문자열로 넘어가서 오류날까?
case2) 몫 값인 1
case3) 몫과 나머지가 같이나오는 1.5

정답은 case3) 1.5가 나온다. 

 

 

 

 

 

 

 

 

[출처]

뉴렉쳐 
www.youtube.com/watch?v=u6-D8CJbsmo&list=PLq8wAnVUcTFVOtENMsujSgtv2TOsMy8zd&index=14