
Expression Language (EL)은 JSP(JavaServer Pages)에서 데이터 접근을 쉽게 하기 위해 사용하는 언어입니다.
EL은 간단한 표현식으로 JSP 페이지에서 자바 객체의 속성 값을 참조할 수 있게 해줍니다.
스코프(scope)는 웹 애플리케이션에서 변수나 객체가 저장되는 영역을 나타냅니다. EL에서는 다음과 같은 스코프를 사용할 수 있습니다:
pageScoperequestScopeHttpServletRequestsessionScopeHttpSessionapplicationScopeServletContextEL에서 특정 스코프를 지정하지 않고 속성을 참조할 때, 속성을 찾는 순서는 다음과 같습니다:
1. Page Scope
2. Request Scope
3. Session Scope
4. Application Scope
예를 들어, ${username}이라는 표현식이 있을 때, EL은 다음 순서로 username 속성을 찾습니다:
username을 찾습니다.HttpServletRequest)HttpSession)ServletContext)이를 통해 개발자는 적절한 스코프를 사용하여 웹 애플리케이션의 데이터와 상태를 효율적으로 관리할 수 있습니다.
ScopeServlet.java이 서블릿은 클라이언트 요청을 받아 다양한 스코프에 데이터를 설정하고,
데이터를 포함한 요청을 JSP페이지로 포워딩하는 역할을 합니다.
포워딩 (Forwarding)개념 설명
웹 애플리케이션에서 "포워딩"이란 클라이언트의 요청을 서버 내에서 다른 리소스(예: 서블릿, JSP페이지)로 전달하는 것을 의미한다. 포워딩은 클라이언트가 인식하지 못하는 서버 내부의 동작이다.
<포워딩 주요 특징>
1. 서버 내에서 발생 : 클라이언트는 요청을 한번만 보낸다. 포워딩은 서버 내에서 발생하며, 클라이언트는 요청이 다른 리소스로 전달된 사실을 알지 못한다.
2. URL 변경 없음 : 클라이언트의 브라우저 URL은 처음 요청한 URL 그대로 유지된다. 포워딩은 서버 내부의 동작이기 때문에 클라이언트 측에서는 URL이 바뀌지 않는다.
3. 요청 및 응답 객체 재사용 : 원래의 HttpServletRequest와 HttpServletResponse 객체가 그대로 전달되므로, 초기 요청의 모든 데이터와 속성이 유지된다.
@WebServlet("/scope")
// /scope URL 패턴에 매핑됨.
public class ScopeServlet extends HttpServlet {
ServletContext sc;
// 애플리케이션 범위의 정보를 저장 및 제공하는 객체
@Override
public void init(ServletConfig config) throws ServletException {
sc = config.getServletContext();
}
// init(ServletConfig config): 서블릿이 초기화될 때 호출된다. 여기서는 ServletContext 객체를 가져온다.
protected void doGet(HttpServletRequest request, HttpServletResponse response)
// HTTP GET 요청을 처리하는 메소드 .
throws ServletException, IOException {
sc.setAttribute("scopeName", "applicationScope 값");
// Application Scope. ServletContext 객체에 scopeName 속성을 설정한다. 이는 애플리케이션 범위의 속성이다.
HttpSession session = request.getSession();
// Session Scope. 현재 요청과 관련된 세션을 가져온다.
session.setAttribute("scopeName", "sessionScope 값");
// 세션 범위의 scopeName 속성을 설정한다.
request.setAttribute("scopeName", "requestScope 값");
// Request Scope. 요청 범위의 scopeName속성을 설정한다.
Member member = new Member("홍길동", "hong");
//Member 객체 생성.
request.setAttribute("member", member);
// 요청 범위의 member 속성을 설정.
request.getRequestDispatcher("scope.jsp").forward(request, response);
//요청을 scope.jsp로 포워딩한다. 이는 서블릿이 처리한 데이터를 JSP로 전달한다.
}
}
Servlet:
서블릿은 자바 기반 웹 애플리케이션에서 클라이언트의 요청을 처리하고 응답을 생성하는 서버측 컴포넌트입니다.
ServletContext:
애플리케이션 전체에서 공유되는 컨텍스트입니다.
여기서는 scopeName 속성을 applicationScope에 저장합니다.
HttpSession:
특정 클라이언트와 서버 간의 세션을 유지하기 위해 사용됩니다.
여기서는 scopeName 속성을 sessionScope에 저장합니다.
scopeName 속성과 member 객체를 requestScope에 저장합니다.scope.jsp로 요청을 포워딩합니다.scope.jspJSP 페이지는 EL(Expression Language)을 사용하여
서블릿에서 설정한 다양한 스코프의 속성값을 출력한다.
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
// JSP페이지의 설정을 지정한다. 여기서는 컨텐츠 타입을 text/html로, 문자 인코딩을 UTF-8로 설정.
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>scope 데이터 보기 </h1>
pageScope의 속성값은 : ${pageScope.scopeName}<br>
// EL을 사용하여 페이지 범위의 scopeName 속성 값을 출력한다.
requestScope의 속성값은 : ${requestScope.scopeName}<br>
// EL을 사용하여 요청 범위의 scopeName 속성 값을 출력한다.
sessionScope의 속성값은 : ${sessionScope.scopeName}<br>
// EL을 사용하여 세션 범위의 scopeName 속성 값을 출력한다.
applicationScope의 속성값은 : ${applicationScope.scopeName}<br>
// EL을 사용하여 애플리케이션 범위의 scopeName 속성 값을 출력한다.
scopeName 자동 찾기: ${scopeName} <br>
//EL을 사용하여 지정된 스코프 순서대로 scopeName 속성 값을 자동으로 찾는다.
member: ${member.name}(${member.userid})<br>
// EL을 사용하여 member 객체의 name과 userid 속성 값을 출력한다.
</body>
</html>
JSP (JavaServer Pages): 서버 측에서 동적으로 생성된 HTML을 포함한 웹 페이지를 만들기 위한 기술입니다.
EL (Expression Language): JSP에서 간단하게 자바 객체의 속성을 참조하기 위해 사용됩니다. 예를 들어, ${requestScope.scopeName}은 requestScope에서 scopeName 속성의 값을 가져옵니다.
스코프:
pageScope: 페이지 내에서만 유효한 속성.requestScope: 요청 내에서 유효한 속성.sessionScope: 세션 내에서 유효한 속성.applicationScope: 애플리케이션 전체에서 유효한 속성.Member.javaMember 클래스는 사용자의 이름과 아이디를 저장하는 자바 빈 객체이다.
package org.scoula.ex05.domain;
public class Member {
private String name;
private String userid;
// 사용자 이름과 아이디를 저장하는 두 개의 속성.
public Member() {
}
// 기본 생성자.
public Member(String name, String userid) {
this.name = name;
this.userid = userid;
} // 이름과 아이디를 매개변수로 받아 초기화 하는 생성자.
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//name 속성의 getter와 setter 메소드.
public String getUserid() {
return userid;
}
public void setUserid(String userid) {
this.userid = userid;
}
//userid 속성의 getter와 setter 메소드.
}
Member 클래스는 사용자의 이름과 아이디를 저장하는 단순한 자바 빈 객체입니다.name과 userid 속성.getName, setName, getUserid, setUserid 메소드.Getter와 Setter 메소드 개념
<개념>
• Getter 메소드: 객체의 속성(필드) 값을 반환하는 메소드입니다. 주로 getFieldName() 형태로 명명됩니다.
• Setter 메소드: 객체의 속성(필드) 값을 설정하는 메소드입니다. 주로 setFieldName(value) 형태로 명명됩니다.
<사용 목적>
1. 캡슐화: 객체지향 프로그래밍의 중요한 원칙 중 하나로, 객체의 내부 상태(속성 값)를 외부에서 직접 접근하지 못하게 하고, 메소드를 통해 접근하도록 합니다. 이를 통해 데이터의 무결성을 보장하고, 객체의 내부 구현을 숨길 수 있습니다.
2. 데이터 보호: 속성 값에 대한 직접 접근을 막아 잘못된 값이 설정되지 않도록 합니다. setter 메소드에서 값의 유효성을 검사할 수 있습니다.
3. 유연성: 속성 값을 읽거나 쓸 때 추가 로직을 구현할 수 있습니다. 예를 들어, 속성 값을 설정할 때 로그를 남기거나, 특정 조건에 따라 다른 속성 값도 변경할 수 있습니다.
4. 변경 용이성: 속성의 구현을 변경하더라도 getter와 setter 메소드의 인터페이스는 변경되지 않으므로, 다른 코드에 영향을 주지 않고 수정할 수 있습니다.
<Getter 메소드>
• 목적: 객체의 속성 값을 **반환**합니다.
• 형태: 반환 타입이 속성의 타입과 동일합니다.
• 명명 규칙: get 접두사에 속성 이름의 첫 글자를 대문자로 한 형태를 사용합니다.
<Setter 메소드>
• 목적: 객체의 속성 값을 **설정**합니다.
• 형태: 매개변수 타입이 속성의 타입과 동일합니다.
• 명명 규칙: set 접두사에 속성 이름의 첫 글자를 대문자로 한 형태를 사용합니다.
클라이언트 요청: 클라이언트가 /scope URL로 요청을 보냅니다.
서블릿 초기화: ScopeServlet이 초기화되고 ServletContext 객체를 가져옵니다.
doGet 메소드 실행:
applicationScope에 scopeName 속성을 설정합니다.sessionScope에 scopeName 속성을 설정합니다.requestScope에 scopeName 속성을 설정하고 member 객체를 추가합니다.요청 포워딩: scope.jsp로 요청을 포워딩합니다.
JSP 처리:
scopeName 값을 출력합니다.member 객체의 name과 userid 속성을 출력합니다.이 과정을 통해 각 스코프에 저장된 데이터가 어떻게 JSP 페이지에서 표현되는지를 보여줍니다. 이러한 구조는 웹 애플리케이션의 상태 관리와 데이터 접근을 효율적으로 처리할 수 있게 합니다.
