패키지

JSP실행구조, 스크립트 요소 본문

Server-Side/JSP

JSP실행구조, 스크립트 요소

업단업업 2015. 8. 14. 12:13

JSP 

1. JavaServer Pages : 웹프로그램 작성 언어의 한 종류. Servlet 언어와 유사한 기능.


2. 프로그램 환경

1) 콘솔기반

- Java SE

- 로컬 실행 환경. 외부와의 연결은 네트워크 기능 별도 추가.


2) 윈도우기반

- AWT, Swing 

- 로컬 실행 환경. 외부와의 연결은 네트워크 기능 별도 추가.


3) 웹기반

- 네트워크 실행 환경. 브라우저에서 연결 주소를 이용해서 원격 실행.

- 클라이언트(브라우저) : HTML, CSS, Javascript

- 서버(톰캣, ...) : JSP, ASP, PHP, Servlet(Java), ASP.NET(C#)


4) 모바일기반

- 안드로이드 운영체제 : Java, XML

- 웹앱



3. JSP 웹 프로그램 실행 환경

1) JDK

2) Web Server : Tomcat 


4. JSP 실행 구조

1) 웹클라이언트에서 웹서버에 웹프로그램 요청

2) 웹서버에서 클라이언트가 요청한 JSP 프로그램 로드

3) JSP 페이지에 대한 변환 실행. 일반 .java 파일로 변환됨.


--------------------------------------

JSP 가 .java 파일로 변환된 모습 확인

경로\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\프로젝트이름\org\apache\jsp


/*

 * Generated by the Jasper component of Apache Tomcat

 * Version: Apache Tomcat/7.0.61

 * Generated at: 2015-05-07 01:49:48 UTC

 * Note: The last modified time of this file was set to

 *       the last modified time of the source file after

 *       generation to assist with modification tracking.

 */

package org.apache.jsp;


import javax.servlet.*;

import javax.servlet.http.*;

import javax.servlet.jsp.*;

import java.util.*;


public final class Sample01_jsp extends org.apache.jasper.runtime.HttpJspBase

    implements org.apache.jasper.runtime.JspSourceDependent {


  private static final javax.servlet.jsp.JspFactory _jspxFactory =

          javax.servlet.jsp.JspFactory.getDefaultFactory();


  private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants;


  private javax.el.ExpressionFactory _el_expressionfactory;

  private org.apache.tomcat.InstanceManager _jsp_instancemanager;


  public java.util.Map<java.lang.String,java.lang.Long> getDependants() {

    return _jspx_dependants;

  }


  public void _jspInit() {

    _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();

    _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());

  }


  public void _jspDestroy() {

  }


  public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)

        throws java.io.IOException, javax.servlet.ServletException {




    final javax.servlet.jsp.PageContext pageContext;

    javax.servlet.http.HttpSession session = null;

    final javax.servlet.ServletContext application;

    final javax.servlet.ServletConfig config;

    javax.servlet.jsp.JspWriter out = null;

    final java.lang.Object page = this;

    javax.servlet.jsp.JspWriter _jspx_out = null;

    javax.servlet.jsp.PageContext _jspx_page_context = null;



    try {

      response.setContentType("text/html; charset=UTF-8");

      pageContext = _jspxFactory.getPageContext(this, request, response,

      null, true, 8192, true);

      _jspx_page_context = pageContext;

      application = pageContext.getServletContext();

      config = pageContext.getServletConfig();

      session = pageContext.getSession();

      out = pageContext.getOut();

      _jspx_out = out;


      out.write("\r\n");

      out.write("    \r\n");


/* JSP(Java) 소스 코드 영역 */

String msg = "Hello, JSP World!";


      out.write("    \r\n");

      out.write("<!DOCTYPE html>\r\n");

      out.write("<html>\r\n");

      out.write("<head>\r\n");

      out.write("<meta charset=\"UTF-8\">\r\n");

      out.write("<title>Insert title here</title>\r\n");

      out.write("</head>\r\n");

      out.write("<body>\r\n");

      out.write("<div>\r\n");

      out.write("<!-- (HTML주석)결과 출력시 특정 위치에 출력문 작성 -->\r\n");

      out.write('\r');

      out.write('\n');

      out.print(msg);

      out.write("\r\n");

      out.write("</div>\r\n");

      out.write("</body>\r\n");

      out.write("</html>\r\n");

    } catch (java.lang.Throwable t) {

      if (!(t instanceof javax.servlet.jsp.SkipPageException)){

        out = _jspx_out;

        if (out != null && out.getBufferSize() != 0)

          try {

            if (response.isCommitted()) {

              out.flush();

            } else {

              out.clearBuffer();

            }

          } catch (java.io.IOException e) {}

        if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);

        else throw new ServletException(t);

      }

    } finally {

      _jspxFactory.releasePageContext(_jspx_page_context);

    }

  }

}




