EL test
- expression 태그를 통해 출력할 수 있었던 내용을 보다 간결하게 사용할 수 있도록 한다.
- 요청을 서블릿으로 하고, request 영역에 Attribute를 담고 이를 화면에 expression 으로 표현해보고
- 이를 el로 어떻게 표현할 수 있는지 살펴보고자 한다.
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>
<h1 align="center">JSP Action Tag</h1>
<h3><a href="views/action/testAction.jsp">JSP Action Tag 테스트</a></h3>
<h2>EL test</h2>
<h3><a href="test1">request.getAttribute() 테스트</a></h3>
<h3><a href="test2">request에 저장 된 객체 출력 테스트</a></h3>
<h3><a href="views/el/testEl3.jsp?name=galaxy&price=95&no=5&no=6&option=삼성">parameter로 값 전달한 경우 el 테스트</a></h3>
<h3><a href="test4">requestScope와 sessionScope 테스트</a></h3>
</body>
</html>
TestOneServlet.java
package com.greedy.el.controller;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/test1")
public class TestOneServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setAttribute("name", "홍길동");
request.setAttribute("age", 20);
request.setAttribute("phone", "010-1234-5678");
List<String> items = new ArrayList<>();
items.add(new String("apple"));
items.add(new String("banana"));
items.add(new String("melon"));
request.setAttribute("items", items);
RequestDispatcher view = request.getRequestDispatcher("views/el/testEl1.jsp");
view.forward(request, response);
}
}
- <a href>코드에서 작성한 내용이므로 doGet 메소드를 사용한다.
- 요청을 하고 그에대한 응답을 보낼 때, 응답에 대해 동적으로 처리되는 내용들을 request 의 Attribute 내에 담아 화면상에 출력하고자 할 것이다.
- 위임된 JSP에서 출력하고자 하는 내용을 request 내장객체 내 setAttribute를 이용해서 담는다.
- 문자값, 숫자값을 담은 뒤 ArrayList 배열도 생성한다. 이 배열역시 request에 담는다.
- items를 request에 setAttribute 하여 담아준다.
- attribute는 Object 타입이므로 담길 수 있다.

ServletRequest를 통해서 RequestDispatcher 얻는 법
서블릿 클래스에서는 service() 메서드나 doGet() doPost() 등에서 ServletRequest의 하위 클래스인 HttpServletRequest를 매개변수로 받기 때문에 이것을 이용하여 RequestDispatcher를 얻을 수 있습니다. HttpServletRequest에서는 URL 경로를 통해서 대상을 지정하는 한가지 방법만을 제공합니다. 그러나 ServletContext를 통해서 대상을 지정할때와는 다르게 절대경로 및 상대경로 모두 지정이 가능합니다. JSP 페이지에서도 ServletRequest의 인스턴스인 request 기본객체가 있으므로 쉽게 얻을 수 있습니다.
출처: https://dololak.tistory.com/502
- 다 담아줬다면 위임, 즉 forward 하여 jsp로 보내도록 한다.
- 보내기 위해 RequestDispatcher 객체가 필요하다.
* * *
RequestDispatcher란?
RequestDispatcher는 클라이언트로부터 최초에 들어온 요청을 JSP/Servlet 내에서 원하는 자원으로 요청을 넘기는(보내는) 역할을 수행하거나, 특정 자원에 처리를 요청하고 처리 결과를 얻어오는 기능을 수행하는 클래스입니다. 즉 /a.jsp 로 들어온 요청을 /a.jsp 내에서 RequestDispatcher를 사용하여 b.jsp로 요청을 보낼 수 있습니다. 또는 a.jsp에서 b.jsp로 처리를 요청하고 b.jsp에서 처리한 결과 내용을 a.jsp의 결과에 포함시킬 수 있습니다.
요청을 보내는 방법으로는 (1) RequestDispatcher#forward()와 (2) RequestDispatcher#include() 두 가지 방법이 있습니다.
출처 : https://dololak.tistory.com/502
- 경로를 지정한뒤 해당경로로 위임시키는 forward를 호출한다.
- request 와 response를 다 넘겨야 해당페이지에서도 담았던 값들을 모두 사용할 수 있다.

- 위임될 대상인 JSP ("views/el/testEl1.jsp")를 경로에 맞게 작성한다.

