Java

[Java] JSP (Java Server Page)

Bay Im 2024. 4. 13. 12:38

JSP (Java Server Page)

  • JSP 란?
    • Java Server Page이며 서버 사이드 템플릿 엔진이다.
    • HTML안에 Java 코드나 EL, JSTL을 사용하여 동적인 페이지를 구성한다.
  • JSP 프로젝트 생성 (인텔리제이)
    1. build.gradle 코드 추가
      • dependencies {
            // JSP
            implementation 'jakarta.servlet:jakarta.servlet-api'
            implementation 'jakarta.servlet.jsp.jstl:jakarta.servlet.jsp.jstl-api'
            implementation 'org.apache.tomcat.embed:tomcat-embed-jasper'
            implementation 'org.glassfish.web:jakarta.servlet.jsp.jstl'
    2. application.properties 코드 추가
      • # JSP
        spring.mvc.view.prefix=/WEB-INF/views/
        spring.mvc.view.suffix=.jsp
    3. main 디렉토리 안에 webapp/WEB-INF/views 디렉토리 생성
    4. views 디렉토리에 .jsp 파일 생성
      • jsp 파일 상단에 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> 입력
    5. Controller 클래스 생성
      • @Controller 어노테이션 주입
      • 생성한 jsp 파일을 return 하는 @GetMapping 메소드 생성
  • JSP 파일의 주석문
    • <%— 주석내용 —%> 사용
  • JSP 심볼 종류
    • 페이지 지시어
      • <%@ %>
    • 출력문(표현식)
      • <%= %>
    • 전역변수, 함수 선언부
      • <%! %>
    • 자바 코드 영역 (스크립트릿)
      • <% %>
    • 심볼 사용 예시
      • JSP 코드
        • <%!
              int globalVar = 10;
              public int sum( int a, int b ){
                  return a + b;
              }
          %>
          <%
              //스크립트릿 : JSP안의 Java 코드
              String title = "java coding!";
              System.out.println( title );
          %>
          <!-- 표현식 -->
          전역변수 : <%= globalVar %> <br>
          타이틀 문자열 : <%= title %> <br>
          합계 함수 : <%= sum(10, 20) %>
      • 출력
        • 타이틀 문자열 : java coding!
        • 합계 함수 : 30
        • 전역변수 : 10
  • 페이지 지시어 (<%@ @>)
    • contentType
      • JSP 문서의 ContentType과 encoding 타입 지정
      • 기본 형태는 contentType=”text/html; charset=UTF-8”
      • contentType 종류
        • text/html, Application/xml, Application/json, Application/x-www-form-urlencode, text/plain, text/xml, multipart/formed-data
      • charset 종류
        • UTF-8, iso-8859-1, EUC-KR, ASCII
    • import
      • 자바 클래스 import
    • session
      • 세션 사용 여부 (기본값은 true)
    • buffer
      • 출력 버퍼(memory)의 크기 지정 (기본값은 8kb)
    • autoFlush
      • 출력 버퍼가 다 찼을 경우 자동으로 내보낼지 결정 (기본값은 true)
    • info
      • JSP 페이지에 대한 설명 기술
    • errorPage
      • JSP 페이지 실행 중 에러 발생시 보여줄 페이지 기술 (error.jsp)
    • isErrorPage
      • 현재 페이지가 에러 페이지 여부인지 지정 (기본값은 false)
    • pageEncoding
      • JSP 페이지 소스 코드의 문자 인코딩을 지정
      • charset과 차이점
        • charset은 서버가 웹 브라우저에게 보내는 문자 인코딩 타입(통신)
        • pageEncoding은 소스 코드 자체의 문자 인코딩 타입(파일)
    • isELIgnored
      • 표현언어의 사용 여부 (기본값은 false)
      • 출력문의 형식
    • deferredSyntaxAllowedAsLiteral
      • #{} 문자가 값으로 사용될지 여부 (기본값은 false)
    • trimDirectiveWhitespaces
      • 출력 결과에서 공백문자를 제거할지 여부 (기본값은 false)
  • request 내장 객체 (<%= 안에 작성 %>)
    • request.getRemoteAddr()
      • 접속한 클라이언트의 IP주소
        • 웹브라우저, 안드로이드폰, 아이폰 등
    • request.getContentLength()
      • 클라이언트가 전송한 요청정보의 길이
      • 길이를 알 수 없으면 -1 출력
    • request.getCharacterEncoding()
      • 요청정보의 문자 인코딩 정보(charset)
    • request.getContentType()
      • 클라이언트가 사용한 ContentType
    • request.getProtocol()
      • 요청정보의 통신 프로토콜
        • HTTP 1.0, HTTP 1.1
    • request.getMethod()
      • 요청정보의 전송방식
        • GET, POST, PUT, DELETE
    • request.getRequestURI()
      • 클라이언트가 요청한 서버의 URI(경로만)
        • (루트)/jsp_examples/ex09.jsp
    • request.getContextPath()
      • 웹 어플리케이션의 컨텍스트(폴더) 경로
        • /jsp_examples
    • request.getServerName()
      • 요청한 서버의 이름
        • localhost, 도메인 서버 이름
        • 도메인
          • 서버주소(123.123.123.123) 숫자
        • 도메인 서버
    • request.getServerPort()
      • 구동중인 서버의 포트 번호
        • 톰캣은 8090, 오라클은 8080을 사용중
  • JSP 페이지 간의 데이터 전달/받기
    • 데이터 전달 방법
      • application
      • pageContext
      • request
      • session
      • GET 방식으로 주소줄에 데이터 전달
      • input type=hidden submit 사용
      • jsp:forward jsp:param
      • c:redirect c:param
    • 데이터 받기
      • request.getParameter(”name명")
    • 예시
      • <jsp:forward page="ex08.jsp">
                <jsp:param name="id" value="hong" />
                <jsp:param name="pw" value="1234" />
        </jsp:forward>
        ----------------------------------------------
        // ex08에서 데이터 받기
        id 파라미터 값은 : <%= request.getParameter("id")  %>
        pw 파라미터 값은 : <%= request.getParameter("pw")  %>
  • 자바빈
    • 클래스의 멤버변수 및 데이터, getter/setter 등을 가져온다.
    • 자바빈 태그의 종류
      • jsp:useBean
        • 자바빈 객체(클래스)를 생성하는 태그
        • <jsp:useBean id="빈이름" class="자바빈 클래스 이름" scope="범위" /> 의 형태
        • 예시
          • 엔티티 클래스 생성 후 해당 클래스를 자바빈으로 등록
            1. Users 클래스 생성
              • @Getter
                @Setter
                @AllArgsConstructor
                @NoArgsConstructor
                public class Users {
                    private int userNo;
                    private String userId;
                    private String userPw;
                    private String phone;
                    private String address;
                    private LocalDate regDate;
                }
            2. jsp에서 가져오기 (상단에 작성)
              • <jsp:useBean id="users" scope="request" class="com.study.ex17jsp.Users" />
            3. jsp body 태그 안에서 사용
              • <body>
                <% users.setAddress("서울");  %>
                <%= users.getAddress() %>
                
                <!-- 반복문 -->
                <%
                    for(int i=0; i<5; i++){
                %>
                i: <%= i %> <br>
                <%
                    }
                %>
                </body>
      • jsp:setProperty
        • 생성된 자바빈 객체에 Property 값을 지정하는 기능
        • <jsp:setProperty name="자바빈" property="이름" value="값" /> 의 형태
      • jsp:getProperty
        • 생성된 자바빈 객체에 Property 값을 가져오는 기능
        • <jsp:getProperty name="자바빈" property="이름" /> 의 형태
  • 자바빈 객체의 수명
    • page
      • 현재 페이지의 범위에서만 한정
      • 페이지 처리가 끝나면 유효하지 않다.
    • request
      • 단일요청
      • Request 요청을 받고 처리를 완료할때까지 생존
    • session
      • 로그아웃전
      • 사이트 전체의 범위를 갖지만 지속 시간 동안만 유지
    • application
      • 웹브라우저 닫히기전까지
      • 사이트 전체의 범위를 갖고 계속 유지될 수 있다.
  • JSTL (자바 서버페이지 표준 태그 라이브러리)
    • JSP 표현식을 간단히 출력하기 위해 사용
      • 예시
        • <%= student %>에서 ${student}로
        • <% if %>에서 <c: if>로
        • <% for %>에서 <c: for>로
    • JSTL core 태그 종류
      • <c:set>
        • 변수 선언
        • 예시
          • <c:set var="name" value="홍길동" />
            • name: ${ name }
          • <c:set var="sum" value="0" />
      • <c:remove>
        • 변수 제거
        • 예시
          • <c:remove var="name" scope="page" />
      • <c:out>
        • 출력
        • 예시
          • <c:out value="${sum}" />
      • <c:if>
        • 조건문
        • 예시
          • <c:if test="${ 10 < 20 }">10은 20보다 작다</c:if>
          • <c:if test="${ name eq '홍길동' }">name은 홍길동이다.</c:if>
      • <c:choose>
        • switch(else if)문과 유사
        • 예시
          • <c:set var="grade" value="골드회원" />
            <c:choose>
                <c:when test="${ grade eq '우수회원'}">
                    회원등급은 우수회원입니다.<br>
                </c:when>
                <c:when test="${ grade eq '골드회원'}">
                    회원등급은 골드회원입니다.<br>
                </c:when>
                <c:when test="${ grade eq '일반회원'}">
                    회원등급은 골드회원입니다.<br>
                </c:when>
                <c:otherwide>
                    그외의 회원등급입니다.<br>
                </c:otherwide>
            </c:choose>
      • <c:when>
        • case문과 유사
      • <c:otherwise>
        • defalut문과 유사
      • <c:forEach>
        • 향상된 for문
        • 예시
          • 리스트 출력
            • <c:forEach var="i" begin="0" end="4" step="1">
                  i : ${ i } <br>
              </c:forEach>
          • 배열 출력
            • <c:set var="intArray" value="<%= new int[]{10,20,30} %>" />
              <c:forEach var="intValue" items="${ intArray }">
                  intValue : ${ intValue } <br>
              </c:forEach>
          • 값 더하기
            • <c:set var="sum" value="0" />
              
              <c:forEach var="i" begin="1" end="100" step="1">
                  <c:set var="sum" value="${sum + i}" />
              </c:forEach>
              
              합계: <c:out value="${sum}" />
          • 구구단 (7단)
            • <c:forEach var="i" begin="1" end="9" step="1">
                  7 * ${i} = <c:out value="${7*i}" /><br>
              </c:forEach>
  • var의 status 사용 종류
    • status.index
      • 현재 값의 인덱스 값 출력 (0부터 시작)
    • status.count
      • 현재 몇번째 루프인지 출력 (1부터 시작)
    • status.current
      • 현재 값 출력 (var 속성의 값과 같다.)
    • status.first
      • 현재가 첫번째 루프이면 true
    • status.last
      • 현재가 마지막 루프이면 true
    • status.begin
      • begin 속성을 사용했을 경우 그 값이 나온다.
    • status.end
      • end 속성을 사용했을 경우 그 값이 나온다.
    • status.step
      • step 속성을 사용했을 경우 그 값이 나온다.
    • 사용 예시
      • <c:forEach var="value" items="${ intArray }" varStatus="status">
            value : ${ value }<br>
            index : ${ status.index }<br>
            count : ${ status.count }<br>
            current : ${ status.current }<br>
        </c:forEach>
  • EL의 연산자 (${ 연산자 })
    • 수치 연산자
      • +, -, *, /(div), %(mod), 단항연산자 -부호
      • ++, — 연산자는 지원하지 않는다.
    • 비교 연산자
      • ==(eq), ≠(ne), <(lt), >(gt), ≤(le), ≥(ge)
    • 논리 연산자
      • &&(and), ||(or), !(not)
    • empty 연산자
      • empty(값)
        • true일 때: null, 빈 문자열, 길이가 0인 배열, 빈 Map, 빈 Collection
        • 그외 값은 모두 false
    • 삼항 연산자
      • 조건식 ? true값 : false값
    • 문자열 연결 연산자
      • +=
      • 예시
        • ${ "대한민국" += "만세" }
    • 세미콜론 연산자 (;)
      • 두개의 식을 붙일 때, 앞의 식은 무시되고 뒤의 식이 출력
      • 예시
        • ${ 1 + 1; 10 + 10 }
    • 기타
      • 특수문자 출력하고 싶을 때
        • \
          • 예시
            • \\${ 10 } ⇒ ${10} 출력
      • 표현 언어에서 $과 #의 차이점
        • ${ }
          • 미리 컴파일하고 실행
        • #{ }
          • 참조시(읽을 때) 컴파일하고 실행