4) .java 파일로 변환된 서블릿 컴파일 및 실행.

5) 실행의 결과로 동적 생성된 HTML Document를 클라이언트에게 응답.

6) 웹클라이언트는 응답 받은 HTML Document를

브라우저에 웹페이지 형태로 출력.


5. 이클립스에서 JSP 개발 환경 구축

1) 프로젝트 생성시 Dynamic Web Project 선택

2) 프로젝트 이름 입력시 식별자 작성규칙 준수.

3) Target Runtime 지정 -> 톰캣 설치 디렉토리 연결

4) 프로젝트 생성 후에는 Servers 탭에서 톰캣 서버 등록

5) 톰캣 서버에 프로젝트 등록 -> Add and Remove

6) 톰캣 서버 시작(재시작)

* 오라클과 톰캣이 같은 서버에 설치된 경우 포트번호 변경할 필요가 있습니다.

7) JSP 페이지 작성(확장자 .jsp) -> WebContent 폴더 하위에 작성


* 기본 페이지는 HTML 4.01로 작성됩니다.

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>Insert title here</title>

</head>

<body>


</body>

</html>






* HTML5로 변경을 원하면 JSP 템플릿을 수정하면 됩니다.

<%@ page language="java" contentType="text/html; charset=${encoding}"

    pageEncoding="${encoding}"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="${encoding}">

<title>Insert title here</title>

</head>

<body>

${cursor}

</body>

</html>




//서버에서 실행(톰캣)되는 1차 실행 소스 코드

//->JSP, Servlet

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<%

String msg = "Hello, JSP World!";

%>    

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>Insert title here</title>

</head>

<body>

<div>

<%=msg%>

</div>

</body>

</html>




//클라이언트에서 실행(브라우저)되는 2차 실행 소스 코드

//-> HTML, CSS, Javascript 코드

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>Insert title here</title>

</head>

<body>

<div>

Hello, JSP World!

</div>

</body>

</html>




//최종 결과 웹페이지

Hello, JSP World!



8) 톰캣 서버가 실행되고 있는 상태에서 

브라우저에 아래 주소를 요청합니다.

http://localhost:8090/프로젝트이름/Sample01.jsp


* 원격접속인 경우는

http://상대방IP주소:포트번호/프로젝트이름/Sample01.jsp

http://192.168.0.24:8080/JSP201402/Sample02.jsp

****6. JSP 기본 구조****

1) Scriptlet : HTML 베이스에 JSP 영역을 확보하고, 그 안에 Java 언어를 가지고 작성. 확장자 .jsp 사용.

<% code fragment %>

2) Declarations : 클래스 차원의 변수 선언 및 메소드 정의 영역.

<%! declaration; [ declaration; ]+ ... %>

3) Expression : 출력 전용 영역.

<%= expression %>

4) Comments : 주석 처리.

<%-- This is JSP comment --%>

5) Directives : 프로그램의 환경 설정 영역.

<%@ directive attribute="value" %>


<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<%@ page import="java.util.*" %>    

<%

/* JSP(Java) 소스 코드 영역 */

String msg = "Hello, JSP World!";

%>    

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>Insert title here</title>

</head>

<body>

<div>

<!-- (HTML주석)결과 출력시 특정 위치에 출력문 작성 -->

<%-- (JSP주석)결과 출력시 특정 위치에 출력문 작성 --%>

<%=msg%>

</div>

</body>

</html>





-------------------------------------

1부터 10까지의 수를 출력하는 JSP 페이지 작성.


//요청주소

http://localhost:8090/JSP_20150507/Sample02.jsp

http://상대방IP주소:8090/JSP_20150507/Sample02.jsp



<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<%

//액션 코드만 작성하고, 출력문은 HTML 영역에서 출력하도록 한다.


//1부터 10까지의 수를 출력하기 위한 반복문 액션

StringBuilder sb = new StringBuilder();

for (int a=1; a<=10; ++a) {

//웹에서는 줄바꿈 처리를 하는 경우 

// <br> 태그 이용

sb.append(String.format("%d<br>", a));

}


%>    

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>Insert title here</title>

</head>

<body>

<div>

<%-- 출력문은 Expression 표현을 이용해서 특정 위치에서 출력되도록 한다. --%>

<%=sb.toString()%>

</div>

</body>

</html>



--------------------------------------

문제) 1부터 100까지의 수를 모두 더한 값(5050)을 출력.

