공부/그냥 공부

[JSP] Java Server Page

ㄱ ㅣ린 2023. 3. 26. 02:30

※ JSP (Java Server Page) 

  • Java EE에서 동적으로 웹페이지(HTML)를 생성하기 위해 제공하는 기능.
  • Servlet 기능 개선 
    • class안에 HTML코드를 작성하는 방식
    • 디자이너와 개발자간의 업무구분이 되지않는다
    • 제작하여 서비스하기 복잡하다
  • 개발자가 컴파일하지 않는다. (Web Container가 자동 컴파일)
  • 디자이너와 개발자간 업무구분이 어느정도 가능
  • + CSS(Client Side Script): Front-End에서 실행되는 스크립트 언어
    • JavaScript, ActionScript --> HTML안에서 작성되고 실행되는 언어
  • SSS(Server Side Script): Back-end에서 실행되는 스크립트 언어
    • JSP, ASP, PHP --> 요청되면 동적으로 HTML을 생성하는 언어

 


  # JSP Tags

  • JSP에서 기능을 정의할 때 사용하는 태그들
  • JSP가 자바로 변경될 때 코드가 생성되고, 사용자들에게 태그의 내용이 보이지 않는다.
  • 5가지 종류
태그명 태그 설명
지시자 (directive) page <%@ page .. %> JSP페이지의 환경설정용
include <%@ include .. %> 다른 JSP를 끼워넣을 때 사용
스크립트렛 (scriptlet) <%   %> JSP에서 method안에 정의하는 자바코드를 작성할 때
지역변수 선언, 제어문
표현식 (expression) <%=  %> 웹 브라우저로 출력할 때
선언 (declaration) <%!  %> JSP에서 method를 정의할 때
JSP에서 instance variable, static variable를 선언할 때
주석 (comment) <%--  --%> JSP태그의 실행을 막을 때

 

  1. 스크립트렛 Scriptlet
    • 형식) <%  %>
    • JSP에서 method안에 정의하는 자바코드를 작성할 때
    • Scriptlet안에서 정의한 코드는 JSP가 자바소스로 변경될 때, _jspService()안에 코드가 생성
  2. 표현식 Expression
    • 형식) <%= 값  %>
    • JSP에서 발생한 값을 웹 브라우저로 출력하기 위해 사용
    • JSP가 자바로 변경될 때 _jspService method안에 out.print()로 변경된다.
      • JSP: <%=  값  %>  →  코드변환: out.print(값);
      • Error: out.print method에는 파라미터가 하나만 존재하기 때문에 <%= 값, 값 %%> → out.print(값, 값);
  3. 선언 (Declaration)
    • 형식) <%!   코드 → _jspService가 아닌 class field에 코드가 생성된다 %>
    • ¡ 주의: JSP나 Servlet은 객체를 사용하여 접속자를 구분하기 어렵기 때문에, 객체마다 생성되는 instance 변수로 접속자를 구분하기 어렵다 !
    • 내장객체를 사용할 수 없다
  4. 주석 (Comment)
    • 형식) <%--   --%>
    • JSP tag의 실행을 막을 때 사용
  5. 지시자 (Directive)
    • 형식) <%@  %>
    • page 지시자
      • 문법) <%@ page 속성="값"  속성="값"  %>
      • JSP 페이지의 환경 설정용
속성명 기본값 하는일 확장값
language java JSP페이지에서 사용할 언어 설정 OOP언어를 완벽하게 지원하는 언어
extends HttpJspBase
(WAS마다 다름)
JSP가 자바소스로 변경될 때 상속받을 부모 클래스 설정 웹서비스를 할 수 있는 코드가 구현된 class
isThreadSafe "true" JSP에서 Thread에 대한 사용설정 "false" - JSP를 접속자바다 프로세스를 생성하여 사용할 때
buffer "8kb" JSP가 HTML로 생성될 때 사용할 Stream의 크기 "8kb, 16kb, 32kb"
autoFlush "true" 스트림의 내용을 분출 "false"
info "" JSP페이지의 간단한 설명 JSP페이지의 간단한 설명
contentType "text/html" JSP가 응답될 때 생성할 파일 설정. (MIME type 설정 - web.xml에서 확인) web.xml에 설정된 MIME-type들
pageEncoding "UTF-8" JSP파일 내에서 사용할 charset 설정 사용할 charset
session "true" JSP에서 WAS가 제공하는 Session을 사용할 때 "false"
errorPage "" JSP페이지에서 error가 발생할 때 이동할 페이지의 설정 Error가 발생했을 때 응답할 페이지의 URL
isErrorPage "false" JSP가 다른 JSP에서 문제가 발생했을 때 보여줄 에러 페이지인지의 설정 "true"
isELlgnored "false" JSP에서 EL의 사용여부 "true" - EL을 사용하지 않음
trimDirective
WhiteSpaces
"false" JSP에서 지시자를 사용할 때 발생하는 enter를 없앨 때 "true" - 지시자에 의해 발생되는 공백을 없앤다
import JSP운영에 필요한 패키지 JSP에서 다른 패키지의 클래스를 사용할 때 "패키지명.클래스명" - 필요한 패키지를 사용

 

