EL이란?
Controller에서는 데이터를 가공하게 되고 그 가공한 것을 request저장소에 담아 View에서 사용하게 된다. View에서는 가능하면 자바코드를 사용하지 않는 것이 MVC를 구현하는 가장 좋은 방법이다.이를 쉽게 하는 방법이 EL이다.
왜 View에서는 자바코드를 사용하지 않는 것이 MVC를 구현하는데 가장 좋은 방법인가?
- 분리된 역할 : MVC는 모델, 뷰, 컨트롤러로 역할을 분리하는데, 뷰는 사용자 인터페이스를 담당하고 모델은 응용프로그램의 상태와 로직을 처리하며, 컨트롤려는 사용자 입력을 처리하고 모델 및 뷰를 관리한다. 자바코드가 뷰에 들어가게되면 이러한 역할에 혼란이 온다.
- 향상되는 가독성
- 유지보수 용이
EL에서는 getter를 사용하지 않고 속성을 가져온다.
ex)
public class Person {
private String name;
public String getName() {
return name;
}
}
${person.name}
기존 코드
Spag.java ( Controller단 )
@WebServlet("/spag")
public class Spag extends HttpServlet{
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
int num = 0;
String num_= request.getParameter("n");
if(num_ != null && !num_.equals(""))
num = Integer.parseInt(num_);
String result;
if(num%2!=0)
result="홀수";
else
result="짝수";
request.setAttribute("result", result);
// redirect - 현재 작업과 상관없는 새로운 요청을 함
// forward - 현재 작업한 내용을 이어가게 해줌
RequestDispatcher dispatcher = request.getRequestDispatcher("spag.jsp");
// 현재 작업한 내용을 인자로 담아 그 내용이 dispatcher경로인 spag.jsp로 이어지게 함
// forward관계에 있는 Spag.java와 spag.jsp의 저장소는 request가 사용된다.
dispatcher.forward(request, response);
}
}
spag.jsp( View단 )
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!-- -------------------------------------------------------------- -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%=request.getAttribute("result") %> 입니다.
</body>
</html>
EL 적용
Spag.java ( Controller단 )
@WebServlet("/spag")
public class Spag extends HttpServlet{
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
int num = 0;
String num_= request.getParameter("n");
if(num_ != null && !num_.equals(""))
num = Integer.parseInt(num_);
String result;
if(num%2!=0)
result="홀수";
else
result="짝수";
// EL적용
request.setAttribute("result", result);
String[] names = {"newlec", "dragon"};
request.setAttribute("names", names);
Map<String, Object> notice = new HashMap<>();
notice.put("id", 1);
notice.put("title", "EL은 좋아요");
request.setAttribute("notice", notice);
// redirect - 현재 작업과 상관없는 새로윤 요청을 함
// forward - 현재 작업한 내용을 이어가게 해줌
RequestDispatcher dispatcher = request.getRequestDispatcher("spag.jsp");
// 현재 작업한 내용을 인자로 담아 그 내용이 dispatcher경로인 spag.jsp로 이어지게 함
// forward관계에 있는 Spag.java와 spag.jsp의 저장소는 request가 사용된다.
dispatcher.forward(request, response);
}
}
spag.jsp( View단 )
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!-- -------------------------------------------------------------- -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%=request.getAttribute("result") %> 입니다.
${result}
${names[1]}
${notice.id}
${notice.title}
</body>
</html>
<%=request.getAttribute("result") %> 를 ${result} 로 받은 것이 동일한 출력을 나타내는것을 확인하였다.
EL을 통해 page객체, request객체, session객체, application객체에 담긴 값을 뽑아낼 수 있다.
우선순위는 page - request - session - application 순이다. 우선순위에 상관없이 특정 저장소에서 뽑아내고 싶은 경우 scope한정사를 붙인다. 따라서 pageScope, requestScope, sessionScope, applicationScope라고 한다.
<%
pageContext.setAttribute("result", "hello");
%>
<body>
${requestScope.result}<br>
${result}
</body>
</html>
page객체에 담긴값은 "hello", request에 담긴 값은 홀수, 짝수 판별 값이다.

requestScope를 붙인 경우 짝수, 이를 붙이지 않았을 경우 page객체가 우선순위가 더 높으므로 hello가 출력되었다.
그 외 내장 객체
- param :
String num_= request.getParameter("n"); 일 때
String num_= request.getParameter("n"); 대신
${param.n} // parameter 정보 꺼냄
-
header : ${header.accept} / / header정보 꺼냄
참고 자료 출처 :
https://youtube.com/watch?v=VPvs6SGQ9yY&list=PLq8wAnVUcTFVOtENMsujSgtv2TOsMy8zd&index=48
https://www.youtube.com/watch?v=TAgXBpfJ4-o&list=PLq8wAnVUcTFVOtENMsujSgtv2TOsMy8zd&index=49
'서블릿 JSP' 카테고리의 다른 글
MVC model1 & model2 (0) | 2024.02.27 |
---|---|
JSP 기본 구조 (0) | 2024.02.26 |
두 개의 서블릿을 하나로 합치기 (0) | 2024.02.26 |
서블릿 동적인 페이지 (0) | 2024.02.25 |
redirect (0) | 2024.02.24 |