2020년 12월 23일 - 1
업데이트:
EL(Expression Language)이란?
<%= %> 와 같은 JSP 출력에 사용되는 java 코드를 간결하게 사용하는 방법으로 화면에 표현하고자 하는 코드를
${ value }
형식으로 작성하는 것이다.
- 프로젝트 구성
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>EL / JSTL</title>
</head>
<body>
<h3>EL</h3>
<ul>
<li><a href="01_el/el.do">01.EL이란?</a>
// 링크 클릭 시 Java Resources 내 ELServlet1로 이동
<li><a href="views/01_el/02_elParam.jsp">02.EL - param</a>
<li><a href="01_el/elObject.do">03.EL - Object</a>
<li><a href="views/01_el/04_elOperation.jsp">04.el - operation</a>
</ul>
</body>
</html>
Java Resources (ELServlet1.java)
// 생략
// @WebServlet 어노테이션
// 서버 주소로 요청이 왔을때 이를 매핑해주는 web.xml 구문을 대체하는 어노테이션
@WebServlet("/01_el/el.do")
public class ELServlet1 extends HttpServlet{
private static final long serialVersionUID = 1L;
public ELServlet1() { super(); }
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// servlet / jsp에서의 객체 범위(scope)
// 1. page scope : 해당 페이지(servlet/jsp)
// 2. request scope : 요청 받은 페이지(servlet) + 요청 위임 페이지(jsp)
// 3. session scope : 브라우저가 종료되거나 세션이 만료되기 전까지
// 4. application scope : 프로젝트 전체에서 사용 가능
// request scope
request.setAttribute("classRoom", "A강의장");
request.setAttribute("person", new Person("홍길동", 23, '여'));
// Person 객체를 생성할 수 있도록 VO 생성(Person.java)
// session scope
// Session 객체 얻어오기
HttpSession session = request.getSession();
session.setAttribute("academyName", "KH 정보교육원");
// request, session 객체가 동일한 속성명의 속성을 가진 경우
request.setAttribute("scope", "request scope");
request.setAttribute("scope", "session scope");
// 요청 위임
RequestDispatcher view = request.getRequestDispatcher("/views/01_el/01_el.jsp");
// /views/01_el/01_el.jsp 여기로 이동
view.forword(request, response);s
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { doGet(request, response); }
}
Java Resources (Person.java)
package com.kh.el.model.vo;
public class Person {
private String name;
private int age;
private char gender;
public Person() {}
public Person(String name, int age, char gender) {
super();
this.name = name;
this.age = age;
this.gender = gender;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public char getGender() {
return gender;
}
public void setGender(char gender) {
this.gender = gender;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", gender=" + gender + "]";
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Person other = (Person) obj;
if (age != other.age)
return false;
if (gender != other.gender)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + gender;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
}
views (01_el.jsp)
<%@page import="com.kh.el.model.vo.Person"%>
<%@ 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>
<h3>EL 이란?</h3>
<pre>
Expression Language(표현 언어)의 약자.
<%= %> 와 같은 JSP 출력에 사용되는 java 코드를
간결하게 사용하는 방법으로 화면에 표현하고자 하는 코드를
\${ value } 형식으로 작성하는 것.
</pre>
<h3>1. scriptlet을 이용하여 request,session 객체에 저장된 속성 화면 출력하기</h3>
<% // 스크립틀릿
// 1. request, session 객체에 저장된 속성 scriptlet을 이용하여 화면 출력하기
String classRoom = (String)request.getAttribute("classRoom");
Person person = (Person)request.getAttribute("person");
// Person 객체인 person에 값을 넣기 위해서는 (Person)으로 형변환을 해주어야한다.
// Session scope 속성 값 얻어오기
String academyName = (String)request.getSession()
.getAttribute("academyName");
%>
학원명 : <%= academyName %><br>
강의장 : <%= classRoom %><br>
<br>
수강생 정보
<ul>
// 객체의 getter로 값을 가져온다.
<li>이름 : <%= person.getName() %></li>
<li>나이 : <%= person.getAge() %></li>
<li>성별 : <%= person.getGender() %></li>
</ul>
<hr>
<h3>2. el을 이용하여 request, session 객체에 저장된 속성 화면 출력하기</h3>
학원명 : ${ academyName }<br>
강의장 : ${ classRoom }<br>
<%-- ${ classRoom } == <%= request.getArrtibute("classRoom") %>
${ 속성명 }을 작성한 경우
page -> request -> session -> application 범위 순서로 접근하며
일치하는 속성명이 있는 경우 해당 속성의 값을 얻어와 출력함.
--%>
<br>
수강생 정보
<ul>
<li>이름 : ${person.name}</li>
<li>나이 : ${person.age}</li>
<li>성별 : ${person.gender }</li>
<%--
EL은 객체에 저장된 필드 값을 얻어올 때
${객체명.필드명}을 작성하면
자동적으로 해당 필드의 getter 메소드를 이용하여 값을 얻어온다.
-> 반대로 생각하면
EL을 이용해서 객체의 필드값을 얻어 오려면
객체에 반드시 getter/setter가 작성되어 있어야 한다.
--%>
</ul>
<a href="/EL_JSTL/views/01_el/sessionTest.jsp">
session Scope Test
</a>
<hr>
<h3>3. el 사용 시 내장객체에 저장된 속성명이 같은 경우</h3>
<pre>
웹 애플리케이션에서 객체는 4가지 영역(범위)를 가짐
page, request, session, application
1. page 영역
- 하나의 JSP 페이지 내에서만 객체 공유
-> forward 되더라도 해당 페이지에 지정된 변수를 사용할 수 없다.
- pageContext라는 JSP 내장 객체를 사용해도 선언 가능
2. request 영역
- 요청을 하는 페이지 + 요청을 위임 받은(응답) 페이지 에서 객체 공유
- Servlet에서 JSP로 객체를 공유하는 경우
-> request.setAttribute("속성명", 객체); 로 전달
-> JSP에서는 Object obj = request.getAttribute("속성명"); 으로 받음.
3. session 영역
- 하나의 브라우저당 1개의 session 객체가 생성되며 같은 브라우저 내에서 객체를 공유.
- 브라우저가 종료되거나 session이 만료되면 반환됨.
- request.getSession() 메소드를 호출하여 session영역 객체를 얻어옴
4. application 영역
- 하나의 웹 애플리케이션당 하나의 application 객체가 생성됨.
- 애플리 케이션이 종료되기 전 까지 모든 페이지에서 객체 공유
- request.getServletContext() 메소드를 호출하여 application 영역 객체를 얻어옴.
모든 웹 애플리케이션 객체는
setAttribute("속성명", 객체)로 세팅,
getAttribute("속성명")로 객체를 얻어올 수 있음.
el은 page -> request -> sessionS -> applicationScope 순으로 속성을 찾는다.
</pre>
<br><br>
<hr>
<h3>4. 특정 내장 객체에 저장된 속성 다루기</h3>
scope 출력 : ${ scope } <br>
<!-- request, session 중 범위가 작은 request가 출력됨 -->
session에 있는 scope를 출력하고 싶을 때 : ${ sessionScope.scope } <br>
request에 있는 scope를 출력하고 싶을 때 : ${ requestScope.scope }
</body>
</html>
views (sessionTest.jsp)
<%@ 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>
학원명 : (session scope) ${ academyName }<br>
<!-- session scope는 브라우저가 종료되거나 세션이 만료되기 전까지의
범위를 갖기 때문에 페이지에서 academyName의 값이 보인다.-->
강의장 : (request scope) ${ classRoom }<br>
<!-- request scope는 요청 받은 페이지(serlvet) + 요청 위임 페이지(jsp)
까지의 범위를 갖기 때문에 페이지에서 classRoom 값이 보이지 않는다. -->
<button onclick="history.back()">돌아가기</button>
</body>
</html>
결과
- 초기화면
-
-
-
-
-
views (02_elParam.jsp)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>EL - Param</title>
</head>
<body>
<h2>EL param 테스트 </h2>
<form action="02_elParamEnd.jsp">
<input type="text" name="pname" placeholder="제품명을 입력하세요.">
<br>
<input type="number" name="pcount" placeholder="수량을 입력하세요">
<br>
<input type="text" name="option" placeholder="옵션1">
<br>
<input type="text" name="option" placeholder="옵션2">
<br>
<input type="submit" value="제출">
</form>
</body>
</html>
views (02_elParamEnd.jsp)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>El - Param</title>
</head>
<body>
<h3>스크립팅 원소로 파라미터를 얻어와 출력하기</h3>
<%
String pname = requset.getParameter("pname");
String pcount = request.getParameter("pcount");
String[] optionArr = request.getParameterValues("option");
%>
상품명 : <%= pname %> <br>
수량 : <%= pcount %> <br>
상품명 : <%= optionArr[0] %> <br>
상품명 : <%= optionArr[1] %> <br>
<hr>
<h3>EL의 param을 이용하여 출력하기</h3>
<p>
param : 전달된 단일 파라미터 값을 얻어올때 사용.<br>
paramValues : 전달된 복수 파라미터 값을 배열로 얻어올 때 사용
</p>
상품명 : ${ param.pname }<br>
수량 : ${ param.pcount } <br>
옵션 1 : ${ paramValues.option[0] } <br>
옵션 2 : ${ paramValues.option[1] } <br>
</body>
</html>
결과
- 초기화면
-
-
Java Resources (ELObjectServlet.java)
// 생략
@WebServlet("/01_el/elObject.do") // web.xml 대체
public class ELObjectServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public ELObjectServlet() { super(); }
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Cookie 생성
// Cookie란?
// 웹 페이지에서 사용할 정보를 클라이언트 측에 저장하고 불러다 사용할 수 있는 파일
// ex) 아이디 저장
Cookie cookie = new Cookie("saveId", "user01");
cookie.setMaxAge(7 * 24 * 60 * 60); // 1주일
// 생성한 쿠키 객체를 응답 객체에 추가한다.
// -> 응답 성공 시 클라이언트 컴퓨터에 쿠키 파일을 자동 저장한다.
response.addCookie(cookie);
// 요청 위임
RequestDispatcher view = request.getRequestDispatcher
("/views/01_el/03_elObject.jsp");
view.forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
views (03_elObject.jsp)
<%@page import="java.util.Enumeration"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>EL - Object</title>
</head>
<body>
<h2>그 밖의 EL 내장객체 : cookie, initParam, header, pageContext</h2>
<h3>cookie</h3>
쿠키에서 얻어온 saveId 값 : ${ cookie.saveId.value } <br>
id : <input type="text" name="userId"
value="${ cookie.saveId.value }"> <br>
<!-- value에 쿠키에 저장된 아이디를 넣어주면 input 박스에 아이디가 보인다. -->
<br><br>
쿠키에 저장되지 않은 값을 얻어와 출력해보기 : ${ cookie.savePwd.value }
<!-- 아무것도 출력되지 않는다. -->
<pre>
EL의 장점 중 하나는 EL을 처리하는 도중 NullPointerException이 발생해도
예외를 발생시키지 않고 빈칸으로 처리한다.
만약 산술 연산에 null이 포함되면 0, 논리 연산에 null이 포함되면 fales로 처리한다.
</pre>
<hr>
<h3>컨텍스트 초기화 파라미터 : initParam</h3>
<p>web.xml에 설정한 초기화 파라미커 값을 가져옴. 서블릿 초기화 파라미터 X</p>
컨텍스트 파라미터 : ${initParam.email} <br>
컨텍스트 파라미터(스크립팅) : <%= application.getInitParameter("email") %>
<hr>
<h3>기타 request객체의 메소드를 el로 호출하기</h3>
프로젝트의 시작 주소(context-root)를 얻어오는 방법 <br>
표현식 : <%= request.getContextPath() %> --> 이거로 외워!<br>
EL : ${pageContext.request.contextPath }
</body>
</html>
web.xml
<?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_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>EL_JSTL</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- web.xml 파일은 배포와 관련된 설명, 설정을 작성하는 파일로
서버 배포 시 최우선적으로 읽어지는 파일이다.
-->
<!--context-param :쉽게 설명하면 프로젝트의 설정? context에서 쓰는 parameter를 설정하겠다 -->
<context-param>
<param-name>email</param-name>
<param-value>it_hs@naver.com</param-value>
</context-param>
</web-app>
결과
- 초기화면
-
views(04_elOperation.jsp)
<%@page import="com.kh.el.model.vo.Person"%>
<%@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>EL - Operation</title>
</head>
<body>
<h2>EL연산 </h2>
<p>
el을 가지고 어떤 연산을 처리하지 않음. 속성값들을 화면에 뿌리기 위한 용도임. <br />
하지만, 산술연산 및 논리연산을 지원함. 간단한 논리연산은 자주 사용함.
</p>
<h3>산술연산</h3>
10 더하기 5 = ${10 + 5}<br>
10 빼기 5 = ${10 - 5}<br>
10 곱하기 5 = ${10 * 5}<br>
10 나누기 5 = ${10 / 5} 또는<%-- ${10 div 5} --%><br>
<!-- 에러가 발생하겠지만 문제없음 -->
10 나누기 7의 나머지 = ${10 % 7} 또는 ${10 mod 7}<br>
<hr>
<h3>여리 가지 연산</h3>
<h4>객체 비교 연산</h4>
<%
String sOne = "안녕";
String sTwo = new String("안녕");
// Person VO 만들기
Person pOne = new Person("홍길동",20,'남');
Person pTwo = new Person("홍길동",20,'남');
// page socpe 범위(현재 페이지) 에 세팅
pageContext.setAttribute("sOne", sOne);
pageContext.setAttribute("sTwo", sTwo);
pageContext.setAttribute("pOne", pOne);
pageContext.setAttribute("pTwo", pTwo);
%>
<table border="1">
<tr>
<th>비교식</th>
<th>scriptlet</th>
<th>el</th>
</tr>
<tr>
<td>sOne == sTwo</td>
<td><%=sOne == sTwo %></td>
<td>${sOne == sTwo} 또는 ${sOne eq sTwo }</td>
<!-- el의 == 연산은 equals()와 같은 동작을 함 -->
</tr>
<tr>
<td>sOne != sTwo</td>
<td><%=sOne != sTwo %></td>
<td>${sOne != sTwo} 또는 ${sOne ne sTwo }</td>
</tr>
<tr>
<td>pOne == pTwo</td>
<td><%=pOne == pTwo %></td>
<td>${pOne == pTwo} 또는 ${pOne eq pTwo }</td>
<!-- el의 == 연산은 equals()와 같은 동작을 함 -->
</tr>
<tr>
<td>pOne != pTwo</td>
<td><%=pOne != pTwo %></td>
<td>${pOne != pTwo} 또는 ${pOne ne pTwo }</td>
</tr>
</table>
<br><br>
<h4>숫자형 자동 형변환</h4>
<%
// int형 값인 10, 3을 세팅 했지만
// 웹 애플리케이션 객체에 setAttribute된 값은 Obejct 타입으로 저장됨
pageContext.setAttribute("big", 10);
pageContext.setAttribute("small", 3);
%>
scriptlet : <%-- <%= pageContext.getAttribute("big") + pageContext.getAttribute("small")%> --%>
<!-- Object 타입 끼리 더하기가 성립되지 않음 -->
<br>
<!-- el은 scope에 속성으로 담긴타입은 Object를 자동으로 인식하여 형변환 후 연산을 처리함 -->
el : ${big + small }
<br>
<h4>숫자형 자동 형변환 + 비교 연산</h4>
big>small : ${big > small } 또는 ${big gt small } <br>
big<small : ${big<small } 또는 ${big lt small }<br><br>
big>=small : ${big >= small } 또는 ${big ge small } <br>
big<=small : ${big <= small } 또는 ${big le small }<br><br>
\${big+small } : ${big+small } <br /><br />
<h4>객체가 null 또는 비어있는지 체크</h4>
<%
Person person = null; // 아무것도 참조하지 않는 참조 변수 선언
List<String> list = new ArrayList<>();
pageContext.setAttribute("person",person); // page scope에 세팅
%>
\${empty person } = ${empty person} <br><br>
\${empty list } = ${empty list} <br><br>
<h1 style="color:red">EL은 NullPointerException을 발생시키지 않는 특징이 있음!</h1>
${person.name }
<h4>논리연결연산자/부정연산자</h4>
${true and true } 또는 ${true && true } <br>
${true or true } 또는 ${true || true } <br>
${! (big<small) }
</body>
</html>
결과
- 초기화면
-
-
JSP Action Tag란?
JSP 페이지를 이루는 요소 중 하나이며 페이지를 이동시키거나 외부 파일을 불러오는 등의 기능을 가진다. 액션 태그는 XML 문법을 사용하기 때문에 단독 태그의 경우에도 반드시 종료 태그를 포함해야한다. 웹 브라우저에서 실행되는 것이 아니라, 웹 컨테이너에서 실행되고 결과만 브라우저로 보낸다.
- 프로젝트 구성
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>EL / JSTL</title>
</head>
<body>
<h3>JSP Action Tag</h3>
<ul>
<li><a href="views/02_action/01_action.jsp">JSP Action Tag - include</a></li>
</ul>
</body>
</html>
views (01_action.jsp)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>정적, 동적 include</title>
</head>
<body>
<a href="02_scriptingInclude.jsp">
1) Scripting 방식의 include (정적 include)
</a>
<br>
<a href="03_actionInclude.jsp">
1) JSP Action Tag 방식의 include (동적 include)
</a>
</body>
</html>
views (02_scriptingInclude.jsp)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>정적 include</title>
</head>
<body>
<h1>정적 include 방식</h1>
<pre>
현재 페이지에 포함되어지는 jsp 파일이
컴파일 전에 지정된 위치에 삽입되어
하나의 거대한 jsp 파일로 컴파일됨.
특징 : 추가된 페이지에 선언된 변수를 그대로 사용할 수 있음.
문제점 : 현재 페이지와 추가된 페이지가 동일한 이름의 변수를 가질 수 없다.
(변수명 충돌)
</pre>
<%@include file="test.jsp" %> <!-- test.jsp 파일을 여기에 추가하겠다. --><br><br>
현재 년도 : <%= year %>
</body>
</html>
views (03_actionInclude.jsp)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>동적 Include</title>
</head>
<body>
<h3>JSP Action Tag란?</h3>
<pre>
JSP Action 태그는 XML 기술을 이용하여
기존의 JSP 문법을 확장하는 메커니즘을 제공하는 태그로,
웹 브라우저에서 실행되는 것이 아니라,
웹 컨테이너에서 실행되고 결과만 브라우저로 보냄.
JSP 페이지에서 바로 사용 가능하고
태그 앞에 jsp: 접두어가 붙음
<%--
<jsp:include page="jsp파일 경로"></jsp:include>
--%>
</pre>
<h3>동적 include</h3>
<pre>
현재 페이지에 삽입되는 페이지가 컴파일 이전이 아닌, 현재 페이지가 요청되어 출력되는 시점에
하나로 합쳐지는 방식
특징 : 정적 include에서의 문제점인 변수명 중복이 발생하지 않는다.
(변수명 중복 검사는 컴파일 시에 수행됨.)
+ 현재 페이지에서 삽입되는 페이지로 데이터 전달이 가능하다.
</pre>
<%-- 전달하고자 하는 값을 작성할 수 있음 --%>
<jsp:include page="test.jsp">
<jsp:param name="age" value="30" />
</jsp:include>
</body>
</html>
views (test.jsp)
<%@page import="java.util.Date"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
String year = String.format("%tY", new Date());
%>
<p>
2005 - <%= year %>
<%-- <% String year = "2021"; %>
Duplicate local variable year == 변수명 중복
--%>
<h1> age : ${param.age }</h1>
</p>
결과
- 초기화면
-
-
-
댓글남기기