다잘하고싶어

JSP 본문

이론학습/Servlet&JSP

JSP

챙영잉 2023. 4. 11. 12:16
더보기

목차

- JSP 구성요소

    - JSP 태그 종류

    - 스크립트릿 <% %>

    - 선언부<%! %>

    - Q. 스트립트릿으로 선언한 변수와 선언부로 선언한 변수의 차이?

    - 표현식

    - 지시자 page, include

 

- JSP 기본 객체 영역 ( scope)

- 페이지 이동

    - 포워드

    - 리다이렉트

- JSP 기본 객체 영역 메서드

   - 코드실습

JSP

  • Servlet 표준을 기반으로 작성된 웹 어플리케이션 개발 언어
  • HTML 내에 Java 를 작성하여 동적으로 웹페이지를 생성하여 브라우저에게 돌려주는 페이지
  • 실행 시 Servlet 으로 변환된 후 실행

서블릿은 자바코드 내에 HTML 을 작성, JSP는 HTML 내에 자바코드를 작성

JSP 구성요소

지시자

  • JSP 에 대한 설정 정보를 지정하기 위해서 사용

스크립트 요소 : 스트립트릿(Scriptlet), 표현식, 선언부

  • JSP에서 문서의 내용을 동적으로 생성하기 위해 사용

JSP 기본 객체

  • 요청 및 응답 관련 정보를 얻거나

JSP 태그 종류

스크립트릿 <% %>

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>스크립트릿</title>
</head>
<body>
	<h2>스크립트릿 연습</h2>
	<%
		int a = 10;
		int b = 20;
		
		int sum = a + b;
		
		out.print(a+"+"+b+"="+sum);
	%>

</body>
</html>

선언부 <%! %>

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>

<%!String name = "랄랄라";

	//두 정수를 더하는 메서드
	public int add(int a, int b) {
		return a + b;
	}

	//절대값을 반환하는 메서드
	public int abs(int a) {
		return a > 0 ? a : -a;
	}

	int a = 10;
	int b = -20;%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<% out.print(add(a,b));%> <br>
	<% out.print(abs(a));%> <br>
	<% out.print(abs(b));%> <br> 

</body>
</html>

 

 

 

Q. 스트립트릿으로 선언한 변수와 선언부로 선언한 변수의 차이는 뭘까?

스트립트릿에서도 자바코드로 변수를 선언할 수 있는데 왜 굳이 선언부로 변수를 선언하지?

파일을 확인해보면

→ 자바파일을 살펴보면 스크립트릿으로 선언한 변수들은 jspService 라고 하는 메서드 안에 생성되어있다.

→ 자바에서는 메서드 안에 메서드 정의할 수 없다!

→메서드 안에 변수를 선언했다면 그것은 지역변수(local value)

선언부로 선언한 변수들은 jsp라고 이름이 바뀐 클래스의 멤버변수로 생성되어있다. 메서드와 무관하게 클래스 영역에 작성된 변수들. 서블릿은 한번 생성한 것을 계속해서 사용하니까 클래스변수로 생각할 수 있다. 따라서 서비스(다른 메서드)에서 불러서 사용할 수도 있다!

 

 

선언한 애들은 클래스 밑에 바로 생성되는 거고 스크립트로 생성된 애들은 서비스(메서드) 안에 생성된 지역변수이다.

그렇다면? 아래 코드를 실행한 후 계속해서 새로고침하면 값은 어떻게 나올까?

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%!
	int cnt1 = 0;
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%
		int cnt2 = 0;
	
		out.print("cnt1 : ");
		out.print(++cnt1);
		out.print("<br>");
		out.print("cnt2 : ");
		out.print(++cnt2);
		out.print("<br>");
	%>
</body>
</html>

새로고침을 반복할수록 cnt1은 계속해서 증가하지만 cnt2는 계속 1 이 나온다. 왜?

 

 

서블릿은 사라질 때까지 계속 사용할 수 있음

즉, cnt1은 계속 사용할 수 있는 변수이고, cnt2는 요청할때마다 새롭게 만들어지는 지역변수이다.

위의 예시와 서블릿의 생명주기 이해하기!

 

 

원래는 JVM에 서블릿이 없는 상황( 요청이 왔지만 서블릿이 없음) ⇒ 그러면 class를 메모리에 올린다. (ex. count.class) ⇒ 톰캣에 있는 서블릿 컨테이너가 생성자를 생성해준다 (우리가 new 해서 만들지 않음, 대신해줘) ⇒ init() 메서드 동작 해서 초기화를 하고 ⇒ 내부적으로 service 라는 메서드가 동작한다.

