EL expression EL 표기법 사용하기

728x90

 

 

JSP에서 <%%>를 사용하여 자바를 사용할 수 있지만 이 방식으로 사용 시 JSP가 매우 더러워질 수 있다.

 

본래 JSP의 목적에 맞게 VIEW로만 활용하여 깔끔한 코드를 유지해야 하는 것이 맞기 때문에 EL 표기법을 사용하여 깔끔한 코드를 유지할 수 있다.

 

EL의 표기법은 ${ }을 사용하면 된다 // Jquery 표기법과 헷갈리지 말자! = $(' ')

 

<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@page import="com.VO.UserBoardVO"%>
<%@ page contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
    <%
    UserBoardVO bvo = new UserBoardVO();
    bvo.setNum(11);
    bvo.setId("Tim");
    bvo.setTitle("게시판 테스트");
    bvo.setContent("내용 테스트");
    
    pageContext.setAttribute("bvo", bvo);
    
    //request객체
    pageContext.setAttribute("msg", "World");
    //아래의 EL을 사용하면 아래의 EL 값을 변경할 필요없이 값을 바꿈 = 타이핑이 줄어들음
    %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<body>
<!-- EL expression Language, 화면에 표시 -->
<div>
<%
	out.println("Hello");
	UserBoardVO b = (UserBoardVO)pageContext.getAttribute("bvo");

%>
</div>
<div>제목: <%=b.getTitle() %></div> <!-- 일반 컨텍스트 사용하여 표시 -->
<div>내용: ${bvo.content} </div>
<!-- private으로 설정해서 get같은거 써야 정상이지만 그냥 객체 이름인 bvo써서 .content만 쓰면 해결됨  -->
<!-- 편의성 만땅 -->

 </div>
</body>
</html>

 

위의 코드처럼 일반적으로는 attribute를 받고 <%=b.getTitle%>과 같이 사용하는 것도 가능하지만 코드의 가독성이 떨어진다.

 

따라서 EL 표기법을 사용하여 ${bvo.content}로 간편하게 사용하여 표기할 수 있다.

 - private으로 설정했지만 get등의 표기법을 생략하고 .content로 바로 표기 가능.

 

 

리스트 형식을 for을 사용하여 EL 표기법으로 사용하려면 아래와 같이 사용한다.

 

일단 for 루프를 EL표기법만으로는 표기할 수 없기에 taglib을 사용할 수 있게 만들어주는 라이브러리를 설치해야한다.

 

https://mvnrepository.com/artifact/javax.servlet/jstl/1.2

 

위의 링크에 가서 jar 파일을 다운받은 후에, 작업하는 프로젝트의 main\webapp\WEB-INF\lib 폴더안에 저장한다.

 

저장 후에 JSP상단에서 아래의 코드를 입력

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

c는 core함수만 이용하겠다는 의미이고 url은 url을 참조하여 이용하겠다는 의미?

 

for문을 사용하는 방법은 두가지가 있다.

 

1. forEach를 사용하고 var에 b라는 변수를 대입하여 items안에 있는 list2라는 값을 출력

<c:forEach var="b" items="${list2}">
<!-- items는 list2의 객체를 다룬다는 말이고 -->
<!-- var는 변수를 빼내서 어떤 이름으로 저장할 건지 설정-->
	<div>${b.title}</div>
</c:forEach>

 

2. begin, 즉 0번부터 end, list2의 사이즈까지 status라는 변수를 사용하여 status.index로 출력

<c:forEach begin="0" end="${list2.size()}" varStatus="status">
	<div>
	${list2[status.index].title }
	</div>
</c:forEach>

 

EL형식으로 Map의 객체를 출력하려면 아래와 같이 출력한다

 

c:forEach에서 변수를 m으로 주고 map을 EL로 지정하여 출력한다.

각각의 key value를 더블 EL 표기법을 사용하여 더블for 을 사용하여 값을 출력한다.

   <%
   
   List list = new ArrayList();
   list.add(1);
   list.add(2);
   
   Map map = new HashMap();
   map.put("num", list);
   
   
   request.setAttribute("map", map);
   %>
   
   <div>
<c:forEach var="m" items="${map}">
	<c:forEach var="s" items="${m.value}">
	<!-- 태그로 더블 for문 만들기 -->
		${s}
	</c:forEach>
</c:forEach>
</div>

 

이 때 setAttribute로 값을 배정하는 것 대신에 아래와 같이 태그 안에 지역을 지정해주면 코드를 생략할 수 있다.

<c:set var="map" value="<%=map%>" scope="page"> </c:set> <!-- </c:set>을 줄여서 /로 사용, body가 없기때문에 이렇게 사용 가능 -->

map이라는 변수에 map의 값을 배정하고 scope지역은 page로 지정해서 이 페이지 안에서만 map의 값을 사용 가능

 

 

 

최종활용

 

아래 service에서 request영역으로 list라는 List 객체를 전달하였으면

	public String getPath() {
		
		String m = getP();
		if(m == null) {
			NewsDAO dao = new NewsDAO();
			List<NewsVO> list = dao.getnewsList();
			request.setAttribute("list", list);
			
			return "/mainPage.jsp";
		}
		return null;
	}

 

이 list의 값을 출력하기 위해 스크립트립인 <%%>을 사용하는 것이 아닌 아래와 같이 사용 

                <ul class="newsTitle">
                <c:set var="list" value="${requestScope.list}"/>
                	<c:forEach var="vo" items="${list}">
                    	<li><a href='${vo.link }' target='_blank'>${vo.title}</a></li>
                   	</c:forEach>
                </ul>

c:set을 사용하여 서비스 클래스에서 request영역으로 보내준 ilst를 value = "${requestScope.list }"로 받아오고

list의 변수이름으로 할당받아 c:forEach 태그로 반복문 사용.

 

자바의 문법을 제외함으로써 뭔가 더욱 HTML스러워지고 깔끔해졌다.

728x90