📚 Study/Servlet&JSP

JSP의 기초 문법

0_ch4n 2022. 5. 26. 21:53
반응형

✔️ JSP 스크립팅 요소

  • jsp 내부에 자바 코드를 삽입하는 기능을 제공합니다.

 

📌 Scriptlet tag

  • <% 자바 코드 %> 와 같은 형태로 사용합니다.
  • JAVA 코드를 위한 각 코드에는 반드시 세미콜론을 붙여야합니다.
  • scriptlet에서 선언된 변수는 요청 때마다 호출되며 값이 초기화됩니다.
<html>  
<body>  
<%  
String name=request.getParameter("uname");  
out.print("welcome "+name);  
%>  
</form>  
</body>  
</html>

 

📌 Expression tag

  • <%= 표현 문장 %> 와 같은 형태로 사용합니다.
  • 표현식에서는 세미콜론을 붙이지 않아야합니다.
  • 실행 결과를 리턴하므로 void 메서드나 변수의 선언만 식으로 작성할 수 없습니다.
<html>  
<body>  
<%= "Welcome "+request.getParameter("uname") %>  
</body>  
</html>

 

📌 Declaration tag

  • <%! 필드 또는 메서드 선언 %> 와 같은 형태로 사용합니다.
  • 전역변수, class, function을 선언하는 영역으로 반드시 세미콜론이 필요합니다.
  • 선언된 변수나 메서드는 첫 요청 때만 값이 초기화 된 후 웹 컨테이너에서 값이 유지됩니다.
<html>  
<body>  
<%!   
int data=50;
int cube(int n){  
return n*n*n*;  
}  
%>  
<%= "Value of the variable is:"+data %>  
<%= "<br> Cube of 3 is:"+cube(3) %>  
</body>  
</html>

 

📌 Scriptlet Tag 와 Declaration Tag 비교

 

✔️ Directive tag (지시어)

  • 웹 컨테이너에게 JSP 페이지를 서블릿으로 변환하는 방법을 알려주는 메시지입니다.

 

📌 page directive

  • <%@ page 속성="값" %> 와 같은 형태로 사용합니다.
  • 현재 JSP 페이지를 처리 시 필요한 정보를 기재합니다.

 

  • import
    • JSP 프로그램에서 가져올 클래스 패키지를 지정합니다.
<html>  
<body>  
  
<%@ page import="java.util.Date" %>  
Today is: <%= new Date() %>  
  
</body>  
</html>
  • contentType
    • JSP 프로그램의 응답 시의 MIME 타입과 문자 인코딩을 지정합니다.
<html>  
<body>  
  
<%@ page contentType=application/msword %>  
Today is: <%= new java.util.Date() %>  
  
</body>  
</html>
  • extends
    • 상속 받을 부모 클래스를 정의합니다.
  • info
    • Servlet 인터페이스의 getServletInfo() 메서드를 사용하여 검색되는 JSP 페이지의 정보를 설정합니다.
<html>  
<body>  
  
<%@ page info="composed by Sonoo Jaiswal" %>  
Today is: <%= new java.util.Date() %>  
  
</body>  
</html>
  • buffer
    • JSP 페이지에 생성된 출력을 처리하기 위해 버퍼 크기를 KB 단위로 설정합니다. (기본 크기는 8KB입니다.)
<html>  
<body>  
  
<%@ page buffer="16kb" %>  
Today is: <%= new java.util.Date() %>  
  
</body>  
</html>
  • language
    • JSP 페이지의 언어를 설정합니다. (기본 언어는 자바입니다.)
  • isELIgnored
    • JSP 페이지에서 EL(Expression Language)를 무시하게끔 설정합니다. (기본 값은 false 입니다.)
<%@ page isELIgnored="true" %>//Now EL will be ignored
  • isThreadSafe
    • JSP 페이지의 멀티스레드 동작을 제어하기 위해 설정합니다.
    • 기본 값은 true로 false가 되면 웹 컨테이너가 여러 요청을 직렬화합니다.
