백엔드 프로그래밍

백엔드 (4) - JSP(Java Server Page)

hyovvely 2021. 12. 30. 23:36

JSP (Java Server Page)

JSP와 Servlet (서블릿)

JSP (Java Server Pages)

  • HTML 내에 Java 언어를 삽입함 문서
  • jsp

Servlet (Server + Applet)

  • Java 언어로 이루어진 웹 프로그래밍 문서
  • 자바 코드에 의존적
  • .java

JSP (Java Server Page)

  • Java 기반
  • HTML 문서 내에 자바 코드를 삽입해서
  • 웹 서버에서 동적으로 웹 페이지를 생성해서 클라이언트(웹 브라우저)에게 반환해 주는 언어
  • 서버 사이드 스크립트 언어
  • JSP를 통해 HTML과 동적으로 생성된 컨텐츠(DB 연동된 실시간 데이터)를 혼합해서 사용 가능
  • Servlet을 보완한 스크립트 방식 표준 언어
  • Servlet 기능 + 추가 기능
  • JSP(.jsp)는 실행되면서 Servlet(.java)으로 변환되어 컴파일 되서 클래스 파일(.class) 파일로 만들어져 실행
  • View를 담당하는 페이지로 사용
  • 점차 JSP 페이지에서 자바 코드가 사라지고 있는 추세
    • El과 JSTL로 표현

JSP와 Servlet(서블릿) 차이점

  • JSP : HTML 내부에 Java 소스 코드가 들어 있는 형식 (사용하기 편리하고 쉬움)
  • Servlet : Java 코드 내에 HTML 코드가 들어 있어서 읽고 쓰기 불편

JSP 페이지 구조

JSP = 정적 페이지 + 동적 페이지

정적 페이지 구현 : HTML 태그

동적 페이지 구현

  • <%@ %>
  • <% %>
  • <%! %>
  • <%= %>
  • 등의 스크립트 사용

JSP 페이지 인코딩 설정

Window / Preferences
General / Workspace 
오른쪽 하단에서 Other : UTF-8
[Apply]
Web / JSP Files
Encoding : ISO 10626/Unicode(UTF-8)
프로젝트 생성 (Dynamic Web Project)
JSP01
JSP 파일 생성

JSP 파일 생성/실행하고 웹 브라우저에서 확인

JSP 파일은 .java 파일로 변환 생성되고, 
컴파일되서 .class 파일 생성되어 실행
java와 class 파일 위치
C:\webWorkspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\JSP01\org\apache\jsp
JSP 파일 내용을 변경하고 실행했는데 결과가 반영되지 않는 경우 java와 class 파일 삭제하고 다시 실행

JSP 템플릿 만들기

JSP 태그

  • <% 로 시작하고 %> 로 종료
  • @, !, =, – 문자를 추가하여 태그의 의미 부여

JSP 페이지의 기본 구성 요소

JSP 페이지 내용

  • HTML 문서 내용 + JSP 태그 + 자바 코드

JSP 페이지 구성

  • 지시어 : page, include, taglib
  • 스크립트 요소
    • 선언문 (Declaration)
    • 표현식 (Expression)
    • 스크립트릿 (Scriptlet)
  • 액션 태그

지시어

  • JSP 페이지의 전체적인 속성을 지정할 때 사용
  • JSP 컨테이너에게 전달하는 JSP 페이지 관련 메시지
  • <%@ 지시어 속성1=값, 속성2=값, … %>
  • page, include, taglib 등 사용

page 지시어 : <%@ page %>

  • JSP 페이지에 대한 속성 설정
  • language="java"
  • contentType="text/html; charset=UTF-8"
  • pageEncoding="UTF-8"

include 지시어 : <%@ include %>

  • <%@ include file=”포함될 파일의 url” %>
  • 포함시킬 파일명을 file 속성의 값으로 기술
  • 공통적으로 포함될 내용을 가진 파일을 해당 JSP 페이지 내에 삽입하는 기능 제공
  • 중첩 지정 가능
    • 한 JSP 페이지에서 다른 JSP 페이지를 포함하거나
    • 포함된 JSP 페이지가 또 다른 JSP 페이지에 중첩 포함 가능
  • 두 개의 파일이 하나의 파일로 합쳐진 후 하나의 파일로서 변환되고 컴파일

