🍁Servlet과 JSP의 특징
Servlet
Servlet은 자바를 베이스로 한다.
- *.java
장점: 자바를 그대로 사용할 수 있다.
단점: 문자열 처리를 해야 하므로 클라이언트 코드를 작성하기 불편하다.
JSP
JSP는 HTML 페이지를 베이스로 한다.
- *.jsp
장점: HTML을 기반으로 하기 때문에 클라이언트 코드를 작성하기 쉽고, 추가 자바 코드를 작성할 수 있다.
단점: 자바 코드를 작성하기 불편하다.
이게 자바 파일이라고?
<%@ page import="java.util.Calendar" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>Hello!</h1>
<%=Calendar.getInstance() %>
</body>
</html>
JSP를 사용하는 이유는 Servlet보다 개발 편의성이 높기 때문이다.
JSP는 HTML 기반 문서이기 때문에 webapp 문서에 파일을 생성하여 사용한다.
아무리 봐도 HTML 문서이지만, 이건 java 파일이다!
🍁JSP 구성 요소
JSP 지시자 (JSP Directive)
- <%@ %>
- page 지시자
- include 지시자
- taglib 지시자
스크립트 요소 (Scripting Elements)
- <% %>
- 스크립틀릿 (Scriptlet)
- 표현식 (Expression)
- 선언부
액션 태그 (Action Tags)
- <jsp:XXX> <c:XXX>
- 기본 액션 태그
- 확장 액션 태그
- 사용자 정의 액션 태그
🍂JSP 지시자 (JSP Directive)
page 지시자
<%@page import="java.util.Calendar"%>
<%@page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
page 지시자는 JSP의 실행환경(JSP 컨테이너 == 톰캣)에게 현재 페이지의 정보를 알려주는 역할을 한다.
page 지시자는 JSP 페이지의 항상 첫 번째 라인에 위치해 있지만 항상 첫 번째 라인에 위치하지 않아도 되며, 1개 이상 작성하는 게 가능하다.
- language="java"
- contentType="text/html; charset=UTF-8"
- pageEncoding="UTF-8"
- import="java.util.Calendar"
language는 현재 JSP 페이지에서 사용할 서버 프로그래밍 언어를 지정한다.
contentType은 JSP 페이지 내용물에 대해 기술한 것으로, 브라우저에게 전달할 HTML 페이지와 연관이 있다.
text/html(MINE Type)은 text 타입의 html 문서라는 것을 알려주는 것이다. 이 정보는 톰캣이 확인한 다음에 클라이언트(브라우저)에 보여준다. 그리고 charset은 HTML 문서의 인코딩으로, 마찬가지로 브라우저에게 전달한다.
pageEncoding은 JSP의 인코딩이다.
import="java.util.Calendar"는 자바의 import 구분과 동일하다.
include 지시자
- "ex02.jsp"
- <%@include file="URL" %>
include 지시자는 지정된 URL의 페이지(JSP, HTML, Text 등)를 현재 JSP 페이지의 일부로 사용하는 조각 페이지 기능이다.
조각 페이지 사용
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>include</h1>
<p>문자열</p>
<p>문자열</p>
<p>문자열</p>
<p>문자열</p>
<p>문자열</p>
<p>문자열</p>
<p>문자열</p>
<p>문자열</p>
<p>문자열</p>
<%@ include file="inc/copyright.jsp" %>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<hr>
<div>
©Copyright 2023 test.com ALL rights reserved.
</div>
중복되면 안 되는 <html> 태그가 중복되어 사용되었다.
이러한 문제를 해결하기 위해 조각 페이지에는 재사용되지 않는 내용만 남기고 작성해야 한다.
taglib 지시자
(추후 추가 예정)
🍂스크립트 요소 (Scripting Elements)
스크립틀릿과 익스프레션은 순수 JSP를 사용할 때 가장 많이 사용하는 표현이다.
스크립틀릿 (Scriptlet)
- <% %>
<% 자바 영역 %>
스크립틀릿은 HTML 페이지 영역(JSP)에서 Java를 사용할 수 있는 영역을 제공한다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
//자바 영역
int a = 10;
int b = 20;
int c = a + b;
String name = "Isaac";
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
</body>
</html>
스크립틀릿으로 여러 가지 업무 코드를 작성하고, 화면을 출력해야 하는 것들은 익스프레션을 사용한다.
출력이 아닌 나머지 코드는 HTML 코드 위에 작성한다.
표현식 (Expression)
- <%= %>
표현식은 자바의 값(데이터)을 HTML 문서에 출력하는 역할을 한다.
예로 들면 system.out.print 같은 역할을 하는 셈이며, 익스프레션을 통해 적절한 위치에 출력을 할 수 있다.
<table border="1" width="300">
<tr>
<th>a</th>
<td><%= a %></td>
</tr>
<tr>
<th>b</th>
<td><%= b %></td>
</tr>
<tr>
<th>c</th>
<td><%= c %></td>
</tr>
<tr>
<th>d</th>
<td><%= name %></td>
</tr>
</table>
코드를 확인해 보면 익스프레션으로 올바른 값으로 대체되어 출력되는 것을 볼 수 있다.
구구단
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
int dan = 5;
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>구구단</h1>
<%
for (int i=1; i<=9; i++) {
%>
<div><%= dan %> x <%= i %> = <%= dan * i %></div>
<%
}
%>
</body>
</html>
for문의 내용은 {}로 연결되어 있어야 하지만, 스크립틀릿 안에 데이터를 넣어야 할 때 for문을 끊어서 사용하는 것처럼 구현할 수 있다.
자바와 HTML이 뒤엉켜 있는 이러한 코드를 🍝 스파게티 코드라고 한다. 이런 상황을 안 만드는 게 좋지만, 스파게티 코드는 웹에서는 굉장히 흔한 일이다.
동적으로 태그 생성
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
String name = "Isaac";
int age = 25;
String txt = "<input type='text'>";
String color = "cornflowerblue";
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style>
div {
color: <%= color %>;
}
</style>
</head>
<body>
<h1>스크립틀릿과 표현식</h1>
<div>이름: <%= name %></div>
<div>나이: <%= age %></div>
<div><%= txt %></div>
<div><input type="text" value="<%= color %>"></div>
<input type="button" value="버튼" id="btn1">
<script>
document.getElementById('btn1').onclick = function() {
alert('<%= color %>');
};
</script>
</body>
</html>
자바의 변수에 태그를 만드는 문자열을 만들고, HTML에서 호출하여 동적으로 태그를 생성할 수 있다.
브라우저는 정적으로 만든 태그와 동적으로 만든 태그를 구별할 수 없다.
결론적으로 클라이언트 코드와 관련된 모든 부분에 대해 자바 변수는 위치에 상관없이 어디든지 사용할 수 있다.
선언부
- <%! %>
선언부는 멤버 변수와 멤버 메서드를 선언하는 영역이다.
public을 붙였을 때 에러가 나는 것을 보아 이때 선언하는 것들은 지역 변수이다. 즉, 이는 어떤 메소드 영역의 지역 변수이다.
자바스크립트는 함수 안에 함수를 넣을 수 있었는데, 자바는 메소드 안에 메소드를 넣을 수 없다. test() 메소드를 만들 수 없는 이유도 이미 이 영역 자체가 어떤 영역의 구현부이기 때문이다.
이럴 때 사용할 수 있는 게 선언부이다.
<%!
int b = 20; //지역 변수(X), 클래스 멤버 변수(O)
public int sum(int a, int b) {
return a + b;
}
%>
<div><%= sum(10, 20)%></div>
이렇게 선언부를 사용할 수도 있지만, 가용성이 낮으므로 현실적으로는 적합하지 않은 방법이다.
일반 클래스 사용
package com.test.jsp;
public class MyMath {
public int sum(int a, int b) {
return a + b;
}
}
<%@page import="com.test.jsp.MyMath"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%!
int b = 20;
public int sum(int a, int b) {
return a + b;
}
MyMath m = new MyMath();
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<div><%= sum(10, 20)%></div>
<div><%= m.sum(10, 20)%></div>
</body>
</html>
선언부 대신에 일반 클래스를 사용해서 이용하면 다른 jsp 파일에서도 해당 메소드를 사용할 수 있다.
🍂액션 태그 (Action Tags)
기본 액션 태그
(추후 추가 예정)
확장 액션 태그
(추후 추가 예정)
사용자 정의 액션 태그
(추후 추가 예정)