목차
- Servlet(서블릿)
- JSP
서블릿은 JSP 표준이 나오기 전에 만들어진 표준으로, Java에서 웹 어플리케이션을 개발할 수 있도록 하기 위해 만들어졌다. Java 클래스를 웹에서 호출 및 실행할 수 있도록 하는 표준이다.
Javax.servlet.http.HttpServlet
클래스로부터 상속받아서 작성할 수 있다.Javax.servlet.http.HttpServlet
클래스는 톰캣의 servlet-api.jar
에 포함되어 있다.
(1) 서블릿 규칙에 따라 Java 코드 작성
(2) 자바 코드를 컴파일 하여 클래스 파일 생성
(3) 서블릿 3.0부터는 @WebServlet
어노테이션을 사용
(4) 톰캣 등의 웹 컨테이너를 실행
요청 방식에 따라 doGet
이나 doPost
메서드를 재정의하여 처리하고, Service
메서드를 재정의하여 사용할 수도 있다.
cf. 세부사항
request
객체를 이용하여 웹 브라우저의 요청 정보를 읽어온다.response
객체를 이용한다.response
객체의 setContentType()
메서드를 이용하여 데이터 타입과 인코딩 방식을 지정해 준다.PrintWriter
객체의 getWriter()
메서드를 호출하여 문자열 데이터를 출력한다.[week02]라는 package 생성 후 해당 package 선택 후 "HelloServlet"이라는 이름으로 서블릿 생성
Source
package week02;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/HelloServlet")
public class HelloServlet extends HttpServlet { // HttpServlet 상속받아짐. ttpServlet 메서드를 재정의(override)
private static final long serialVersionUID = 1L;
public HelloServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out = response.getWriter();
out.println("<html><body>");
out.println("<h1>Hello Servlet</h1>");
out.println("</body></html>");
out.close();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
실행 결과
?
로 구분)<a>
태그를 이용하여 페이지를 요청하는 경우,<form>
태그에서 명시적으로 GET
방식으로 요청하는 경우에 사용된다.<form>
태그에서 명시적으로 POST
방식으로 요청하는 경우에 사용된다.(1) Get 방식을 이용하여 서블릿 호출하기 (HTMl 문서에서 서블릿을 호출)
Source
HelloWorld_get.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action = "HelloWorld" method = "get">
<br>
<h1> Get 방식으로 부르는 페이지입니다. </h1>
<br>
<input type = "submit" value = "확인">
</form>
</body>
</html>
HelloWorld.java
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out = response.getWriter();
out.println("<html><body>");
out.println("<h1> Hello Wrold Servelt doGet() Page </h1>");
out.println("</body></html>");
out.close();
}
실행 결과
(2) Post 방식을 이용하여 서블릿 호출하기. (매개변수를 본문에 포함시켜 호출.)
HelloWorld_post.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action = "HelloWorld" method = "post">
<br>
<h1> Post 방식으로 부르는 페이지입니다. </h1>
<br>
<input type = "submit" value = "확인">
</form>
</body>
</html>
HelloWrold.java
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out = response.getWriter();
out.println("<html><body>");
out.println("<h1> Hello Wrold Servelt doPost() Page </h1>");
out.println("</body></html>");
out.close();
}
실행 결과
doGet, doPost 메서드 내에 response.setContentType("text/html;charset=utf-8");
적어주면 한글로도 나온다...
(1) HTML 문서에서 서블릿으로 데이터를 전송
Source
addrGet.html
<!DOCTYPE html>
<!-- Servlet 호출 예제 3 - HTML문서에서 서블릿으로 데이터를 전송 -->
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action = "Address" method = "get">
이름 : <input type = "text" name = "name"><br>
주소 : <input type = "text" name = "addr"><br>
<input type = "submit" value = "확인">
</form>
</body>
</html>
Address.java
package week02;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/Address")
public class Address extends HttpServlet {
/* Address는 서블릿 클래스명.
접근지정자는 반드시 public이어야 함.
HttpSevlet을 상속받아야 함.
*/
private static final long serialVersionUID = 1L;
public Address() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
// 클라이언트에 응답할 페이지에 대한 환경설정.
String name = request.getParameter("name");
// name 변수명에 값이 저장되어 넘어온다.
String addr = request.getParameter("addr");
// addr 변수명에 값이 저장되어 넘어온다. text 타입으로 넘어오므로 String 타입으로 받음.
PrintWriter out = response.getWriter();
out.println("<html><body>");
out.println(name + " 님은 " + addr + "에 사시는군요.");
out.println("</body></html>");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
doGet(request, response);
}
}
실행 결과
Source
addrPost.html
<!DOCTYPE html>
<!-- Servlet 호출 예제 3 - HTML문서에서 서블릿으로 데이터를 전송 -->
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action = "Address" method = "post">
이름 : <input type = "text" name = "name"><br>
주소 : <input type = "text" name = "addr"><br>
<input type = "submit" value = "확인">
</form>
</body>
</html>
Address.java
는 위 소스코드와 동일함!
실행 결과
<form action = "Address" method = "get">
에서 "Address"는 @WebServlet 어노테이션으로 URL mpping 즉, 요청할 서블릿
이다.
<input type = "submit" vlaue = "확인"
에서 "submit"은 해당 버튼을 클릭하면 서블릿이 요청되는 것이다.
<input type = "text" name = "name">
에서 "text"는 전송되는 값의 데이터 타입으로, 보기와 같이 text인 경우에는 String 타입으로 전송된다. "name"은 해당 변수명에 값이 저장되어 서블릿으로 데이터가 전송되는 것이다.
잠깐!! 여기서 어노테이션...?
@WebServlet
서블릿 클래스의 요청을 위한 URL 매핑을 보다 쉽게 자바 클래스에서 설정할 수 있도록 제공되는 어노테이션인데, 어노테이션이란 문장이나 문서에 추가적인 정보를 기입하는 것이다. 자바 프로그램에 영향을 주는 것이 아니라, 컴파일 할 때 환경 설정을 변경해 줄 것을 알려 주는 주석 형태이다.
그렇다면 URL Mapping은 왜 필요한 걸까?
실제 서블릿 클래스명을 공개하지 않기 위함이다. 프로그램 개발자는 자신이 만든 서블릿 클래스의 위치를 알아야 하지만, 클라이언트는 URL을 입력하여 원하는 서비스만 얻으면 된다. 내부 경로나 파일명이 바뀌면 일일이 사용자에게 알려 주어야 하는데, URL 매핑을 이용하면, 내부 구조가 바뀌더라도 매핑 이름만 동일하면 URL 요청이 가능하다. 사용자에게 서블릿 구조와 파일명을 공개하는 것은 보안에 문제가 생길 수 있다.
Source
gugu.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1> 구구단 선택 </h1>
<form action = "Gugu" method = "get">
숫자: <select name = "number">
<option> 2 </option>
<option> 3 </option>
<option> 4 </option>
<option> 5 </option>
<option> 6 </option>
<option> 7 </option>
<option> 8 </option>
<option> 9 </option>
</select> <br><br>
<input type = "submit" value = "확인">
</form>
</body>
</html>
Gugu.java
package week02;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/Gugu")
public class Gugu extends HttpServlet {
private static final long serialVersionUID = 1L;
public Gugu() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset = utf-8");
int num = Integer.parseInt(request.getParameter("number"));
PrintWriter out = response.getWriter();
out.println("<html><body>");
out.println("<h3> 구구단" + num + "단</h3>");
for (int i = 1; i <= 9; i++ ) {
out.println(num + "*" + i + "=" + num*i + "<br>");
}
out.println("</body></html>");
out.close();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
실행 결과
앞장에서 말했듯 서블릿의 단점을 보완하기 위한 스크립트 방식의 표준으로, 서버 쪽 모듈을 개발하기 위한 기술이다.
<%@ page contentType = "text/html;charset=eue-kr"%>
<html>
<head>
<title> Title </title>
<body>
<%
int total = 0;
for (int i = 0; i <= 100; i++) {
total += i;
}
%>
1부터 100까지 더한 값 : <%= total %>
</body> </html>
(1) JSP에 해당하는 서블릿이 존재하지 않을 경우 (과정 1.1)
(a) JSP 페이지로부터 자바코드를 생성한다. (과정 1.2)
(b) 자바 코드를 컴파일하여 서블릿 클래스를 생성한다. (과정 1.3)
(c) 서블릿에 클라이언트 요청을 전달한다. (과정 2.1)
(d) 서블릿이 요청을 처리한 결과를 응답으로 생성한다. (과정 2.2)
(e) 응답을 웹 브라우저에 전송한다. (과정 3)
(2) JSP에 해당하는 서블릿이 존재하는 경우 (과정 1.1~1.3을 이미 거친 경우)
(a) 서블릿에 클라이언트 요청을 전달한다. (과정 2.1)
(b) 서블릿이 요청을 처리한 결과를 응답으로 생성한다. (과정 2.2)
(c) 응답을 웹 브라우저에 전송한다. (과정 3)
<!DOCTYPE ....>
이전<!DOCTYPE ....>
이후1. 디렉티브(Directive) : 지시자
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@
로 시작하여 %>
로 끝난다. JSP 페이지에 대한 정보를 지정하며, JSP가 생성하는 문서의 타입, 출력 버퍼의 크기, 에러 페이지 등을 지정한다. JSP 페이지에서 필요로 하는 정보를 설정한다.
2-1. 스크립트 - 스클립틀릿
<%
int total = 0;
for (int i = 0; i <= 100; i++) {
total += i;
}
%>
<%
로 시작하여 %>
로 끝난다. JSP 페이지에서 java 코드를 실행할 때 사용된다.
2-2. 스크립트 - 표현식
1부터 100까지 더한 값 : <%= total %>
// <%= total +100 %> 이런 표현식도 가능
// <%= Math.sqrt(total) %> 얘도 가능
<%=
로 시작하여 %>
로 끝난다. 사이에 자바식이 들어갈 수 있고, 상수나 변수 이름 하나로 구성될 수도 있다. 또, 연산자를 포함할 수 있고, return 값이 있는 메서드 호출이 가능하다.
2-3. 스크립트 - 선언부
<%!
public int sum(int x, int y) {
return x + y;
}
%>
<%!
로 시작하여 %>
로 끝난다. 사이에 자바 메서드 작성이 가능하다. 선언부의 함수는 자바 메서드 문법 구조와 동일하다.
Source
mul.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>
<%!
public int mul(int x, int y) {
return (x * y);
}
%>
<h1> 두 수의 곱 구하기 </h1>
<h2> 13 * 18 = <%= mul(13, 19) %></h2>
</body>
</html>
실행 결과
Source
cal.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1> 두 수를 입력하세요. </h1>
<form action = "calResult.jsp" method = "post">
숫자 1 : <input type = "text" name = "num1"><br>
숫자 2 : <input type = "text" name = "num2"><br><br>
<input type = "submit" value = "확인">
</form>
</body>
</html>
calResult.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>
<%
int num1 = Integer.parseInt(request.getParameter("num1"));
int num2 = Integer.parseInt(request.getParameter("num2"));
%>
<h2> 사칙연산 결과 </h2>
<%= num1 %> + <%= num2 %> = <%= num1 + num2 %> <br>
<%= num1 %> - <%= num2 %> = <%= num1 - num2 %> <br>
<%= num1 %> * <%= num2 %> = <%= num1 * num2 %> <br>
<%= num1 %> / <%= num2 %> = <%= num1 / num2 %> <br>
</body>
</html>
실행 결과