Web언어/JSP

[JSP] JSP 코드블록

IT록흐 2022. 1. 31. 07:51
반응형
 

[JSP] JSP의 역할

HTML 문서를 Dynamic하게 만드는 언어 중 하나가 JSP이다. 이번 포스팅에서는  HTML 문서를 Dynamic하게 만드는 과정에서 JSP의 역할을 알아보겠다. HTML 문서를 서블릿(Servlet)으로 만들기 HTML문서는 태그

lordofkangs.tistory.com

 

 

 

지난 포스팅에서

JSP의 역할을 알아보았다.

 

 

 

 

JSP는 jasper가 Dynamic하게

처리할 부분을 표시한 문서이다.

 

개발자는 HTML 코드 중

Dynamic한 부분을 코드블록을 사용하여

표현해야한다. 

 

 

<% %>

 

jasper는 JSP 문서를 

서블릿 클래스로 변환한다. 

 

 

// 서블릿클래스
public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent,
                 org.apache.jasper.runtime.JspSourceImports {

  // 1) 멤버변수 및 멤버함수 영역
    
  public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
      throws java.io.IOException, javax.servlet.ServletException{
      
    // 2) 서비스 메소드 영역
    
   }

}

 

 

서블릿 클래스의 용도는

클라이언트로부터 받은 Request를 처리하여

Response로 보내는 Service를 제공하는 것이다.

 

jsp 서블릿의 경우,

_jspService 메소드가 그 역할을 담당한다.

 

 

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
	<!-- 코드 블록 -->
	<% int x = 1;
	   int y = 2;
	%>
</body>
</html>

 

 

위와 같은 JSP문서가 있다.

 

HTML 코드 안에

int x와 int y가 코드 블록( <% %> ) 안에

감싸져서 선언되어 있다.

 

그렇다면 

이는 어떻게 서블릿 코드로 변환될까?

 

 

public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent,
                 org.apache.jasper.runtime.JspSourceImports {

	// 중략....
    
  public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
      throws java.io.IOException, javax.servlet.ServletException {

	// 중략 ...

      out.write("\r\n");
      out.write("<!DOCTYPE html>\r\n");
      out.write("<html>\r\n");
      out.write("<head>\r\n");
      out.write("<meta charset=\"EUC-KR\">\r\n");
      out.write("<title>Insert title here</title>\r\n");
      out.write("</head>\r\n");
      out.write("<body>\r\n");
      out.write("	");
      
      // 코드 블록 안에 감싸져 있던 부분
      int x = 1; 
	  int y = 2;
	
      out.write("\r\n");
      out.write("</body>\r\n");
      out.write("</html>");
      
  	// 중략...
  }
}

 

 

 

<% %> 코드 블록 안에 

감싸져 있는 JAVA 코드는

위와 같이,

 

_jspService 메소드 안에 

그대로 복붙된다.

 

고로, 

서블릿의 서비스 메소드에

JAVA 코드를 추가하고 싶다면

 

<% %>을 사용한다.

 

 

<%= %>

 

<%= %><% out.print(); %>와 같은 의미다. out은 JspWriter 클래스의 객체로 _jspService 메소드 안에 내장되어 있다. out은 밖으로 html 코드를 내보내는 역할을 담당한다. 이때 out.write(""); 메소드를 활용하는데, 문자열 출력만 가능해서 정수와 같은 리터럴 출력은 out.print()를 사용한다.

 

 

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
	<% int x = 1;
	   int y = 2;
	%>
	
	<h1> 결과 : <%= x+y %></h1> 
</body>
</html>

 

 

위 jsp 문서를 서블릿으로 변환하면

아래와 같다.

 

 

public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent,
                 org.apache.jasper.runtime.JspSourceImports {

	// 중략....
    
  public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
      throws java.io.IOException, javax.servlet.ServletException {

	// 중략 ...

     
      out.write("\r\n");
      out.write("<!DOCTYPE html>\r\n");
      out.write("<html>\r\n");
      out.write("<head>\r\n");
      out.write("<meta charset=\"EUC-KR\">\r\n");
      out.write("<title>Insert title here</title>\r\n");
      out.write("</head>\r\n");
      out.write("<body>\r\n");
      out.write("	");
      
      // <% %>
 	int x = 1;
	  int y = 2;
	
      out.write("\r\n");
      out.write("	\r\n");
      out.write("	<h1> 결과 : ");
      
      //<%= %>
      out.print( x+y ); // x + y가 연산되어 출력, Dynamic!
      
      out.write("</h1>\r\n");
      out.write("</body>\r\n");
      out.write("</html>");
      
  	// 중략...
  }
}

 

 

