JSP, Servlet 설정, 사용법

톰켓설정

  • JavaEE 설정
  • Window-Preperence 메뉴 클릭
  • Server-Runtime Environments 메뉴에서 톰캣버전 설정, 톰켓 폴더 설정
  • propertis-Project Facets-Runtimes에서 톰캣 체크.그러면 톰켓 lib가 추가됨

톰켓 라이브러리 추가

  • 프로젝트 선택 후 오른쪽 마우스 클릭-Properties
  • Project Facets-Runtimes
  • Apach Tomcat 체크하고 Apply

인코딩 설정

  • Web-HTML Files - Encoding UTF-8
  • Web-JSP Files - Encoding UTF-8

프로젝트 생성

  • Dynamic Project 만들 때 XML 생성체크하기
  • (NEXT, NEXT 클릭하면 XML 생성 체크박스 있음)

웹 어플리케이션

  • 웹을 기반으로 실행되는 프로그램
  • 단순 화면을 출력하는게 아니라, 어떤 동작에 대한 처리를 한다(WAS:Web Application Server)
  • Servlet과 JSP는 J2EE를 구성하는 기술 중 하나
  • 컨테이너 (WSA, Servlet, JSP) WAS 기반으로 돌아가는 것을 의미
  • WAS가 Servlet을 초기화,생성, 실행한다
  • 서비스 API (JDBC, JTA, JMS, JNDI, XML…)

Servlet, JSP

  • Servlet은 자바코드 기반에서 HTML이 들어가있다(WEB 페이지 만들기가 어렵다)
  • 그래서 만들어진 것이 JSP. HTML안에 자바코드가 들어가있다
  • 서블릿, JSP는 같다. 밀접한 관계(WAS가 JSP를 서블릿으로 변경해준다)
  • Servlet은 비즈니스 로직을 처리
  • JSP는 출력된 결과 처리

서블릿 클래스 작성

  • HttpServlet 클래스를 상속해서 class를 만들어야 한다
  • 서블릿 클래스=>서블릿객체=>서블릿
  • 멀티 스레드에서는 데이터 관리를 신경써야 한다
  • request : 요청
  • response : 응답

JSP 작성

  • 자바코드는 ‘<%’로 시작한다
  • Java코드(처리)와 JSP가 섞이면 복잡하므로 처리부분은 Servlet에서 작성한다
<%@ page import ="java.text.SimpleDateFormat" %>
<%@ page import ="java.util.Calendar" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"  "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>JSP예제</h1>
<%
       Calendar date = Calendar.getInstance();
       SimpleDateFormat today =
                    new SimpleDateFormat("YYYY년 MM월 DD일");
%>
오늘은 <%=today.format(date.getTime()) %>
</body>
</html>
  • E:\work\jsp_work.metadata.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\Servers\org\apache\jsp\JSP
  • 위는 실제 실행되는 java파일 위치
  • JSP가 java파일로 변환되었고 그 파일이 실제로 실행됨

JSP, Servlet 예제

  • form.jsp에서 주는 값 2개를 FormServlet.java에서 받아서 결과계산 후 다시 result.jsp url을 요청해서 결과값을 넘겨준다
  • form.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"  "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- action위치는 Project명/Servlet파일명 -->
<form action="/Servers/FormServlet" method="post">
숫자1:<input type="text" name="num1">
숫자2:<input type="text" name="num2">

<input type="submit" value="계산">
</form>
</body>
</html>
  • FormServlet.java
  • Post방식으로 호출했으므로 doPost 함수가 호출됨
    import java.io.IOException;
    import javax.servlet.RequestDispatcher;
    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("/FormServlet")
    public class FormServlet extends HttpServlet {
         private static final long serialVersionUID = 1L;
           
      public FormServlet() {
          super();
      }
      protected void doPost(HttpServletRequest request, HttpServletResponse  response) throws ServletException, IOException {
         request.setCharacterEncoding("utf-8");
         int num1 = Integer.parseInt(request.getParameter("num1"));
         int num2 = Integer.parseInt(request.getParameter("num2"));
         int result = num1 + num2;
         request.setAttribute("result", result);
      // jsp가 위치한 폴더이름/jsp파일이름
         RequestDispatcher re = request.getRequestDispatcher("/JSP/result.jsp");
         re.forward(request, response);
         }
    }
    
  • result.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"  "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
       결과:${result}
</body>
</html>

redirect, dispatcher

  • Dispatcher는 A->B->C로 요청이 들어가면 B->C로 이동할 때 url이 C로 바뀌지 않고 B url 그대로 있다
  • Dispatcher는 url을 기존 그대로 사용한다. 같은 요청이므로 데이터를 사용할 수 있다
  • redirect는 다른 요청이므로 데이터를 사용할 수 없다. url도 다르다
  • 그래서 redirect 사용 시 데이터의 값이 출력되지 않는다. 데이터를 사용하지 못하기 때문
// dispatcher
RequestDispatcher re = request.getRequestDispatcher("/JSP/result.jsp");
re.forward(request, response);
// redirect
response.sendRedirect("JSP/result.jsp");