오봉이와 함께하는 개발 블로그

JSP - EL 본문

BE/JSP

JSP - EL

오봉봉이 2021. 12. 31. 16:26
728x90

표현 언어 : EL(Expression Language)

  • JSP 발전 과정
    • 초기 : HTML 태그 중심으로 자바를 이용해서 화면 구현
      • JSP 구성 내용 : HTML + JSP 태그 + 자바 코드
      • 화면에 대한 요구 사항이 복잡해지며 자바 코드를 대체하는 액션태그가 등장
      • 복잡한 자바 코드를 제거하는 방향으로 발전
        • 복잡한 자바 코드로 인해 화면 작업이 어려움
        • 프론트엔드 개발자와 백엔드 개발자 분리
    • 현재 : JSP 페이지는 JSP 태그의 스크립트 요소보다 표현 언어와 JSTL을 사용

EL(Expression Language)

  • 표현 언어
  • 자바 코드가 들어가 표현식을 좀 더 편리하게 사용하기 위해 JSP 2.0부터 도입된 데이터 출력 기능
  • 표현식 또는 액션태그 대신 값을 표현
  • <%= 값 %> => ${값}
  • attribute 또는 parameter 등을 JSP 파일에서 출력할 용도로 사용
    • attribute : ${attribute 이름}
    • parameter : ${param.이름} 또는 ${paramValue[인덱스]}

EL 연산자

  • 산술 연산자 : +, -, *, / %, (div, mod)
  • 관계 연산자 : >, >=, <, <=, ==, !=
    • (gt, ge, lt, le, eq, ne)
  • 논리 연산자 : &&, ||, !, (and, or, not)
  • 조건 연산자 : 수식 ? 참일 때 값 : 거짓일 때 값
  • empty 연산자 : 값이 null 이거나 길이가 0이면 참 (true)
    • ${empty 변수} : 변수가 null 이거나 0이면 참
    • ${not empty 변수} : 변수가 null이 아니거나 0이 아니면 참

EL을 액션 태그로 사용 예제 - el2.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<jsp:useBean id="student" class="main.StudentBean" scope="page">
    <jsp:setProperty name="student" property="stdName" value="홍길동" />
</jsp:useBean>
<html>
  <head>
      <title>Title</title>
  </head>
  <body>
    <jsp:getProperty name="student" property="stdName" />
    ${student.stdName}
  </body>
</html>

EL 내장 객체

  • Scope
    • pageScope : page 객체 참조
    • requestScope : request 객체 참조
    • sessionScope : session 객체 참조
    • applicationScope : application 객체 참조
  • 요청 파라미터
    • param : 요청 파라미터 참조
    • paramValues : 요청 파라미터(배열) 참조
  • 쿠키 값
    • Cookis : cookie 객체 참조
  • JSP 내용
    • pageContext : pageContext 객체 참조(페이지 정보)
  • 초기 파라미터
    • initParam : web.xml의 context 초기화 파라미터 참조

param 내장 객체 예제 - studentForm2.jsp, newStudentOk2.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
      <title>Title</title>
  </head>
  <body>
      <h3>학생 정보 등록</h3>
      <form name="frmStudent" method="post" action="newStudentOk2.jsp" >
          <table>
              <tr><td>학번</td><td><input type="text" name="stdNo"></td></tr>
              <tr><td>성명</td><td><input type="text" name="stdName" ></td></tr>
              <tr><td>전화번호</td><td><input type="text" name="stdPhone" ></td></tr>
              <tr><td>주소</td><td><input type="text" name="stdAddress" ></td></tr>
              <tr><td>학년</td>
                  <td><input type="radio" name="stdYear" value="1">1학년
                      <input type="radio" name="stdYear" value="2">2학년
                      <input type="radio" name="stdYear" value="3">3학년
                      <input type="radio" name="stdYear" value="4">4학년</td></tr>
              <tr><td colspan="2"> <input type="submit" value="등록">
                  <input type="reset" value="다시입력"></td></tr>
          </table>
      </form>
  </body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
      <title>폼에 입력한 값으로 빈 속성값 한번에 설정</title>
  </head>
  <body>
    <%
        request.setCharacterEncoding("utf-8");
    %>
    <h3>학생 정보 출력(EL param 객체 사용)</h3><br>
        학번 : ${param.stdNo} <br>
        성명 : ${param.stdName} <br>
        전화번호 : ${param.stdPhone} <br>
        주소 : ${param.stdAddress} <br>
        학년 : ${param.stdYear} <br>
  </body>
</html>

pageContext 내장 객체

  • 컨텍스트 이름(프로젝트명) 가져오기
  • getContextPath() 메소드 이용해서 컨텍스트 이름 가져오기 했던 것을 pageContext 내장 객체 사용 해서 컨텍스트 이름 가져올 수 있음
  • <a href=”/JSP01/sec01/login.jsp”>로그인</a>
  • <a href=”<%=request.getContextPath()%>/sec01/login.jsp”>로그인</a>
  • <a href=”${pageContext.request.contextPath}/sec01/login.jsp”>로그인</a>

