EL (속성값으로 저장된 객체를 제공받아 client에게 전달하여 출력하기 위한 언어)

woom·2023년 1월 20일
0

MVC

목록 보기
3/6
post-thumbnail

🌼 EL

  • EL(Expression Language) : 스코프(Scope) 속성값으로 저장된 객체를 제공받아 클라이언트에게 전달하여 출력하기 위한 언어

  • ${속성명} : EL 표현식으로 스코프의 속성명을 사용하면 속성값을 제공받아 출력

    • getAttribute() 메소드를 호출하지 않아도 스코프의 속성값을 제공받아 사용 가능
    • 이름(name) = ${name }
    • 스코프 속성명으로 저장된 속성값이 없는 경우 EL 미실행 (속성값 미출력)
  • 스코프 속성값이 객체인 경우 ${속성명.필드명} 형식의 표현식을 사용하여 객체의 필드값을 제공받아 출력 가능 (EL 표현식으로 필드명을 사용하면 Getter 메소드 자동 호출)


📕 Page Scope

  • pageContext.setAttribute(String attributeName, Object attributeValue)

    • pageContext.setAttribute("name", "홍길동");
  • pageContext 내장객체에 속성명(문자열)과 속성값(객체)을 전달받아 저장하는 메소드 (Page Scope)

  • Page Scope : 스코프 속성값을 저장한 웹프로그램에서만 객체를 반환하아 사용 가능

  • pageContext.getAttribute(String attributeName) : pageContext 내장객체에 저장된 속성값을 속성명을 이용하여 객체로 반환하는 메소드
    • Object 타입의 객체로 반환하므로 반드시 명시적 객체 형변환하여 사용
    • String name=(String)pageContext.getAttribute("name");
    • 전달받은 속성명에 대한 속성값이 없는 경우 null 반환

🐣 예제

<%@ 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>





📌 car class 생성

  • 자동차 모델명과 색상 필드로 저장
  • el사용시 Getter 메소드가 자동 호출되므로 필드에 맞게 작성 필수
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;
	}
}





📕 car class 객체 이용

  • pageCotext 내장객체에 Car 객체를 속성값으로 저장

    • pageContext.setAttribute("car", new Car("싼타페","하얀색"));
  • pageContext 내장객체에 저장된 속성값을 Car 객체로 반환받아 저장

    • Car car=(Car)pageContext.getAttribute("car");
    • 전달받은 속성명에 대한 속성값이 없는 경우 [null] 반환 (참조변수에 [null]이 저장된 상태에서 메소드를 호출하면 NullPointerException 발생)
    • Car car=(Car)pageContext.getAttribute("pageCar");
    • 객체의 필드값을 반환받아 저장
    • String modelName=car.getModelName();
  • EL 표현식으로 제공받은 객체의 메소드 호출 가능
    • 스코프 속성값이 객체인 경우 ${속성명.필드명} 형식의 표현식을 사용하여 객체의 필드값을 제공받아 출력 가능 (EL 표현식으로 필드명을 사용하면 Getter 메소드 자동 호출)
    • <p>자동차 모델명 = ${car.modelName }</p>
    • EL 표현식의 속성명으로 제공되는 속성값이 없는 경우 EL 미실행 (NullPointerException 미발생)

🐣 예제

<%@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>





📕 Map 객체 이용

  • 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 객체에 저장된 엔트리의 맵값을 제공받아 출력

    • EL 표현식에서 맵키를 사용하면 Map 객체의 get() 메소드가 자동 호출되어 맵값 반환
    • <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>





📌 member class 생성

  • 이름명과 car클래스의 car를 필드로 저장
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;
	}
}






📙 Request Scope (요청)

  • Member 객체를 생성하여 Request Scope 속성값으로 저장하고 다른 웹프로그램(JSP)로 포워드 이동하는 JSP 문서

    • 요청을 처리하는 웹프로그램(Model)
  • request 내장객체에 Member 객체를 속성값으로 저장 (Request Scope)

  • Request Scope : 스코프 속성값을 저장한 웹프로그램과 스레드가 이동된 웹프로그램에서만 속성값을 객체로 반환받아 사용 가능

    • request.setAttribute("member", member);
  • 포워드 이동 : 현재 웹프로그램의 명령을 실행하는 스레드를 다른 웹프로그램으로 이동시켜 명령을 실행하도록 제공하는 기능

    • 스레드가 이동되는 웹프로그램에서는 현재 웹프로그램의 request 객체와 response 객체를 전달받아 사용
    • 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);