JSP 응답

  •  include 지시자
    • 문법) <%@ include file="JSP URI" %>
      • http://localhost/jsp/project/test.jsp    == URL
      • http://localhost/jsp/project/test.jsp == URI (서버의 정보를 포함하지 않은 주소(다른 서버 접속 불가))
    • 여러 JSP가 하나의 JSP에 합쳐져서 한번에 보여줄 때 사용
    • 주의: JSP의 page지시자가 다른 값을 가지게 되면 error가 발생할 수 있다
    • JSP가 자바소스로 변경될 때 합쳐진다. 다른 JSP 변수나 method를 사용할 수 있다(변수나 method가 공유된다.)
    • web browser에서 source 보기 했을 때 하나의 HTML 처럼 보이도록 만든다
    • 공통디자인보다는 여러 페이지에서 사용되는 공통코드를 정의할 때 주로 사용한다. (로그인 되었는지 세션을 체크하는 코드)
    • <jsp:include>, <c:import> 보다 동작속도가 빠르다

JSP include

 

  # JSP 요청

  • GET 방식과 POST 방식으로 요청
  • <a>, <form>, location
  • GET 방식 요청: <a>, <form>, location
    • <a> : <a href="요청 JSP URL">링크</a>
    • <form> : <form method="get" action="요청 JSP URL"> <input type="button"/> </form>
      • <input type="button">  : Javascript에서 유효성 검증 후 document.submit(); 호출하여 back-end 페이지를 요청한다
    • location : location.href="요청 JSP URL";
  • POST 방식 요청: <form>
    •  <form method="post" action="요청 JSP URL"> <input type="button"/> </form>
      • <input type="button">  : Javascript에서 유효성 검증 후 document.submit(); 호출하여 back-end 페이지를 요청한다

 

  # 내장 객체

  • _jspService method 안에 선언되어 있는 객체들
내장객체명 데이터형 하는 일
request HttpServletRequest - 접속자의 정보 얻기
- 요청 파라미터 얻기
- forward로 페이지 이동(RequestDispatcher 함께 사용)
- session, cookie 얻기
- forward로 이동한 페이지에서 사용될 값 저장, 관리
response HttpServletResponse - 응답방식 설정 (MIME type 설정)
- redirect로 페이지 이동
- download
- cookie 설정
session HttpSession 접속자 별 데이터를 저장하고 관리
out JspWriter 웹 브라우저로 출력
application ServletContext 모든 접속자가 사용하게 될 공통 값 저장, 관리
pageContext PageContext (ServletConfig) 접속한 페이지에서만 사용될 값 저장, 관리
exception Throwable - page 지시자의 isErrorPage="true" 상태에서만 존재하는 내장객체
- 예외처리에 사용

+ scope 객체: 접속자가 사용하는 값을 저장하고 관리하는 객체. pageContext, request, seesion, application

  • 접속자 정보 얻기
    • request 내장객체 (HttpServletRequest) 사용
    •  
    • 요청 방식 : request.get  // get, post
    • 접속자 ip address : request.getRemoteAddr();
    • 접속자 port : request.getRemotePort();
    • 요청 URL : request.getRequestURL();    // http://localhost:80/jsp/project/test.jsp
    • 요청 URI : request.getRequestURI();    // jsp/project/test.jsp
    • 요청 프로토콜 : request.getProtocol();   // http
    • 요청 서버주소 : request.getServerName();  // localhost (서버 ip, domain)
    • 요청 서블릿 경로 : request.getServletPath();   // project/test.jsp
    • 서버 포트 : request.getServerPort();   // 80
    • QueryString : request.getQueryString();  // 이름=값&이름=값
    • parameter : request.getParameter("이름");  // 값
    • parameter values : request.getParameterValues("이름");   // [값, 값,,,]

 