testEl1.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.*"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>전달 된 request 객체에서 저장된 정보 출력하기</h2>
<%-- <%
String name = (String)request.getAttribute("name");
int age = (Integer)request.getAttribute("age");
String phone = (String)request.getAttribute("phone");
%>
name : <%= name %> <br>
age : <%= age %> <br>
phone : <%= phone %> <br> --%>
<!-- EL 표현식으로 출력하기 -->
name : ${ requestScope.name } <br>
age : ${ requestScope.age } <br>
phone : ${ requestScope.phone } <br>
<!-- 스코프 범위 생략 가능함(알아서 찾음) -->
name : ${ name } <br>
age : ${ age } <br>
phone : ${ phone } <br>
<br>
<h2>items 이름으로 저장 된 리스트 정보 출력하기</h2>
<%-- <%
ArrayList items = (ArrayList)request.getAttribute("items");
%>
<% for(int i = 0; i < items.size(); i++) { %>
<%= i %> : <%= items.get(i) %> <br>
<% } %> --%>
0 : ${ requestScope.items[0] } <br>
1 : ${ requestScope.items[1] } <br>
2 : ${ requestScope.items[2] } <br>
0 : ${ items[0] } <br>
1 : ${ items[1] } <br>
2 : ${ items[2] } <br>
</body>
</html>
전달 된 request 객체에서 저장된 정보 출력하기
- 스크립틀릿과 익스프레션 태그를 이용해서 먼저 출력해본다.
- request에서 setAttribute 해주었던 내용을 getAttribute 해온다.
- 스크립틀릿(<% %>) 내에선 순수하게 '꺼내왔다'고만 할 수 있으나 이걸 화면상에서 표현하고자 한다면
- 익스프레션(<%= %>) 태그를 이용해 주면 된다.

- 화면에 잘 반영되는지 확인해보자.
- 아까전 jsp 파일에 /test1으로 경로를 지정해서 연결해주었다.
- 1) test1으로 요청이 되어서 서블릿과 매핑이 되고
- 2) 서블릿에서는 jsp로 위임한 것이 화면에 출력된 것이다.
- 하지만 위임에 대해서는 경로에 드러나지 않는다. 내부적으로 위임이 되어 jsp 에서 처리를 해주는 것이다.


EL 표현식으로 출력하기
- 지금까지 태그를 이용해서 (위와같이) 꺼내오고 출력하는 모습을 확인했다.
- 이렇게 꺼내오는 과정의 번거로움을 줄이기 위해 나타난 것이 el표현식이다.
- 특징은 다음과 같다. ${ } 를 활용하며, requestScope 라는 내장객체를 이용해, 속성을 가져온다.
- requestScope란, request 영역을 의미한다. el문법안에서 사용할 수 있는 el 내장객체이다.
- requestScope 뒤에 점을 찍어 영역의 속성을 가져오는 것이다.

- jsp내장객체이기에 request를 그냥 쓸 수 있듯 requestScope 역시 el 문법의 내장객체이기에 별도의 처리 없이 사용할 수 있다. 약속된 용어이다.
- el문법에서 내장하고있는 객체, 즉 requstScope 는 생략이 가능하다.
- JSP 태그를 사용하면 저장(setAttribute)하고 꺼내와야(getAttribute)하지만
- el문법에서 내장하고있는 객체는 ${ } 즉, 달러와 중괄호 내에 작성하기만 하면 알아서 잘 찾아온다는 특징을 가지고 있으므로 훨씬 간결하고, 편리한 면이 있다.

items 이름으로 저장 된 리스트 정보 출력하기
- request 객체의 속성은 Object로 리턴되므로 ArrayList에 담기위해서 다운 캐스팅이 필요하다.
- Attribute는 Object에 속한탓이다.
- 다운캐스팅을 해주어도 여전히 에러줄이 사라지지않는다면 맨 위 지시자 태그내에 import 처리가 되어있는지 확인한다.


- 배열이므로 출력을 위해선 반복문의 사용이 필요하다.
- 단순히 화면에 출력되기 위해 반복문을 출력줄 것이다.
- 겉, 즉 위아래로 반복문의 범위를 스크립틀릿으로 잡아주고
- 내부에선 익스프레션 태그를 이용해 반복되는 만큼 화면에 출력해줄 것이다.

<%
ArrayList items = (ArrayList)request.getAttribute("items");
%>
<% for(int i = 0; i < items.size(); i++) { %>
<%= i %> : <%= items.get(i) %> <br>
<% } %>