tagline 지시어 : <%@ taglia %>

  • <%@ taglib prefix = “c” url =”…….” %>
  • 커스텀 태그를 JSP 페이지 내에 사용할 때 이용
  • 뒤에서 상세하게 다룸

JSP 페이지의 스크립트 요소

  • 선언문 (Declaration)
  • 표현식 (Expression)
  • 스크립트릿 (Scriptlet)

선언문 (Declaration)

  • JSP 페이지의 멤버 필드(변수)나 메소드를 정의할 때 사용
  • 선언문에서 선언된 변수는 페이지 전체에서 사용 (전역변수의 의미)
  • 형식 : <%! 선언 %>
  • 예 : <%! int a = 10; %>
  • <%!
    int x = 100;
    String str = “문자열”;
    // String name= “홍길동”;
          %>

표현식 (Expression)

  • 변수 값, 계산 결과, 메소드 호출 결과를 직접 출력하기 위해 사용
  • 형식 : <%= 수식 %>
    • <%= 변수 %>
  • 예 :
    • <%= 3*5 %>
    • <%= name %>

스크립트릿 (Scriptlet)

  • 자유롭게 자바 코드를 기술할 수 있는 영역
  • <% 자바코드 %>
  • 스크립트릿에서 선언된 변수는 지역변수의 개념
    • 선언된 이후부터 사용 가능
    • <% String address = “경기”; %>

변수 선언 예제 : variable.jsp

<body>
<%
// 선언
// 변수 선언 및 초기화만 가능 
int x = 10;// 변수 선언 및 초기화 // 선언과 동시에 값을 지정하는건 가능 
long y;// 변수 선언만

// y = 100;// 이 경우 오류 (선언부에서는 값을 지정할 수 없음. 선언과 동시에 초기화만 가능)

float floatValue = 3.14f;
double doubleValue = 3.14;

char ch = 'a';
String myJob = "프로그래머";

boolean b = true;
%>
<%
String name = "홍길동";
y = 100; // 스크립트 영역에서 값 지정하면 됨 
%>

<h3>변수 값 출력</h3>
x : <%= x %><br>
y : <%= y %><br>
floatValue : <%= floatValue %><br>
doubleValue : <%= doubleValue %><br>
ch : <%= ch %><br>
   myJob : <%= myJob %><br>
   b : <%= b %><br>
   name : <%= name %>
</body>

메소드 선언 : 반드시 선언부에서 정의 (<%옆에 !가 선언부 정의 !!)

  • 스크립트릿 영역에서 정의(선언) 안 함
<%!
String id = "abcd";

// 메소드는 반드시 선언부에서 정의
public String getId() {
return id;
}
%>

표현식 예제 : expression.jsp

<body>
<%!
int add(int a, int b){
return a*b;
}
int x=10, y=20;
%>
x= <%= x %><br>
y= <%= y %><br>
add(x,y)= <%= add(x,y) %><br>
</body>

include 지시어

  • <%@ include file=”포함될 파일의 url” %>
  • 포함시킬 파일명을 file 속성의 값으로 기술
  • (공통적으로) 포함될 내용을 가진 파일을 해당 JSP 페이지 내에 삽입하는 기능

include 지시어 예제

  • top.jsp
  • bottom.jsp
  • jspInclude.jsp (top.jsp와 bottom.jsp include 시킴)
<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
  <%@ page import="java.util.*" %> <!-- 자바처럼 import 필수! -->
<%
Date date = new Date();
%>
<font color='blue' size='3pt'>
top.jsp 입니다 <p/>
<%= date.toLocaleString() %>
</font>
<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
<font color='pink' size='3pt'>
bottom.jsp 입니다 <p/>
작성자 <b><%= name %></b> 입니다
<!-- name : 선언되지 않은 변수이기 때문에 오류 발생 -->
<!-- 다른 페이지에 포함되어서 선언되어 있는 name 변수 사용 시 -->
</font> 
<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
<%!
String name = "홍길동";
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSP include 지시어 예제</title>
</head>
<body>
<!-- top -->
이 부분에 top.jsp의 내용이 포함될 것입니다 <p>
<%@ include file="top.jsp" %>
<hr>
<!-- 본문 -->
<h3>본문</h3>
이 부분은 include.jsp의 내용입니다 <p>

