JSP 정리 2
Updated:
JSP Directive Elements
Directive Elements에는 세가지 종류가 있다.
- page directive
- include directive
- taglib directive
directive의 문법
<%@ directive attribute=”value” %>
page directive
Page directive는 JSP 페이지 전체에 적용되는 속성을 정의한다.
Page directive의 문법
<%@ page attribute=”value” %>
page directive
-
import
-
Class, interface, package import 할때 사용한다. 보통 파일의 맨 윗쪽에 import 코드들을 한꺼번에 올려놓는다.
<%@ page import="java.util.Date" %> Today is: <%= new Date() %>
-
-
contentType
-
HTTP 응답의 MIME(Multipurpose Internet Mail Extension) type을 정의할 때 사용한다. 디폴트 값은 “text/html;charset=ISO-8859-1”이다.
<%@ page contentType=application/msword %> Today is: <%= new java.util.Date() %>
-
-
extends
- 만들어질 servlet에 의해 상속될 부모 class를 정의한다. 잘 쓰이진 않는다.
-
info
-
Servlet interface의 getServletInfo() 메서드를 이용해서 알 수 있는 JSP 페이지의 정보를 설정한다.
<%@ page info="composed by Sonoo Jaiswal" %>
웹 컨테이너는 이후에 getServletInfo() 함수를 만들게 된다.
public String getServletInfo() { return "composed by Sonoo Jaiswal"; }
-
-
buffer
-
만들어진 JSP페이지의 버퍼 사이즈를 kilobyte단위 설정한다. 디폴트 값은 8Kb이다.
<%@ page buffer="16kb" %>
-
-
language
- JSP 페이지 내에서 사용될 script 언어를 정의한다. 디폴트 값은 “java”이다.
-
isELIgnored
-
Expression Language (EL)를 무시할 수 있다. 디폴트 값은 “false”이다. 즉, EL은 디폴트로 활성화 되있다. (EL이 무엇인지 밑에서 다시 다룬다)
<%@ page isELIgnored="true" %>//Now EL will be ignored
-
-
isThreadSafe
-
Servlet과 JSP는 모두 멀티스레드로 구동된다. 하지만 만약에 사용자가 JSP 페이지의 멀티스레드 기능을 안쓰고 싶다면 이 속성을 이용하면 된다. 디폴트 값은 “true”이다. 만약에 “false”로 값을 바꾸면 웹 컨테이너는 여러 요청들을 serialize하게 된다.
<%@ page isThreadSafe="false" %>
이 경우 웹 컨테이너는 이런 servlet을 만들게 된다.
public class SimplePage_jsp extends HttpJspBase implements SingleThreadModel{ ....... }
-
-
errorPage
-
에러 페이지를 정의하는데 사용된다. 만약 현재 페이지에서 exception이 발생한다면 여기서 정의한 에러페이지로 리디렉션된다.
<%@ page errorPage="myerrorpage.jsp" %> <%= 100/0 %>
-
-
isErrorPage
-
현재 페이지가 에러페이지라는 것을 선언할 때 사용된다. 에러페이지인 경우에만 사용할 수 있다.
-
The isErrorPage attribute is used to declare that the current page is the error page.
<%@ page isErrorPage="true" %> Sorry an exception occured!<br/> The exception is: <%= exception %>
-
include directive
include directive는 다른 파일의 컨텐츠들(jsp, html, text file) 을 포함시킬 때 사용된다. JSP 페이지 전체에 적용되는 속성을 정의한다. JSP 페이지는 한번만 번역되기 때문에 include directive를 사용할 때는 정적인 파일을 사용하는게 좋다.
include directive의 문법
<%@ include file=”resourceName” %>
<%@ include file="header.html" %>
보통 include directive를 사용하는 이유는 페이지 내에서 공통적인 영역이 있을 수 있는데 그런 경우 매번 같은 코드를 쓰기 보다 중복되는 코드를 한 파일에다 넣어놓고 중복되는 코드가 존재하는 페이지에 해당 파일을 include하는 것이 더 효율적이기 때문이다. 이런 방법을 ‘웹 페이지 모듈화’라고 하는데 웹 페이지 모듈화를 하게 되면 코드의 길이도 더 짧아지고 유지보수성도 더 좋아지게 된다.
taglib directive
html코드들 사이에 자바 코드들이 들어가 있는게 보기가 좋지 않기 때문에(최대한 같은 코드들(CSS / HTML / JSP)끼리 뭉쳐놓는 것이 이상적) 자바 코드들을 html스타일로 일원화 해주기 위해 만들어졌다.
taglib directive는 여러 태그들이 정의되어 있는 태그 라이브러리를 정의할 때 사용된다. 요즘 흔히 사용되는 방법이다. (가장 많이 사용되는 태그 라이브러리는 JSTL 라이브러리이다.)
taglib directive의 문법
<%@ taglib uri=”taglib의 uri” prefix=”taglib의 prefix” %>
<%@ taglib uri="http://www.javatpoint.com/tags" prefix="mytag" %>
<!-- 태그 라이브러리 주소 지정 -> 컨테이너가 태그에 대한 정보를 알 수 있도록 -->
<!-- prefix : 태그들을 사용할 때 쓸 이름 -->
<mytag:currentDate/>
<!-- prefix로 정의한 태그 이름을 사용하여 이 라이브러리 안에 있는 변수나 함수들을 사용 -->
JSP Action Tags(Elements)
JSP에는 여러가지 action tag들이 있는데 각각 주어진 역할이 있다. Action tag들은 크게 두가지 역할을 하는데 첫번째 역할은 페이지들 사이에 흐름을 제어하고 두번째 역할은 Java bean을 사용할 수 있도록 해준다.
Action tag들은 다음과 같다.
JSP Action Tags | Description |
---|---|
jsp:forward | 요청과 응답을 다른 리소스로 전달한다. |
jsp:include | 다른 리소스를 포함시킨다. |
jsp:useBean | Bean 객체를 생성하거나 가져온다. |
jsp:setProperty | Bean 객체의 속성 값을 설정한다. |
jsp:getProperty | Bean 객체의 속성 값을 출력한다. |
jsp:plugin | Applet과 같은 다른 컴포넌트를 포함시킨다. |
jsp:param | Parameter값을 설정한다. 보통 전달하거나 포함시킬 때 사용된다. |
jsp:fallback | Plugin이 돌아가고 있다면 메세지를 출력하는데 사용될 수 있다. jsp:plugin에서 사용된다. |
-
-
Java Bean 은 다음의 규칙들을 따르는 Java class이다.
- Argument가 없는 constructor를 가지고 있어야 한다.
- Serializable이어야 한다.
- 속성을 설정하고 가져올 수 있는 메서드를 제공해야 한다. 보통 setter와 getter 메서드라고 한다.
-
Java Bean을 사용하는 이유는 ‘reusable software component’이기 때문이다. 즉, 이 클래스로 만든 객체들은 여러 장소에서 접근이 가능하고 유지보수가 용이해진다.
간단한 예시
//Employee.java package mypack; public class Employee implements java.io.Serializable { private int id; private String name; public Employee() { } public void setId(int id) { this.id = id; } public int getId() { return id; } public void setName(String name) { this.name = name; } public String getName() { return name; } }
Java bean 접근 방법
package mypack; public class Test { public static void main(String args[]) { Employee e = new Employee();// object is created e.setName("Arjun");// setting value to the object System.out.println(e.getName()); } }
-
Java Bean의 속성들은 두가지 method를 통해 read와 write가 지원된다.
- getPropertyName() : 예를 들어 속성 이름이 firstName이면 이 속성을 읽기 위한 메서드 이름은 getfirstName()이 된다.
- setPropertyName() : 예를 들어 속성 이름이 firstName이면 이 속성을 읽기 위한 메서드 이름은 setfirstName()이 된다.
-
Java Bean의 장점들
- Java Bean의 속성들과 메서드들은 다른 application에 노출될 수 있다.
- software components들을 쉽게 재사용할 수 있도록 해준다.
-
Java Bean의 단점들
- Java Bean은 mutable이다. Immutable 객체의 장점을 가지지 못한다.
- 각 속성에 대해 getter와 setter 메서드를 만드는 과정에서 boilerplate code(꼭 필요한 간단한 기능인데, 반복적인 코드를 필요로 하며, 이것이 중복되어 많은 양의 코드를 양산하는 것을 이야기함. 각 속성에 대해 getter와 setter를 만들기 때문에 속성의 개수에 비례하여 코드가 길어짐)가 되기 쉽다.
-
-
-
jsp:useBean은 bean class를 객체화하거나 찾을 때 사용된다. 만약 bean 객체가 이미 생성되었다면 범위에 따라 bean을 다시 생성하지 않는다. 만약 bean 객체가 생성되지 않았다면 bean 객체를 객체화시킨다.
jsp:useBean action tag의 문법
<jsp:useBean id= "instanceName" scope= "page | request | session | application" class= "packageName.className" type= "packageName.className" beanName="packageName.className | <%= expression >" > </jsp:useBean>
jsp:useBean action tag의 속성과 사용 방법
- id: 지정된 scope에서 bean을 identify할 때 사용된다.
- scope: bean의 범위를 나타낸다. 범위는 page이거나 request이거나 session이거나 application일 수도 있다. 디폴트 범위는 page이다.
- page: 한 JSP page안에서 bean을 쓸 수 있음을 나타낸다. 디폴트 범위이다.
- request: 같은 request인 경우 이 bean을 어느 페이지에서도 사용할 수 있음을 나타낸다. page보다 더 넓은 범위이다.
- session: 같은 request인지 여부에 관계없이 같은 세션인 경우 이 bean을 어느 세션에서도 사용할 수 있음을 나타낸다. request보다 더 넓은 범위이다.
- application: 같은 application인 경우 이 bean을 application 내의 어느 페이지에서도 사용할 수 있음을 나타낸다. session보다 더 넓은 범위이다.
- class: 특정 bean 클래스를 객체화시킨다. (즉, bean 클래스의 객체를 생성한다.) 하지만 반드시 argument나 constructor가 없어야 하고 abstract 하지 않아야 한다.
- type: 범위 안에 이미 bean이 있을 경우 bean의 data type을 제공한다. class나 beanName 속성으로 사용된다. 만약 class나 beanName 없이 사용할 경우 bean이 객체화되지 않는다.
- beanName: java.beans.Beans.instantiate() 메서드를 사용하여 bean을 객체화한다.
-
JSP Expression Language
Expression Language(EL)는 Java Bean 안에 들어있는 데이터들과 request, session, application등 다른 객체들에 대한 접근을 간편하게 해준다. EL안에는 많은 내장객체들과 연산자(operator)들과 예약어(reserve words)들이 존재한다.
Expression Language (EL)의 문법
${ expression }
Expression Language (EL)의 내장 객체들(Implicit objects)
Implicit Objects | Usage |
---|---|
pageScope | it maps the given attribute name with the value set in the page scope |
requestScope | it maps the given attribute name with the value set in the request scope |
sessionScope | it maps the given attribute name with the value set in the session scope |
applicationScope | it maps the given attribute name with the value set in the application scope |
param | it maps the request parameter to the single value |
paramValues | it maps the request parameter to an array of values |
header | it maps the request header name to the single value |
headerValues | it maps the request header name to an array of values |
cookie | it maps the given cookie name to the cookie value |
initParam | it maps the initialization parameter |
pageContext | it provides access to many objects request, session etc. |
-
예시 1 (param)
-
index.jsp
<form action="process.jsp"> Enter Name:<input type="text" name="name" /><br/><br/> <input type="submit" value="go"/> </form>
-
process.jsp
Welcome, ${ param.name }
-
-
예시 2 (sessionScope)
-
index.jsp
<h3>welcome to index page</h3> <% session.setAttribute("user","sonoo"); %> <a href="process.jsp">visit</a>
-
process.jsp
Value is ${ sessionScope.user }
-
-
예시 3 (cookie)
-
index.jsp
<h1>First JSP</h1> <% Cookie ck=new Cookie("name","abhishek"); response.addCookie(ck); %> <a href="process.jsp">click</a>
-
process.jsp
Hello, ${cookie.name.value}
-
EL에서 연산자들의 우선순위
우선순위(위의 연산자들이 우선순위가 더 높음) |
---|
[] . |
() |
-(unary) not ! empty |
* / div % mod |
+ - (binary) |
< <= > >= lt le gt ge |
== != eq ne |
&& and |
|| or |
?: |
EL에서 예약어(Reserve words)
EL에서의 예약어들은 다음과 같다.
lt | le | gt | ge |
eq | ne | true | false |
and | or | not | instanceof |
div | mod | empty | null |
Leave a comment