티스토리 뷰
1. JSP의 특징
- JSP는 Servlet과 마찬가지로 웹 컴포넌트이다.
- 1 ) jsp는 태그(tag) 기반의 웹 컴포넌트로써 jsp확장자를 가진다.
- 2 ) 클라이언트의 요청에 의해서 동적으로 실행되며, 다양한 요구사항을 처리 가능하다.
- 3 ) 클라이언트는 브라우저를 이용한 URL을 지정하여 JSP에 요청이 가능하며, 요청방법은 HTML 파일 요청방식과 동일하다.
- 4 ) JSP의 응답결과는 HTML형식으로 서비스된다.
- 5 ) JSP는 자동으로 서블릿으로 변환되어 실행된다.
- 6 ) JSP는 MVC 패턴의 View 역할로 사용된다. (****)
2. 서블릿과 JSP 비교
- 1 ) Servlet ( 서블릿 )
- : Java 코드 내에 HTML 코드가 삽입되는 형태로 구성되어 있다.
- : HTML을 작성하는 Java코드작업이 복잡한 편이다.
- : 자바코드를 이용한 비즈니스 로직처리에 적합하며, MVC 패턴의 Controller의 역할로 사용된다.
- 2 ) JSP
- : HTML 코드 내에 Java코드가 삽입되는 형태이다.
- : 서블릿에 비해서 HTML 코드를 쉽게 작성할 수 있다.
- : 태그를 이용한 Presentation Logic 처리에 적합하며, MVC 패턴의 View 역할로 사용된다.
3. JSP의 기본 태그 요소
- JSP는 대부분이 HTML과 같이 태그로 구성되어 있으며, 태그 안에 자바코드를 삽입하여 구현한다.
- JSP에서 사용이 가능한 기본 태그 요소로는 1. HTML요소 2. JSP 스크립팅 요소 3. JSP 표준 액션태그 요소 4. EL 요소 5. 커스텀 태그 라이브러리 요소가 있다.
4. JSP 지시자 ( <%@ %> )
- JSP Container에 각종 처리를 지시하는 설정을 수행한다.
- 즉, 용어 그대로 JSP 페이지를 실행할 JSP 엔진에게 해당 페이지를 어떻게 처리할 것인 것에 대한 설정 정보를 지시하는 용도로 사용된다는 의미이다.
- 1 ) @page : 현재의 JSP 처리에 관련된 각종 설정을 한다.
- 2 ) @include : 정적인(static) 삽입 ( 다른 JSP나 HTML문서를 소스 그대로 포함 )
- 3 ) @taglib : Tag Library의 줄인 말로 별도의 라이브러리인 JSTL을 사용한다.
5. JSP Scripting 요소
- 비즈니스 데이터( Model )을 현재 JSP 문서의 원하는 위치에 반영( 삽입, 표현, 출력 )하는 역할
- JSP 지시자( directive )를 제외한 나머지 모든 JSP 문서의 내용은 변환된 서블릿 클래스의 jspService( ) 메소드의 블록 내부에서 실행될 문장들을 만드는 것이다.
- 1 ) Declaration Tag ( 선언 태그 ) [ <%! %> ]
- : 메소드나 필드를 선언한다.
- 2 ) Scriptlet Tag ( 스크립트릿 태그 ) [ <% %> ] ( 가장 중요 **** )
- : 조각(let) 실행문장을 생성하는 기능을 수행
- : JSP 파일 내의 어디에서나 중복해서 태그 사용가능
- : 즉, 원하는 실행문장들을 몇 개든 생성 및 수행하고, 그 결과를 활용할 수 있다.
- : "_jspService( ) 메소드 블록 내에서 실행될 실행문장"을 만드는 기능을 한다.
- 3 ) Expression Tag ( 표현식 태그 ) [ <%= %> ] ( 중요 **** )
- : 하나의 값을 원하는 위치에 출력( 표현 )해주는 기능을 한다.
[ 1. 파일 다운로드하기 - GET방식으로 파일명을 지정해줘야 한다. ] (****)
package org.zerock.myapp;
import java.io.FileInputStream;
import java.io.IOException;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import lombok.Cleanup;
import lombok.NoArgsConstructor;
import lombok.extern.log4j.Log4j2;
@Log4j2
@NoArgsConstructor
@WebServlet("/FileDownload")
public class FileDownServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
log.trace("service(req, res) invoked.");
req.setCharacterEncoding("UTF-8");
// ============================================
// 1. 사용자로부터 다운로드 받을 전송파라미터로 획득
String fileName = req.getParameter("fileName"); // 다운로드 요청 파일명
log.info("\t + fileName : {}", fileName);
// ============================================
// 2. 실제 파일 다운로드 처리를 수행
// (1) 다운로드 파일의 절대경로를 생성
final String uploadPath = "C:/temp/upload/";
final String downloadPath = uploadPath + fileName;
log.info("\t + downloadPath : {}", downloadPath);
// ============================================
// (2) 다운받을 파일의 MIME type 획득
ServletContext sc = this.getServletContext();
String mimeType = sc.getMimeType(downloadPath);
if( mimeType == null ) { // well - known extension이 아닐때를 대비
mimeType = "application/octet-stream";
} // if
log.info("\t + mimeType : {}", mimeType);
// ============================================
// (3) (2)에서 얻어낸 다운로드 파일의 MIME type을 응답문서의 컨텐츠 유형 지정
res.setContentType(mimeType);
// ============================================
// (4) 사용자가 지정한 다운로드 파일명에 다국어 문자 또는 whitespace 등이 포함되어 있는 경우
// 다운로드 시에도 파일명이 깨지지 않고 정상적으로 출력되도록 인코딩 처리를 해줘야 한다.
// 가장 마지막에 수행 (***)
// Encoding ( 부호화, 예 : 전문 -> 모르스부호로 변환 )
// 파일명 -> ASCII 문자만 포함된 형태로 변환하지 않으면 다국어가 깨져버리기에 필요
// ASCII 문자집합의 공식 명칭인 ISO-8859-1을 지정
// 파일명을 바이트배열로 쪼개야 하기에 fileName.getBytes("utf8")로 작성
String encodedFileName = new String(fileName.getBytes("utf8"), "ISO-8859-1");
// ============================================
// (5) 응답문서의 헤더에 특수한 헤더를 추가해줘야 한다. ( 필수 ) (****)
// 일반적인 HTTP 응답에서 Content-Disposition 헤더는
// 가. 컨텐츠가 브라우저에 inline 되어야 하는 웹페이지 자체이거나 웹페이지의 일부인지,
// 나. 아니면 attachment로써 다운로드 되거나 로컬에 저장될 용도록 쓰이는 것인지를 알려주는 헤더이다.
res.setHeader("Content-Disposition", "attachment; filename=" + encodedFileName);
// ============================================
// (6) 다운로드 경로의 파일의 데이터를 읽어서, 응답메세지의 Body(Payload)에 넣어주자!
// Java IO API 사용이 필요하다.
@Cleanup
FileInputStream fis = new FileInputStream(downloadPath);
// 바가지 생성
byte[] buf = new byte[100];
// 응답 메세지의 Body에 출력할 바이트 기반의 출력 스트림
@Cleanup
ServletOutputStream sos = res.getOutputStream();
// 읽어낸 바이트의 수를 반환
int readBytes = fis.read(buf);
while ( ( readBytes = fis.read(buf) ) != -1 ) { // EOF : 끝까지
// 읽어낸만큼 출력
sos.write(buf, 0, readBytes);
} // while
sos.flush();
// ============================================
} // service
} // end class
[ 2. 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>Hello</title>
</head>
<body>
<h1>hello.jsp</h1>
<hr>
<h2>Hello World!!!</h2>
</body>
</html>
[ 3. JSP 지시어 - 화면내에서 화면 넣기 --- > <%@ include %> ] (**)
[ 3 - 1. 화면내의 화면 ]
<%@ 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>copyright</title>
</head>
<body>
Copyright (c) ...... All rights reserved.
</body>
</html>
[ + 화면 내의 화면 축약 버전 ]
<p>Copyright (c) ...... All rights reserved.</p>
<!-- 안의 페이지는 위의 p태그만 남겨두고, 나머지 태그는 삭제해도 괜찮다. -->
<!-- 지금은 정적인 포함이다. -->
[ 3 - 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>main</title>
</head>
<body>
<h1>include 지시어 태그</h1>
<p>내용을 수정 중입니다. 다음 줄에 삽입이 됩니다.</p>
<%@ include file="copyright.jsp" %>
<!-- 태그에 익숙해져야 한다. -->
<!-- 지금은 정적인 포함이다. -->
</body>
</html>
[ 4. JSP 선언 태그 ( declare )를 통해 필드와 메소드 선언 --> <%! %> ] (***)
<%@ 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>declare.jsp - 선언하다.</title>
</head>
<body>
<h1>Declare 태그를 이용한 JSP LifeCycle 메소드</h1>
<%!
// 변환된 클래스 소스 파일에 필드 선언
String initMesg = "jspInit 메소드";
String delMesg = "jspDestroy 메소드"; // 변환될 클래스 소스파일에 메소드 선언
// 변환된 클래스 소스 파일에 메소드 선언
// JSP LifeCycle( 서블릿과 유사하게 ) 메소드
public void jspInit(){ // when NEW state call back : 시작할때
System.out.println(">>>>> " + initMesg + "<<<<<");
} // jspInit
public void jspDestroy(){ // when Destroy state call back : 파괴되기 전에
System.out.println(">>>>> " + delMesg + "<<<<<");
} // jspDestroy()
%>
</body>
</html>
[ 5. JSP 스크립트 태그 ( Scriptlet ) --> <% %> + 표현식 태그 ( Expression == 연산식 ) --> <%= %> : 동적인 문서를 생성할 때 사용한다. ] (*****)
<!-- 모든 종류의 지시자는 중복선언이 가능하지만 -->
<!-- 각 지시자의 속성은 중복선언되어서는 안된다!! -->
<%@ page
language="java"
contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page
import="java.util.Date"
import="java.util.Calendar"
import="java.util.List" %>
<!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>currentTime.jsp</title>
</head>
<body>
<h1>현재 날짜 출력 실습</h1>
<%
// script Tag : 자바 실행문장(조각)들을 실행
Date now = new Date();
System.out.println("- now : " + now);
int age = 23;
%>
<!-- Expression Tag : 표현식 == 연산식 -->
<h2>Now : <%= now %></h2>
<h2>1. 이름 : <%= "Yoseph" %></h2>
<h2>2. 산술연산식의 결과 : <%= 10+100 %></h2>
<h2>3. 나이 : <%= age %></h2>
</body>
</html>
[ 6. JSP 스크립트 태그 + 표현식 태그 ( Expression == 연산식 ) 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>Expression tag.jsp</title>
</head>
<body>
<!-- Scriptlet Tag -->
<%
String name = "Yoseph";
int age = 23;
%>
<!-- Expression Tag -->
<!-- < %= 변수명 / 리터럴 / 상수 / 연산식 / 리턴값이 있는 메소드 호출 %> -->
<h1>1. name : <%= name %></h1>
<h1>2. age : <%= age %></h1>
</body>
</html>
'KH 정보교육원 [ Java ]' 카테고리의 다른 글
KH 98일차 - JSP ( 액션 태그 ) ( ***** ) (0) | 2022.07.18 |
---|---|
KH 97일차 - JSP ( 내장 객체 ) ( ****** ) (0) | 2022.07.15 |
KH 95일차 - Servlet ( 쿠키 / 파일 업로드 및 다운로드 ) (****) (0) | 2022.07.13 |
KH 94일차 - 세션 (**) (0) | 2022.07.12 |
KH 93일차 - MVC 패턴 (*****) (0) | 2022.07.11 |