%>





📙 응답 (EL 미사용)

  • 요청페이지(member.jsp)의 Request Scope 속성값을 객체로 반환받아 클라이언트에게 전달하는 JSP 문서

  • 요청페이지(member.jsp)에 대한 실행 결과를 제공받아 응답 처리하는 웹프로그램(View)

    • 응답페이지(member_non_el.jsp)를 요청한 경우 Request Scope 속성값이 없으므로 NullPointerException 발생

<%@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>






📙 응답 (EL 사용)

  • 요청페이지(member.jsp)의 Request Scope 속성값을 객체로 반환받아 클라이언트에게 전달하는 JSP 문서

  • 요청페이지(member.jsp)에 대한 실행 결과를 제공받아 응답 처리하는 웹프로그램(View)

    • 응답페이지(member_el.jsp)를 요청한 경우에도 EL이 미실행될뿐 NullPointerException 미발생
  • 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>




🌼 EL 표현식에서 대괄호 필수인 경우

  1. 속성값이 배열 객체나

  2. List 객체인 경우는 dot(.) 연산자로 표현이 불가능하므로 반드시 [] 연산자를 이용해야 한다.

  3. [] 연산자는 “두번째변수”를 사용할 때 자바 이름 규칙을 이용해야 하는데 자바 이름 규칙을 벗어나는 경우

  4. EL 표현식에서 [] 연산자를 이용하여 다른 스코프 속성값을 제공받아 맵키로 표현하여 맵값 출력 가능 (맵키를 속성값으로 대체하기 위해 사용)


📒 1. Array 객체 request

  • 배열 객체 생성 후 request 속성 저장 (포워드 이동)
<%@ 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);
%>





📗 Array 출력 (EL 사용)

  • 스코프 속성값이 배열인 경우 배열 요소값을 표현하기 위해 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> 





📌 student class 생성

  • 회원번호와 이름을 필드로 저장
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;
	}
}






📒 2. List 객체 request

  • List 객체 생성 후 request 속성 저장 (포워드 이동)
<%@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);
%>





📗 List 객체 출력 (EL 사용)

  • 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>





📒 3. 자바 이름 규칙을 벗어나는 경우

  • Map 객체 생성 후 request 속성 저장 (포워드 이동)
<%@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 사용)

  • 스코프 속성값으로 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>





📒 4. 다른 스코프 속성값

  • Map 객체 생성 후 request 속성 저장 (포워드 이동)
<%@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 객체 출력

  • 스코프 속성값이 Map 객체인 경우 맵키를 이용하여 맵값을 제공받아 출력 가능

    • 맵키에 해당하는 맵값이 없는 경우 EL 미실행
    • <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>





🌼 EL implicit object (내장객체)

  • 웹 컨테이너가 객체 생성 없이 바로 사용할 수 있게 제공하는 객체


📘 속성값 사용범위

  • JSP 내장객체에 따라 속성값을 저장하여 사용할 수 있는 범위가 다르게 구분

    • 속성값 사용범위(Scope) : Page Scope, Request Scope, Session Scope, Application Scope
  • JSP 내장객체가 다른 경우 속성명을 동일하게 설정하여 속성값 저장 가능

  • JSP 내장객체가 같은 경우 속성명을 동일하게 설정하면 기존 속성값 대신 새로운 속성값 저장 (변경 처리)

  • 스코프 속성명이 서로 같은 경우

    • EL 표현식의 속성명으로 속성값을 검색하여 제공하는 순서 존재
    • Page Scope >> Request Scope >> Session Scope >> Application Scope
    • JSP 내장객체에 동일한 이름의 속성명이 존재할 경우 먼저 검색된 속성값을 제공받아 출력
    • JSP 내장객체의 속성명을 다른게 설정하는 것을 권장
  • JSP 내장객체의 속성명이 동일한 경우 EL 표현식에서 EL 내장객체를 사용하여 스코프 속성값을 구분하여 출력 가능

    • EL 내장객체 : pageScope, requestScope, sessionScope, applicationScope
    • 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>





📘 request param form

<%@ 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>





