EL(Expression Language) : 스코프(Scope) 속성값으로 저장된 객체를 제공받아 클라이언트에게 전달하여 출력하기 위한 언어
${속성명} : EL 표현식으로 스코프의 속성명을 사용하면 속성값을 제공받아 출력
이름(name) = ${name }
스코프 속성값이 객체인 경우 ${속성명.필드명} 형식의 표현식을 사용하여 객체의 필드값을 제공받아 출력 가능 (EL 표현식으로 필드명을 사용하면 Getter 메소드 자동 호출)
pageContext.setAttribute(String attributeName, Object attributeValue)
pageContext.setAttribute("name", "홍길동");
pageContext 내장객체에 속성명(문자열)과 속성값(객체)을 전달받아 저장하는 메소드 (Page Scope)
Page Scope : 스코프 속성값을 저장한 웹프로그램에서만 객체를 반환하아 사용 가능
String name=(String)pageContext.getAttribute("name");
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
pageContext.setAttribute("name", "홍길동");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MVC</title>
</head>
<body>
<h2>EL 미사용</h2>
<%
String name=(String)pageContext.getAttribute("name");
//전달받은 속성명에 대한 속성값이 없는 경우 null 반환
String pageName=(String)pageContext.getAttribute("pageName");
%>
<p>이름(name) = <%=name %></p>
<%-- JSP 표현식에서는 출력값이 [null]인 경우 "null" 문자열로 변환되어 출력 --%>
<p>이름(pageName) = <%=pageName %></p>
<%-- if 명령을 사용하여 JSP 표현식의 출력값이 [null]이 아닌 경우에만 출력되도록 설정 --%>
<p>이름(pageName) = <% if(pageName!=null) { %><%=pageName %><% } %></p>
<hr>
<h2>EL 사용</h2>
<%-- ${속성명} : EL 표현식으로 스코프의 속성명을 사용하면 속성값을 제공받아 출력 --%>
<%-- => getAttribute() 메소드를 호출하지 않아도 스코프의 속성값을 제공받아 사용 가능 --%>
<p>이름(name) = ${name }</p>
<%-- 스코프 속성명으로 저장된 속성값이 없는 경우 EL 미실행 - 속성값 미출력 --%>
<p>이름(paagName) = ${pageName }</p>
</body>
</html>
package xyz.itiwll.el;
public class Car {
private String modelName;
private String carColor;
public Car() { }
public Car(String modelName, String carColor) {
super();
this.modelName = modelName;
this.carColor = carColor;
}
public String getModelName() {
return modelName;
}
public void setModelName(String modelName) {
this.modelName = modelName;
}
public String getCarColor() {
return carColor;
}
public void setCarColor(String carColor) {
this.carColor = carColor;
}
}
pageCotext 내장객체에 Car 객체를 속성값으로 저장
pageContext.setAttribute("car", new Car("싼타페","하얀색"));
pageContext 내장객체에 저장된 속성값을 Car 객체로 반환받아 저장
Car car=(Car)pageContext.getAttribute("car");
Car car=(Car)pageContext.getAttribute("pageCar");
String modelName=car.getModelName();
<p>자동차 모델명 = ${car.modelName }</p>
<%@page import="xyz.itiwll.el.Car"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
//pageCotext 내장객체에 Car 객체를 속성값으로 저장
pageContext.setAttribute("car", new Car("싼타페","하얀색"));
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MVC</title>
</head>
<body>
<h1>EL(Expression Language)</h1>
<hr>
<h2>EL 미사용</h2>
<%
//pageContext 내장객체에 저장된 속성값을 Car 객체로 반환받아 저장
Car car=(Car)pageContext.getAttribute("car");
//전달받은 속성명에 대한 속성값이 없는 경우 [null] 반환
// => 참조변수에 [null]이 저장된 상태에서 메소드를 호출하면 NullPointerException 발생
//Car car=(Car)pageContext.getAttribute("pageCar");
//객체의 필드값을 반환받아 저장
String modelName=car.getModelName();
String carColor=car.getCarColor();
%>
<p>자동차 = <%=car %></p>
<p>자동차 모델명 = <%=modelName %></p>
<p>자동차 색상 = <%=carColor %></p>
<hr>
<h2>EL 사용</h2>
<p>자동차 = ${car }</p>
<%-- EL 표현식으로 제공받은 객체의 메소드 호출 가능 --%>
<%-- <p>자동차 모델명 = ${car.getModelName() }</p> --%>
<%-- 스코프 속성값이 객체인 경우 ${속성명.필드명} 형식의 표현식을 사용하여 객체의
필드값을 제공받아 출력 가능 - EL 표현식으로 필드명을 사용하면 Getter 메소드 자동 호출 --%>
<%-- => Getter 메소드 작성 규칙에 맞지 않게 선언된 경우 또는 Getter 메소드가 없는 경우 에러 발생 --%>
<p>자동차 모델명 = ${car.modelName }</p>
<p>자동차 색상 = ${car.carColor }</p>
<%-- EL 표현식의 속성명으로 제공되는 속성값이 없는 경우 EL 미실행 - NullPointerException 미발생 --%>
<p>자동차 모델명 = ${pageCar.modelName }</p>
</body>
</html>
VO클래스를 만들필요 없음
HashMap 객체(Map 객체)를 생성하여 저장
Map<String, String> carMap=new HashMap<String, String>();
HashMap 객체(Map 객체)에 엔트리(Entry : 이름과 값을 하나의 묶음으로 표현한 요소)를 추가하여 저장
carMap.put("modelName", "싼타페");
pageContext 내장객체의 속성값으로 HashMap 객체(Map 객체) 저장
pageContext.setAttribute("carMap", carMap);
pageContext 내장객체에 저장된 속성값을 객체로 반환받아 저장
Map<String, String> car=(Map<String, String>)pageContext.getAttribute("carMap");
<p>자동차 = ${carMap }</p>
Map 객체에 저장된 엔트리(Entry)에서 맵키(Key)를 이용하여 맵값(Value)을 반환받아 출력
<p>자동차 모델명 = <%=car.get("modelName") %></p>
스코프 속성값이 Map 객체인 경우 ${속성명.맵키} 형식의 표현식을 사용하여 Map 객체에 저장된 엔트리의 맵값을 제공받아 출력
<p>자동차 모델명 = ${carMap.modelName }</p>
<%@page import="java.util.HashMap"%>
<%@page import="java.util.Map"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
//HashMap 객체(Map 객체)를 생성하여 저장
Map<String, String> carMap=new HashMap<String, String>();
//HashMap 객체(Map 객체)에 엔트리(Entry : 이름과 값을 하나의 묶음으로 표현한 요소)를 추가하여 저장
carMap.put("modelName", "싼타페");
carMap.put("carColor", "하얀색");
//pageContext 내장객체의 속성값으로 HashMap 객체(Map 객체) 저장
pageContext.setAttribute("carMap", carMap);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MVC</title>
</head>
<body>
<h1>EL(Expression Language)</h1>
<hr>
<h2>EL 미사용</h2>
<%
//pageContext 내장객체에 저장된 속성값을 객체로 반환받아 저장
//@SuppressWarnings : 프로그램 소스코드에서 발생되는 경고를 제거하는 어노테이션
// => value 속성값으로 경고의 종류를 설정 - 다른 속성이 없는 경우 속성값만 설정 가능
@SuppressWarnings("unchecked")
Map<String, String> car=(Map<String, String>)pageContext.getAttribute("carMap");
%>
<p>자동차 = <%=car %></p>
<%-- Map 객체에 저장된 엔트리(Entry)에서 맵키(Key)를 이용하여 맵값(Value)을 반환받아 출력 --%>
<p>자동차 모델명 = <%=car.get("modelName") %></p>
<p>자동차 색상 = <%=car.get("carColor") %></p>
<hr>
<h2>EL 사용</h2>
<p>자동차 = ${carMap }</p>
<%-- 스코프 속성값이 Map 객체인 경우 ${속성명.맵키} 형식의 표현식을 사용하여 Map 객체에
저장된 엔트리의 맵값을 제공받아 출력 --%>
<%-- => EL 표현식에서 맵키를 사용하면 Map 객체의 get() 메소드가 자동 호출되어 맵값 반환 --%>
<p>자동차 모델명 = ${carMap.modelName }</p>
<p>자동차 색상 = ${carMap.carColor }</p>
</body>
</html>
package xyz.itwill.el;
public class Member {
private String name;
private Car car;
public Member() { }
public Member(String name, Car car) {
super();
this.name = name;
this.car = car;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Car getCar() {
return car;
}
public void setCar(Car car) {
this.car = car;
}
}
Member 객체를 생성하여 Request Scope 속성값으로 저장하고 다른 웹프로그램(JSP)로 포워드 이동하는 JSP 문서
request 내장객체에 Member 객체를 속성값으로 저장 (Request Scope)
Request Scope : 스코프 속성값을 저장한 웹프로그램과 스레드가 이동된 웹프로그램에서만 속성값을 객체로 반환받아 사용 가능
request.setAttribute("member", member);
포워드 이동 : 현재 웹프로그램의 명령을 실행하는 스레드를 다른 웹프로그램으로 이동시켜 명령을 실행하도록 제공하는 기능
request.getRequestDispatcher("member_non_el.jsp").forward(request, response);
<%@page import="xyz.itwill.el.Member"%>
<%@page import="xyz.itwill.el.Car"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
Member member=new Member("홍길동", new Car("싼타페", "하얀색"));
//request 내장객체에 Member 객체를 속성값으로 저장 - Request Scope
//Request Scope : 스코프 속성값을 저장한 웹프로그램과 스레드가 이동된 웹프로그램에서만
//속성값을 객체로 반환받아 사용 가능
request.setAttribute("member", member);
//포워드 이동 : 현재 웹프로그램의 명령을 실행하는 스레드를 다른 웹프로그램으로 이동시켜
//명령을 실행하도록 제공하는 기능
// => 스레드가 이동되는 웹프로그램에서는 현재 웹프로그램의 request 객체와 response 객체를 전달받아 사용
//request.getRequestDispatcher("member_non_el.jsp").forward(request, response);
request.getRequestDispatcher("member_el.jsp").forward(request, response);
%>
요청페이지(member.jsp)의 Request Scope 속성값을 객체로 반환받아 클라이언트에게 전달하는 JSP 문서
요청페이지(member.jsp)에 대한 실행 결과를 제공받아 응답 처리하는 웹프로그램(View)
<%@page import="xyz.itwill.el.Member"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
//Request Scope 속성값을 객체로 반환받아 저장
Member member=(Member)request.getAttribute("member");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MVC</title>
</head>
<body>
<h1>EL 미사용</h1>
<hr>
<%-- <p>회원 = <%=member %></p> --%>
<p>회원의 이름 = <%=member.getName() %></p>
<%-- <p>회원의 자동차 = <%=member.getCar() %></p> --%>
<p>회원의 자동차 모델명 = <%=member.getCar().getModelName() %></p>
<p>회원의 자동차 색상 = <%=member.getCar().getCarColor() %></p>
</body>
</html>
요청페이지(member.jsp)의 Request Scope 속성값을 객체로 반환받아 클라이언트에게 전달하는 JSP 문서
요청페이지(member.jsp)에 대한 실행 결과를 제공받아 응답 처리하는 웹프로그램(View)
EL 표현식에서 . 연산자 대신 [] 연산자를 이용하여 필드명(맵키)으로 필드값(맵값)을 제공받아 출력
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MVC</title>
</head>
<body>
<h1>EL 사용</h1>
<hr>
<%-- <p>회원 = ${member }</p> --%>
<p>회원의 이름 = ${member.name }</p>
<%-- <p>회원의 자동차 = ${member.car}</p> --%>
<p>회원의 자동차 모델명 = ${member.car.modelName}</p>
<p>회원의 자동차 색상 = ${member.car.carColor}</p>
<hr>
<%-- EL 표현식에서 . 연산자 대신 [] 연산자를 이용하여 필드명(맵키)으로 필드값(맵값)을 제공받아 출력 --%>
<%-- => [] 연산자에 필드명(맵키) 사용시 반드시 ""으로 표현 --%>
<p>회원의 이름 = ${member["name"] }</p>
<p>회원의 자동차 모델명 = ${member["car"]["modelName"]}</p>
<p>회원의 자동차 색상 = ${member["car"]["carColor"]}</p>
</body>
</html>
속성값이 배열 객체나
List 객체인 경우는 dot(.) 연산자로 표현이 불가능하므로 반드시 [] 연산자를 이용해야 한다.
[] 연산자는 “두번째변수”를 사용할 때 자바 이름 규칙을 이용해야 하는데 자바 이름 규칙을 벗어나는 경우
EL 표현식에서 [] 연산자를 이용하여 다른 스코프 속성값을 제공받아 맵키로 표현하여 맵값 출력 가능 (맵키를 속성값으로 대체하기 위해 사용)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
String[] nameArray={"홍길동","임꺽정","전우치","일지매","장길산"};
request.setAttribute("nameArray", nameArray);
request.getRequestDispatcher("string_array_el.jsp").forward(request, response);
%>
스코프 속성값이 배열인 경우 배열 요소값을 표현하기 위해 EL 표현식에서 . 연산자로 첨자(Index)를 표현한 경우 ELException 발생
스코프 속성값이 배열인 경우 배열 요소값을 표현하기 위해 EL 표현식에서 [] 연산자로만 첨자(Index)를 표현하여 요소값을 제공받아 출력
<li>${nameArray[0] }</li>
EL 표현식의 참자가 배열 요소의 범위를 벗어난 경우 EL 미실행 (미출력)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MVC</title>
</head>
<body>
<h1>EL - Array</h1>
<hr>
<ul>
<%-- 스코프 속성값이 배열인 경우 배열 요소값을 표현하기 위해 EL 표현식에서 . 연산자로
첨자(Index)를 표현한 경우 ELException 발생 - . 연산자 사용 불가능 --%>
<%-- <li>${nameArray.0 }</li> --%>
<%-- 스코프 속성값이 배열인 경우 배열 요소값을 표현하기 위해 EL 표현식에서 [] 연산자로만
첨자(Index)를 표현하여 요소값을 제공받아 출력 --%>
<%-- <li>${nameArray["0"] }</li> --%><%-- 첨자는 " " 기호 생략 가능 --%>
<li>${nameArray[0] }</li>
<li>${nameArray[1] }</li>
<li>${nameArray[2] }</li>
<li>${nameArray[3] }</li>
<li>${nameArray[4] }</li>
<%-- EL 표현식의 참자가 배열 요소의 범위를 벗어난 경우 EL 미실행 - 미출력 --%>
<li>${nameArray[5] }</li>
</ul>
</body>
</html>
package xyz.itwill.el;
public class Student {
private int num;
private String name;
public Student() { }
public Student(int num, String name) {
super();
this.num = num;
this.name = name;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
<%@page import="java.util.ArrayList"%>
<%@page import="xyz.itwill.el.Student"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
List<Student> studentList=new ArrayList<Student>();
studentList.add(new Student(1000, "홍길동"));
studentList.add(new Student(2000, "임꺽정"));
studentList.add(new Student(3000, "전우치"));
studentList.add(new Student(4000, "일지매"));
studentList.add(new Student(5000, "장길산"));
request.setAttribute("studentList", studentList);
request.getRequestDispatcher("student_list_el.jsp").forward(request, response);
%>
EL 표현식에 . 연산자로 첨자를 표현하면 ELException 발생
<p>학번 = ${studentList.0.num }, 이름 = ${studentList.0.name }</p>
스코프 속성값이 List인 경우 요소값을 표현하기 위해 EL 표현식에서 [] 연산자로만 첨자(Index)를 표현하여 요소값을 제공받아 출력
<p>학번 = ${studentList[0].num }, 이름 = ${studentList[0].name }</p>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MVC</title>
</head>
<body>
<h1>EL - List</h1>
<hr>
<%-- EL 표현식에 . 연산자로 첨자를 표현하면 ELException 발생 --%>
<%-- <p>학번 = ${studentList.0.num }, 이름 = ${studentList.0.name }</p> --%>
<%-- <p>학번 = ${studentList[0]["num"] }, 이름 = ${studentList[0]["name"] }</p> --%>
<p>학번 = ${studentList[0].num }, 이름 = ${studentList[0].name }</p>
<p>학번 = ${studentList[1].num }, 이름 = ${studentList[1].name }</p>
<p>학번 = ${studentList[2].num }, 이름 = ${studentList[2].name }</p>
<p>학번 = ${studentList[3].num }, 이름 = ${studentList[3].name }</p>
<p>학번 = ${studentList[4].num }, 이름 = ${studentList[4].name }</p>
</body>
</html>
<%@page import="java.util.HashMap"%>
<%@page import="java.util.Map"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
Map<String, String> hewonMap=new HashMap<String, String>();
hewonMap.put("first.name", "홍");
hewonMap.put("second.name", "길동");
request.setAttribute("hewonMap", hewonMap);
request.getRequestDispatcher("hewon_map_el.jsp").forward(request, response);
%>
스코프 속성값으로 Map 객체가 저장된 경우 맵키에 EL 표현식으로 사용하기 부적절한 문자(ex. ".")가 존재할 경우 . 연산자로 맵키를 표현하여 맵값을 제공받아 출력 불가능
<p>이름 = ${hewonMap.first.name } ${hewonMap.second.name }</p>
스코프 속성값으로 Map 객체가 저장된 경우 맵키에 EL 표현식으로 사용하기 부적절한 문자가 존재할 경우 [] 연산자로 맵키를 표현하여 맵값을 제공받아 출력
<p>이름 = ${hewonMap["first.name"] } ${hewonMap["second.name"] }</p>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MVC</title>
</head>
<body>
<h1>EL - Map</h1>
<hr>
<%-- 스코프 속성값으로 Map 객체가 저장된 경우 맵키에 EL 표현식으로 사용하기 부적절한
문자가 존재할 경우 . 연산자로 맵키를 표현하여 맵값을 제공받아 출력 불가능 --%>
<%-- <p>이름 = ${hewonMap.first.name } ${hewonMap.second.name }</p> --%>
<%-- 스코프 속성값으로 Map 객체가 저장된 경우 맵키에 EL 표현식으로 사용하기 부적절한
문자가 존재할 경우 [] 연산자로 맵키를 표현하여 맵값을 제공받아 출력 --%>
<p>이름 = ${hewonMap["first.name"] } ${hewonMap["second.name"] }</p>
</body>
</html>
<%@page import="java.util.HashMap"%>
<%@page import="java.util.Map"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
Map<String, String> fruitsMap=new HashMap<String, String>();
fruitsMap.put("one", "딸기");
fruitsMap.put("two", "복숭아");
fruitsMap.put("three", "사과");
request.setAttribute("fruitsMap", fruitsMap);
request.setAttribute("choice", "two");
request.getRequestDispatcher("fruits_map_el.jsp").forward(request, response);
%>
스코프 속성값이 Map 객체인 경우 맵키를 이용하여 맵값을 제공받아 출력 가능
<p>좋아하는 과일 = ${fruitsMap.choice }</p>
EL 표현식에서 [] 연산자를 이용하여 다른 스코프 속성값을 제공받아 맵키로 표현하여 맵값 출력 가능
<p>좋아하는 과일 = ${fruitsMap[choice] }</p>
<p>좋아하는 과일 = ${fruitsMap["two"] }</p>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MVC</title>
</head>
<body>
<h1>EL - Map</h1>
<hr>
<p>과일-1 = ${fruitsMap.one }</p>
<p>과일-2 = ${fruitsMap.two }</p>
<p>과일-3 = ${fruitsMap.three }</p>
<hr>
<p>좋아하는 과일 = ${fruitsMap.two }</p>
<p>좋아하는 과일 = ${fruitsMap["two"] }</p>
<%-- 스코프 속성값이 Map 객체인 경우 맵키를 이용하여 맵값을 제공받아 출력 가능 --%>
<%-- => 맵키에 해당하는 맵값이 없는 경우 EL 미실행 --%>
<%-- <p>좋아하는 과일 = ${fruitsMap.choice }</p> --%>
<%-- EL 표현식에서 [] 연산자를 이용하여 다른 스코프 속성값을 제공받아 맵키로 표현하여 맵값 출력 가능 --%>
<p>좋아하는 과일 = ${fruitsMap[choice] }</p>
</body>
</html>
JSP 내장객체에 따라 속성값을 저장하여 사용할 수 있는 범위가 다르게 구분
JSP 내장객체가 다른 경우 속성명을 동일하게 설정하여 속성값 저장 가능
JSP 내장객체가 같은 경우 속성명을 동일하게 설정하면 기존 속성값 대신 새로운 속성값 저장 (변경 처리)
스코프 속성명이 서로 같은 경우
JSP 내장객체의 속성명이 동일한 경우 EL 표현식에서 EL 내장객체를 사용하여 스코프 속성값을 구분하여 출력 가능
pageName 속성값(Page Scope) = ${pageScope.name }
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
pageContext.setAttribute("pageName", "홍길동");//Page Scope
request.setAttribute("requestName", "임꺽정");//Request Scope
session.setAttribute("sessionName", "전우치");//Session Scope
application.setAttribute("applicationName", "일지매");//Application Scope
//JSP 내장객체가 다른 경우 속성명을 동일하게 설정하여 속성값 저장 가능
// => JSP 내장객체가 같은 경우 속성명을 동일하게 설정하면 기존 속성값 대신 새로운 속성값 저장 - 변경 처리
pageContext.setAttribute("name", "홍길동");//Page Scope
request.setAttribute("name", "임꺽정");//Request Scope
session.setAttribute("name", "전우치");//Session Scope
application.setAttribute("name", "일지매");//Application Scope
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MVC</title>
</head>
<body>
<h1>EL 내장객체 - Scope Attribute</h1>
<hr>
<h3>스코프 속성명이 서로 다른 경우</h3>
<ul>
<li>pageName 속성값(Page Scope) = ${pageName }</li>
<li>requestName 속성값(Request Scope) = ${requestName }</li>
<li>sessionName 속성값(Session Scope) = ${sessionName }</li>
<li>applicationName 속성값(Application Scope) = ${applicationName }</li>
</ul>
<hr>
<h3>스코프 속성명이 서로 같은 경우</h3>
<%-- EL 표현식의 속성명으로 속성값을 검색하여 제공하는 순서 존재 --%>
<%-- => Page Scope >> Request Scope >> Session Scope >> Application Scope --%>
<%-- => JSP 내장객체에 동일한 이름의 속성명이 존재할 경우 먼저 검색된 속성값을 제공받아 출력 --%>
<%-- => JSP 내장객체의 속성명을 다른게 설정하는 것을 권장 --%>
<%--
<ul>
<li>pageName 속성값(Page Scope) = ${name }</li> 홍길동
<li>requestName 속성값(Request Scope) = ${name }</li> 홍길동
<li>sessionName 속성값(Session Scope) = ${name }</li> 홍길동
<li>applicationName 속성값(Application Scope) = ${name }</li> 홍길동
</ul>
--%>
<%-- JSP 내장객체의 속성명이 동일한 경우 EL 표현식에서 EL 내장객체를 사용하여 스코프 속성값을 구분하여 출력 가능 --%>
<%-- => EL 내장객체 : pageScope, requestScope, sessionScope, applicationScope --%>
<ul>
<li>pageName 속성값(Page Scope) = ${pageScope.name }</li>
<li>requestName 속성값(Request Scope) = ${requestScope.name }</li>
<li>sessionName 속성값(Session Scope) = ${sessionScope.name }</li>
<li>applicationName 속성값(Application Scope) = ${applicationScope.name }</li>
</ul>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MVC</title>
</head>
<body>
<h1>EL 내장객체 - Request Parameter</h1>
<hr>
<form action="implicit_param_action.jsp" method="post">
<div><b>개인정보</b></div>
<div>이름 : <input type="text" name="name"></div>
<div>주소 : <input type="text" name="address"></div>
<br>
<div><b>좋아하는 음식</b></div>
<div>음식-1 : <input type="text" name="food"></div>
<div>음식-2 : <input type="text" name="food"></div>
<br>
<button type="submit">전송</button>
</form>
</body>
</html>
사용자 입력값을 전달받아 클라이언트에게 전달하는 JSP 문서
POST 방식으로 요청하여 리퀘스트 메세지 몸체부에 저장되어 전달하는 값에 대한 캐릭터셋 변경
request.setCharacterEncoding("utf-8");
EL 미사용 시 같은 이름으로 전달되는 값이 여러개 있는 경우 첫번째 전달값만 반환받아 사용
음식-1 = <%=request.getParameterValues("food")[0]
EL 사용 시 EL 표현식에서 전달값의 이름을 param 내장객체 또는 paramValues 내장객체의 맵키로 사용하여 전달값을 구분하여 출력
이름 = ${param.name }
음식-1 = ${paramValues.food[0] }
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%-- request.setCharacterEncoding("utf-8"); --%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MVC</title>
</head>
<body>
<h1>EL 내장객체 - Request Parameter</h1>
<hr>
<h3>EL 미사용</h3>
<ul>
<li>이름 = <%=request.getParameter("name") %></li>
<li>주소 = <%=request.getParameter("address") %></li>
<%-- 같은 이름으로 전달되는 값이 여러개 있는 경우 첫번째 전달값만 반환받아 사용 --%>
<%--
<li>음식-1 = <%=request.getParameter("food") %></li>
<li>음식-2 = <%=request.getParameter("food") %></li>
--%>
<%-- 같은 이름으로 전달되는 값이 여러개 있는 경우 getParameterValues() 메소드로
모든 전달값을 문자열 배열로 반환받아 사용 가능 --%>
<li>음식-1 = <%=request.getParameterValues("food")[0] %></li>
<li>음식-2 = <%=request.getParameterValues("food")[1] %></li>
</ul>
<hr>
<h3>EL 사용</h3>
<ul>
<%-- EL 표현식에서 전달값의 이름을 param 내장객체 또는 paramValues 내장객체의 맵키로
사용하여 전달값을 구분하여 출력 --%>
<li>이름 = ${param.name }</li>
<li>주소 = ${param.address }</li>
<li>음식-1 = ${paramValues.food[0] }</li>
<li>음식-2 = ${paramValues.food[1] }</li>
</ul>
</body>
</html>
필터 클래스 : 특정 웹프로그램 요청에 대한 웹프로그램 실행 전 또는 후에 동작될 명령을 작성하기 위한 클래스
필터 클래스는 반드시 Filter 인터페이스를 상속받아 작성하며 @WebFilter 어노테이션 또는 [web.xml] 파일에서 필터 클래스를 필터로 등록하고 필터가 동작되기 위한 URL 패턴정보를 매핑 처리
클라이언트가 요청하는 모든 웹프로그램에 대해 실행 전 리퀘스트 메세지의 몸체부에 저장되어 전달되는 문자값에 대한 문자형태(캐릭터셋)을 변경하는 필터 클래스 (인코딩 필터)
filter interface는 javax.servlet으로 import할 것
init 메소드 오버라이드
encoding=filterConfig.getInitParameter("encoding");
doFilter 오버라이드 : 요청 웹프로그램 실행 전 또는 후에 동작될 명령을 작성하는 메소드
chain.doFilter(request, response);//요청 웹프로그램 실행
package xyz.itwill.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class EncodingFilter implements Filter {
//변경할 캐릭터셋를 저장하기 위한 필드
private String encoding;
//init 메소드 : 필터 클래스로 객체가 생성된 후 가장 먼저 1번만 호출되는 메소드 - 필터 객체의 초기화 작업
@Override
public void init(FilterConfig filterConfig) throws ServletException {
//encoding="utf-8";
//FilterConfig.getInitParameter(String name) : [web.xml] 파일의 init-param 엘리먼트로
//제공되는 값을 얻어와 반환하는 메소드
encoding=filterConfig.getInitParameter("encoding");
}
//요청 웹프로그램 실행 전 또는 후에 동작될 명령을 작성하는 메소드
// => 등록된 URL 패턴의 웹프로그램 실행 전에 자동 호출되는 메소드
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
//웹프로그램 실행 전에 동작될 명령 작성 - 리퀘스트 메세지의 정보 변경
if(request.getCharacterEncoding()==null ||
!request.getCharacterEncoding().equalsIgnoreCase(encoding)) {
request.setCharacterEncoding(encoding);
}
//FilterChain.doFilter(ServletRequest request, ServletResponse response)
// => 요청 웹프로그램을 연결하여 실행되도록 설정하는 메소드
chain.doFilter(request, response);//요청 웹프로그램 실행
//웹프로그램 실행 후에 동작될 명령 작성 - 리스폰트 메세지의 정보 변경
//response.setContentType("text/html; charset=utf-8");
}
}
filter : 필터 클래스를 필터로 등록하기 위한 엘리먼트
filter-mapping : 필터가 실행되기 위한 요청 웹프로그램의 URL 패턴을 등록하기 위한 엘리먼트
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
<display-name>mvc</display-name>
<filter>
<filter-name>encoding filter</filter-name>
<filter-class>xyz.itwill.filter.EncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<!-- filter-mapping : 필터가 실행되기 위한 요청 웹프로그램의 URL 패턴을 등록하기 위한 엘리먼트 -->
<filter-mapping>
<filter-name>encoding filter</filter-name>
<!-- 클라이언트의 모든 웹프로그램 요청에 대한 필터가 실행되도록 URL 패턴 등록 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- servlet : 서블릿 클래스를 웹프로그램(서블릿)으로 등록하기 위한 엘리먼트 -->
<servlet>
<servlet-name>controller</servlet-name>
<servlet-class>xyz.itwill.mvc.ControllerServlet</servlet-class>
<!-- init-param : 서블릿 클래스에 필요한 값을 제공하기 위한 엘리먼트 -->
<init-param>
<param-name>configFile</param-name>
<param-value>/WEB-INF/model.properties</param-value>
</init-param>
<!-- load-on-startup : WAS 실행시 서블릿 클래스를 서블릿 객체로 생성하기 위한 엘리먼트 -->
<!-- => 클라이언트의 요청 없이 WAS 실행시 서블릿 객체를 미리 생성 - init() 메소드가 자동 호출되어 초기화 작업 -->
<!-- => 엘리먼트값은 0 이상의 정수값으로 설정하며 정수값이 작을수록 먼저 서블릿 객체로 생성 -->
<load-on-startup>1</load-on-startup>
</servlet>
<!-- servlet-mapping : 웹프로그램(서블릿)에 URL 패턴을 등록하기 위한 엘리먼트 -->
<servlet-mapping>
<servlet-name>controller</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.jsp</welcome-file>
<welcome-file>default.htm</welcome-file>
</welcome-file-list>
</web-app>
request.getHeader(String name) : 리퀘스트 메세지의 머릿부에 저장된 값들중 원하는 값을 이름을 이용하여 반환하는 메소드
EL 표현식에서 header 내장객체 또는 headerValues 내장객체를 이용하여 리퀘스트 메세지의 머릿부에 저장된 값들중 원하는 값을 이름(맵키)으로 제공받아 출력 가능
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MVC</title>
</head>
<body>
<h1>EL 내장객체 - Request Header</h1>
<hr>
<h3>EL 미사용</h3>
<ul>
<%-- request.getHeader(String name) : 리퀘스트 메세지의 머릿부에 저장된 값들중
원하는 값을 이름을 이용하여 반환하는 메소드 --%>
<li>현재 접속 서버 = <%=request.getHeader("host") %></li>
<li>브라우저 종류 = <%=request.getHeader("user-Agent") %></li>
<li>전달 가능한 문서 종류 = <%=request.getHeaders("accept").nextElement() %></li>
</ul>
<hr>
<h3>EL 사용</h3>
<ul>
<%-- EL 표현식에서 header 내장객체 또는 headerValues 내장객체를 이용하여 리퀘스트
메세지의 머릿부에 저장된 값들중 원하는 값을 이름(맵키)으로 제공받아 출력 가능 --%>
<li>현재 접속 서버 = ${header.host }</li>
<li>브라우저 종류 = ${header["user-Agent"] }</li>
<li>전달 가능한 문서 종류 = ${headerValues.accept[0] }</li>
</ul>
</body>
</html>
클라이언트에 쿠키가 저장되도록 Cookie 객체를 생성하여 클라이언트에게 전달
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
Cookie cookie=new Cookie("userName","HongGilDong");
cookie.setMaxAge(60*60);//쿠키 지속시간을 1시간으로 변경
response.addCookie(cookie);//클라이언트에게 쿠키 전달 >> 클라이언트에 쿠키 저장
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MVC</title>
</head>
<body>
<h1>EL 내장객체 - Cookie</h1>
<hr>
<p>클라이언트에 쿠키가 저장되도록 전달 하였습니다.</p>
<p><a href="implicit_cookie_load.jsp">쿠키값 출력</a></p>
</body>
</html>
EL 표현식에서 cookie 내장객체를 이용하여 쿠키명으로 쿠키값을 제공받아 출력 가능
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MVC</title>
</head>
<body>
<h1>EL 내장객체 - Cookie</h1>
<hr>
<h3>EL 미사용</h3>
<%
//클라이언트에서 전달된 모든 쿠키를 Cookie 객체 배열로 반환받아 저장
Cookie[] cookies=request.getCookies();
String userName="";
//Cookie 객체 배열의 요소값(Cookie 객체)를 하나씩 제공받아 반복 처리
// => Cookie 객체의 쿠키명을 반환받아 비교하여 쿠키값 저장
for(Cookie cookie:cookies) {
if(cookie.getName().equals("userName")) {
userName=cookie.getValue();
}
}
%>
<p>쿠키에 저장된 사용자 이름 = <%=userName %></p>
<hr>
<h3>EL 사용</h3>
<%-- EL 표현식에서 cookie 내장객체를 이용하여 쿠키명으로 쿠키값을 제공받아 출력 가능 --%>
<%-- => 쿠키명으로 제공되는 값은 Cookie 객체이므로 반드시 쿠키값을 제공받기 위해 value 표현식 사용 --%>
<p>쿠키에 저장된 사용자 이름 = ${cookie.userName.value }</p>
</body>
</html>
ServletContext.getInitParameter(String name) : [web.xml] 파일의 context-param 엘리먼트로 제공되는 값을 얻어와 반환하는 메소드
EL 표현식에서 initParam 내장객체를 이용하여 [web.xml] 파일의 context-param 엘리먼트로 제공되는 값을 얻어와 출력 가능
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MVC</title>
</head>
<body>
<h1>EL 내장객체 - Context Init Parameter</h1>
<hr>
<h3>EL 미사용</h3>
<%-- ServletContext.getInitParameter(String name) : [web.xml] 파일의 context-param 엘리먼트로
제공되는 값을 얻어와 반환하는 메소드 --%>
<p>web.xml 파일에서 제공되는 이름 = <%=config.getServletContext().getInitParameter("name") %></p>
<hr>
<h3>EL 사용</h3>
<%-- EL 표현식에서 initParam 내장객체를 이용하여 [web.xml] 파일의 context-param 엘리먼트로
제공되는 값을 얻어와 출력 가능 --%>
<p>web.xml 파일에서 제공되는 이름 = ${initParam.name }</p>
</body>
</html>
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
<display-name>mvc</display-name>
<!-- context-param : 모든 웹프로그램에게 값을 제공하기 위한 엘리먼트 -->
<context-param>
<param-name>name</param-name>
<param-value>홍길동</param-value>
</context-param>
<!-- filter : 필터 클래스를 필터로 등록하기 위한 엘리먼트 -->
<!-- => servlet 엘리먼트 선언 전에 작성하는 것을 권장 -->
<filter>
<filter-name>encoding filter</filter-name>
<filter-class>xyz.itwill.filter.EncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<!-- filter-mapping-mapping : 필터가 실행되기 위한 요청 웹프로그램의 URL 패턴을 등록하기 위한 엘리먼트 -->
<filter-mapping>
<filter-name>encoding filter</filter-name>
<!-- 클라이언트의 모든 웹프로그램 요청에 대한 필터가 실행되도록 URL 패턴 등록 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- servlet : 서블릿 클래스를 웹프로그램(서블릿)으로 등록하기 위한 엘리먼트 -->
<servlet>
<servlet-name>controller</servlet-name>
<servlet-class>xyz.itwill.mvc.ControllerServlet</servlet-class>
<!-- init-param : 서블릿 클래스에 필요한 값을 제공하기 위한 엘리먼트 -->
<init-param>
<param-name>configFile</param-name>
<param-value>/WEB-INF/model.properties</param-value>
</init-param>
<!-- load-on-startup : WAS 실행시 서블릿 클래스를 서블릿 객체로 생성하기 위한 엘리먼트 -->
<!-- => 클라이언트의 요청 없이 WAS 실행시 서블릿 객체를 미리 생성 - init() 메소드가 자동 호출되어 초기화 작업 -->
<!-- => 엘리먼트값은 0 이상의 정수값으로 설정하며 정수값이 작을수록 먼저 서블릿 객체로 생성 -->
<load-on-startup>1</load-on-startup>
</servlet>
<!-- servlet-mapping : 웹프로그램(서블릿)에 URL 패턴을 등록하기 위한 엘리먼트 -->
<servlet-mapping>
<servlet-name>controller</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.jsp</welcome-file>
<welcome-file>default.htm</welcome-file>
</welcome-file-list>
</web-app>
PageContext.getRequest() : 웹프로그램의 ServletRequest 객체를 반환하는 메소드
ServletRequest 객체(부모)를 HttpServletRequest 객체(자식)로 형변환하면 HttpServletRequest 객체(자식)의 메소드 호출 가능
EL 표현식에서 pageContext 내장객체를 사용하여 PageContext 객체의 메소드 호출 가능
컨텍스트 경로 = ${pageContext.request.contextPath }
요청자원의 URI 주소 = ${pageContext.request.requestURI }
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MVC</title>
</head>
<body>
<h1>EL 내장객체 - PageContext</h1>
<hr>
<h3>EL 미사용</h3>
<%-- request 내장객체 = HttpServletRequest 객체 --%>
<%--
<p>컨텍스트 경로 = <%=request.getContextPath() %></p>
<p>요청자원의 URI 주소 = <%=request.getRequestURI() %></p>
--%>
<%-- PageContext.getRequest() : 웹프로그램의 ServletRequest 객체를 반환하는 메소드 --%>
<%-- => ServletRequest 객체(부모)를 HttpServletRequest 객체(자식)로 형변환하면
HttpServletRequest 객체(자식)의 메소드 호출 가능 --%>
<p>컨텍스트 경로 = <%=((HttpServletRequest)pageContext.getRequest()).getContextPath() %></p>
<p>요청자원의 URI 주소 = <%=((HttpServletRequest)pageContext.getRequest()).getRequestURI() %></p>
<hr>
<h3>EL 사용</h3>
<%-- EL 표현식에서 pageContext 내장객체를 사용하여 PageContext 객체의 메소드 호출 가능 --%>
<%-- => Getter 메소드는 EL 표현식에서 이름을 사용하면 자동 호출 가능 --%>
<%-- <p>컨텍스트 경로 = ${pageContext.getRequest().getContextPath() }</p> --%>
<p>컨텍스트 경로 = ${pageContext.request.contextPath }</p>
<p>요청자원의 URI 주소 = ${pageContext.request.requestURI }</p>
</body>
</html>
EL 함수 : EL 표현식에서 사용하기 위한 함수
EL 함수를 사용할 경우 호출될 메소드가 선언된 클래스를 작성하고 TLD 파일에서 클래스의 메소드를 EL 함수로 등록 후 JSP 문서에서 taglib 디렉티브를 이용하여 EL 함수를 제공받아 사용
<%@taglib prefix="elfun" uri="http://www.itwill.xyz/mvc/el" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%-- taglib 디렉티브를 사용하여 TLD 파일을 제공받아 JSP 문서에서 EL 함수 또는 커스텀 태그를
사용할 수 있도록 설정 --%>
<%-- prefix 속성 : EL 함수 또는 커스텀 태그를 사용하기 위한 접두사를 속성값으로 설정 --%>
<%-- uri 속성 : TLD 파일의 식별자(url 엘리먼트값)를 속성값으로 설정 - 자동 완성 기능 사용 --%>
<%@taglib prefix="elfun" uri="http://www.itwill.xyz/mvc/el" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MVC</title>
</head>
<body>
<h1>EL Function</h1>
<hr>
<p>EL 함수 : EL 표현식에서 사용하기 위한 함수</p>
<p>EL 함수를 사용할 경우 호출될 메소드가 선언된 클래스를 작성하고 TLD 파일에서 클래스의
메소드를 EL 함수로 등록 후 JSP 문서에서 taglib 디렉티브를 이용하여 EL 함수를 제공받아 사용</p>
<hr>
<p>${elfun:hello("홍길동") }</p>
<p>${elfun:hello("임꺽정") }</p>
</body>
</html>
EL 함수를 사용할 경우 실행될 객체를 생성하기 위한 클래스
EL 함수를 사용할 경우 호출될 메소드 (반드시 정적 메소드로 선언)
package xyz.itwill.el;
public class HelloEL {
//EL 함수를 사용할 경우 호출될 메소드 - 반드시 정적 메소드로 선언
public static String hello(String name) {
return name+"님, 안녕하세요.";
}
}
description : TLD 파일에 대한 설명을 제공하는 엘리먼트 (생략가능)
tlib-version : TLD 파일의 버전을 등록하기 위한 엘리먼트 (생략가능)
short-name : TLD 파일의 이름의 등록하기 위한 엘리먼트 (생략가능)
uri : JSP 문서에서 TLD 파일을 불러오기 위해 사용하는 식별자를 등록하기 위한 엘리먼트
function : EL 함수를 등록하기 위한 엘리먼트
<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.1" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xml="http://www.w3.org/XML/1998/namespace" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd">
<!-- description : TLD 파일에 대한 설명을 제공하는 엘리먼트 -->
<description>EL 함수를 선언하기 위한 TLD 파일</description>
<!-- tlib-version : TLD 파일의 버전을 등록하기 위한 엘리먼트 -->
<tlib-version>1.0</tlib-version>
<!-- short-name : TLD 파일의 이름의 등록하기 위한 엘리먼트 -->
<short-name>EL</short-name>
<!-- uri : JSP 문서에서 TLD 파일을 불러오기 위해 사용하는 식별자를 등록하기 위한 엘리먼트 -->
<uri>http://www.itwill.xyz/mvc/el</uri>
<!-- function : EL 함수를 등록하기 위한 엘리먼트 -->
<function>
<!-- name : EL 함수의 이름을 설정하기 위한 엘리먼트 -->
<name>hello</name>
<!-- function-class : EL 함수 사용시 생성될 객체의 자료형(클래스)을 설정하기 위한 엘리먼트 -->
<function-class>xyz.itiwll.el.HelloEL</function-class>
<!-- function-signature : EL 함수 사용시 객체에 의해 호출되는 메소드의 머릿부를 설정하기 위한 엘리먼트 -->
<function-signature>java.lang.String hello(java.lang.String)</function-signature>
</function>
</taglib>
EL 연산자 : EL 표현식에서 사용하는 연산자 (산술연산자, 관계연산자, 논리연산자 등)
empty 연산자 : EL 표현식으로 제공되는 속성값이 없거나 속성값이 Java 객체나 Map 객체인 경우 저장값이 없으면 [true]를 제공하고 속성값이 있거나 Java 객체 또는 Map 객체에 저장값이 있는 경우 [false] 제공하는 연산자
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MVC</title>
</head>
<body>
<h1>EL Operator</h1>
<hr>
<%-- EL 연산자 : EL 표현식에서 사용하는 연산자 - 산술연산자, 관계연산자, 논리연산자 등 --%>
<% request.setAttribute("first", 20); %>
<% request.setAttribute("second", 10); %>
<div>first = ${first }</div>
<div>second = ${second }</div>
<hr>
<div>first * second = ${first * second }</div>
<div>first / second = ${first / second }</div>
<div>first div second = ${first div second }</div>
<div>first % second = ${first % second }</div>
<div>first mod second = ${first mod second }</div>
<div>first + second = ${first + second }</div>
<div>first - second = ${first - second }</div>
<hr>
<div>first > second = ${first > second }</div>
<div>first gt second = ${first gt second }</div>
<div>first < second = ${first < second }</div>
<div>first lt second = ${first lt second }</div>
<div>first >= second = ${first >= second }</div>
<div>first ge second = ${first ge second }</div>
<div>first <= second = ${first <= second }</div>
<div>first le second = ${first le second }</div>
<div>first == second = ${first == second }</div>
<div>first eq second = ${first eq second }</div>
<div>first != second = ${first != second }</div>
<div>first ne second = ${first ne second }</div>
<hr>
<% request.setAttribute("num", 15); %>
<div>num = ${num}</div>
<hr>
<div>first > num && second < num = ${first > num && second < num }</div>
<div>first gt num and second lt num = ${first gt num and second lt num }</div>
<div>first < num || second > num = ${first < num || second > num }</div>
<div>first lt num or second gt num = ${first lt num or second gt num }</div>
<hr>
<%
Object object=null;
request.setAttribute("object", object);
String string="";
request.setAttribute("string", string);
String[] array={};
request.setAttribute("array", array);
List<String> list=new ArrayList<String>();
request.setAttribute("list", list);
%>
<%-- empty 연산자 : EL 표현식으로 제공되는 속성값이 없거나 속성값이 Java 객체나 Map 객체인
경우 저장값이 없으면 [true]를 제공하고 속성값이 있거나 Java 객체 또는 Map 객체에 저장값이
있는 경우 [false] 제공하는 연산자 --%>
<div>object Empty = ${empty(object) }</div>
<div>string Empty = ${empty(string) }</div>
<div>array Empty = ${empty(array) }</div>
<div>list Empty = ${empty(list) }</div>
</body>
</html>