pageContext 내장 객체 예제 로그인 페이지로 이동(4가지 방법) - newStudentOk2.jsp

  • url 사용 : “http://localhost:8080/JSP01/sec01/login.jsp”
  • <a>에서 ContextPath + ServletPath (URI) 사용
    • ”/JSP01/sec01/login.jsp”
  • getContextPath() 메소드 이용
    • request.getContextPath()
  • pageContext 내장 객체 사용
    • ${pageContext.request.contextPath}

EL (표현 언어)로 바인딩 속성 출력하기

  • request, session, application 내장 객체에 속성을 바인딩한 후 다른 서블릿이나 JSP에 전달 가능
  • 자바 코드 사용하지 않고 바인딩된 속성 이름으로 바로 값 출력
  • request.setAttribute("id", "hong");
  • 서블릿 : getAttribute("id") 해서 값 가져와서 사용
  • EL : ${id}

EL (표현 언어)로 바인딩 속성 출력하기 예제 - el-forward.jsp, el-forward-result.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
    <head>
        <title>Title</title>
    </head>
    <body>
        <%
            request.setAttribute("id", "Hong");
            request.setAttribute("pwd", "1234");
            request.setAttribute("name", "홍길동");
            request.setAttribute("email", "Hong@test.com");
        %>
        <jsp:forward page="el-forward-result.jsp" />
    </body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
    <head>
        <title>Title</title>
    </head>
    <body>
        <%
            request.setCharacterEncoding("utf-8");
        %>
        id : ${id }<br>
        pwd : ${pwd }<br>
        name : ${name }<br>
        email : ${email }<br>
    </body>
</html>

빈 객체 바인딩

  • StudentBean 사용
    • StudentBean student = new StudentBean(생성자로 초기화);
    • requset.setAttribute("student", student);
    • ${student.stdNo}

빈 객체 바인딩 예제 - el-forward2.jsp, el-forward-result2.jsp

<%@ page import="main.StudentBean" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
      <title>Title</title>
  </head>
  <body>
    <%
        StudentBean student = new StudentBean("2001003", "이몽룡", "010", "서울시 강남구", "4학년");
        request.setAttribute("student", student);
    %>
  <jsp:forward page="el-forward-result2.jsp" />
  </body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
    <head>
        <title>Title</title>
    </head>
    <body>
    학번 : ${student.stdNo } <br>
    성명 : ${student.stdName } <br>
    전화번호 : ${student.stdPhone} <br>
    주소 : ${student.stdAddress } <br>
    학년 : ${student.stdYear } <br>
    </body>
</html>

빈 객체 바인딩 예제 ArrayList - el-forward3.jsp, el-forward-result3.jsp

<%@ page import="main.StudentBean" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
    <head>
        <title>Title</title>
    </head>
    <body>
        <%
            StudentBean student1 = new StudentBean("2001003", "이몽룡", "010", "서울시 강남구", "4학년");
            StudentBean student2 = new StudentBean("2001001", "홍길동", "010", "서울시 강남구", "3학년");
            StudentBean student3 = new StudentBean("2001002", "성춘향", "010", "서울시 강남구", "2학년");

            List studentList = new ArrayList();
            studentList.add(student1);
            studentList.add(student2);
            studentList.add(student3);

            request.setAttribute("stdList", studentList);
        %>
        <jsp:forward page="el-forward-result3.jsp" />
    </body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
    <head>
        <title>Title</title>
    </head>
    <body>
<!--        바인딩된 ArrayList에서 인덱스 사용하여 데이터 출력-->
    <table border="1">
        <tr><th>학번</th><th>성명</th><th>전화</th><th>주소</th><th>학년</th></tr>
        <tr><td>${stdList[0].stdNo}</td><td>${stdList[0].stdName}</td><td>${stdList[0].stdPhone}</td><td>${stdList[0].stdAddress}</td><td>${stdList[0].stdYear}</td></tr>
        <tr><td>${stdList[1].stdNo}</td><td>${stdList[1].stdName}</td><td>${stdList[1].stdPhone}</td><td>${stdList[1].stdAddress}</td><td>${stdList[1].stdYear}</td></tr>
        <tr><td>${stdList[2].stdNo}</td><td>${stdList[2].stdName}</td><td>${stdList[2].stdPhone}</td><td>${stdList[2].stdAddress}</td><td>${stdList[2].stdYear}</td></tr>
    </table>
    </body>
</html>

scope : 스코프 우선순위

  • request, session, application 내장 객체에서는 데이터를 바인딩해서 다른 JSP 페이지로 전달
  • 각 내장 객체에 바인딩되는 속성 이름이 같은 경우 각 내장 객체에 지정된 출력 우선순위에 따라 순서대로 속성에 접근
    • 높음 page < request < session < application 낮음
  • pageScope : 현재 페이지 영역의 변수
  • requestScope : 이전 페이지에서 받아온 영역의 변수
  • sessionScope : session 영역의 변수
  • applicationScope : application 영역의 변수

스코프 우선순위 예제 - scope-priority.jsp, scope-priority-result.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
      <title>Title</title>
  </head>
  <body>
    <%
      // request -> session -> application
      session.setAttribute("name", "세션");
      request.setAttribute("name", "request");
      application.setAttribute("name", "애플리케이션");
    %>
  <jsp:forward page="scope-priority-result.jsp" />
  </body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
    <head>
        <title>Title</title>
    </head>
    <body>
        <h3>누가 더 높나?</h3><br>
        scope : ${name}
    </body>
</html>
728x90
Comments