# Web Parameter 받기

  • HTML Form Control의 값 받기
  • HTML Form Control에 name 속성의 값이 유일하면 request.getParameter를 사용하고, name 속성의 값이 중복되면 request.getParameterValues(); 를 사용한다.
  • name 속성이 같은데 getParameter를 사용하면 가장 처음 값 하나만 입력된다
  • 파일 전송(enctype="multipart/form-data")이 아닌 parameter 전송방식 (enctype="application/x-www-for-urlencoded" 방식)

 

# GET과 POST 방식에서 한글 처리

  • GET방식인 경우 decoding된 글자가 저장된다 (한글 안깨짐)
  • POST방식인 경우 decoding되지 않은 글자가 저장된다. (한글 깨짐)
    • request가 사용되기 전에 수행한다.   request.setCharacterEncoding("charset");

 

# out

  • jspWriter 클래스로 생성된 객체로 scriptlet안에서 web browser로 출력할 때
  • out.print(" ");   out.println(" ");

 

# response

  • 응답방식 설정 ( response.setContentType() ), 관계유지 객체사용(Cookie 설정), 페이지 이동 ( response.sendRediret() ), file Download

 

# 서버 내 페이지 이동

  • forward (request)
    • 데이터 처리 페이지와 view 페이지를 분리하여 만들 때 (Model2 방식의 개발에서 주로 사용)
    • 요청 시에 페이지 이동
    • 웹 브라우저는 페이지 이동을 모른다 (이전 페이지에 요청 parameter을 이동한 페이지에서 사용할 수 있다. URL이 변경되지 않는다.)
    • scope객체에 값을 저장하여 이동한 페이지로 값을 보낼 수 있다.
    • 사용법)
      • 1. 이동할 페이지를 설정하여 RequestDispatcher에 할당
        • RequestDispatcher rd = request.getRequestDispatcher("URI");  // 다른 서버로 보낼 수 없다.
      • 2. request scope 객체에 값 설정 - 이동할 페이지로 값을 넘겨줄 때
        • request.setAttribute("이름", 값);
      • 3. 이동
        • rd.forward(request, response);
    • request 내장객체 (scope 객체)를 사용한 값 설정과 값 얻기
      • 값 설정: request.setAttribute("이름", Object값);
      • 값 얻기: 입력된 클래스명 객체명 = (Casting)request.getAttribute("이름");

forward 동작

  • redirect (response)
    • 정상적인 요청이 있을 때 응답되는 페이지에서 비정상적인 요청(페이지를 URL을 사용하여 직접 요청)이 발생했을 때 사용한다.
    • 요청 URL을 변경하여 보여줄 때 사용
    • response 내장객체를 사용하여 페이지를 이동한다.
    • 이동한 페이지에서 이전페이지에 요청한 값을 사용할 수 없다.
    • 접속자 브라우저에 응답된 후 접속자 브라우저에서 자동 재요청을 수행한다. (URL이 변경된다.)
    • 사용법)  response.sendRedirect("이동할 URL");

redirect 동작

 

# 관계 유지

  • 웹은 비연결성 (요청이 발생하면 응답해주고 연결을 끊는다.) 
    • 장점: 접속자수가 많아도 연결을 유지하지 않아 저사양의 컴퓨터로도 웹서버를 구성할 수 잇다
    • 단점: 서버에서 발생한 데이터를 접속자에 실시간으로 보내줄 수 없다 (server push가 될 수 없다). client pull로 해결할 수 있다(접속자가 지정한 시간애 재요청하여 데이터를 받는다)
  • 서버는 접속자의 상태를 알 수 없다 (접속자가 현재 가진 값을 서버에서 알 수 없다.)
  • 서버가 접속자의 상태(값)을 알 수 있도록 저장하는 기술 개발 ==> 세션, 쿠키
    • 세션 Session
      • 접속자의 정보를 서버 측 메모리에 저장하는 기술
      • 접속자가 어떤 브라우저를 사용하더라도 정보를 저장할 수 있다 (모든 접속자에 적용할 수 있다.)
      • 모든 값이 저장가능 (Object을 저장)
      • 자바에서는 session을 사용하기 위해 HttpSession 인터페이스를 제공한다.
    • 쿠키 Cookie
      • 접속자의 정보를 접속자 HDD에 file로 저장하는 기술
      • 문자열만 저장가능 (1MByte까지만 저장)
      • 접속자의 웹 브라우저가 쿠키를 지원하지 않으면 정보를 저장할 수 없다 (접속자가 직접 제어 가능 - 중요 정보를 저장하지 않음)

 

