kh day 084
오늘부터 본격적으로 JSP를 배우기 시작했다. 새로운 개념을 배우는건 항상 정신 없지만 공부하는 맛이 난다 ㅎㅎ 아마 이틀내로 JSP가 끝나게 될 거 같은데 짧은 기간동안 집중도를 높여야겠다!
---
JSP 파일은 webapp 폴더 밑에 위치해야한다.


<%@ page
language="java"
contentType="text/html; charset=utf8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Hello</title>
</head>
<body>
<h1>/hello.jsp</h1>
<hr>
<h2>안녕하시렵니까? 반갑구먼 반가워요.</h2>
<!-- html 주석 -->
<%-- JSP주석 --%>
</body>
</html>
hello.jsp
---
* JSP == Servlet
모든 JSP가 Servlet 자바소스로 변환될 때는, 아래의 패키지로 고정됨
org.apache.jsp.<JSP파일명_jsp.java>
* Servlet Lifecycle methods :
init -> service -> destroy
JSP 동작 3단계
JSP파일은 다음과 같이 3단계를 거쳐서 실행된다.
1) 변환 단계
요청된 JSP파일은 파일명_jsp.java 파일명을 가진 서블릿으로 변환 되어진다. 앞에서 배웠던 서블릿과 100% 일치되는 형태는 아니지만 내부적으로 서블릿으로 동작된다.
2) 컴파일 단계
변환된 서블릿을 컴파일하는 단계이다. JSP파일에 문법적으로 에러가 있으면 컴파일 에러가 발생되어 변환되지 않으며 파일명_jsp.class 형식을 갖는다.
3) 실행 단계
컴파일된 파일을 실행 시키는 단계이다. 실행된 결과는 HTML형식으로 응답 되어진다. 웹 브라우저에 예외를 출력하는 화면이 나오면 실행시 예외(runtime exception)가 발생된 것이다. 따라서 JSP코드를 디버깅해야 된다.
변환된 서블릿은 tomcat의 work디렉토리의 하위 디렉토리에 기본으로 저장된다


---
* JSP 아키텍쳐

*서블릿과 JSP 비교

---
**JSP 기본요소
JSP는 대부분이 HTML과 같은 태그(tag)로 구성되어 있으며 태그(tag)안에 자바코드를 삽입하여 구현한다. 따라서 JSP를 학습하는 것은 어떤 tag 종류가 있으며 tag안에 자바코드를 어떻게 지정하는지를 배우는 것이다
다음은 JSP에서 사용 가능한 기본 태그 요소이다.
1) HTML 요소
2) JSP 스크립팅 요소
3) JSP 표준 액션태그 요소
4) EL 요소
5) 커스텀 태그 라이브러리 요소
---
JSP 스크립팅 요소
JSP 스크립팅 요소는 JSP 페이지가 서블릿으로 변환시 JSP 엔진에 의해서 처리되며
<% %> 형식을 갖는다. 다음과 같이 5가지 요소로 구성된다

---
1. 주석 태그 ( Comment tag )
JSP에서 사용 가능한 주석문은 다음과 같이 3가지 제공된다.
HTML 주석
<!-- HTML 태그 주석 -->
기본적으로 HTML 및 XML 문서에서 사용되며 웹 브라우저 출력에 영향을 미치지 않는다. 하지만 클라이언트에 주석까지 전송되기 때문에 ‘소스보기’를 했을 때 확인이 가능하다.
JSP 페이지 주석
<%-- JSP 태그 주석 --%>
JSP 페이지가 서블릿으로 변환될 때 무시된다. 따라서 클라이언트에 전송되지 않기 때문에 ‘소스보기’를 했을 때 확인이 불가능하다. JSP 소스 파일을 통해서만 확인이 가능하다.


