BackEnd/Java

[Servlet/JSP]EL/JSTL

Hojung7 2024. 8. 16. 10:55
▶ EL(Expression Language)

 

 <%= %> 
    - JSP에서 표현식을 

      간단하고 효율적으로 작성할 수 있도록
      고안된 언어(JSP 내부에 기본 내장되어 있음!)

    - Java 값을 HTML 형태로 쉽게 출력할 수 있다!!

 

    - null을 빈칸("")으로 처리

     (NullPointerException을 발생시키지 않음!!)

 

   - get 이라는 단어를 거의 사용하지 않는다(  EL은 표현(출력) 언어 )

    → 값을 대입하고, 조건/반복하는 구문을 작성X

       오로지 출력!!

      (출력하려면 값을 얻어와야되는게 당연한 거라 get 단어 사용 X)

 

    - EL은 자료형 변환(parsing)을 자동 수행 해준다

 EL은 Java로 변환 되지만 문자열 비교는 == (비교 연산자) 사용 가능

   ${param.str == "abc"}
HTML에서 얻어온 데이터는 모두 String 하지만 EL에서 연산 되는 자료형이 다를 경우

자동으로 자료형 변환(parsing) 진행해준다!!!

   ${param.intNum == 100}
   ${param.doubleNum == 3.14}


  - 기본 작성법 :  \${key}  (백슬래시는 제거하고 사용)

 

전달 받은 파라미터 출력하기
- \${param.key} : key가 일치하는 파라미터 얻어오기
- \${paramValues.key} : key가 일치하는 파라미터 모두 얻어오기
존재하는 파라미터 얻어오기
 - JSP 표현식으로 으로 str 파라미터 얻어오기 :
    <%= request.getParameter("str")%>
   
 - EL구문으로 str 파라미터 얻어오기   
    ${param.str}
존재하지 않는 파라미터 얻어오기
 - JSP 표현식으로 으로 temp 파라미터 얻어오기 :
      <%= request.getParameter("temp")%>
   
 - EL구문으로 str 파라미터 얻어오기 
   ${param.temp}
▶ JSTL(Jsp Standard Tag Library)

 

  JSP에서 자주 사용하는 Java 코드를
  (if, for, 변수 선언, String 관련 메서드 ....)

  <%--  <% Java코드 %>  --%>
  스크립틀릿이 아닌 HTML 태그 모양으로 작성할 수 있도록
  태그를 제공하는 라이브러리

  [라이브러리 추가 방법]
 
    1. 필요한 라이브러리(.jar) 파일을 다운 받기

    2. 프로젝트 webapp/WEB-INF/lib 폴더에
       다운 받은 라이브러리 추가(복사, 붙여넣기)

    3. JSTL을 사용할 JSP 파일 제일 위에
       taglib 추가 구문 작성

 

 < 클라이언트가 서버로 요청을 하는 방법 >


      1) form 제출(FET/POST)


      2) a 태그 (GET)


      3) JS - location.href = "주소"; (GET)


      4) JS - Ajax(GET/POST/PUT/DELETE)
     

   ※ 브라우저 주소창에
    서버 컴퓨터 주소(ip:port,  ex) localhost:80 )만 작성하면
   
    index.jsp가 변환된 index_jsp.class 파일로 요청이 매핑
    -> 클라이언트에게 index.jsp 코드가 그대로 출력됨

   < index.html과   index.jsp 차이>
 
 html
html, css, js 코드 작성 가능
          + 정적 페이지(미리 만들어진 형태 그대로)
jsp
html, css, js , java, el, jstl 작성 가능
          + 동적 페이지(요청에 따라 응답 화면 변함 가능)

▶ Servlet/JSP 범위별 내장 객체

page(pageContext) 현재 JSP에서만 사용 가능한 객체(Servlet X)
request(요청) 요청 받은 페이지(Servlet/JSP)와
위임 받은 페이지(Servlet/JSP)에서 유지되는 객체
session(입회, 접속)  - session : 서버에 접속한 클라이언트를
                  나타내거나, 관련 정보를 get/set 할 수 있는 객체
                  (session 객체는 서버에서 관리함)
      
 - [중요!] session은 브라우저 마다 하나씩 생성된다!!!
      (새탭, 새창은 아님)

 - [유지 범위]
      사이트 접속 ~ 브라우저 종료 | 세션 만료

      - session이 유지되는 상태에서는 
      아무 곳에서나 가져다 사용할 수 있다!
application(ServletContext)  - 하나의 웹 애플리케이션 마다 1개만 생성되는 객체
      (Server를 키면 1개만 생성되는 객체)

 - application 객체는 어디서든 사용 가능

 - [유지 범위]
      서버 실행 ~ 서버 종료