# 세션 Session

  • 내장객체로 제공
  • 페이지 지시자에 session="true" 인 상태에서 내장객체를 사용할 수 있다.
  • 세션이 필요한 이유
    • 웹은 접속자가 요청하면 커넥션이 연결되고, HTML이 응답되면 연결이 끊어진다 ( 이전 페이지에서 사용한 값이 다음 페이지에서 사용될 수 없다 )

세션이 필요한 이유

  • 세션 사용
    • 접속자의 웹 브라우저에 id를 부여하고 식별하여 정보를 저장하고, 웹 브라우저가 종료되면 사라진다
    • apache tomcat 에서는 세션 유지 시간을 30분으로 설정하고 있다. (web.xml에 <session-timeout>을 설정한다)
    • 사용법)
      • 1. 세션 얻기. WAS가 실행되면 세션이 생성된 상태
        • session="true" => 내장객체로 바로 사용가능
          session="false" => 요청 객체로부터 세션을 얻는다HttpSession session = request.getSession();
      • 2. 세션의 생존시간 설정 (web.xml에서 할 수 있다.) - 한번 설정하면 모든 jsp에 동일 시간으로 설정된다.
        • session.setMaxInactiveInterval(초)
      • 3. 값 할당 - 값은 Object이기 때문에 모든 값을 할당할 수 있다.
        • session.setAttribute("이름", 값);
      • 4. 값 사용 - 할당된 값은 모든 jsp에서 사용자를 식별하여 사용할 수 있다.
        • 데이터형 변수명 = (Casting)session.getAttribute("이름");
      • 5. 세션 값 삭제
        • session.removeAttribute("이름");
      • 6. 브라우저에 할당된 session 무효화
        • session.invalidate();

 

# 쿠키 Cookie

  • 접속자의 정보를 접속자 HDD의 file에 저장하는 방식
  • 문자열만 저장가능
  • 사용법)
    • 쿠키 심기
      • 1. 쿠키 생성
        • Cookie cookie = new Cookie("이름", "값");
      • 2. 생존시간 설정 (생존시간을 설정하지 않으면 브라우저가 실행되는 동안만 유지)
        • cookie.setMaxAge(초); // 초*분*시*일*월*년
      • 3. 쿠키 심기 (접속자 컴퓨터에 파일 생성)
        • response.addCookie(쿠키객체);
    • 쿠키 읽기
      • // 1. 쿠키들 얻기 (JSESSIONID는 기본으로 얻어진다)
        Cookie[] cookies = request.getCookies();
        Cookie c = null;
        for(int i=0; i < cookies.length; i++) {
             c = cookies[i];
             // 2. 쿠키 이름얻기
             String name = c.getName();
             // 3. 쿠키 값얻기
             String value = c.getValue();
        }
    • 쿠키 삭제
      • method가 없음(비연결성)
      • 1. 삭제할 쿠키와 같은 이름으로 쿠키 생성
        • Cookie c = new Cookie("이름", "");
      • 2. 생존시간을 0으로 설정
        • c.setMaxAge(0);
      • 3. 쿠키 심기
        • response.addCookie(c);

쿠키의 사용

 

세션과 쿠기의 차이점

 