이렇게

<%= %> 부분은 자동으로

out.print(x+y)로 치환된다.

 

<%!  %>

 

<%  %> 코드 블록은 

JAVA 코드를 _jspService 메소드 안에

삽입한다.

 

만약

메소드를 삽입하고 싶을 때는 어떻게 할까?

 

 

// 서블릿클래스
public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent,
                 org.apache.jasper.runtime.JspSourceImports {

  // 1) 멤버변수 및 멤버함수 영역
    
  public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
      throws java.io.IOException, javax.servlet.ServletException{
      
    // 2) 서비스 메소드 영역
    
   }

}

 

 

<%  %> 는 2) 영역에 코드를 삽입한다.

 

그러나

메소드를 메소드 안에 삽입하면 에러가 난다.

 

고로

1) 영역에 메소드를 선언해야하는데

<%!  %> 코드 블록을 쓰면

1) 영역에 코드가 삽입되도록 약속되어 있다.

 

 

 

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
	<% 
	   int x = 1;
	   int y = 2;
	%>
	
	<h1> 결과 : <%= sum(x,y) %></h1> <!-- out.print( sum(x,y) ); -->
	
    <!-- 메소드 정의 -->
	<%!
		public int sum(int x, int y){
			return x+y;
		}
	
	%>
</body>
</html>

 

이와 같이 

 

<%!  %> 를 이용하여

sum() 메소드를 정의하였고

 

<%= %> 블록 안에 

sum 메소드를 호출하였다.

 

그럼 서블릿으로는 어떻게 변환될까?

 

 

public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent,
                 org.apache.jasper.runtime.JspSourceImports {

	// <%!  %>
   public int sum(int x, int y){
        return x+y;
  	}
    
	   // 중략 ...
       
  public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
      throws java.io.IOException, javax.servlet.ServletException {

        // 중략 ...

      out.write("\r\n");
      out.write("<!DOCTYPE html>\r\n");
      out.write("<html>\r\n");
      out.write("<head>\r\n");
      out.write("<meta charset=\"EUC-KR\">\r\n");
      out.write("<title>Insert title here</title>\r\n");
      out.write("</head>\r\n");
      out.write("<body>\r\n");
      out.write("	");
 
 	 // <%  %>
	   int x = 1;
	   int y = 2;
	
      out.write("\r\n");
      out.write("	\r\n");
      
      //<%= %>
      out.write("	<h1> 결과 : ");
      
      out.print( sum(x,y) );
      out.write("</h1>\r\n");
      out.write("	\r\n");
      out.write("	");
      out.write("\r\n");
      out.write("</body>\r\n");
      out.write("</html>");
      
      // 중략 ...
  
  }
}

 

 

이와같이,

<%!  %>는 멤버 메소드 영역에

코드를 삽입한다.

 

 

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

 

 

<%@ page %> 블록은 페이지의 정보를

표현하는 지시 블록이다.

 

서블릿으로 변환할 때 

설정해두어야 하는 페이지 정보를 담는다.

 

 

 

▷ language="java"  :  코드블록 안에 JAVA 언어로 설정한다.

 contentType : 페이지가 웹브라우저에 출력될 때의 MIME Type을 설정한다.

 pageEncoding : JSP 파일 자체의 인코딩 방식을 설정한다.

 

 

 

 


 

 

 

참고자료

 

 

 

반응형

'Web언어 > JSP' 카테고리의 다른 글

[JSP] JSP의 역할  (0) 2022.01.30
[JSP] 동적(Dynamic) 페이지란?  (0) 2022.01.29
[ JSP ] 상태 유지 ( Session, Cookie )  (0) 2022.01.25
[ JSP ] 인코딩(Encoding) 설정  (0) 2021.06.21
[ JSP ] 인코딩(Encoding)을 하는 이유  (3) 2021.06.21