▶ 내장 객체의 우선순위 

 

page > request > session > application

 

▶ Servlet/JSP 범위 객체에 값(속성) 추가 및 얻어오는 방법


 1.  값(속성) 추가하는 방법

 범위객체.setAttribute("key", value);



 2.  값(속성) 얻어오는 방법

 Object 범위객체.getAttribute("key");


 -> 반환형 Object -> 필요 시 다운캐스팅


 

#예제1

[html]

    <h1>
      <a href="/el_jstl">EL / JSTL 사용해보기</a>
    </h1>

 

[Servlet]

package edu.kh.jsp.controller;

import java.io.IOException;

import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

@WebServlet("/el_jstl")
public class ELJstLServlet extends HttpServlet{
	
	// GET 방식 요청 시
	// 지정된 JSP로 바로 요청 위임
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
	
    	// 1) JSP 경로(webapp 폴더 기준)
		String path = "/WEB-INF/views/el_jstl.jsp";
		//2) 요청 발송자 얻어오기
		RequestDispatcher dispatcher
		= req.getRequestDispatcher(path);
		
		//3) 요청 위임(forward)
		dispatcher.forward(req, resp);
		
		
		
	}
}

 

[jsp]

<%-- prefix : 접두사(앞에 붙는 단어/말)
  만약 prefix="c"    ->  <c:if>
  만약 prefix="core" ->  <core:if>
--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="ko">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>EL / JSTL 사용법</title>
</head>
<body>

  <h3>전달 받은 파라미터를 출력하는 방법</h3>

  <p style="color:red;">
    주소 뒤에 쿼리스트링(?name=홍길동&age=20)
    직접 작성해보면서 테스트
  </p>

  <h4>1. JSP 표현식</h4>
  <div>
    name : <%= request.getParameter("name") %>
    <br>
    age : <%= request.getParameter("age") %>
  </div>

  <h4>2. EL</h4>
  <div>
    <%-- EL에서 파라미터를 얻어오는 방법 : ${param.key값} --%>
    name : ${param.name}
    <br>
    age : ${param.age}
  </div>

  <hr><hr>


  <h3>JSTL c:if문 사용해보기</h3>

  <% 
    int age = Integer.parseInt(request.getParameter("age"));
    if(age > 20){%>

    <h3>성인 입니다11111</h3>

  <% } %>

  <c:if test="${param.age > 20}">
    <h3>성인 입니다</h3>
  </c:if>

  <c:if test="${param.age <= 20}">
    <h3>성인이 아닙니다</h3>
  </c:if>


  

</body>
</html>

 

#결과

#예제2

[html]

 <%-- form태그 method 기본값은 GET --%>
  <form action="/el/test1">
    문자열 입력 : <input type="text" name="str">
    <br>
    정수 입력 : <input type="number" name="intNum">
    <br>
    실수 입력 : <input type="text" name="doubleNum">

    <div>
      A <input type="checkBox" name="check" value="A">
      B <input type="checkBox" name="check" value="B">
      C <input type="checkBox" name="check" value="C">
    </div>


    <button>제출하기</button>
  </form>


  <hr>

  <h1>
    <a href="/el/scope">Servlet/JSP 범위(scope)별 내장 객체
    + EL 사용법</a>
  </h1>
  

  <hr>

  <h1>
    <a href="/jstl/test"> JSTL 간단히 다뤄보기 </a>
  </h1>

  <hr>

  <h1>
    <a href="/book/list"> 책 목록 조회하기 </a>
  </h1>


  <hr>

  <h1>forward와 redirect</h1>

  <h3>forward : 요청 위임</h3>

  <pre>
    - 클라이언트 요청을 받은 Servlet/JSP가
      직접 응답하는 것이 아닌
      다른 Servlet/JSP에 
      HttpServletRquest, HttpServletResponse 
      객체를 넘겨서(위임) 대신 응답하게 하는 것
  
    - 요청 위임시 
      RequestDispatcher(요청 발송자)를 이용

    - 요청 위임할 JSP ***파일 경로*** 작성

    - 응답 화면(결과 페이지) 주소는
      처음 Servlet이 요청 받은 주소 그대로!
  </pre>

  <form action="/fr/forward">
    forward 입력 1 : <input type="text" name="forwardInput1">
    <br>
    forward 입력 2 : <input type="text" name="forwardInput2">
    <button>forward 확인하기</button>
  </form>


  <hr>


  <h3>redirect (재요청, 다른 Servlet 요청)</h3>

  <pre>
    - 클라이언트의 요청을 받은 Servlet/JSP에서
      직접 응답하지 않고
      다른 Servlet/JSP를 다시 요청 하는 것

    - 보통 Servlet 요청 처리 후
      특정 JSP로 요청을 위임해 
      결과 화면을 응답해 주는 것이 아닌
      (요청 받은 Servlet이 응답해줄 JSP가 없음)

      다른 Servlet을 다시 요청하여
      다른 Servlet의 결과 화면을 응답해줌

    - redirect는 다시 요청 하는 것!!!
      -> 기존 client의 req, resp 객체가 "사라지고"
        새로운 "req, resp 객체가 생성"된다!!!

        -> request scope에 세팅된 값들이 모두 사라짐!!

    - redirect는 응답 화면의 주소가
      처음 요청한 Servlet 주소가 아닌
      다시 요청한 Servlet 주소로 변경된다!

    - 다른 Servlet을 요청하기 위해서는
      "요청 주소"를 작성해야 한다
  </pre>

  <form action="/fr/redirect">
    redirect 입력 1 : <input type="text" name="redirectInput1">
    <br>
    redirect 입력 2 : <input type="text" name="redirectInput2">
    <button>redirect 확인하기</button>
  </form>


