📚 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/>
📄 참고
반응형