즉, 서블릿은 한번 만들어지면 계속해서 사용한다. 따라서 init 메서드를 통해 만들어진 cnt1 변수는 계속해서 살아있으니까 cnt가 누적해서 올라가는 것이고, 서비스메서드 안에 있는 cnt2는 메서드 종료 시 삭제되니까 요청이 들어올때마다 매번 새로운 변수로 초기화되기때문에 1 값만 나오는 것

 

 

표현식

  • 변수의 값이나 계산식 혹은 함수를 호출한 결과를 문자열 형태로 출력
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%!String name = "아아아";%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%
		out.print(name);		
	%>
	<br>
	<%=name %>

</body>
</html>

 

결과는 같다! 두개의 차이는?

<%out.print(name);%>

<%=name %>

⇒ 세미콜론이 없음

왜? <%= 안의 값은 파라미터로 그대로 들어간다! 파라미터안에 ; 있을 수 없으니까 제외

 

 

HTML 주석만 보인다!

지시자(1) → page

  • 웹 컨테이너(톰캣)가 JSP 번역하고 실행하는 방법을 서술
  • page : 해당 JSP 전반적으로 환경을 설정할 내용 지정
  • include : 현재 페이지에 다른 파일의 내용을 삽입할 때 사용
  • taglib : 태그 라이브러리에서 태그를 사용할 수 있는 기능 제공

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ page errorPage="error.jsp"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>강제로 0으로 나눠</title>
</head>
<body>
	0으로 나누는 것은 불가능!!!
	<%=2 / 0%> 
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ page isErrorPage="true" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>에러페이지</title>
</head>
<body>
	<%= exception.getMessage() %>
</body>
</html>

지시자(2) → include

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>인클루드 써보자</title>
</head>
<body>
	<%@ include file="/template/
	header.jsp" %>
	<h3>메인내용입니다</h3>
	<p>가나다라마바사</p>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<header>head 수정 혹은 메뉴가 들어갈 내용입니다.</header>

JSP 기본 객체 영역( Scope )

페이지 이동

포워드 방식

  • 요청이 들어오면 요청을 받은 JSP 또는 Servlet 이 직접 응답을 작성하지 않고, 요청을 서버 내부에서 전달하여 해당 요청을 처리하게 하는 방식( url 안바뀜)

  • request, response 객체가 전달되어 사용되기 때문에 ( 통로 유지) 객체가 사라지지 않고, 브라우저에는 최초 요청한 주소가 표시
  • 프로젝트 내부적으로만 토스 가능

리다이렉트 방식

  • 요청이 들어오면 내부 로직을 실행, 브라우저의 url 을 변경하도록 하여 새로운 요청을 생성함으로써 페이지를 이동.

  • 브라우저가 새로운 요청을 만들어내기 때문에 최초 요청 주소와 다름
  • 새롭게 요청을 날리는 거니까 다양하게 사용 가능,

⇒ 포워드 = 날 가지고가, 리다이렉트 = 새롭게 요청 보내

JSP 기본 객체 영역 메서드

서블릿과 페이지간 정보를 공유하기 위한 메서드

코드실습

import java.util.ArrayList;
import java.util.List;

import com.ssafy.dto.Person;

//사람의 목록 관리를 하는 매니저
//싱글턴으로 만들고 싶어요!!
public class PersonManager {
	//사람 목록
	private List<Person> list = new ArrayList<>();
	
	private static PersonManager manager = new PersonManager();
	
	//기본생성자막기
	private PersonManager() {
	}
	
	//외부에서 그래도 만들어진 매니저를 가져다 써야되니까~~~
	public static PersonManager getInstance() {
		return manager;
	} 
	//사람을 등록하는 기능
	public void regist(Person p) {
		list.add(p);
	}
	
	//사람의 목록을 반환하는 기능
	public List<Person> getAll(){
		return list;
	}
	
	//... 다양하게 분류를 지어 가져오도록 만들어 볼수도있음...
	
}

RequestDispatcher 인터페이스

WEB-INF 는 특별한 영역이라서 주소를 쳐서는(url로는) 접근할 수 없다. 외부에서 접근할 수 없게끔 막아져 있는 공간. 여기 안에는 요청을 통해서만 접근이 가능.

'이론학습 > Servlet&JSP' 카테고리의 다른 글

서블릿  (0) 2023.04.10
이클립스에 톰캣 등록하기  (0) 2023.04.10