JSP(JavaServer Pages) 개념 및 활용, 스크립트 기반 태그, 스크립트릿과 익스프레션

Yeppi's 개발 일기·2022년 5월 26일
1

Servlet&JSP

목록 보기
10/13
post-custom-banner

1. JSP

1) JSP 란

내부적으로 서블릿으로 변환되어 실행

  • 웹 애플리케이션에서 동적 컨텐츠를 만들기 위해 제공되는 기술
    → 서블릿과 동일

JSP 장점

  • 규칙이 없음
  • 소스 수정시 리로딩하지 않아도 됨
  • web.xml 이나 어노테이션 설정 안해도 됨

👉 서블릿의 단점이기도 함


서블릿 단점

  • 자바 코드 안에 디자인 코드가 있음(html, css . . )
  • 디자인 수정은 거의 불가능에 가까움

👉 서블릿은 구현 및 유지보수가 불편함

👉 서블릿의 단점을 보완한 것 = JSP



2) 🍑Servlet VS JSP VS HTML🍑

Servlet

  • 자바 코드 사이에 HTML 디자인이 포함되는 구조

JSP

  • HTML 디자인 사이에 자바 코드가 포함되는 구조
  • 디자인 친화적
  • 디자인 유지보수 간편
  • web.xml 파일에 등록 or @어노테이션 추가 안해도 됨
  • 소스 수정 시, 수정된 소스 반영될때까지 안기다려도 됨 = 리로딩 없음
  • <%@ page contentType="text/html; charset=UTF-8" %> 가 있으면 JSP

HTML

  • <%@ page contentType="text/html; charset=UTF-8" %> 가 없으면 HTML


3) JSP 실행

  • 서버는 브라우저 요청에 대한 JSP 파일을 찾은 후
    서블릿 클래스로 변환

  • 변환된 후
    서블릿 객체와 동일하게 서블릿 컨테이너에서 생성 및 관리


  • JSP 파일 생성
  • server.xml
<Context docBase="BoardWeb" **path="/"** reloadable="true" source="org.eclipse.jst.jee.server:BoardWeb"/></Host>
  • hello.jsp
<%@page contentType="text/html; charset=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>임시 제목</title>
</head>
<body>
	<center>
		<h1><%= request.getParameter("id")%>님 환영합니다.</h1>
    </center>
</body>
</html>

  • 해당 경로에 파일이 생기는 것을 확인할 수 있음
    • 아파치 톰캣서버가 알아서 생성 해줌
    • C:\FACAM_DEV\eclipse-workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\ROOT

  • hello_jsp.java
    • 서블릿 형식으로 코드를 열어서 보면?
      JSP 파일에 작성한 코드가 _jspService() 메서드 안으로 자동 등록됨
public final class hello_jsp extends HttpJspBase implements JspSourceDependent, JspSourceImports {

  public void _jspInit() {
  }

  public void _jspDestroy() {
  }

  public void _jspService(final HttpServletRequest request, final HttpServletResponse response) throws IOException, ServletException {

    final PageContext pageContext;
    HttpSession session = null;
    final ServletContext application;
    final ServletConfig config;
    JspWriter out = null;
    final Object page = this;
    JspWriter _jspx_out = null;
    PageContext _jspx_page_context = null;

    try {
      response.setContentType("text/html; charset=UTF-8");
      pageContext = _jspxFactory.getPageContext(this, request, response, null, true, 8192, true);
      _jspx_page_context = pageContext;
      application = pageContext.getServletContext();
      config = pageContext.getServletConfig();
      session = pageContext.getSession();
      out = pageContext.getOut();
      _jspx_out = out;

      out.write("\r\n");
      out.write("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\r\n");
      out.write("<html>\r\n");
      out.write("<head>\r\n");
      out.write("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\r\n");
      out.write("<title>임시 제목</title>\r\n");
      out.write("</head>\r\n");
      out.write("<body>\r\n");
      out.write("<center>\r\n");
      out.write("<h1>");
      out.print( request.getParameter("id"));
      out.write("님 환영합니다.</h1></center>\r\n");
      out.write("</body>\r\n");
      out.write("</html>");
      
    } catch (java.lang.Throwable t) {
    
    } finally {
    	
    }
  }
}


