-
[JSP] 001. 웹 어플리케이션 / JSP + Servlet 개념 및 구조 및 관찰SsY/Class 2023. 5. 15. 18:00728x90
Web Application
웹 어플리케이션 (웹 애플리케이션)- 웹 어플리케이션의 개념 및 구조
■■■ 웹 어플리케이션 ■■■ ○ 웹 어플리케이션의 개념 웹 어플리케이션은 웹 브라우저의 요청에 대하여 처리한 결과를 보여주는 프로그램을 의미한다. 사용자가 어떤 상태로 무엇을 요청했느냐에 따라 스스로 판단하여 자동으로 각각에 대한 처리 결과를 보여주는 프로그램인 것이다. ------------------------------------------------------------------------------------------- ○ 웹 어플리케이션의 구성요소 1. 웹 브라우저 - 인터넷 익스플로러, 크롬, 파이어폭스, 오페라, 사파리, ... 2. 웹 서버 - 웹 서버란 웹 브라우저를 이용하여 World Wide Web 을 사용하는 클라이언트에게 미리 저장된 하이퍼텍스트(Hyper Text)를 제공하는 서버이다. - 대표적으로는 MS 기반의 IIS 버서와 유닉스 기반의 아파치 서버 등이 있다. 3. 애플리케이션서버 - 처리 결과 값을 웹 서버에 전달 - 클라이언트가 어떤 페이지를 요청했느냐에 따라 그 문서를 동적으로 만들어 전달 - JSP, Servlet 등으로 동적 웹 페이지 구축 4. 데이터베이스 - 데이터 저장 및 처리 ------------------------------------------------------------------------------------------- ○ 웹 어플리케이션의 구분 1. 어플리케이션 서버 방식 - 웹 어플리케이션 서버를 통해 간접적으로 웹 어플리케이션 프로그램을 실행한다. - 대용량 처리에 유리하며, CGI(Common Gateway Interface) 방식에 비해 메모리 사용량이 적다. 2. 스크립트 방식 - 코드 형태 : 컴파일 되지 않은 스크립트 코드 - 실행 방식 : 스크립트 코드를 해석한 뒤 실행 - 코드 변경 : 스크립트 코드만 수정 ------------------------------------------------------------------------------------------- ○ 웹 어플리케이션 1. Servelet(Server + Applet) - SUN 사에서 내놓은 기술로서 JAVA 라는 언어를 기반으로 하여 동적인 컨텐프를 생성하는 기술. JAVA 라는 코드 안에 HTML 태그가 혼재되엉 있어 효율성이 다소 떨어질 수 있다. → JAVA 가 HTML 을 품고 있는 형태 ( 확장자 : .java →(컴파일 시) .class ) 2. JSP(Java Server Page) - JSP 또한 JAVA 라는 언어를 기반으로 하여 만들어진 것이지만. ASP, PHP 퍼럼 동적인 컨텐츠를 생성하기 위해 스크립트 언어 형식으로 프로그램을 작성할 수 있어서 개발자에게 비교적 쉬운 개발을 할 수 있게 한다. 사용자가 직접 태그를 정의해서 사용할 수 있는 사용자 정의 태그를 지정할 수 있는 기능도 갖고 있다. → HTML 이 JAVA를 품고 있는 형태 ( 확장자 : .jsp → .html 로 브라우저에 전달 됨 )
※ 원래 순서는 Servlet → JSP 가 맞지만... 더 잘보여지는 부분부터 확인하기 위해서
JSP 를 먼저보고 가려진 뒷 부분(Servlet)을 확인해본다~
JSP(Java Server Pages)
- JSP 의 개념 및 구조
■■■ JSP(Java Server Pages) ■■■ 1. JSP(Java Server Pages) : 웹 프로그램 작성 언어의 한 종류 ------------------------------------------------------------------------------------------- 2. JSP(Java Server Pages)는 동적(Dynamic)인 웹 페이지를 비교적 간단히 만들 수 있는 방법을 제공하는 자바를 기반으로 하고 있는 스크립트 언어(Server Side Script)로 자바 엔터프라이즈 어플리케이션에서 UI(User Interface)영역을 담당하고 있다. //-- JSP 가 Servelet 뒤에 나와 대체하는 방향으로 나오긴 했으나, // 100% 대체된다기보다 보완하여 JSP 가 활용되지 못하는 부분을 Servlet 을 사용하게 됨 // 이 때, JSP가 UI 파트를 담당하게 되었다는 의미 ------------------------------------------------------------------------------------------- 3. JSP 는 자바를 서버 환경에서 사용하는 스크립트 방식의 언어로 단일 스레드로 클라이언트의 요청에 서비스한다. 요청이 있을 때 마다.. 즉, 객체가 생성될 때 마다... 프로세스를 생성하는 기존의 CGI 와는 달리 하나의 메모리를 공유하면서 서비스되는 원리를 갖고 있다. 이러한 원리는 서버측 부하를 줄여주며, JSP 내부에는 보여주는 코드만 작성하고 직접 작업하는 부분은 자바 빈으로 구성하여 둘을 분리할 수 있다. 이는 서로 영향을 주지 않으면서 수정할 수 있는 장점을 취하며, JAVA 가 갖고 있는 장점인 재사용성을 높일 수 있게 한다. 클라이언트 <-------------------------------> 서버 HTML, CSS, Javascript <--------------------> JSP(JAVA) 브라우저(IE,CR,FF...) <--------------------> 웹서버(톰캣), 오라클 요청 <------------------------------------> 응답(HTML 웹 페이지) ------------------------------------------------------------------------------------------- 4. JSP 실행 구조 1단계. 웹 클라이언트에서 웹 서버에 웹 프로그램(페이지) 요청 2단계. 웹 서버에서 웹 클라이언트가 요청한 JSP 프로그램(페이지) 로드 3단계. JSP 페이지에 대한 변환 실행 ※ 이 과정에서 일반 『.java』인 파일로 변환된다. 『→Servlet』//-변환된 파일 // 즉, JSP만으로 구성되어있는것은 없는것! -- 작업을 편하게 만들 뿐 4단계. 『.java』인 파일로 변환된 Servlet 의 컴파일(.class) 및 실행 5단계. 실행 결과로 동적 생성된 HTML Document 를 클라이언트 측에 응답 6단계. 웹 클라이언트는 응답받은 HTML Document 를 브라우저에서 웹 페이지 형태로 출력 ------------------------------------------------------------------------------------------- 5. 이클립스 JSP 개발 환경 구축 1) 프로젝트(new) 생성 시 『Dynamic Web Project』 선택 2) 프로젝트명 입력시 식별자 작성 규칙을 준수 원래 규칙에 따르면 『JspTest001.jsp』와 같이 명명해야하지만 클라이언트 측에서 (대소문자 구분 없이) 좀 더 편하게 사용할 수 있도록 일단... 지금은 jsptest001.jsp 와 같이 명명할 수 있다. // 현재까지는 해당 문서 주소를 직접 입력하여 문서를 요청하게 되나 // 곧, 해당 부분은 클라이언트가 문서의 이름을 직접 확인하지 못하게 하는 형태로 // 만들것 이기 때문에, 현재는 실습 편의상 소문자로 대체한다 // (실제로 url 주소를 보면 소문자로 구성) 3) Target Runtime 지정 → 톰캣 설치 디렉터리 연결 4) 프로젝트 생성 후에는 Server 탭에서 톰캣 서버 등록 (단, 서버를 새로 등록했을 경우 서버 관련 설정을 재구성) 5) 톰캣 서버에 프로젝트 등록 → add and remove 6) 톰캣 서버 시작(재시작) ※ 이 시점에서... 포트번호 설정 및 확인 필요 (오라클이 웹 상에서 port 8080 을 사용하기 때문에 충돌 방지) 『Project Explorer』의 『server』 디렉터리 노드를 확장하면 『server.xml』파일이 존재하며 이 파일을 열어 63~65 정도 라인의 내용을 수정한다. <Connector URIEncoding="UTF-8"...port="8090"/> ------------------ ---------- ↑ 추가 ↑수정(기본 8080) ※ xml 파일을 수정한 이후에는 반드시 서버를 재시작 해야한다. check! 7) JSP 페이지 작성(확장자 『.jsp』) → WebContent 디렉터리 하위에 작성 ※ 페이지 작성 전에 Encoding 방식을 체크 및 설정한다. (UTF-8) ※ JSP 기본 페이지의 템플릿을 HTML5 기반으로 수정하여 설정한다. (기본 HTML 4.01) 8) 톰캣 서버가 실행되고 있는 상태에서 웹 브라우저의 URL 주소 창에 다음과 같은 주소를 요청한다. (클라이언트의 입장) http://localhost:8090/WebAppxxx/jsptest001.jsp --------- 127.0.0.1 ※ 원격 접속인 경우는 localhost(127.0.0.1) 대신 목적지 서버의 IP Address 를 작성해야 한다. ------------------------------------------------------------------------------------------- ○ JSP 의 구성요소 1. 디렉티브(지시어) - 페이지에 대한 설정 정보 지정. 클래스 속성을 변경 <%@ %> ·page 페이지에 대한 기본 정보 입력 (생성하는 문서의 타입, 출력 버퍼의 크기, 에러 페이지 등) 현재 문서를 나타내는 객체 page 디렉티브는 JSP 페이지와 관련된 속성을 정의하고 이 속성들은 웹 컨테이너에 정보를 제공한다. 또한, 한 페이지에 page 디렉티브는 여러 번 등장할 수 있고 위치도 관계가 없다. 하지만 보통 페이지 상단에 기술한다. <주요속성> - language : 스크립트 코드에서 사용되는 프로그래밍 언어 지정 - contentType : 생성할 문서 타입 - import : 사용할 자바 클래스 지정 - session : 세션 사용 여부 지정 - buffer : 출력 버퍼 크기 지정 - autoFlush : 출력 버퍼가 다 채워졌을 경우 자동으로 버퍼에 있는 데이터를 비우게 만들지의 여부 지정 - info : 페이지에 대한 설명 - errPage : 실행 도중 에러 발생 시 보여줄 페이지 지정 - pageEncoding : 페이지 자페의 캐릭터 인코딩 지정 ----------------------------------------------------------------------- ·taglib 태그 라이브러리(tag library) 사용자가 만든 태그 모음(사용자가 직접 기능 설정) ----------------------------------------------------------------------- ·include 다른 문서를 포함하는 기능 여러 JSP 페이지에서 공통적으로 포함하는 내용이 있을 때 이러한 내용을 매번 반복해서 입력하지 않고 별도의 파일에 저장해두었다가 JSP 파일에 삽입하도록 하는 것 → 생산성 향상 include 디렉티브 처리 과정은 정적으로 include 지시자를 이용한 JSP 페이지가 컴파일 되는 과정에서 include 되는 JSP 페이지 소스 내용을 그대로 포함해서 컴파일한다. 즉, 복사&붙여넣기 방식으로 두 개의 파일을 하나로 구성한 후 같이 변환되고 컴파일 ㅗ딘다. ----------------------------------------------------------------------- 2. 스크립트 요소 - 스크립트 릿(Scriptlet)... 스크립 릿... 스크립틀릿... JSP 에 자바 코드를 기술 <% %> JSP 문서 내에 JAVA 코드를 기술하는 부분이기 때문에 오로지 자바코드만 올 수 있다. 스크립트 릿에 선언된 변수는 지역 변수의 성격을 가지게 되며 (서블릿 안에 있는 service() 메소드 안에서 선언된 변수이므로...) 자바에서 메소드 내에 선언된 변수라고 할 수 있다. ----------------------------------------------------------------------- - 표현식(Expression) HTML 문서 결과값에 포함시키고자 할 때 사용 <%= %> - 선언부(Declaration) 스크립트 릿이나 표현식에서 사용할 수 있는 함수 작성시 사용. <%! %> ----------------------------------------------------------------------- 스크립트 릿이나 표현식에서 사용할 수 있는 변수나 메소드를 정의하는 부분이기 때문에 선언부에서 선언된 변수는 서블릿으로 변환되는 과정에서 멤버 변수의 입장을 취하게 되며 전역 변수의 성격을 가진다. 또한, 『_jspInit()』, 『_jspDestory()』와 같은 생명주기 운영을 위해 메소드를 재정의할 수 있다.
※ )
- CGI
ex) 한글 파일을 열기 위해서 프로그램이 실행될 때,
파일 10개(혹은 10명이 동일한 파일을) 열면 프로그램이 10개가 돌아가는 방식
- JSP
ex) 동일한 상황에서 프로그램이 한 번만 돌아가게 되는 형식
JSP 관찰 실습
- WebApp04- 환경 구축
- 잘 못된 부분이 없는데 x 등 이상 표시가 있다면 해당 프로젝트 close 후 open 하면 됨
- jsptest001
- index.html
<%@ page contentType="text/html; charset=UTF-8"%> <% // 스크립트 릿(Scriptlet) 영역 -- JAVA의 영역!(js 아님) String name = "planet"; name += "은 홍길동이 아니다."; int result; result = 10 + 20; %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>jsptest001.jsp</title> </head> <body> <div> <h1>JSP 관찰하기</h1> <hr> </div> <div> <h2><%=name %></h2> <!-- servlet컨테이너 -> html --> <h2><%=result %></h2> <!-- servlet컨테이너 -> html --> </div> </body> </html>
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <div> <h1>welcome-file-list</h1> <hr> </div> <div> <h2>planet-c</h2> </div> </body> </html>
- jsptest002
- 디렉티브 영역
- 스크립 릿 영역
- 표현식 : 연산, 개행
<%@ page contentType="text/html; charset=UTF-8"%> <% // 자바 주석문 사용 // 스크립릿 영역 → JSP 에서 JAVA 코드를 기술하는(사용하는) 영역 int a=10, b=5, c; c= a + b; //-- 스크립릿 영역에서 수행된 자바 코드의 실행 결과는 // 표현식에 의해 HTML 브라우저 영역에 출력된다. %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>jsptest002.jsp</title> </head> <body> <div> <h1>JSP 관찰하기</h1> <hr> </div> <div> <!-- 표현식 // 자바안에서 구성된 a,b,c 변수는 이방인... --> <h2>합 : <%=a %> + <%=b %> = <%=c %></h2> </div> <% //스크립릿 영역 -- 이렇게 중간에 만들어 사용하는 것도 가능 //-- 스크립릿 영역 안에서의 a,b,c 변수는 내부의 것! // ※ 『out』 은 내장 객체로서 출력 스트림이다. out.print("합 : " + a + " + " + b + " = " + c); // 개행이 되는지 확인 out.println("합 : " + a + " + " + b + " = " + c); out.println("합 : " + a + " + " + b + " = " + c); out.println("\n\n\n합 : " + a + " + " + b + " = " + c); out.println("<br><br>"); out.println("합 : " + a + " + " + b + " = " + c + "<br>"); out.println("합 : " + a + " + " + b + " = " + c); out.println("<br><br>"); String str = String.format("합 : %d + %d = %d", a,b,c); out.print(str); out.print(str); out.println("<br><br>"); str = String.format("합 : %d + %d = %d\n", a,b,c); out.print(str); out.print(str); out.println("<br><br>"); str = String.format("합 : %d + %d = %d<br>", a,b,c); out.print(str); out.print(str); out.println("<br><br>"); %> </body> </html>
- jsptest003
- 선언부 영역 : 활용 빈도, 우선순위는 낮음
유일하게 함수 정의가 가능한 영역이나 함수를 정의할 일이 별로 없어서 그렇다...
- 전역변수의 위상과 지역변수의 위상 확인
<%@ page contentType="text/html; charset=UTF-8"%> <%! // ○ 선언부 영역 → 함수 정의가 가능한 영역 // 선언부에서 선언한 변수 int a=10; int sum(int x) { int s=0; for(int i=1; i<=x; i++) s += i; return s; } %> <% // ○ 스크립 릿 영역 // 스크립 릿 영역에서 선언한 변수 int b=0; a++; b++; %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>jsptest003.jsp</title> </head> <body> <div> <h1>JSP 관찰하기</h1> <hr> </div> <div> <h2>변수의 값 확인</h2> <h3>a : <%=a %></h3> <h3>b : <%=b %></h3> </div> <div> <h2>함수의 기능 확인</h2> <h3><%=sum(100) %></h3> </div> <!-- ※ 요청한 페이지(jsptest003.jsp)의 결과를 확인한 후 새로고침을 반복해보면... a 변수(선언부 영역에 선언한 변수) 값만 계속 증가하는 것을 확인할 수 있다. a 변수 값만 계속 증가하는 이유를 확인하기 위해서는 서블릿(Servlet) 코드를 분석해 보아야 한다. - 경로 : C:\WebStudy\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\WebApp04\org\apache\jsp) ----------- -------- workspace project - 파일 : jsptest003_jsp.java ---------- ----- jsp 파일명 서블릿(Servlet)의 확장자(→컴파일 이전) => jsptest003_jsp.class (→컴파일) ==> 변수 a 는 클래스(jsptest003_jsp)의 전역변수로 선언된 것을 확인할 수 있다. 이는 객체가 소멸되기 전까지는 계속 이 값이 유지된다는 것을 의미한다. 변수 b 는 메소드(jsptest003_jsp 클래스의 _jspService())내의 지역변수로 선언된 것을 확인할 수 있다. 이는 해당 메소드가 호출 될 때 마다 값이 갱신된다는 것을 의미한다. 『_jspInit()』 메소드와 『_jspDestroy()』 메소드는 서비스가 시작될 때와 끝날 때 한 번씩만 실행되는 메소드이다. 반면... 『_jspService()』 메소드는 브라우저에 의해 페이지가 요청될 때 마다 매번 실행되는 메소드이다. 이로 인해 변수 b는 페이지에 대한 요청이 발생할 때 마다 새롭게 초기화 되는 과정을 거치게 되는 것이다. JSP 페이지의 스크립 릿 영역에서 선언된 모든 변수는 이 『_jspService()』 메소드의 지역변수가 된다. 또한, JSP 페이지의 선언부 영역에서 선언된 모든 변수는 클래스의 전역변수(인스턴스 변수)가 된다. JSP 페이지의 메소드 정의 시 스크립 릿 영역 내부에서는 정의할 수 없다. 서블릿으로 변환되는 과정에서 메소드 내부에 또 다른 메소드가 정의되는 상황이 되어버리기 때문에 문법적으로 잘못된 표현이 되는 것이다. 선언부는... 비록 사용 빈도는 낮지만 메소드는 선언부 내부에서만 정의할 수 있는 것이다. --> </body> </html>
- Test004
- Servlet 구성하는 법 3가지
- 가장 많이 사용하는 방법은 HttpServlet 이나 비교를 위해서 다른 방법 먼저 보고 넘어감
- GenericServelet 을 상속받는 방법 관찰
- req = request , resp = response
/* ================ Test004.java - Servlet 실습 ================== */ // 현재 자바의 기본 클래스 Test004 // 이를 서블릿(Servlet)으로 구성하는 방법 // GenericServlet 을 상속받는 클래스로 설계 → Servlet package com.svt; import java.io.IOException; import java.io.PrintWriter; //import javax.servlet.Servlet; import javax.servlet.GenericServlet; //import javax.servlet.http.HttpServlet; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; //public class Test004 implements Servlet public class Test004 extends GenericServlet //public class Test004 extends HttpServlet { // 직렬화 ID private static final long serialVersionUID = 1L; //GenericServlet 의 추상메소드 재정의 //-- 요청 받으면 응답을 해야하는 구조이나 현재까지는 요청을 어떻게 받아올 지 모르는 상황 // 이를 위해서 web.xml 을 만든 것 @Override public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException { // 요청에 대한 응답 방법 //-- html 로 응답하겠다(jsp 디렉티브영역) response.setContentType("text/html; charset=UTF-8"); try { //출력 스트림 구성 //-- 브라우저에 내용 전달 PrintWriter out = response.getWriter(); //-- PrintWriter 타입 객체 반환 out.print("<html>"); out.print("<head>"); out.print("<title>"); out.print("Test004.java"); out.print("</title>"); out.print("</head>"); out.print("<body>"); out.print("<div>"); out.print("<h1>"); out.print("서블릿 관련 실습"); out.print("</h1>"); out.print("</div>"); out.print("<div>"); out.print("<h2>"); out.print("GenericServlet 클래스를 이용한 서블릿테스트"); out.print("</h2>"); out.print("</div>"); out.print("</body>"); out.print("</html>"); } catch (Exception e) { System.out.println(e.toString()); } } }
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> <display-name>WebApp04</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <!-- web-app 가 끝나기 전 여기서 작업합니다 --> <!-- servlet과 servlet-mapping 은 세트! --> <servlet> <servlet-name>chk</servlet-name> <!-- 3.짝 찾기 --> <servlet-class>com.svt.Test004</servlet-class> <!-- 4.파일 건네주기 --> </servlet> <servlet-mapping> <servlet-name>chk</servlet-name> <!-- 2.servlet-name 찾기 --> <url-pattern>/test004</url-pattern> <!-- 1.사용자 request --> </servlet-mapping> <!-- 5. 과정이 끝나면 서버 재시작 --> <!-- 해당 과정에서 간단한 오류가 발생하면 서버 재시작이 안된다. 이 때, 경로나 이름이 잘 설정 되었는가 확인. --> </web-app>
728x90'SsY > Class' 카테고리의 다른 글
[JSP] 003. JSP / Servlet 관찰(2) (0) 2023.05.18 [JSP] 002. JSP / Servlet 관찰 (1) 2023.05.16 [JavaScript] 006. 자바스크립트 활용 실습(5) (0) 2023.05.15 [JavaScript] 005. 자바스크립트 활용 실습(4) (0) 2023.05.12 [JavaScript] 004. 자바스크립트 활용 실습(3) (0) 2023.05.11