<hr>
<!-- bottom -->
이 부분에 bottom.jsp의 내용이 포함될 것입니다 <p>
<%@ include file="bottom.jsp" %>

</body>
</html>

필요한 부분만 넣어서 하나의 html처럼 표시 가능!!!!!!!!

페이지소스 볼때는 ?!

주석

  • HTML 주석 : <!-- -->
  • JSP 주석 : <%-- --%>
  • 자바 주석 : //, /* */
    •  

JSP 내장 객체

  • 클라이언트에서 웹 서버에 JSP 페이지를 요청하면 자동으로 생성
  • 객체 생성하지 않고 바로 사용 가능

내장 객체 종류

  • 입출력 : request / response / out
  • 서블릿 : page /config
  • 컨텍스트 : session / application / pageContext
  • 예외 처리 : exception

request 객체

  • 클라이언트(웹 브라우저)의 요청 정보를 전달하기 위한 객체
  • 주로 클라이언트에서 전송된 쿼리 문자열, 쿠키 정보, 다른 페이지에서 전송된 값에 대한 정보 등을 추출할 수 있는 메소드 제공

request 메소드

  • 클라이언트 요청 관련 메소드
  • 파라미터 관련 메소드
  • HTTP 헤더 관련 메소드

request 객체 예제 : request.jsp

<body>
<%
out.println("서버 : " + request.getServerName() + "<br>");
out.println("포트 번호 : " + request.getServerPort() + "<br>");
out.println("요청 방식 : " + request.getMethod() + "<br>");
out.println("프로토콜 : " + request.getProtocol() + "<br>");
out.println("URL : " + request.getRequestURL() + "<br>");
out.println("URI : " + request.getRequestURI() + "<br>");
out.println("ContextPath : " + request.getContextPath() + "<br>");
out.println("ServletPath : " + request.getServletPath());
%>
</body>

request 객체 파라미터 관련 메소드

가장 많이 사용되는 중요한 메소드
<input type="text" name="address">
HTML 태그의 name 속성 값을 받음

request 객체 파라미터 관련 메소드 예제 (중요!!!)

requestForm.jsp (join.html 복사해서 사용)
requestFormOk.jsp

중요!!!

requestForm.jsp (join.html 복사해서 사용)
requestFormOk.jsp
실행 순서
requestForm.jsp 실행하고
데이터 입력 후 
[완료] 버튼 클릭
결과 출력
주의!!!
requestFormOk.jsp 부터 실행하지 않음
데이터가 전송되지 않으면 String 변수는 오류 없이 null 값이 출력되지만
배열에서 index 참조할 때 NullPointer 오류 발생
오류 유형
404 : 페이지 없음 (jsp 페이지가 없거나 매핑 페이지 없는 경우 발생)
<form> 태그의 action 속성에 있는 jsp 파일명부터 확인
500 : 문법적 오류 (자세히 보면 오류 나는 행 번호가 있음 - 행 번호 찾아서 오류 해결)

response 객체

  • JSP 페이지에서 처리한 결과를 웹 브라우저에게 응답할 때 사용
  • 헤더 설정, 코드 상태, 쿠키 등의 정보 포함
  • 응답 컨텐츠 설정, 응답 헤더 설정, 상태 코드 설정 등과 관련된 메소드 제공

response 객체 예제

response.jsp : 데이터 입력 폼
“대한민국의 수도는?” 
입력 데이터 : 서울
responseOk.jsp 
데이터 전달 받아서 작업 수행 후 결과를 sendRedirect() 
맞으면 : pass.jsp로 sendRedirect() 
틀리면 : fail.jsp로 sendRedirect() 
pass.jsp
fail.jsp
실행 시작 : response.jsp
<form method="post" action="responseOK.jsp">
대한민국의 수도는 ?
<input type = "text" name="answer" size="10">
<input type = "submit" value="전송">
</form>
<title>JSP responseOK</title>
</head>
<body>
<%
request.setCharacterEncoding("utf-8");
String answer = request.getParameter("answer");

// "서울"이면 reponse.sendRedirect("pass.jsp")
if(answer.equals("서울")){
response.sendRedirect("pass.jsp");
} else{
response.sendRedirect("fail.jsp");
}

%>

 