2. 스크립트 기반 태그 5가지

JSP가 제공하는 태그

태그형태의미
주석문(Comment)<%--  --%>특정 코드를 서블릿 변환에서 제외
지시자(Directive)<%@   %>서블릿 변환 과정에서 추가할 페이지 정보를 설정
스크립트릿(Scriptlet)<%     %>실행될 자바 코드를 작성
표현식(Expression)<%=    %>브라우저에 출력할 데이터를 설정
선언문(Declaration)<%!     %>변환된 서블릿의 멤버변수와 메소드를 선언


1) 주석문(Commont)

  • HTML 주석
    JSP 파일이 서블릿으로 변환될 때 서블릿에 포함

  • JSP 주석
    서블릿으로 변환될 때 포함되지 않음

<!-- HTML 주석입니다. -->
<%-- JSP 주석입니다. --%>


2) 지시자(Directive)

JSP가 서블릿 클래스로 변환될 때 , 어떤 내용을 반영할지 지시할 때 사용

지시자 종류

지시자형태의미
page<%@ page      %>서블릿 변환 과정에서 추가할 페이지 정보를 설정
include<%@ include    %>다른 JSP의 코드를 특정 위치에 포함
taglib<%@ taglib     %>XML 기반의 태그를 사용할 수 있도록 선언


(1) page

개념

  • 매우 중요
  • <%@page %>
    • @page 사이는 띄어쓰지 않는 것을 권고
<%@page contentType="text/html; charset=EUC-KR" %>

속성

속성의미
isErrorPage현재 페이지가 에러 처리 전용 페이지임을 설정
errorPage에러가 발생했을 때 에러를 처리할 페이지를 지정
import변환된 서블릿 클래스에서 import할 클래스를 설정
session현재 페이지에서 세션 객체를 기본적으로 사용할 것인지 설정

isErrorPage와 errorPage

  • isErrorPage 속성값을 true 로 설정하면?
    → 서블릿 클래스로 변환될 때, exception 라는 변수가 자동으로 선언됨
    exception 변수에 JSP 에서 발생된 예외 객체가 자동으로 할당
  • 에러 전용 화면
isErrorPage="true"
  • 어떤 예외가 발생됐는 지 자동으로 알려줌
<h3><%= exception.getClass().getName() %> 발생!</h3>

📌isErrorPage 실습📌

  • web.xml
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  • boardError.jsp
<center>
<h3><%= exception.getClass().getName() %> 발생!</h3>
<hr>
	<% StackTraceElement[] elements = exception.getStackTrace(); %>
	예외 위치 : <%= elements[0].toString() %>
</center>
  • 구 hello.jsp 현 index.html
<%@page contentType="text/html; charset=UTF-8" 
	errorPage="errors/boardError.jsp"%>
<!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>임시 제목</title>
</head>
<body>
<center>
<h1><%= request.getParameter("id").toString()%>님 환영합니다.</h1></center>
</body>
</html>

📌session 실습📌

  • session 속성은 기본이 true이므로 생략해도 결과는 동일
session="true"
  • JSP 파일이 서블릿으로 변환될 때
    seesion 변수에는 HttpSession 객체가 자동으로 할당
    ⇒ 해당 객체 자유롭게 사용 가능
  • index.jsp
<%@page contentType="text/html; charset=UTF-8" 
	errorPage="errors/boardError.jsp" session="true" %>
<!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>임시 제목</title>
</head>
<body>
	<center>
		<h1><%= request.getParameter("id").toString()%>님 환영합니다.</h1>
		세션 아이디 : <%= session.getId() %>
	</center>
</body>
</html>




(2) include

개념

  • 다른 JSP 결과를 포함시킴
  • 구성
    Header 공통메뉴
    Contents 내용
    Footer 사이트 정보
  • 반복되는 페이지를 여러개로 분리하여 작성 가능