# 표준 액션

  • JSP에서 제공하는 기능을 가진 태그들 (JSP tag와 다르게 작성하면 정해진 일을 수행)
  • 형식) <jsp: 태그명 속성="값"> 내용 </jsp: 태그명>
             <jsp: 태그명 속성="값"/> // element 내용 없는 경우
    • <jsp: include> : 여러 개의 JSP를 합쳐서 보여줄 때 사용 (디자인을 합칠때)
    • <jsp: forward> : forward로 페이지 이동할 때
      <jsp: param> : forward로 이동할 때 parameter를 생성 전달할 때 사용
    • <jsp: useBean> : bean(VO)를 생성할 때, web parameter를 받을 때
      <jsp: setProperty> : setter method 호출
      <jsp: getProperty> : getter method 호출
    • <jsp:include>
      • 여러 개의 JSP를 한번에 보여줄 때 사용
      • <%@ include %>보다 처리속도는 느리지만 지시자의 충돌이 발생하지 않고, 변수, method에 공유가 되지 않는다. => 공통 디자인을 제작(ex. footer)
      • 사용법) <jsp:include page="끼워넣을 JSP"/>
    • <jsp:useBean>
      • VO를 객체 생성할 때, Web parameter를 받을 때
      • web parameter처리
        • 사용자가 서버로 전달하는 값
        • <jsp:useBean>을 사용하면 request.getParameter를 사용하지 않고 web parameter를 받을 수 있다
        • 사용법)
          • VO 생성 ( ¡ instance variable명과 HTML Form Control의 이름이 같아야한다 )
            public class MemberVO {
                  private String name, id;
                  private int age;
                  getter&setter method 정의
            }
          • 값을 받는 JSP에서 useBean태그 선언
            ¡ 패키지명은 import로 처리할 수 없고 full path로 처리한다 !
            <jsp:useBean id="객체명" class="패키지명.클래스명" scope="page"/>
            <jsp:useBean id="mv" class="day.MemberVO"/>
              // 모든 parameter를 받기 위해
              <jsp:setProperty name="객체명" property="*" />  // *=모든  setter method
              <jsp:setProperty name="mv" property="*" />
    • <jsp:getProperty>
      • getter method 를 호출하여 웹 브라우저에 출력하는 일
      • 사용법)
        • <jsp:getProperty name="객체명" property="method명" />
                                                                          get을 제외한 method명을 소문자로 작성
                                                                          getMyName() { } ==> myName
        • <jsp:setProperty name="객체명" property="method명" value="값" />
                                                                          set을 제외한 method명을 소문자로 작성
                                                                          setMyName(String ){ }  ==> myName

  • useBean action tag의 scope 속성
    • page: JSP가 호출될 때마다 생성되고, VO가 JSP에서만 사용된다
    • request: JSP가 호출될 때마다 생성되고, VO가 forward로 이동한 페이지에서도 사용된다
    • session: 웹 브라우저마다 하나의 객체가 생성되고, 생성된 객체는 모든 JSP에서 사용된다
    • application: 최초 접속자에 의해 하나의 객체가 생성되고, 생성된 객체는 모든 접속자가 공유하여 사용한다
  • <jsp:forward>
    • fowrad 방식(데이터처리와 뷰를 구분해서 제작할 때)으로 페이지를 이동할 때 사용
    • 이동한 JSP로 web parameter를 생성하여 넘길 때
      <jsp:param name="이름" value="값" /> 태그를 사용한다 // 값은 web parameter로 전송되기 때문에 문자열로만 전송된다
    • 문법) 
      • 단순 페이지
        <jsp:forward page="이동할 JSP URI" />
      • 웹 파라메터를 생성하여 이동
        <jsp:forward page="이동할 JSP URI" >
            <jsp:param name="이름" value="값" />
        </jsp:forward>

 

  • EL(Expression Language)
    • 표현언어: JSP 화면 출력을 하기위해 만들어진 언어
    • page directive에 isELIgnored="false"인 상태에서 사용할 수 있다.
    • 변수의 값, scope 객체의 값, web parameter값, 간단한 연산결과를 출력한다.
    • 사용법)  ${ 코드 }
      연산자의 사용)   ${ 값 연산자 값 }
                        사용가능한 연산자[ 단항(!, +, -), 산술(+,-,*,/), 관계(>,<,<=, >=, ==, !=), 논리(&&, ||), 삼항( ?: )  ]
                        EL에서는 문자가 존재하지 않는다.
                        Null은 출력하지 않는다. empty: 비어있는 값을 비교하여 true | false로 반환한다
      web parameter 출력)   ${ param.폼컨트롤명 }, ${ paramValues.폼컨트롤명[인덱스] }
                        param객체 사용한다.
    • 변수 출력
      • EL에서는 변수를 직접 출력할 수 없기 때문에 Scope 객체 사용
      • 사용법) 
        • page => pageScope.이름
          request => requestScope.이름
          session => sessionScope.이름
          application => applicationScope.이름
        • 1. Scope객체에 값 설정
          pageContext.setAttribute("이름", 값);
          requestContext.setAttribute("이름", 값);
          sessionContext.setAttribute("이름", 값);
          applicationContext.setAttribute("이름", 값);
        • 2. EL에서 Scope 객체에 값 사용
          $ { pageScope.이름 }
          $ { requestScope.이름 }
          $ { sessionScope.이름 }
          $ { applicationScope.이름 }