out 객체

  • 웹 서버에서 웹 브라우저에게 출력 스트림으로 응답하기 위해 사용
  • out.println(“출력 문자열”);
  • 표현식(<%= 출력 문자열 %>)과 동일

전송되는 데이터의 타입

  • 모두 문자열
    • String answer = request.getParameter("answer");
  • 숫자 연산을 할 경우 숫자형으로 형변환 필요
  • Integer.parseInt(문자열 변수)
  • Integer.parseInt(answer )
  • Int a = Integer.parseInt(request.getParameter("answer"))

형변환 예제

  • typeConversion.jsp
    • 가로 길이, 세로 길이 숫자 입력
  • typeConversionOK.jsp
    • 문자열로 전달 받은 데이터를 숫자형으로 형변환하고 넓이 계산하여 출력
    • 사각형의 넓이 출력

JSP의 제어문 (Java와 동일)

  • if 문
  • for 문
  • while 문

for문 연습문제

  • forForm.jsp
    • 구구단 단 입력
  • forResult.jsp
    • 입력 받은 단 출력
    • 테이블 행으로 출력
      • 7 단
      • 7 * 1 = 7
      • 7 * 2 = 14

액션 태그

  • JSP 페이지 내에서 어떤 동작을 지시하는 태그
  • 기능
    • 어떤 동작 또는 액션이 일어나는 시점에 페이지와 페이지 사이에서의 제어 이동
    • 다른 페이지의 실행 결과를 현재 페이지에 포함
  • 종류
    • include
    • forward
    • useBean
    • setProperty
    • getProperty

include 액션 태그 : jsp:include

  • 다른 페이지의 실행 결과를 현재 페이지에 포함시킬 때 사용

forward 액션 태그 : jsp:forward

  • 현재 페이지에서 다른 특정 페이지로 전환
  • 웹 페이지 간의 제어를 이동시킬 때 사용

param 액션 태그 : jsp:param

  • 이동하는 페이지에 파라미터 값을 전달할 때 사용

useBean 액션 태그 : jsp:useBean

  • 자바빈을 JSP 페이지에서 사용할 때 사용

setProperty 액션 태그 : jsp:setProperty

  • 프로퍼티(변수) 값을 세팅할 때 사용

getProperty 액션 태그 : jsp:getProperty

  • 프로퍼티의 값을 얻어낼 때 사용 (getter)

include 액션 태그 : jsp:include

  • 다른 페이지의 실행 결과를 현재 페이지에 포함시킬 때 사용
  • 페이지를 모듈화 할 때 사용
  • <jsp:include page="포함될 페이지" flush="true" />
    • page 속성 : 결과가 포함될 페이지명
    • fulsh 속성
      • 포함될 페이지로 제어가 이동될 때 현재 포함하는 페이지가 지금까지 출력 버퍼에 저장한 결과를 처리하는 방법을 결정
      • true : 현재 페이지가 지금까지 버퍼에 저장한 내용을 웹 브라우저에 출력하고 버퍼를 비움

include 액션 태그 예제

includeAction1.jsp
includeAction2.jsp
includeAction1.jsp에 includeAction2.jsp를 포함시킴
includeAction1.jsp 실행
<h3> includeAction1.jsp 입니다</h3>
<hr>
<jsp:include page = "includeAction2.jsp" flush=" true"/>


forward 액션 태그 : jsp:forward

  • 현재 페이지에서 다른 특정 페이지로 전환
  • 웹 페이지 간의 제어를 이동시킬 때 사용
  • <jsp:forward page=”포워딩할 JSP 페이지”>
  • forward 액션 태그 예제
    • login.jsp
      • 처음 실행 시 제목 : 로그인
    • loginResult.jsp
      • ID를 입력하지 않은 경우 다시 login.jsp로 forward
        • 로그인 자리에 "아이디를 입력하지 않았습니다. 아이디를 입력해 주세요" 출력
<body>
<%-- <%
String user_id = request.getParameter("user_id");
   // null 인 경우에 오류 없이 null 로 출력
   // null로 뭔가를 하려고 하면 NullPointerException 오류 발생
%>
<%= user_id.length() %> --%>
<%
String user_id = request.getParameter("user_id");
   if(user_id == null){
%>
<h2>로그인</h2>
<%
   }else {
%>
<h2>아이디를 입력하지 않았습니다. 아이디를 입력해 주세요.</h2>
<%
   }