📘 Request Parameter

  • 사용자 입력값을 전달받아 클라이언트에게 전달하는 JSP 문서

  • POST 방식으로 요청하여 리퀘스트 메세지 몸체부에 저장되어 전달하는 값에 대한 캐릭터셋 변경

    • request.setCharacterEncoding("utf-8");
    • 인코딩 필터를 이용할 경우 필터에 의해 웹프로그램 실행 전 캐릭터셋 변경 가능
  • EL 미사용 시 같은 이름으로 전달되는 값이 여러개 있는 경우 첫번째 전달값만 반환받아 사용

    • 같은 이름으로 전달되는 값이 여러개 있는 경우 getParameterValues() 메소드로 모든 전달값을 문자열 배열로 반환받아 사용 가능
    • 음식-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>





📌 필터 클래스

  • 필터 클래스 : 특정 웹프로그램 요청에 대한 웹프로그램 실행 전 또는 후에 동작될 명령을 작성하기 위한 클래스

    • 웹프로그램 실행 전 동작될 명령으로 리퀘스트 메세지(요청 관련 정보 - HttpServletRequest 객체)의 정보를 변경하는 명령 작성
    • 웹프로그램 실행 후 동작될 명령으로 리스폰즈 메세지(응답 관련 정보 - HttpServletResponse 객체)의 정보를 변경하는 명령 작성
  • 필터 클래스는 반드시 Filter 인터페이스를 상속받아 작성하며 @WebFilter 어노테이션 또는 [web.xml] 파일에서 필터 클래스를 필터로 등록하고 필터가 동작되기 위한 URL 패턴정보를 매핑 처리

  • 클라이언트가 요청하는 모든 웹프로그램에 대해 실행 전 리퀘스트 메세지의 몸체부에 저장되어 전달되는 문자값에 대한 문자형태(캐릭터셋)을 변경하는 필터 클래스 (인코딩 필터)

  • filter interface는 javax.servlet으로 import할 것

  • init 메소드 오버라이드

    • 필터 클래스로 객체가 생성된 후 가장 먼저 1번만 호출되는 메소드 (필터 객체의 초기화 작업)
    • FilterConfig.getInitParameter(String name) : [web.xml] 파일의 init-param 엘리먼트로 제공되는 값을 얻어와 반환하는 메소드
    • encoding=filterConfig.getInitParameter("encoding");
  • doFilter 오버라이드 : 요청 웹프로그램 실행 전 또는 후에 동작될 명령을 작성하는 메소드

    • 등록된 URL 패턴의 웹프로그램 실행 전에 자동 호출되는 메소드
    • FilterChain.doFilter(ServletRequest request, ServletResponse response) : 요청 웹프로그램을 연결하여 실행되도록 설정하는 메소드
    • 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");
	}
}





📌 web.xml

  • filter : 필터 클래스를 필터로 등록하기 위한 엘리먼트

    • servlet 엘리먼트 선언 전에 작성하는 것을 권장
  • 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 Header

  • request.getHeader(String name) : 리퀘스트 메세지의 머릿부에 저장된 값들중 원하는 값을 이름을 이용하여 반환하는 메소드

  • EL 표현식에서 header 내장객체 또는 headerValues 내장객체를 이용하여 리퀘스트 메세지의 머릿부에 저장된 값들중 원하는 값을 이름(맵키)으로 제공받아 출력 가능

    • 현재 접속 서버 = ${header.host }
    • 브라우저 종류 = ${header["user-Agent"] }
    • 전달 가능한 문서 종류 = ${headerValues.accept[0] }

<%@ 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 객체를 생성하여 클라이언트에게 전달

    • 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 내장객체를 이용하여 쿠키명으로 쿠키값을 제공받아 출력 가능

    • 쿠키명으로 제공되는 값은 Cookie 객체이므로 반드시 쿠키값을 제공받기 위해 value 표현식 사용
    • 쿠키에 저장된 사용자 이름 = ${cookie.userName.value }

<%@ 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>





📘 init Param (web.xml)

  • ServletContext.getInitParameter(String name) : [web.xml] 파일의 context-param 엘리먼트로 제공되는 값을 얻어와 반환하는 메소드

  • EL 표현식에서 initParam 내장객체를 이용하여 [web.xml] 파일의 context-param 엘리먼트로 제공되는 값을 얻어와 출력 가능

    • web.xml 파일에서 제공되는 이름 = ${initParam.name }