리스트 정보 el문법을 이용해 출력하기
- list 이므로 배열 인덱스 하나하나 값으로 접근시, 잘 출력된다.
- 역시 내장객체인 requestScope 의 사용은 생략 가능하다.
- 이와같이 인덱스로 하나하나 접근하는게 아닌 반복문은 나중에 배울 jstl을 이용하면 된다.


request에 저장된 객체 출력 테스트
index.jsp

TestTwoServlet.java
package com.greedy.el.controller;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.greedy.el.model.dto.MemberDTO;
@WebServlet("/test2")
public class TestTwoServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
MemberDTO member = new MemberDTO("홍길동", 20, "010-1234-5678", "hong@greedy.com");
request.setAttribute("member", member);
RequestDispatcher view = request.getRequestDispatcher("views/el/testEl2.jsp");
view.forward(request, response);
}
}
- 앞으로 서버상 화면에 표현할 데이터들이 대체로 객체 타입이 많을 것이다.
- request 안에 담긴 값이 인스턴스, 객체일때 화면상에 el로 출력하려면 어떻게 해야할까?
- 멤버 DTO를 생성한뒤 JSP로 위임, 즉 forwarding 해준다.
- 먼저 setAttribute를 통해 해당값을 저장한다.

- 위임이라는 처리를 위해서는 RequestDispatcher 객체가 필요하다.
- 이를 통해 jsp 페이지로 위임처리를 해줄 수 있다.

- 경로에 맞게끔 testEl2 페이지도 생성후 작성해준다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="com.greedy.el.model.dto.MemberDTO"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>전달 된 request 객체에 저장 된 Member 객체 필드 값 출력하기</h2>
<%-- <%
MemberDTO member = (MemberDTO)request.getAttribute("member");
%>
이름 : <%= member.getName() %> <br>
나이 : <%= member.getAge() %> <br>
전화번호 : <%= member.getPhone() %> <br>
이메일 : <%= member.getEmail() %> <br> --%>
<!-- EL 표현식으로 작성 -->
이름 : ${ requestScope.member.name } <br>
나이 : ${ requestScope.member.age } <br>
전화번호 : ${ requestScope.member.phone } <br>
이메일 : ${ requestScope.member.email } <br>
이름 : ${ member.name } <br>
나이 : ${ member.age } <br>
전화번호 : ${ member.phone } <br>
이메일 : ${ member.email } <br>
</body>
</html>
스크립틀릿으로 화면상에 표현하기
- 스크립틀릿 방법을 쓴 후 그것을 el표현식으로 바꿔보도록 한다.
- <% %> 스크립틀릿 코드 선언 후 그 안에 작성한다.
- request 객체를 통해 받아오는 값은 Object 형이므로 MemberDTO를 통한 다운캐스팅이 필요하다.
- 잘 작성했음에도 에러줄이 발생시, 가장 상단 지시자 태그 내에 임포트가 잘 되었는지 확인한다.

- 화면상에 다음과같이 익스프레션 태그를 통해 객체에서 값을 꺼내온다.
- 서블릿같은 경우 컴파일이 필요하므로 서버 구동해서 확인하기전 컴파일 해주어야 한다.


EL 표현식으로 작성
- 이제는 이를 EL 태그로 표현하여 화면에서 출력되는지 확인해본다.
- 다음과 같이 작성하면 내부적으로 GET 메소드를 불러서 화면에 뿌려주게 된다.
- 위 스크립틀릿 코드로 작성한 것과 동일하게 나타남을 확인할 수 있다.
- 또한 requstScope를 반드시 명시해야하는 것도 아니기에 생략하고 객체명.컬럼명만 적어도 문제없이 호출됨을 확인할 수 있다.


- requestScope도 생략되었는데 화면에서는 member가 참조변수인지 아는 이유는
- 서블릿 내 doGet 메소드에서 setAttribute 명을 member로 설정 해 주었기 때문임을 잊지말아야 한다.

'Programming > Servlet&JSP' 카테고리의 다른 글
| jsp 액션태그 (0) | 2023.04.03 |
|---|---|
| JSP 태그 종류와 사용법(2) (0) | 2023.03.30 |
| JSP 태그 종류와 사용법(1) (0) | 2023.03.29 |
| 10. EL & JSTL (2) (0) | 2022.03.08 |
| 10. EL & JSTL (1) (0) | 2022.03.08 |
































































































































































































