자바코드 주석
<%
/*
여러 줄 주석
*/
// 한 줄 주석
%>
일반 자바코드 주석으로서, JSP 태그중에서 Declaration tag 와 Scriptlet tag 내의 자바코드를 주석 처리시 사용 가능하다.
---
2. JSP 지시어 ( Directive tag )
JSP 지시어는 용어 그대로 JSP 페이지를 실행할 JSP 엔진에게 해당 페이지를 어떻게 처리할 것인지에 대한 설정 정보를 지시하는 용도로 사용한다. 다음과 같은 3가지 지시어가 제공된다. -> page, include, taglib 지시어
page 지시어
JSP페이지에서 설정 가능한 속성을 지시하는 용도로 문법은 다음과 같다.
<%@ page 속성명=“속성값” 속성명2=“속성값2” %>
하나의 page 지시어를 사용하여 여러 개의 속성을 동시에 지정할 수도 있고 여러 개의 page 지시어를 사용하여 개별적으로 속성을 지정할 수도 있다. 하지만 import 속성을 제외한 나머지 속성들은 중복 지정이 불가능하다
지정 가능한 속성은 다음과 같다.

include 지시어
현재 페이지에서 다른 HTML 및 JSP 페이지를 삽입할 수 있는 방법이다. 일반적인 웹 사이트의 구조를 살펴보면 매 페이지마다 공통적인 화면이 존재한다. 따라서 공통적인 화면을 매번 작성하지 않고 한번 생성한 후에 재삽입해서 사용할 수 있다. 일반적으로 웹 페이지의 footer영역 및 header영역, side영역등으로 모든 페이지가 공통된 화면을 갖는 구조에 적합하다. 정적(static)인 방법으로 삽입되며 문법은 다음과 같다.
<%@ include file="포함할 페이지“ %>
include 지시어의 동작 메커니즘은 다음과 같다. 정적(static)삽입이기 때문에 header.jsp 페이지가 실행된 결과가 아닌, 소스코드 내용 전체를 포함시켜 동작하게 된다. 따라서 main.jsp 페이지만 서블릿으로 변환된다

<p>Copyright (c) ..... All rights reserved.</p>
copyright.jsp
<%@ page language="java"contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>main</title>
</head>
<body>
<h1>/JSP/main.jsp</h1>
<hr>
<h1>Lorem ipsum dolor sit amet.</h1>
<p>Lorem, ipsum dolor sit amet consectetur adipisicing elit.</p>
<h2>1. Static injection</h2>
<%@ include file="copyright.jsp" %>
<hr>
<h2>2. Dynamic injection</h2>
<jsp:include page="copyright.jsp"/>
</body>
</html>
main.jsp

JSP에서 include는 2가지 종류가 있다.
1) 정적인 삽입 (static injection)
: 지정된 파일의 내용(소스코드)을 그대로 directive tag 위치에 넣어라
<%@ include file="포함할 페이지“ %>
2) 동적인 삽입 (dynamic injection)
: 지정된 파일이 만일 JSP라면, 이 jsp 파일의 수행결과(html)를 포함시켜라.
<jsp:include page="포함할 페이지“ />
taglib 지시어
aglib 지시어는 JSP에서 외부 라이브러리로 만든 태그(tag)를 지정할 때 사용하는 방법이다. 대표적으 JSTL(JSP Standard Tag Library)이 제공된다. 기본적인 문법은 다음과 같으며 외부 라이브러리의 설정 정보를 가진 uri속성과 태그의 네임스페이스를 가진 prefix 속성을 갖는다. 이 지시어는 나중에 배움.
<%@ taglib uri="TLD파일 URI" prefix="네임스페이스명" %>
---
3. JSP 선언 태그 ( Declaration tag )
JSP 선언 태그는 JSP페이지에서 자바의 멤버변수(인스턴스 변수)와 메소드를 선언할 때 사용 가능하다. 서블릿으로 변환될 때 멤버변수와 메소드 형태로 변환시키기 때문에 JSP페이지의 어느 위치에서도 참조가 가능하다.

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>declare.jsp</title>
</head>
<body>
<h1>JSP/declare.jsp</h1>
<hr>
<h2>선언태그를 이용한 JSP Lifecycle 메소드</h2>
</body>
</html>
<%!
// 1. 변환될 클래스 소스파일에 필드 선언
private String initMesg="jspInit 메소드" ;
private String delMesg="jspDestroy 메소드" ;
// 2. 변활될 클래스 소스 파일에 메소드 선언
// JSP Lifecycle (서블릿과 비슷하게) 메소드
public void jspInit() { // when NEW state, called back.
System.out.println(">>>>> " + initMesg + " <<<<<");
} // jspInit
public void jspDestroy() { // when DESTROY state, called back.
System.out.println(">>>>> " + delMesg + " <<<<<");
} // jspDestroy
%>
declare.jsp
---
4. 스크립트릿 태그 ( Scriptlet tag )
JSP내에서 가장 중요한 태그이다. 서블릿의 doGet 또는 doPost 메소드에서 처리했던 작업을 JSP페이지에서 사용 가능하게 지원하는 방법이며 변환될 때 _jspService 메소드내에 설정된다. 대표적으로 입력 파라미터 얻기, 요청 포워드, 데이터베이스 연동등과 같은 핵심 기능 처리를 담당한다.

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!-- JSP 코드 내에서 사용하는 자바타입이 있는 경우에는 아래와 같이 import 속성으로 자바타입을 기재한다. -->
<%@page
import="java.util.Date"
import="java.util.Calendar"
import="java.util.List"
%>
<% // Scriptlet Tag : 자바 실행문장(조각)들을 실행
Date now = new Date();
System.out.println("- now: " + now);
int age = 23;
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>currentTime.jsp</title>
</head>
<body>
<h1>현재 날짜 출력 실습</h1>
<h2>Now: <%= now %></h2>
<h2>1. 이름 : <%= "Yoseph" %></h2>
<h2>2. 산술연산식의 결과 : <%= 10+100 %> </h2>
<h2>3. 강사의 나이: <%= age %></h2>
</body>
</html>
currentTime.jsp
---
5. 표현식 태그 ( Expression tag )
표현식 태그는 선언태그(Declaration tag) 및 스크립트릿 태그(Scriptlet tag)에서 선언된 변수 및 메소드에서 리턴된 값을 웹 브라우저에 출력하는 방법이다

