[부스트코스 DB 연동 웹 어플리케이션(2)]
CHAPTER. 02 JSP(Java Server Page)
Point. 01 JSP 라이프사이클
JSP 프로젝트 생성
-
JSP는 서블릿으로 변환되어 실행된다.
-
JSP 프로젝트 생성
- JSP file 생성
- 자동으로 생성된 JSP 파일
- 스크립트릿(Scriptlet) JSP 페이지에서 자바코드를 실행할 수 있는 코드 블록
스크립트릿:
<% ..... %>
이러한 구조를 가진다.
JSP를 Servlet 코드로 변환
- 변환된 코드 경로
%userprofile%\\eclipse-workspace\\.metadata\\.plugins\\org.eclipse.wst.server.core\\tmp0\\work\\Catalina\\localhost\\firstweb\\org\\apache\\jsp
- 서블릿으로 변환된 코드
- 변환된 서블릿코드의 Init, Destroy, Service 메소드
JSP의 실행순서
-
브라우저가 웹서버에 JSP에 대한 요청 정보 전달
-
브라우저가 요청한 JSP가 최초로 요청했을 경우
JSP로 작성된 코드가 서블릿 코드로 변환 (.java 파일 생성)
서블릿 코드를 컴파일해서 실행가능한 bytecode로 변환 (.class 파일 생성)
서블릿 클래스를 로딩하고 인스턴스 생성 (모든 절차는 JSP 엔진이 처리)
- 서블릿이 실행되어 요청을 처리하고 응답 정보 생성
JSP 라이프싸이클 실습
- lifecycle.jsp 파일 작성
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
Hello
<%
System.out.print("jspService()");
%>
<%!
//선언식
public void jspInit(){
System.out.print("jspInit()!");
}
%>
<%!
//선언식
public void jspDestroy(){
System.out.print("jspDestroy()!");
}
%>
</body>
</html>
- 선언식을 이용하여 Service메서드 외에 메서드도 작성 할 수 있다. (lifecycle.java 파일)
-
System.out.print
로 메서드가 호출될 때 콘솔에 출력되어 나온다 -
다른 메서드를 호출하지 않으면 Service 메서드만 호출된다.
-
선언식을 이용하여 Init Destroy 메서드를 작성하여 각각 최초 실행, 수정 시 해당 메서드가 호출된다.
-
라이프 사이클
https://www.studytonight.com/jsp/lifecycle-of-jsp.php
Point. 02 JSP 문법
스크립트 요소
- 선언문, 스크립트릿, 표현식이라는 스크립트 요소 제공
선언문 (Declaration) -
<%! %>
전역변수 선언, 멤버변수 선언 및 메소드 선언스크립트릿 (Scriptlet) -
<% %>
프로그래밍 코드 기술표현식 (Expression) -
<%= %>
화면에 출력할 내용 기술
선언문
-
선언문 문법:
<%! %>
-
선언문 실습
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
id : <%=getId() %>
<%!
String id = "U001"; // 멤버변수 선언
public String getId(){
return id;
}
%>
</body>
</html>
스크립트릿(Scriptlet)
-
스크립트릿: <% %>
-
가장 많이 쓰이는 스크립트 요소
-
프로그래밍 로직 기술
-
선언된 변수는 지역변수
-
스크립트릿 실습
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
<%
for(int i = 1; i <=5; i++){
%>
<H<%=i %>>한글</H<%=i %>>
<%
}
%>
</body>
</html>
변환된 코드
반복문 응답 결과
표현식
-
JSP 페이지에 웹 브라우저에 출력할 부분
-
스크립트릿 내에서 출력할 부분은 내장객체 out객체의 print(), println() 메소드를 사용해서 출력
JSP 사용 주석
-
HTML, 자바, JSP
-
HTML 주석
주석 형태: <!-- -->
웹에서 서비스할 때 화면에 주석 내용이 표시되지 않는다
- JSP 주석
JSP페이지에서만 사용 <%-- --%>
웹 브라우저를 통해 출력 결과가 표시 되지만 웹브라우저 소스에서 표시 되지않고, JSP 주석 내에 실행코드는 실행되지 않는다.
- 자바주석
자바주석: //, /* */
자바가 서블릿으로 실행할 때에 실행되지 않는다.
Point. 03 JSP 내장객체
내장객체
-
JSP를 실행하면 서블릿 소스가 생성되고 실행된다.
-
JSP에 입력한 대부분 코드는 서블릿의
_jspService()
메소드 안에 삽입되는 코드로 생성 -
_jspService()
에 삽입된 코드 위쪽에 미리 선언된 객체들을 jsp에서 사용 가능하다.
내장객체 종류
- 내장객체 실습
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
<%
StringBuffer url = request.getRequestURL();
out.print("url :" + url.toString());
out.print("<br>");
%>
</body>
</html>
내장객체를 사용한 응답결과
Point. 04 redirect & forward
리다이렉트 (redirect)
-
서버가 클라이언트의 요청에 대해 특정 URL로 이동 요청을 하는 것
-
서버는 클라이언트에게 HTTP 상태코드 302로 응답하고 헤더 Location 값에 이동할 URL을 추가한다.
-
클라이언트가 서버로부터 상태코드 302를 받으면 헤더의 Location의 URL로 재요청을 보낸다.
-
서블릿이과 JSP는 HttpServletResponse 클래스의 sendRedirect() 메소드를 사용한다.
실습코드
-
웹 브라우저가 redirect01.jsp 요청
-
redirect01.jsp 는 redirect02.jsp로 리다이렉팅하는 로직 실행 후 결과 확인
<!-- redirect01.jsp -->
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<%
response.sendRedirect("redirect02.jsp");
%>
<!-- redirect02.jsp -->
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
redirect 페이지
</body>
</html>
-
상태코드 302 받으면 URL을 요청한다.
-
리다이렉트된 URL로 상태코드 200 성공 된 것을 확인 할 수 있다.
forward
-
FrontServlet 파일 생성
-
URL은 front로 매핑, service 메소드만 오버라이드
-
NextServlet 파일 생성
-
URL next로 매핑 service 메소드 오버라이딩
-
실습코드
// FrontServlet.java
int diceVal = (int)(Math.random() * 6) + 1;
request.setAttribute("dice", diceVal);
//dice는 diceVal 객체를 넘겨주기 위한 string (객체의 값을 넘겨줌)
RequestDispatcher requestDispatcher = request.getRequestDispatcher("/next");
//RequestDispatcher 객체의 변수를 얻어내고 request 객체로부터 얻어낸다 인자 값은 이동할 경로
requestDispatcher.forward(request, response);
// RequestDispatcher가 가지고 있는 forward 메서드로 request, response 객체를 넘긴다
// NextServlet.java
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head><title>form</title></head>");
out.println("<body>");
int dice = (Integer)request.getAttribute("dice");
out.println("dice : " + dice);
//setAttribute로 전달된 dice 오브젝트를 getAttribute로 받고 dice 오브젝트 값을 integer로 형 변환 한다.
for(int i = 0; i < dice; i++) {
out.print("<br>hello");
}
out.println("</body>");
out.println("</html>");
- 실행결과
Point. 05 Servlet과 JSP 연동
Servlet & JSP
-
서블릿은 자바 파일이기 때문에 프로그램 로직이 수행되기에 유리하다.
-
JSP는 브라우저에 결과를 출력하기에 서블릿보다 유리하다.
-
서블릿과에서 프로그램 로직을 수행하고 JSP에게 포워딩하는 방법을 사용한다.
실습코드
- 실습코드의 동작
-
jsp파일이 reponse 객체에 응답결과를 담아서 클라이언트에 전달한다.
-
LogicServlet.java
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
int v1 = (int)(Math.random() * 100) + 1;
int v2 = (int)(Math.random() * 100) + 1;
int result = v1 + v2;
request.setAttribute("v1", v1);
request.setAttribute("v2", v2);
request.setAttribute("result", result);
RequestDispatcher rd =request.getRequestDispatcher("/result.jsp");
rd.forward(request, response);
}
- result.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>
Java코드<br>
<%
int v1 = (int)request.getAttribute("v1");
int v2 = (int)request.getAttribute("v2");
int result = (int)request.getAttribute("result");
%>
<%=v1 %> + <%=v2 %> = <%=result %><br>
EL표기법<br>
${v1 } + ${v2 } = ${result }
</body>
</html>
-
자바코드를 줄이기 위해서 EL표기법이나 JSTL을 사용한다.
-
실행결과
Point. 06 Scope
Scope 종류
-
Application Scope: 웹 어플리케이션이 시작되고 종료될 때까지 변수가 유지되는 경우 사용한다.
-
Session: 웹 브라우저 별로 변수가 관리되는 경우 사용한다.
-
Request: HTTP request를 WAS가 받아서 웹 브라우저에게 response 할 때까지 변수가 유지되는 경우 사용한다.
-
page: 페이지 내에서 지역변수처럼 사용한다.
Page Scope
- PageContext 추상 클래스를 사용한다.
-
pageContext 내장 객체
-
JSP 페이지에서 pageContext라는 내장 객체로 사용가능
-
forward가 될 경우 Page scope에 지정된 변수 사용불가
-
사용방법은 다른 scoperemf과 동일하다.
-
지역변수처럼 사용된다.
-
JSP에서 pageScope에 값을 저장한 후 해당 값을 EL표기법 등에서 사용
-
JSP나 서블릿이 실행되는 동안에만 정보 유지
request Scope
-
http 요청을 WAS가 받아서 웹 브라우저에게 응답할 때까지 변수값을 유지하고자 할 경우 사용한다.
-
서블릿에서 HttpServletRequest 객체를 사용하고 JSP에서는 request 내장 변수 사용
-
값 저장에는 request 객체의 setAttribute() 메소드 사용
-
값을 읽어 들일 때에는 request 객체의 getAttribute() 메소드 사용
-
forward시 값을 유지하고자 사용한다.
- Request scope 예시
Session scope
-
웹 브라우저별 변수를 관리 할 경우 사용한다.
-
웹 브라우저의 탭들은 세션정보가 공유된다.
-
HttpSession 인터페이스를 구현한 객체를 사용한다.
-
JSP 에서는 session 내장 변수 사용
-
서블릿에서는 HttpServletRequest의 getSession()메소드를 이용하여 session 객체를 얻는다.
-
값 저장할 때: session.setAttribute()
-
값을 읽을 때: session.getAttribute()
-
사용자별로 정보가 유지되어야 할 때 사용한다. (ex. 장바구니)
- session 객체 선언 부분
Application Scope
1) Application scope 정리
-
웹 어플리케이션이 시작되고 종료될 때까지 변수를 사용할 수 있다.
-
원하는 값들을 저장해놓고 사용하는 것
-
ServletContext 인터페이스를 구현한 객체 사용
-
JSP에서는 application 내장 객체를 이용한다.
-
서블릿의 getServletContext() 메소드를 이용하여 application 객체 이용
-
웹 어플리케이션 하나당 하나의 application 객체가 사용된다.
-
값 저장: application 객체의 setAttribute() 메소드
-
값 읽기: application 객체의 getAttribute() 메소드
-
모든 클라이언트가 동통으로 사용해야 할 값들이 있을 때 사용한다.
2) 실습코드
- ApplicationScope01.java
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html; charset=utf-8");
PrintWriter out = response.getWriter();
ServletContext application = getServletContext();
int value = 1;
application.setAttribute("value", value);
out.print("<h1>value : " + value + "</h1>");
}
- ApplicationScope02.java
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html; charset=utf-8");
PrintWriter out = response.getWriter();
try {
ServletContext application = getServletContext();
int value = (int)application.getAttribute("value");
value++;
application.setAttribute("value", value);
out.print("<h1>" + value + "</h1>");
}catch (NullPointerException e) {
out.print("value의 값이 설정되지 않았습니다");
}
}
- ApplicationScope.jsp
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
try {
int value = (int)application.getAttribute("value");
value = value + 2;
application.setAttribute("value", value);
%>
<h1><%=value %></h1>
<%
}catch(NullPointerException ex){
%>
<h1>설정된 값이 없습니다.</h1>
<%
}
%>
</body>
</html>
3) 실행결과
- 서블릿의 value가 null이기 때문에 jsp를 실행하면 예외처리가 된다
- 서블릿을 실행하여 변수에 값을 넣는다
- 두번째 서블릿 실행
- application scope 예제 결과
- 다른 브라우저에서도 웹 어플리케이션이 종료되기 전까지 정보를 유지한다.
- 서버를 중지 후 jsp를 다시 실행하면 변수가 초기화 된 것을 확인
Point. 07 EL(Expression Language)
표현언어 기능
-
JSP 기본문법을 보완하는 역할
-
JSP 스코프(Scope)에 맞는 속성 사용
-
집합 객체(컬렉션,프레임워크에서 제공하는 객체)에 대한 접근 방법 제공
-
변수의 수치 연산, 관계 연산, 논리 연산자 제공
-
자바클래스 메소드 호출 기능
-
EL 기본 객체 제공
-
비활성화 방법: <%@ page isELIgnored = “true” %>를 JSP에 명시
EL 표현방법
-
${ }
-
기본객체 사용 예시
- EL 기본객체
EL 객체 접근
-
문법 ${expr1.expr2}
-
expr1 또는 expr2가 NULL이면 NULL을 반환
-
expr1이 Map일 경유 expr2를 key로 한 값을 반환
-
expr1이 List나 배열 일 경우 expr2에 해당하는 인덱스의 값을 반환, 정수가 아닐경우 에러
-
expr1이 객체일 경우 expr2에 해당하는 getter메소드에 해당하는 메소드를 호출한 결과 반환
EL 실습
![](https://shellcode777.github.io/assets/images/boost/image100.png
![](https://shellcode777.github.io/assets/images/boost/image101.png
![](https://shellcode777.github.io/assets/images/boost/image102.png
<%@ page isELIgnored = "true" %>
를 jsp에 작성하면 EL을 무시하게 된다
Point. 08 JSTL (JSP Standard Tag Library)
JSTL?
-
JSP페이지에서 조건문, 반복문 처리 등을 HTML태그 형태로 작성할 수 있도록 한다.
-
태그 형식으로 로직을 수행할 수 있도록 도와준다.
-
JSTL 사용을 위한 태그 라이브러리 Impl, Spec, EL 다운로드
-
프로젝트의 WEB-INF\lib에 위치 시킨다.
![](https://shellcode777.github.io/assets/images/boost/image103.png
![](https://shellcode777.github.io/assets/images/boost/image104.png
![](https://shellcode777.github.io/assets/images/boost/image105.png
JSTL 태그 종류
- 코어 (접두어 c)
변수지원, 흐름제어, URL 처리
- XML (접두어 x)
XML코어, 흐름 제어, XML 변환
- 국제화 (접두어 fmt)
지역, 메시지 형식, 숫자 및 날짜 형식
-
데이터베이스 (접두어 sql)
-
함수
콜렉션처리, String 처리
- 코어태그: 변수 지원태그 - 프로퍼티, 맵의 처리
(프로퍼티: 객체의 값을 변경하거나 값을 읽어들이기 위한 getter, setter 메서드 역할)