고래씌

[JSP] 7-1. Action Tag (EL 기본 구문) 본문

Server/JSP과 Servlet

[JSP] 7-1. Action Tag (EL 기본 구문)

고래씌 2023. 12. 18. 11:55

1. JSP Action Tag 란?

- XML기술을 이용하여 기존의 JSP문법을 확장하는 매커니즘을 제공하는 태그

- 웹 브라우저에서 실행되는 것이 아니라 웹 컨테이너에서 실행되고 결과만 브라우저로 보냄

 

 

▶ 표준 액션 태그

 

 

 

1) 실습 준비

 

▶ActionProject 프로젝트 생성

 


2. EL(Expression Language)

: 기존에 사용했던 표현식<&= name %>와같이 jsp상에서 표현하고자 하는 값을 ${name }의 형식으로 표현해서 작성하는 것

 

- EL 내장 객체 => 별도의 변수 선언없이(import 없이) 사용할 수 있는 것!

 

▶ 데이터들을 담을 수 있는 JSP 내장객체 종류
1. ServletContext (application scope)
   - 한 애플리케이션당 1개만 존재하는 객체
   - 이 영역에 데이터를 담으면 애플리케이션 전역에서 사용 가능
   => 공유범위가 가장 크다.

 


2. HttpSession (session scope)
   - 한 브라우저당 1개만 존재하는 객체
   - 이 영역에 데이터를 담으면 jsp/servlet 단 등 모두 사용 가능하다.
   - 값이 한번 담기면 서버가 멈추거나, 브라우저가 종료되기 전까지 사용 가능하다.
   => 공유범위가 제한적임

 


3. HttpServletRequest (request scope)
   - 요청 및 응답시 생성되는 객체
   - 이 영역에 데이터를 담으면 해당 request객체를 포워딩받는 응답 jsp에서 사용 가능
    => 공유범위가 해당 요청에 대한 응답 jsp까지

 


4. PageContext (page scope)
    - 현재 jsp페이지에서만 사용가능
     => 공유범위가 가장 적음

- 위의 객체들에 값을 담을 때는 setAttribute('키', 데이터)
- 꺼낼 때는 getAttribute('키')
- 지울 때는 removeAttribute('키')

 

 

 

 

▶ index.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>
	<h1>* EL(Expression Language)</h1>

	<p>
		기존에 사용했던 표현식&lt;&= name %&gt;와같이<br>
		jsp상에서 표현하고자 하는 값을 \${name }의 형식으로 표현해서 작성하는 것
	</p>
	
	<h3>1. EL 기본 구문에 대해서 배우기</h3>
	<a href="/action/el.do">01_EL</a>
	
	
</body>
</html>

 

 

 

▶ Peson.java 클래스 생성

package com.kh.model.vo;

public class Person {
	
	private String name;
	private int age;
	private String gender;
	
	public Person() {
		
	}

	public Person(String name, int age, String 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 String getGender() {
		return gender;
	}

	public void setGender(String gender) {
		this.gender = gender;
	}

	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + ", gender=" + gender + "]";
	}

}

 

 

▶ ELServlet.java 파일 생성(Servlet)

package com.kh.controller;

import java.io.IOException;

import javax.servlet.ServletContext;
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 javax.servlet.http.HttpSession;

import com.kh.model.vo.Person;

/**
 * Servlet implementation class ELServlet
 */
@WebServlet("/el.do")
public class ELServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       

    public ELServlet() {
        super();
    }


	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		// requestScope에 데이터 담기
		request.setAttribute("classRoom", "C강의장");  // 키값 classRoom 
		request.setAttribute("student", new Person("이고래", 26, "여자"));
		
		// sessionScope에 담기
		HttpSession session = request.getSession();
		session.setAttribute("academy", "이고래아카데미");
		session.setAttribute("teacher", new Person("이선생",35, "남자"));
		
		// 동일한 키값으로 데이터 추가
		request.setAttribute("scope", "request scope");
		session.setAttribute("scope", "session scope");
		
		// application scope에 담기
		ServletContext application = request.getServletContext();
		application.setAttribute("scope", "application");
		
		request.getRequestDispatcher("views/1_EL/01_el.jsp").forward(request, response);
	}


	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

 

 

▶ 01_el.jsp 파일 생성

 

1) 기존방식대로 스크립틀릿과 표현식을 이용해서 각 영역에 담겨있는 값을 뽑아서 화면에 출력하기

 

 

- 결과화면

 

 

2) EL을 이용해서 보다 쉽게 Scope에 저장된 값들 출력하기

 

- EL은 getAttribute("키")을 통해 값을 빼올 필요 없이 "키"값만 제시하면 바로 접근 가능하다.
- 내부적으로 해당 scope영역에 키 값의 밸류값을 가져올 수 있다
- 기본적으로 EL은 JSP내장객체를 구분하지 않고 모든 내장객체에 키값을 검색해서 존재하는 경우 값을 가져온다.
- 단점은 자바스크립트의 표현객체와 겹친다.

 

 

- 위 코드를 모두 주석처리하고 다음과 같이 실행해보았다.

 

 

=> teacher에 접근했을때의 밸류값은 person객체임. Person객체의 각 필드에 담긴 값을 출력하고자 한다면 객체명.필드명 으로 접근하면 됨. 내부적으로 getter메소드를 찾아서 실행함.  getter함수가 없다면 가져올 수 없다. 

 

=> 스크립틀릿과 표현식을 이용하지 않아도 출력되는 것을 볼 수 있다!

 

 

3) EL 사용시 내장객체들이 동일한 키값을 사용하는 경우

▶ EL은 공유범위가 제일 작은 Scope에서부터 키값을 검색함
     page => request => session => application 순서

만약 모든 영역에서 값을 못찾을 경우 아무것도 출력되지 않는다.

 

scope 값 : ${scope }

 

- 결과화면

 

 

4) 직접 Scope영역을 지정해서 접근하기

 <%
     // page scope에 데이터 담기
     pageContext.setAttribute("scope", "page");
 %>
 
 pageScope에 담긴 값 : ${scope } 또는 ${pageScope.scope } <br>
 requestScope에 담긴 값 : ${requestScope.scope } <br>
 sessionScope에 담긴 값 : ${sessionScope.scope } <br>
 applicationScope에 담긴 값 : ${applicationScope.scope } <br><br>

 

- 결과화면