%>
 <form name="frmLogin" method="post" action="loginResult.jsp" >
   아이디 :<input type="text" name="user_id"><br>
     비밀번호:<input type="password" name="user_pw" ><br>
   <input type="submit" value="로그인"> <input type="reset" value="다시입력">
 </form>
<body>
<%
request.setCharacterEncoding("utf-8");
// ID 받아와서 ID 입력하지 않았으면 login.jsp 로 forward
String user_id = request.getParameter("user_id");
if(user_id.length() == 0){
%>
<jsp:forward page="login.jsp" />
<%
}
%>

<h2>환영합니다 <%= user_id %>님!</h2>
</body>

param 액션 태그 : jsp:param

  • forward 및 include 액션 태그에서 데이터를 전달하기 위해 사용
  • name과 value로 구성
  • <jsp:param name=”id” value=”abcd” />
  • param 액션 태그로 전달된 값 받을 때
    • request.getParameter(“id”)
  • 예제
    • paramLogin.jsp
    • paramLoginResult.jsp
<%
request.setCharacterEncoding("utf-8");
String msg = request.getParameter("msg");
if(msg == null){
%>
<h3>로그인</h3>
<%
} else {
%>
<h3><%= msg %></h3>
<%
}
%>
<form name="frmLogin" method="post" action="paramResult.jsp" >
   아이디 :<input type="text" name="user_id"><br>
     비밀번호:<input type="password" name="user_pw" ><br>
   <input type="submit" value="로그인"> <input type="reset" value="다시입력">
<%
request.setCharacterEncoding("utf-8");
String msg = "아이디를 입력하지 않았습니다. 아이디를 입력해 주세요.";

String user_id = request.getParameter("user_id");
// user_id 값이 비었으면 paramLogin.jsp로 포워딩. msg 전송
if(user_id.length() == 0){
%>
<jsp:forward page="paramLogin.jsp">
<jsp:param name="msg" value="<%= msg %>" />
</jsp:forward>
<%
}
%>

<h3>환영합니다. <%=user_id %>님!!!</h3>

자바 빈 (JavaBeans)

  • DTO / VO와 같은 개념
  • 데이터를 다루기 위해 자바로 작성되는 소프트웨어 컴포넌트로 재사용 가능
  • 입력 폼의 데이터와 데이터베이스의 데이터 처리 부분에서 활용
  • 클래스로 만들어지고
    • 멤버 필드(변수)로 속성(property)이 있고
    • 멤버 메소드로 Getter/Setter 메소드 포함
    • setXXX() : 프로퍼티에 값 저장
    • getXXX() : 프로퍼티 값 반환
  • 액션 태그를 이용해서 빈 사용
  • 속성 접근 제어자는 private
  • Getter / Setter 메소드와 클래스는 public

자바 빈 관련 액션 태그

  • useBean 액션 태그 : jsp:useBean
    • 자바 빈을 JSP 페이지에서 이용할 때 사용
  • setProperty 액션 태그 : jsp:setProperty
    • 프로퍼티의 값을 설정할 때 사용
    • 데이터 저장
  • getProperty 액션 태그 : jsp:getProperty
    • 프로퍼티의 값을 얻어낼 때 사용

useBean 액션 태그

  • 자바 빈을 JSP 페이지에서 이용할 때 사용
  • <jsp:useBean id=”빈 이름” class=”클래스” scope=”유효범위” />
  • <jsp:useBean id=”student” class=”sec01.StudentBean” scope=”page” />

setProperty 액션 태그 : jsp:setProperty

  • 프로퍼티의 값을 설정할 때 사용
  • 데이터 저장
  • <jsp:setProperty name=”빈 이름” property=”속성이름” value=”속성값” />
  • <jsp:setProperty name=”student” property=”stdNo” value=”2021001” />

getProperty 액션 태그 : jsp:getProperty

  • 프로퍼티의 값을 얻어낼 때 사용
  • <jsp:getProperty name=”빈 이름” property=”속성이름”>
  • <jsp:getProperty name=”student” property=”stdNo”>

자바 빈 액션 태그 예제

빈 클래스 : StudentBean.java (DTO/VO와 동일)
Getters / Setters
studentBean.jsp
useBean 액션 태그
setProperty 액션 태그
getProperty 액션 태그