EL(Expression Language)

1.특징

  • Java 에서 만든 Attribute를 쉽게 출력하기 위한 식
  • 쿠키나 파라미터도 쉽게 출력

2.출력 방법

  • ${attribute 이름} : attribute의 toString 메소드를 호출해서 출력
  • null 인 경우는 출력하지 않음

3.실습 - attribute 출력

1) ItemController의 URL 매핑 부분을 수정 - /el/*을 추가

@WebServlet({"/item/*", "/el/*"})

2) index.jsp 파일에 el 출력을 위한 링크를 추가

<a href="./el/disp">el 출력</a><br />

3) ItemController 클래스의 doGet 메소드에 el/disp 요청을 처리하는 코드를 작성

else if(command.equals("/el/disp")) {
    //데이터 저장
    request.setAttribute("msg", "Hello EL");


    dispatcher = request.getRequestDispatcher("../views/disp.jsp");
    dispatcher.forward(request, response);

}

4) WebContent 디렉토리의 views 디렉토리에 disp.jsp 파일을 만들고 전달된 데이터를 출력

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>EL 출력</title>
</head>
<body>
    <%
        //request 나 session에 저장된 attribute를 출력하기 위해서는
        //읽어와서 출력
        Object msg = request.getAttribute("msg");
        out.println("<p>" + msg + "</p>");
    %>
    <p>${msg}</p>
</body>
</html>
  • Model 2에서는 jsp 페이지에서 자바 코드를 사용하지 않는 것을 권장
    • EL을 이용해서 출력하게 되면 코드도 간결해지고 jsp 페이지에서 java 코드가 필요 없어집니다.

4.EL 데이터를 찾는 순서

  • page -> request -> session -> application 순으로 접근해서 attribute를 찾습니다.
    • 먼저 찾은 곳에서 저장된 데이터를 출력
  • 특정한 위치의 attribute를 출력하고자 하면 attribute 앞에 scope를 붙이면 됩니다.
${attribute이름} => ${pageScope.attribute}
  • requestScope, sessionScope, applicationScope를 붙일 수 있음
  • 각 영역에서 이름이 겹치는 경우는 거의 없음

5.파라미터 출력

${param.파라미터이름}
${paramValues.파라미터이름[인덱스]}

6.쿠키 출력

${cookie.쿠키이름}

7.초기화 파라미터 출력

${initParam.파라미터이름}

  • 초기화 파라미터는 web.xml 에 설정해서 프로젝트가 실행될 때 읽을 수 있는 파라미터

8.실습 - 초기화 파라미터 출력

1) web.xml 파일에 초기화 파라미터 생성

<!-- 초기화 파라미터 생성 -->
  <context-param>
      <param-name>db</param-name>
      <param-value>211.183.6.60:1521/xe</param-value>
  </context-param>

2) disp.jsp 파일에 초기화 파라미터 출력하는 코드를 작성

<p>초기화 파라미터:${initParam.db}</p>

초기화 파라미터 사용 이유
처음 한 번 읽어서 계속 사용하는 문자열의 경우는 java 코드에 적는 것 보다는 별도의 파일에 저장해두고 읽는 것이 좋습니다.
초기 문자열이 변경되어야 하는 경우 java 코드에 만들면 java 코드를 수정해야 합니다.
java 코드를 수정하면 compile을 다시 해야 하고 build를 다시해야 해서 예기치 않은 문제가 발생할 수 있기 때문에 별도의 파일에 작성해서 변경이 되더라도 다시 실행만 하면 되도록 해주는 것이 좋습니다.

9.대괄호 연산자와 .연산자

  • 대괄호([ ])는 배열에서만 사용할 수 있는 연산자인데 EL에서는 List 와 Map에서도 사용이 가능합니다.

배열[인덱스]
list.get(인덱스)를 해야 하지만 list[인덱스]로 데이터에 접근이 가능합니다.
map.get(키)를 해야 하지만 map["키"]로 데이터에 접근이 가능합니다.
map 과 dto 객체는 자신의 속성에 접근할 때 .속성명 으로 접근이 가능합니다.

10.list, map, dto 를 이용한 출력

1) ItemController의 /el/disp 요청을 처리하는 부분을 수정

else if(command.equals("/el/disp")) {
            //데이터 저장
            request.setAttribute("msg", "Hello EL");
            //List, Map, Item 클래스의 객체를 저장
            List<String> list = new ArrayList<String>();
            list.add("List");
            list.add("Set");
            list.add("Map");

            //Map 객체를 생성
            Map<String, Object>map = new HashMap<String, Object>();
            map.put("Encapsulation", "클래스와 인스턴스를 만드는 것");
            map.put("Inheritance", "상위 클래스의 모든 것을 하위 클래스가 물려받는 것");
            map.put("Polymorphism",
                    "동일한 코드가 대입되는 인스턴스에 따라 다른 메소드를 호출하는 것");

            //DTO 객체를 생성
            Item item = new Item();
            item.setNum(1);
            item.setName("딸기");
            item.setPrice(4000);
            item.setManufacture("충남 논산");
            item.setDescription("하우스에서 생성");

            //데이터 저장
            request.setAttribute("list", list);
            request.setAttribute("map", map);
            request.setAttribute("item", item);

            dispatcher = request.getRequestDispatcher("../views/disp.jsp");
            dispatcher.forward(request, response);
        }

2) disp.jsp 파일에서 list, map, item을 출력

<p>리스트 출력:${list[0]}</p>
<p>맵 출력:${map.Encapsulation}</p>
<p>DTO 출력:${item.name}</p>

11.el에서 기억해야 할 것

1) 기본형(boolean, byte, short, char, int, long, float, double), String, Date 는 attribute 이름만 이용해서 출력

2) Map 이나 Class(DTO) 의 데이터는 이름.속성이름 으로 출력

JSTL

  • Java Web Programming에서 자주 사용하는 Java 의 기능을 태그로 만들어서 사용할 수 있도록 해준 태그 라이브러리
  • jsp 페이지에서 자바코드를 사용하지 않고 자바의 기능을 사용하기 위해서 고안

1.기능

1) core : 자바의 변수선언 과 제어문 사용

2) formatting : 출력 형식을 설정

3) 데이터베이스

4) xml

5) 문자열 함수

2.사용 준비

  • jstl.jar 파일을 다운로드 받아서 WEB-INF/lib 디렉토리에 복사

3.자바에서 외부 라이브러리를 사용하는 방법

1) Java Application 의 경우 : jar 파일을 프로젝트에 복사하고 build path에 추가하면 됩니다.

2) Java Web Application 의 경우 : jar 파일을 WebContent/WEB-INF/lib 디렉토리에 복사

3) Maven Project 의 경우 : pom.xml 파일에 의존성 설정

4) Gradle Project(Android) : build.gradle 이라는 파일에 의존성 설정

Maven 과 Gradle은 프로젝트가 아니고 빌드 도구 입니다.

4.외부 라이브러리를 다운로드 받거나 pom.xml 이나 build.gradle에 작성

  • www.mvnrepository.com에서 검색하면 됩니다.
  • 오픈소스가 아닌 경우는 위 사이트에서 다운로드 하거나 검색할 수 없습니다.

    제조사에서 직접 다운로드하거나 코드를 복사해야 합니다. - oracle

5.jstl을 사용할 준비

1) www.mvnrepository.com 에서 jstl을 검색

2) 파일을 다운로드

3) WebContent/WEB-INF/lib 디렉토리에 파일을 복사

6.JSTL Core 기능

1) JSTL 의 Core 기능을 사용하기 위한 준비

  • jsp 페이지의 상단에 태그 라이브러리 설정 코드를 추가 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

  • c로 시작하는 태그는 uri로 설정된 곳에서 해석

    uri가 인터넷 주소처럼 되어 있지만 실제로는 인터넷 주소가 아니고 jstl.jar 파일의 주소입니다.

2) 변수 선언 <c:set var="변수명" value="값"/>

  • 변수가 생성되서 page 객체의 attribute로 저장됩니다.
  • el을 이용해서 출력이 가능

7.실습 - 변수 생성과 출력 실습

1) index.jsp 파일에 링크를 생성 <a href="./el/jstl">jstl 기능 연습</a><br/>

2) ItemController 클래스의 doGet 메소드에 /el/jstl 요청을 처리하는 코드를 추가

else if(command.equals("/el/jstl") && method.equals("GET")) {
    //출력할 페이지
    dispatcher = request.getRequestDispatcher("../views/jstl.jsp");
    dispatcher.forward(request, response);
}

3) views 디렉토리에 jstl.jsp 파일을 만들고 작성

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<!-- JSTL의 core 기능을 사용하기 위한 태그 설정 -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>    

<!-- 변수 만들기 -->
<c:set var="num" value="200" />    

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <p>${num}</p>
</body>
</html>

8.조건문

<c:if test="${표현식}">
    표현식이 true일 때 수행할 문장을 작성
</c:if>
  • jstl.jsp 파일에 추가
<c:if test="${num > 100}">
    <p>크다</p>
</c:if>
<c:if test="${num <= 100}">
    <p>작다</p>
</c:if>

9.c:choose

<c:choose>
    <c:when test = "${표현식}">
        표현식이 true일 때 수행할 내용
    </c:when>
    ...
    <c:otherwise>
        앞의 모든 표현식이 false일 때 수행할 내용
    </c:otherwise>
</c:choose>
  • jstl.jsp 파일에 코드를 추가
<!-- num이 100이면 실패 200이면 성공 -->
    <c:choose>
        <c:when test="${num==100}">
            <p>성공</p>
        </c:when>
        <c:when test="${num==200}">
            <p>실패</p>
        </c:when>
    </c:choose>

10.반복문

1) 일정한 횟수만큼 반복

<c:forEach begin="시작숫자" end="종료숫자" step="간격" var="변수명">
    반복할 내용
</c:forEach>
// step에 음수는 안됨

2) 배열이나 리스트의 데이터를 순회

<c:forEach var="변수명" items="${배열이나 list의 이름}">
    반복할 내용
</c:forEach>
  • 배열이나 list의 데이터가 변수에 하나씩 대입되면 반복할 내용을 수행
    <!--  데이터 순회  -->    
    <div>수량<select name="cnt">
            <c:forEach var="cnt" begin="1" end="100" step="1">
                <option value="${cnt}">${cnt}</option>
            </c:forEach>
    </select></div>

    <div>수량<select name="cnt">
            <c:forEach var="cnt" begin="1" end="100" step="1">
                <option value="${100-cnt}">${100-cnt}</option>
            </c:forEach>
    </select></div>

11.item/list 요청을 처리

  • Item 클래스의 List를 출력

1) Service 인터페이스에 목록보기를 위한 메소드를 선언

//아이템 목록을 가져오는 메소드
public List<Item> list(HttpServletRequest request);

2) Service 클래스에 목록보기를 위한 메소드를 구현

    @Override
    public List<Item> list(HttpServletRequest request) {
        List<Item> list = new ArrayList<Item>();


        Item item = new Item();
        item.setNum(1);
        item.setName("사과");
        item.setPrice(5000);
        item.setManufacture("충북 청송");
        item.setDescription("비타민 C가 풍부");
        list.add(item);

        item = new Item();
        item.setNum(2);
        item.setName("딸기");
        item.setPrice(4000);
        item.setManufacture("충남 논산");
        item.setDescription("하우스 딸기");
        list.add(item);

        item = new Item();
        item.setNum(3);
        item.setName("천혜향");
        item.setPrice(8000);
        item.setManufacture("제주");
        item.setDescription("감귤보다 맛있음");
        list.add(item);
        //아이템 목록을 리턴할 때 데이터의 개수 0 이면 조회된 데이터가 없는 것입니다.
        //List는 null을 리턴하지 않도록 해야 합니다.
        //List는 반복문에 사용하기 때문에 null을 리턴하면 예외가 발생합니다.
        return list;
    }

3) ItemController 클래스의 doGet 메소드에 /item/list 요청을 처리하는 코드를 작성

else if(command.equals("/item/list") && method.equals("GET")) {
            //데이터를 검색해서 조회해야 하는 경우는 데이터를 검색하고 그 결과를 request에 저장하고
            //결과 페이지로 포워딩
            List<Item> list = itemService.list(request);
            request.setAttribute("list", list);


            dispatcher = request.getRequestDispatcher("../views/list.jsp");
            dispatcher.forward(request, response);
        }

4) views 디렉토리에 list.jsp를 만들고 list를 출력하는 코드를 작성

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>목록 보기</title>
</head>
<body>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
        <h2 align='center'>아이템 목록</h2>
        <table align='center' border='1'>
            <tr>
                <th>번호</th>
                <th>이름</th>
                <th>가격</th>
            </tr>    
            <c:forEach var="item" items="${list}">
                <tr>
                    <td>${item.num}</td>
                    <td>${item.name}</td>
                    <td>${item.price}</td>
                </tr>    
            </c:forEach>
        </table>
</body>
</html>

5.목록을 출력하고 상세보기 링크 만들기

  • 예전에는 대부분 상세보기 링크에 파라미터로 기본키를 만들었습니다. <a href="./detail?num=1">제목</a>

  • 최근에는 이런 형태가 아니라 기본키 값을 url에 붙여서 만듭니다. <a href="./detail/1">제목</a>

        <!--  list 라는 이름으로 저장된 데이터를 item이라는 변수에 하나씩 대입  -->
        <c:forEach var="item" items="${list}">
            <tr>
            <!--  item에 있는 목록들을 출력  -->
            <td>${item.num}</td>
            <td><a href="./detail/${item.name}">${item.name}</a></td>
            <td>${item.price}</td>
            </tr>
        </c:forEach>

results matching ""

    No results matching ""