<%@ page isThreadSafe="false" %>
  • errorPage
    • 만약 현재 페이지에서 예외가 발생하면 에러 페이지로 이동하게끔 설정합니다.
<html>  
<body>  
  
<%@ page errorPage="myerrorpage.jsp" %>  
  
 <%= 100/0 %>  
  
</body>  
</html>
  • isErrorPage
    • 현재 페이지가 에러 페이지라고 선언하기 위해 사용합니다.
<html>  
<body>  
  
<%@ page isErrorPage="true" %>  
  
 Sorry an exception occured!<br/>  
The exception is: <%= exception %>  
  
</body>  
</html>

 

📌 include directive

  • <%@ include="리소스 이름" %> 와 같은 형태로 사용합니다.
  • 현재 JSP 파일 안에 JSP 파일, HTML 파일 또는 텍스트 파일과 같은 리소스의 내용을 포함하는데 사용합니다.
  • JSP 페이지는 한 번만 번역되므로 정적 리소스를 포함하는 것이 좋습니다.
  • include 지시어를 사용하면 코드의 재사용성이 좋아집니다.
<html>  
<body>  
  
<%@ include file="header.html" %>  
  
Today is: <%= java.util.Calendar.getInstance().getTime() %>  
  
</body>  
</html>

 

📌 taglib directive

  • <%@ taglib uri="태그 라이브러리의 URI" prefix="태그 라이브러리의 접두사" %> 와 같은 형태로 사용합니다.
  • 태그 라이브러리를 정의하기 위해 사용합니다.
<html>  
<body>  
  
<%@ taglib uri="http://www.javatpoint.com/tags" prefix="mytag" %>  
  
<mytag:currentDate/>  
  
</body>  
</html>

 

✔️ Action tag

  • Action tag는 페이지 간의 흐름을 제어하고 Java Bean을 사용하는데 쓰입니다.

 

📌 jsp:forward

  • 현재 페이지에서 다른 페이지로 이동할 때 사용합니다.
<!-- without parameter -->

<!-- syntax -->
<jsp:forward page="relativeURL | <%= expression %>" />  

<!-- index.jsp -->
<html>  
<body>  
<h2>this is index page</h2>  
  
<jsp:forward page="printdate.jsp" />  
</body>  
</html>  

<!-- printdate.jsp -->
<html>  
<body>  
<% out.print("Today is:"+java.util.Calendar.getInstance().getTime()); %>  
</body>  
</html>



<!-- with parameter -->

<!-- syntax -->
<jsp:forward page="relativeURL | <%= expression %>">  
<jsp:param name="parametername" value="parametervalue | <%=expression%>" />  
</jsp:forward>  

<!-- index.jsp -->
<html>  
<body>  
<h2>this is index page</h2>  
  
<jsp:forward page="printdate.jsp" >  
<jsp:param name="name" value="javatpoint.com" />  
</jsp:forward>  
  
</body>  
</html>  

<!-- printdate.jsp -->
<html>  
<body>  
  
<% out.print("Today is:"+java.util.Calendar.getInstance().getTime()); %>  
<%= request.getParameter("name") %>  
  
</body>  
</html>

 

📌 jsp:include

  • jsp, html 또는 servlet 등 다른 리소스의 내용을 포함하는데 사용됩니다.
  • 정적, 동적 페이지를 모두 포함할 수 있고 코드 재사용성이 좋아집니다.
<!-- syntax without parameter -->
<jsp:include page="relativeURL | <%= expression %>" />  

<!-- syntax with parameter -->
<jsp:include page="relativeURL | <%= expression %>">  
<jsp:param name="parametername" value="parametervalue | <%=expression%>" />  
</jsp:include>  

<!-- index.jsp -->
<h2>this is index page</h2>  
<jsp:include page="printdate.jsp" />  
<h2>end section of index page</h2>  

<!-- printdate.jsp -->
<% out.print("Today is:"+java.util.Calendar.getInstance().getTime()); %>

 

 