currentTime.jsp 다시 보세요
---
내장 객체 ( implicit object, 내장 변수 )
내장 객체는 JSP페이지가 서블릿으로 변환될 때 자동으로 추가되는 객체를 의미한다. 항상 고정된 값으로 제공되기 때문에 JSP페이지에서 선언 없이 사용 가능하고 지정된 변수값으로만 사용해야 된다. 내장 객체는 _jspService 메소드내에서 선언된 변수이기 때문에 Scriptet 태그 및 Expression 태그에서만 사용 가능하다.
다음은 변환된 서블릿 파일의 내용이다.
JSP파일이 변환된 모든 서블릿에는 항상 내장 객체가 제공된다

다음은 내장 객체에 대한 간략한 설명이다.

---
1. request 내장 객체
클라이언트에서 서버로 요청할 때 생성되는 HttpServletRequest 객체를 참조하는 변수이다. 따라서 서블릿 과정에서 학습했던 입력 파라미터 처리, 한글 인코딩, 요청 포워드, request scope기반의 속성(attribute)설정, 쿠키 정보 얻기등을 JSP에서도 구현할 수 있다.
2. response 내장 객체
서버에서 실행된 결과를 클라이언트에게 응답 처리할 때 사용되는 HttpServletResponse 객체를 참조하는 변수이다. 따라서 서블릿 과정에서 학습했던 쿠키정보 저장, 요청 redirect 처리 방법등을 JSP에서도 구현할 수 있다.
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>로그인 창</title>
</head>
<body>
<h1>/loginForm.html</h1>
<hr>
<form action="JSP/login.jsp" method="post">
<fieldset>
<legend>로그인 폼</legend>
<ul>
<li>
<label for="userid">아이디</label>
<input type="text" name="userid">
</li>
<li>
<label for="passwd">비밀번호</label>
<input type="password" name="passwd">
</li>
<li>
<input type="submit" value="전송">
</li>
</ul>
</fieldset>
</form>
</body>
</html>
loginForm.html
<%@ page language="java"
contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
// Step1. 전송파라미터 획득
request.setCharacterEncoding("utf8"); // 내장객체 request 사용
String userid = request.getParameter("userid");
String passwd = request.getParameter("passwd");
// step2. 로그인 처리
// 무조건 성공이라고 가정(아이디와 암호가 정상 수신된 경우에만)
if( (userid != null && !"".equals(userid)) &&
(passwd != null && !"".equals(passwd)) ) { // if normal
;;
} else { // if abnormal
response.sendRedirect("/loginForm.html");
System.out.println(">>>>>>>>>> Re-directed <<<<<<<<<<");
return; // _jspService() 메소드 블록을 즉시 종료 (깨고 나옴)
} // if-else
// step3. 로그인에 성공했다면, 다음으로 과연 무엇을 해야하는가?
// 현재 로그인 한 웹브라우저와 생명주기가 동일한, Session Scope에
// 로그인 아이디/암호 2개 정보를 올려 놓기로(공유속성으로 만듦)함.
session.setAttribute("userid", userid); // session 내장객체 사용
session.setAttribute("passwd", passwd); // session 내장객체 사용
%>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>login</title>
</head>
<body>
<h1>/JSP/login.jsp</h1>
<hr>
<ul>
<li>1. 안녕하세요, <%= userid %>님</li>
<li>2. <a href="/JSP/loginInfo.jsp">로그인 정보 보기</a></li>
</ul>
</body>
</html>
login.jsp
<%@ page language="java"
contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>loginInfo.jsp</title>
</head>
<body>
<h1>/JSP/loginInfo.jsp</h1>
<hr>
<%
// 현재의 웹브라우저가 로그인에 성공한 브라우저인지 아닌지 판단하고
// 로그인에 성공한 웹브라우저라면, "로그아웃"이라는 링크를 생성
// step1. Session Scope에서 성공로그인정보 (userid, passwd)획득
// 만일 없다면 리다이렉션을 이용해 로그인 창으로 밀어냄 (로그인 안 된 웹브라우저기 때문)
String userid = (String) session.getAttribute("userid");
String passwd = (String) session.getAttribute("passwd");
if( userid != null && passwd != null ) { // 로그인 성공정보가 유효하다면
// 밑은 자바언어가 아니라 html이기 때문에 여기서 자름
%>
<h2><a href="/JSP/logout.jsp">로그아웃</a></h2>
<%
} else { // 성공 로그인 정보가 없다면 (즉, 아직 로그인되지 못한 웹브라우저라면)
response.sendRedirect("/loginForm.html");
System.out.println(">>>>>>>>>> Re-directed <<<<<<<<<<");
return; // _jspService() 메소드 블록을 즉시 종료 (깨고 나옴)
} // if-else
%>
</body>
</html>
loginInfo.jsp
<%@ page language="java"
contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
// step1. 해당 브라우저에 할당된 Session Scope 파괴
session.invalidate();
// step2. 로그아웃처리 후에, 웹브라우저는 어느 화면으로 이동할까?
response.sendRedirect("/loginForm.html"); // Re-direct
// RequestDispatcher dispatcher = request.getRequestDispatcher("/loginForm.html");
// dispatcher.forward(request, response); // Request Forwarding
%>
logout.jsp
---
3. out 내장 객체
서블릿에서 응답 처리시 사용했던 PrintWriter 객체와 동일한 기능의 JspWriter 객체를 참조하는 변수이다. 웹 브라우저로 데이터를 출력할 때 사용된다. 따라서 JSP에서 웹 브라우저로 데이터를 출력하는 방식이 기본적으로 2가지 방법이 제공된다

<%@ page language="java"
contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>out 내장객체</title>
</head>
<body>
<h1>out.jsp</h1>
<hr>
<%
String name = "홍길동";
out.println( String.format("<p>이것은 out 내장객체로 출력 : %s</p>", name) );
%>
<p>이것은 expression tag로 출력 : <%= name %></p>
</body>
</html>
out.jsp
---
4. config 내장 객체
서블릿 과정에서 학습했던 ServletConfig 객체를 참조하는 변수이다. 따라서 web.xml 파일에 설정된 초기화 파라미터값을 사용할 수 있다.
web.xml에 초기화 파라미터 값을 설정하자

'국비학원' 카테고리의 다른 글
| [국비지원] KH 정보교육원 86일차 (0) | 2022.07.29 |
|---|---|
| [국비지원] KH 정보교육원 85일차 (0) | 2022.07.28 |
| [국비지원] KH 정보교육원 82-83일차 (0) | 2022.07.26 |
| [국비지원] KH 정보교육원 81일차 (0) | 2022.07.22 |
| [국비지원] KH 정보교육원 80일차 (0) | 2022.07.21 |