📌include 실습📌

  • header.jsp
<%@ page contentType="text/html; charset=UTF-8" 
         errorPage="errors/boardError.jsp"%>
<!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>게시판 프로그램</title>
</head>
<body>
<hr>
	<a href="#">Home</a>&nbsp;&nbsp;&nbsp;
	<a href="#">회원가입</a>&nbsp;&nbsp;&nbsp;
	<a href="#">로그인</a>&nbsp;&nbsp;&nbsp;
<hr>
<br>
  • footer.jsp
<%@ page contentType="text/html; charset=UTF-8"%>
. . .
<br>
<hr>
<br>
<center>
	문의 전화 : 02-1234-5678<br>
	주소 : 서울시 강남구 짱구대로 999
</center>
  • index.jsp
<%@page contentType="text/html; charset=UTF-8" errorPage="errors/boardError.jsp"%>
<%@include file="../layout/header.jsp"%>

<center>
	<h1><%=request.getParameter("id") %>님 환영합니다.</h1>
</center>

<%@include file="../layout/footer.jsp"%>
  • 브라우저 결과


🧐선언문 Declaration 사용 여부🧐

선언문은 사용하지 않는다

  • JSP 파일이 서블릿으로 변환될 때 or 멤버변수나 메소드를 선언할 때 사용
  • _jsp Service() { } 안쪽으로 모든 코드가 들어감
    → jsp에서 선언한 변수는 무조건 로컬변수로 선언됨
  • 원래 멤버변수 또는 독립된 변수로 사용하고 싶을 때 선언문을 사용하는데
    선언문은 로컬변수로 선언되므로 거의 사용할 일이 없음


3. 스크립트릿(Scriptlet)와 익스프레션(Expression)

스크립트는 실행할 자바코드 감쌀때
익스프레션은 변수에 저장된 값 or 메서드가 리턴한 값을 브라우저 특정 위치에 출력할 때

1) 문법

  • 스크립트
<% %>
  • 익스프레션
    • 세미 콜론 사용하지 않음
<%=  변수  %>
<%=  메소드호출  %>
  • import 는 ctrl+space

3) 📌예시📌

  • index.jsp
    • 익스프레션 <td><%**=**board.getSeq()%></td>
    • 해당 위치에 제목 출력 <a href="getBoard.jsp"><%=board.getTitle()%></a>
<%@page import="java.util.List"%>
<%@page import="com.ssamz.biz.board.BoardDAO"%>
<%@page import="com.ssamz.biz.board.BoardVO"%>
<%@page contentType="text/html; charset=UTF-8"
	errorPage="errors/boardError.jsp"%>

<%@include file="../layout/header.jsp"%>

<%
// Scriptlet : 정상적인 자바 코드가 작성되는 영역
// 1. DB 연동 처리
BoardVO vo = new BoardVO();
BoardDAO dao = new BoardDAO();
List<BoardVO> boardList = dao.getBoardList(vo);

// 2. 응답 화면 구성
%>

<center>
	<table border="1" cellpadding="0" cellspacing="0" width="700">
		<tr>
			<th bgcolor="orange" width="100">번호</th>
			<th bgcolor="orange" width="200">제목</th>
			<th bgcolor="orange" width="150">작성자</th>
			<th bgcolor="orange" width="150">등록일</th>
			<th bgcolor="orange" width="100">조회수</th>
		</tr>

		<% for (BoardVO board : boardList) { %>
		<tr>
			<td><%=board.getSeq()%></td>
			<td align="left"><a href="getBoard.jsp"><%=board.getTitle()%></a></td>
			<td><%=board.getWriter()%></td>
			<td><%=board.getRegDate()%></td>
			<td><%=board.getCnt()%></td>
		</tr>
		<% } %>
	</table>
</center>

<%@include file="../layout/footer.jsp"%>
  • 브라우저 실행 결과

profile
imaginative and free developer. 백엔드 / UX / DATA / 기획에 관심있지만 고양이는 없는 예비 개발자👋
post-custom-banner

0개의 댓글