<%@ 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>





📌 web.xml

  • context-param : 모든 웹프로그램에게 값을 제공하기 위한 엘리먼트
<?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

  • PageContext.getRequest() : 웹프로그램의 ServletRequest 객체를 반환하는 메소드

  • ServletRequest 객체(부모)를 HttpServletRequest 객체(자식)로 형변환하면 HttpServletRequest 객체(자식)의 메소드 호출 가능

  • EL 표현식에서 pageContext 내장객체를 사용하여 PageContext 객체의 메소드 호출 가능

    • Getter 메소드는 EL 표현식에서 이름을 사용하면 자동 호출 가능
    • 컨텍스트 경로 = ${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 표현식에서 사용하기 위한 함수

  • EL 함수를 사용할 경우 호출될 메소드가 선언된 클래스를 작성하고 TLD 파일에서 클래스의 메소드를 EL 함수로 등록 후 JSP 문서에서 taglib 디렉티브를 이용하여 EL 함수를 제공받아 사용

    • taglib 디렉티브를 사용하여 TLD 파일을 제공받아 JSP 문서에서 EL 함수 또는 커스텀 태그를 사용할 수 있도록 설정
    • prefix 속성 : EL 함수 또는 커스텀 태그를 사용하기 위한 접두사를 속성값으로 설정
    • uri 속성 : TLD 파일의 식별자(url 엘리먼트값)를 속성값으로 설정 - 자동 완성 기능 사용 (Ctrl+Space)
    • <%@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 함수를 사용할 경우 실행될 객체를 생성하기 위한 클래스

  • EL 함수를 사용할 경우 호출될 메소드 (반드시 정적 메소드로 선언)

package xyz.itwill.el;

public class HelloEL {
	//EL 함수를 사용할 경우 호출될 메소드 - 반드시 정적 메소드로 선언
	public static String hello(String name) {
		return name+"님, 안녕하세요.";
	}
}





📌 TLD 파일 생성

  • TLD(Tag Library Descriptor) : 메소드를 정의해 놓은 자바 클래스와 메서드를 호출하는 JSP 파일을 연결해 주는 교량 역할
    • 이 파일은 /WEB-INF 디렉토리에 tld 확장자를 가지고 이름을 정하여 저장하며 tld 파일의 위치는 /WEB-INF 디렉토리 or /WEB-INF의 서브 디렉토리에 저장
  1. New → Other... → XML 폴더의 XML File 선택 → Next

  1. Create file Using a DTD or XML Schema file 체크 후 Next

  1. Select XML Catalog entry 체크 후 web-jsptaglibrary_2_1.xsd(WAS가 제공해주는 xml(schema file) catalog entry) 체크 후 Next

  1. Namespace information의 javaee 체크 후 Edit... → Prefix 내용 삭제 → OK → Finish


📓 tld 파일

  • description : TLD 파일에 대한 설명을 제공하는 엘리먼트 (생략가능)

  • tlib-version : TLD 파일의 버전을 등록하기 위한 엘리먼트 (생략가능)

  • short-name : TLD 파일의 이름의 등록하기 위한 엘리먼트 (생략가능)

  • uri : JSP 문서에서 TLD 파일을 불러오기 위해 사용하는 식별자를 등록하기 위한 엘리먼트

  • function : EL 함수를 등록하기 위한 엘리먼트

    • name : EL 함수의 이름을 설정하기 위한 엘리먼트
    • function-class : EL 함수 사용시 생성될 객체의 자료형(클래스)을 설정하기 위한 엘리먼트 (패키지까지 작성해야함)
    • function-signature : 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 연산자 : 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 &gt; second = ${first > second }</div>
	<div>first gt second = ${first gt second }</div>
	<div>first &lt; second = ${first < second }</div>
	<div>first lt second = ${first lt second }</div>
	<div>first &gt;= second = ${first >= second }</div>
	<div>first ge second = ${first ge second }</div>
	<div>first &lt;= 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 &gt; num && second &lt; num = ${first > num && second < num }</div>
	<div>first gt num and second lt num = ${first gt num and second lt num }</div>
	<div>first &lt; num || second &gt; 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>





profile
Study Log 📂

0개의 댓글