10 단위마다 중간 결과값도 같이 출력합니다.


//요청주소

http://localhost:8090/JSP_20150507/Sample03.jsp




<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<%

//액션 코드만 작성하고, 출력문은 HTML 영역에서 출력하도록 한다.

StringBuilder sb = new StringBuilder();


/* 

문제) 1부터 100까지의 수를 모두 더한 값(5050)을 출력.

10 단위마다 중간 결과값도 같이 출력합니다.

*/


int b = 0;

for (int i=1; i<=100; ++i) {

b += i;

if (i % 10 == 0) {

sb.append(String.format("%s<br>", b));

}

}


sb.append(String.format("결과값 : %s <br>", b));


%>    

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>Insert title here</title>

</head>

<body>

<div>

<%-- 출력문은 Expression 표현을 이용해서 특정 위치에서 출력되도록 한다. --%>

<%=sb.toString()%>

</div>

</body>

</html>




--------------------------------------

문제) 1부터 100까지의 수를 출력하되 10단위마다 줄바꿈 처리.

출력시 중간 합 결과가 같이 출력되도록 한다.

 1 2 3 4 5 6 7 8 9 10 => 55

 11 12 13 14 15 16 17 18 19 20 => 210

 21 22 23 24 25 26 27 28 29 30 => 465

 31 32 33 34 35 36 37 38 39 40 => ?

 41 42 43 44 45 46 47 48 49 50 => ?

 51 52 53 54 55 56 57 58 59 60 => ?

 61 62 63 64 65 66 67 68 69 70 => ?

 71 72 73 74 75 76 77 78 79 80 => ?

 81 82 83 84 85 86 87 88 89 90 => ?

 91 92 93 94 95 96 97 98 99 100 => 5050

-------------

=> 5050



<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<%

//액션 코드만 작성하고, 출력문은 HTML 영역에서 출력하도록 한다.

StringBuilder sb = new StringBuilder();


/* 

문제) 1부터 100까지의 수를 출력하되 10단위마다 줄바꿈 처리.

출력시 중간 합 결과가 같이 출력되도록 한다.

 1 2 3 4 5 6 7 8 9 10 => 55

 11 12 13 14 15 16 17 18 19 20 => 210

 21 22 23 24 25 26 27 28 29 30 => 465

 31 32 33 34 35 36 37 38 39 40 => ?

 41 42 43 44 45 46 47 48 49 50 => ?

 51 52 53 54 55 56 57 58 59 60 => ?

 61 62 63 64 65 66 67 68 69 70 => ?

 71 72 73 74 75 76 77 78 79 80 => ?

 81 82 83 84 85 86 87 88 89 90 => ?

 91 92 93 94 95 96 97 98 99 100 => 5050

-------------

=> 5050

*/


int b = 0;

for (int i=1; i<=100; ++i) {

b += i;

sb.append(String.format("%s ", i));

if (i % 10 == 0) {

sb.append(String.format(" => %s<br>", b));

}

}

sb.append(String.format("-------------------<br>"));

sb.append(String.format("=> %s <br>", b));


%>    

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>Insert title here</title>

</head>

<body>

<div>

<%-- 출력문은 Expression 표현을 이용해서 특정 위치에서 출력되도록 한다. --%>

<%=sb.toString()%>

</div>

</body>

</html>





--------------------------------------

구구단 중에서 5단을 출력하는 JSP 페이지 작성.


5 * 1 = 5

5 * 2 = 10

...

5 * 9 = 45


//요청주소

http://localhost:8090/JSP20140530/Sample04.jsp



//Sample04.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<%

/* 문자열 결합을 하는 경우 String 보다는

StringBuilder를 사용합니다. */

StringBuilder sb = new StringBuilder();

int dan = 5;

for (int i=1; i<=9; i++) {

sb.append(String.format("%d * %d = %d<br>", dan, i, (dan*i)));

}

%>    

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>JSP Sample</title>

</head>

<body>

<div>

<%-- JSP 실행의 결과값을 출력하는 영역 --%>

<%=sb.toString()%>

</div>

</body>

</html>



---------------------------------------

문제) 1부터 100까지의 숫자 중에서 짝수만 골라서 출력하되, 한 줄에 10개씩 출력.


for (int i=1, count=1; i<=100; i++) {

if (i%2 == 0) {

현재 숫자를 문자열로 추가

count++;

if (10개입니까?) {

줄바꿈 처리; //<br>

}

}

}



<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<%

StringBuilder sb = new StringBuilder();

for (int i=1, count=0; i<=100; i++) {

if (i%2 == 0) {

count++;

sb.append(String.format("%d ", i));

if (count%10 == 0) {

sb.append("<br>");

}

}

}

