티스토리 뷰

1.    JSP의 특징 

-      JSPServlet과 마찬가지로 웹 컴포넌트이다.

-      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) 삽입 ( 다른 JSPHTML문서를 소스 그대로 포함 )

-      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>
728x90
댓글
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
최근에 올라온 글
Total
Today
Yesterday
공지사항