📌 jsp:useBean

  • JavaBean의 규칙을 따라야 합니다. (인수 없는 생성자 존재, 직렬화 가능, getter와 setter 제공)
  • 장점
    • JavaBean 속성 및 메서드는 다른 애플리케이션에 노출될 수 있습니다.
    • 소프트웨어 구성 요소를 쉽게 재사용할 수 있습니다.
  • 단점
    • JavaBeans는 변경이 가능하여 불변 객체의 이점을 얻을 수 없습니다.
    • 각 속성에 대해 setter 및 getter 메서드를 별도로 생성하면 상용구 코드가 발생할 수 있습니다.
<!-- syntax -->
<jsp:useBean id= "instanceName" scope= "page | request | session | application"   
class= "packageName.className" type= "packageName.className"  
beanName="packageName.className | <%= expression >" >  
</jsp:useBean>  

<!-- index.jsp -->
<jsp:useBean id="obj" class="com.javatpoint.Calculator"/>  
  
<%  
int m=obj.cube(5);  
out.print("cube of 5 is "+m);  
%>

 

📌 jsp:setProperty , jsp:getProperty

  • Java Bean의 속성 값을 설정하고 가져오기 위해 사용합니다.
<!-- setProperty Syntax -->
<jsp:setProperty name="instanceOfBean" property= "*"   |   
property="propertyName" param="parameterName"  |   
property="propertyName" value="{ string | <%= expression %>}"   
/>  

<!-- getProperty Syntax -->
<jsp:getProperty name="instanceOfBean" property="propertyName" />  

<!-- process.jsp -->
<jsp:useBean id="u" class="org.sssit.User"></jsp:useBean>  
<jsp:setProperty property="*" name="u"/>  
  
Record:<br>  
<jsp:getProperty property="name" name="u"/><br>  
<jsp:getProperty property="password" name="u"/><br>  
<jsp:getProperty property="email" name="u" /><br>

 

📌 jsp:plugin

  • jsp 파일에 Applet이나 Bean을 포함하는데 사용됩니다.
<!-- syntax -->
<jsp:plugin type= "applet | bean" code= "nameOfClassFile"   
codebase= "directoryNameOfClassFile"  
</jsp:plugin>  

<!-- index.jsp -->
<html>  
    <head>  
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
        <title>Mouse Drag</title>  
    </head>  
    <body bgcolor="khaki">  
<h1>Mouse Drag Example</h1>  
  
 <jsp:plugin align="middle" height="500" width="500"  
     type="applet"  code="MouseDrag.class" name="clock" codebase="."/>  
  
    </body>  
</html>

 

📌 jsp:param

  • <jsp:plugin> 의 자식 태그로 추가 매개변수를 제공하기 위해 사용합니다.
<jsp:params>
 
    <jsp:param name="param1" value="value1" />
 
    <jsp:param name="param2" value="value2" />
 
</jsp:params>

 

📌 jsp:fallback

  • <jsp:plugin> 의 자식 태그로 플러그인을 시작할 수 없는 경우 클라이언트 브라우저에 보여줄 컨텐츠를 지정합니다.
<jsp:fallback>
    <p>Could not load applet!</p>
</jsp:fallback>

 

✔️ Custom tag

<prefix:태그이름 속성1="값1"...속성n="값n"/>  

<prefix:태그이름 속성1=값1...속성n=값n >  
body code  
</prefix:tagname>
  • Action tag의 종류가 많지 않기 때문에 개발자가 특정 기능을 수행하는 Action tag를 직접 만든 것입니다.

 

📌 Custom tag의 장점

  • Scriptlet tag의 필요성 제거
    • Custom tag는 JSP에서 잘못된 프로그래밍 방식으로 간주되는 Scriptlet tag의 필요성을 제거합니다.
  • JSP에서 비즈니스 로직의 분리
    • Custom tag는 JSP에서 비즈니스 로직을 분리하여 유지보수가 쉽도록 합니다.
  • 재사용성
    • Custom tag를 사용하면 동일한 비즈니스 로직을 계속해서 재사용할 수 있습니다.

 