%>    

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>JSP Sample</title>

</head>

<body>

<div>

<%=sb.toString()%>

</div>

</body>

</html>



-------------------------------------------

JSP 스크립팅 요소

1. Scriptlet : HTML 베이스에서 JSP 영역을 확보하고, 그 안에 Java 문법으로 코딩. 

예를 들어,

<%  code fragment  %>

2. Directive : 프로그램 환경 설정 영역.

예를 들어,

<%@  page import="java.util.*"  %>

3. Expression : 출력 전용 영역.

예를 들어,

<%= expression %>

4. Declaration : JSP 페이지내에서 독립적인 메소드 작성시 사용하는 영역.

예를 들어,

<%! method declaration %>

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<%!

private int add(int a, int b) {

return a + b;

}

private int multiple(int a, int b) {

return a * b;

}

%>

<%

StringBuilder sb = new StringBuilder();

sb.append(String.format("%d + %d = %d <br>", 10, 20, add(10, 20)));

int num = 5;

for (int i=1; i<=9; i++) {

sb.append(String.format("%d * %d = %d <br>"

, num, i, multiple(num, i)));

}

%>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>JSP Sample</title>

</head>

<body>

<div>

<%=sb%>

</div>

</body>

</html>



-----------------------------------------------

독립적인 메소드를 전용 클래스에서 작성 및 JSP페이지에서 호출




//Sample05.jsp ->  WebContent 폴더에서 작성

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<%@ page import="com.test.*" %>    

<%


//사용자 정의 클래스(.java)와 JSP 페이지(.jsp->.java) 연동 테스트


//Calculator 클래스의 bin() 메소드 호출 과정 추가

//-> 패키지 확인 -> import 추가


Calculator cal = new Calculator();

int dec = 255; //임의의 10진수 지정

String result = cal.bin(dec); //2진수 문자열 반환


StringBuilder sb = new StringBuilder();

sb.append(String.format("10진수 %s -> 2진수 %s <br>\r\n"

, dec, result));


%>    

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>Insert title here</title>

</head>

<body>

<div>

<%=sb.toString()%>

</div>

</body>

</html>





//Calculator.java -> Java resources 폴더 하위의 src 폴더에서 작성

package com.test;


public class Calculator {

//10진수 입력(int)시 2진수 반환(String) 메소드 -> bin

public String bin(int dec) {

String result = "";

do {

result = String.valueOf(dec%2) + result;

dec /= 2;

}while(dec>0);

return result;

}

}




----------------------------------------------

문제) 반복문 예제.  for, while, do~while


1 + (1+2) + (1+2+3) + (1+2+3+4) +  ... + (1+...+100) => ???


//Sample07.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<%

StringBuilder sb = new StringBuilder();


int sum1 = 0;

int sum2 = 0;

for (int i=1; i<=100; i++) {

sum1 += i;

sum2 += sum1;

}


sb.append(String.format("%,d", sum2));

%>    

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>JSP Sample</title>

</head>

<body>

<div>

1 + (1+2) + (1+2+3) + (1+2+3+4) +  ... + (1+...+100) =&gt; <%=sb%>

</div>

</body>

</html>





----------------------------------------------

문제) 반복문 예제.  for, while, do~while


1 + (1+2) + (1+2+3) + (1+2+3+4) +  ... + (1+...+n) => ???


//Sample08.jsp -> n 변수의 값을 지정

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<%!

private int add(int start, int end) {

int result = 0;

int sum = 0;

for (int i=start; i<=end; i++) {

sum += i; //1~100까지의 합

result += sum; //중간 결과를 다시 합으로 연산

}

return result;

}

%>

<%

/* 

1 + (1+2) + (1+2+3) + (1+2+3+4) +  ... + (1+...+100) => ???

*/

//데이터 수신

String e = request.getParameter("end");

int result = 0;

if (e != null) {

int start = 1;

int end = Integer.parseInt(e);

result = add(start, end);

}

%>    

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>Insert title here</title>

</head>

<body>

<div>

<form>

<input type="text" name="end">

<input type="submit" value="결과">

</form>

<p>

1 + (1+2) + (1+2+3) + (1+2+3+4) +  ... + (1+...+<%=e%>) => <%=result%>

</p>

</div>

</body>

</html>


----------------------------------------------



'Server-Side > JSP' 카테고리의 다른 글

jsp 프로젝트 환경 설정 오류..  (0) 2015.08.16
데이터 송수신 테스트  (3) 2015.08.15
JSP코딩 기본 틀  (0) 2015.05.11
Comments