</body>
</html>

 

[servlet]

package edu.kh.jsp2.controller;

import java.io.IOException;

import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

@WebServlet("/el/test1")
public class ELTestServlet1 extends HttpServlet {
 
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

		
		//----------------------------------------
		/*응답 처리*/
		//-> 원래는 Java에서 out.write("<html>") 써야 되는데
		//  너무 힘들어..
		//  -> JSP한테 응답 화면을 만들어 출력하라고
		//    떠넘기기(== 요청 위임(forward))
		
		// 1) JSP 경로 작성 (webapp 폴더 기준)
		String path = "/WEB-INF/views/el/test1.jsp";
		
		//2) 지정된 JSP 경로로 요청을 넘겨줄
		//   요청 발송자(RequestDispatcher) 객체 생성
		
		RequestDispatcher dispatcher
				= req.getRequestDispatcher(path);
		
		// 3) 요청 위임하기
		dispatcher.forward(req, resp);

		
	}
}

 

[jsp]

<%-- jsp 엔터 자동완성 이용 --%>

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="ko">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>EL 확인1</title>
</head>
<body>

<hr>
  <h3>전달 받은 파라미터 출력하기</h3>
  <pre>
    - \${param.key} : key가 일치하는 파라미터 얻어오기
    - \${paramValues.key} : key가 일치하는 파라미터 모두 얻어오기

  </pre>

<h4>존재하는 파라미터 얻어오기</h4>
  <ul>
    <li>
      JSP 표현식으로 으로 str 파라미터 얻어오기 :
      <%= request.getParameter("str")%>
    </li>
  
    <li>
    EL구문으로 str 파라미터 얻어오기 : ${param.str}
    </li>
  </ul>

<h4>존재하지 않는 파라미터 얻어오기</h4>
  <ul>
    <li>
      JSP 표현식으로 으로 temp 파라미터 얻어오기 :
      <%= request.getParameter("temp")%>
    </li>
  
    <li>
    EL구문으로 str 파라미터 얻어오기 : ${param.temp}
    </li>
  </ul>

  <hr>
  <h3>EL은 자료형 변환(parsing)을 자동 수행 해준다</h3>

  <ul>
  <%-- EL은 Java로 변환 되지만
      문자열 비교는 == (비교 연산자) 사용 가능 --%>
  <li> ${param.str == "abc"}</li>

<%-- HTML에서 얻어온 데이터는 모두 String
    하지만 EL에서 연산 되는 자료형이 다를 경우
    자동으로 자료형 변환(parsing) 진행해준다!!!
 --%>
  <li> ${param.intNum == 100}</li>
  <li> ${param.doubleNum == 3.14}</li>

  </ul>

  <h3>같은 key값을 지닌 파라미터 얻어오기</h3>
   <ul>
   <%-- check가 여래 개 전달된 경우 첫 번째 값 출력 --%>
   <li>
      param.check : ${param.check} 
   </li>
   
   <%-- check라는 key를 가진 모든 값을 모아 String[]로 반환 --%>
   <li>
      paramValues.check : ${paramValues.check}
   </li>
   
   <li>
      <li>paramValues.check[0] : ${paramValues.check[0]}</li>
      <li>paramValues.check[1] : ${paramValues.check[1]}</li>
      <li>paramValues.check[2] : ${paramValues.check[2]}</li>
   </li>


   </ul>


</body>
</html>

 

#결과