📌 Custom tag API

  • JspTag : Custom tag를 사용하는 모든 인터페이스와 클래스들의 Root 인터페이스입니다.
  • Tag : JspTag의 서브 인터페이스로 태그의 시작과 끝의 Action을 수행하는 메서드와 필드를 정의합니다.
    • EVAL_BODY_INCLUDE : body content를 평가합니다.
    • EVAL_PAGE : Custom tag 후에 JSP 페이지 content를 평가합니다.
    • SKIP_BODY : 태그의 body content를 스킵합니다.
    • SKIP_PAGE : Custom tag 후에 JSP 페이지 content를 스킵합니다.
    • setPageContext(PageContext pc) : PageContext 객체를 설정합니다.
    • setParent(Tag t) : 태그 핸들러의 조상을 설정합니다.
    • getParent() : 조상 태그 핸들러 객체를 반환합니다.
    • doStartTag() : JSP 페이지 구현 객체에 의해 호출되고 개발자는 이 메서드를 재정의하여 태그 시작의 비즈니스 로직을 정의해야합니다.
    • doEndTag() : JSP 페이지 구현 객체에 의해 호출되고 개발자는 이 메서드를 재정의하여 태그 끝의 비즈니스 로직을 정의해야합니다.
    • release() : 상태를 해제하기 위해 JSP 페이지 구현 객체에 의해 호출됩니다.
  • IterationTag : Tag 인터페이스의 하위 인터페이스로 body를 재평가하는 메서드와 필드를 정의합니다.
    • EVAL_BODY_AGAIN : body content를 재평가합니다.
    • doAfterBody() : content 평가 후 JSP 페이지 구현 객체에 의해 호출되며 EVAL_BODY_INCLUDE를 반환하면 content가 재평가되고 SKIP_BODY를 반환하면 재평가되지 않습니다.

 

📌 Custom tag의 사용

1. Tag Handler Class 생성

  • TagSupport 를 상속하는 클래스를 만들어 doStartTag() 메서드를 재정의해야 합니다.
  • jsp에 대한 데이터를 쓰려면 JspWriter 클래스를 사용해야 합니다.
  • TagSupport는 PageContext 클래스의 JspWriter의 인스턴스를 반환하는 getOut() 메서드를 제공합니다.
//MyTagHandler.java
package com.javatpoint.sonoo;  
import java.util.Calendar;  
import javax.servlet.jsp.JspException;  
import javax.servlet.jsp.JspWriter;  
import javax.servlet.jsp.tagext.TagSupport;  
public class MyTagHandler extends TagSupport{  
  
public int doStartTag() throws JspException {  
    JspWriter out=pageContext.getOut();//returns the instance of JspWriter  
    try{  
     out.print(Calendar.getInstance().getTime());//printing date and time using JspWriter  
    }catch(Exception e){System.out.println(e);}  
    return SKIP_BODY;//will not evaluate the body content of the tag  
}  
}

2. TLD(Tag Library Descriptor) 파일 생성

  • WEB-INF 디렉토리 안에 포함되어 있으며 태그 및 태그 핸들러 클래스에 대한 정보가 들어있습니다.
<!-- mytags.tld -->
<?xml version="1.0" encoding="ISO-8859-1" ?>  
<!DOCTYPE taglib  
        PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"  
    "http://java.sun.com/j2ee/dtd/web-jsptaglibrary_1_2.dtd">  
  
<taglib>  
  
  <tlib-version>1.0</tlib-version>  
  <jsp-version>1.2</jsp-version>  
  <short-name>simple</short-name>  
  <uri>http://tomcat.apache.org/example-taglib</uri>  
  
<tag>  
<name>today</name>  
<tag-class>com.javatpoint.sonoo.MyTagHandler</tag-class>  
</tag>  
</taglib>

3. JSP 파일 생성

  • jsp 파일에서 taglib 지시문을 사용하여 tld 파일의 경로를 uri로 지정해 태그를 사용할 수 있습니다.
<!-- index.jsp -->
<%@ taglib uri="WEB-INF/mytags.tld" prefix="m" %>  
Current Date and Time is: <m:today/>

 

📄 참고

https://www.javatpoint.com/custom-tags

반응형