0.JSP란?

HTML에 JAVA 코드를 넣어 동적인 웹을 생성하는 도구이며, 컨테이너에서 서블릿으로 관리된다. JSP는 지시어, 액션, 템플릿 데이터, 스크립트 요소, 커스텀 태그과 EL로 구성된다. 

 

- JSP의 동작과정

  • JSP를 JAVA 소스로 변환 (.java 파일 생성)
  • JAVA 소스를 CLASS로 컴파일 (.class 파일 생성)
  • 서블릿 실행
  • 사용자 요청 처리

1. 지시어

- page

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>

page 지시어는 JSP 페이지를 컨테이너에서 처리하는데 필요한 속성을 기술한다. IDE에서 JSP 파일을 생성할 때 자동으로 생성된다.

 

- include 

<% include file="파일 위치"%>

include 지시어는 해당 위치에 특정 파일을 불러와 클라이언트에게 보여준다.

 

- taglib 

커스텀태그를 사용할 시 taglib 지시어가 필요하다. 커스텀 태그란 사용자 정의 태그로, 스크립트릿 사용을 줄이고 태그 형태로 코드를 대체할 수 있다. 그러나 프로젝트가 특정 커스텀 태그에 종속될 수 있어 최근에는 잘 사용하지 않는다.

 

2. 스크립트 요소

JSP는 HTML에 JAVA 코드를 넣어 동적인 웹을 생성하는 도구라고 하였다. JSP는 HTML의 전반적인 구조를 따르는데, 이때 사용되는 자바 코드를 스크립트 요소라고 하며, 자바 코드가 사용되는 부분을 정의해주기 위하여 특정 태그를 사용한다.

 

1) 선언 태그

<%!  > 꼴을가지며, 변수나 메서드를 선언할 때 사용한다.

<%!
string[] alphabet = {"a","b","c","d","e"}

int num1 = 10; 
int calc (int num2) {
	return num1 + num2;
}
%>

2) 표현 태그

<%= %> 꼴을 가지며, 웹 브라우저를 통해 클라이언트에 전달 될 자바 표현식을 정의한다. 자바의 'out.println'에 들어갈 수 있는 모든 자바 코드가 가능하다.

calc(10) 메서드의 실행 결과: <%= calc(10) %>

3) 스크립트릿 태그

멤버 변수 선언과 함수 선언을 제외한 모든 자바 코드의 사용이 가능하다.

<%
for (String alphabet : ap) {
%>
    
    <li><%= ap %></li>
    
<%
}
%>

 

3. 액션 태그

액션 태그란 JSP에서 객체 생성과 공유, 페이지 이동과 전달 등에 필요한 기능을 제공하는 커스텀 태그이다.

jsp:forward request와 response 객체를 포함해 다른 페이지로 포워드
jsp:include 다른 페이지의 실행 결과를 보여줌
jsp:uesBean 자바 빈즈 객체를 생성하거나 불러옴
jsp:setProperty 자바 빈즈 객체의 속성에 값을 할당함
jsp:getProperty 자바 빈즈 객체의 속성값을 출력함
jsp:param include,forward 액션 사용 시 파라미터 값을 수정하거나 추가함

 

1) JavaBeans

자바빈즈(Java Beans)는 자바(Java)로 작성된 소프트웨어 컴포넌트를 일컫는 말로 데이터 표현을 목적으로하는 자바 클래스다.

  •  인자가 없는 생성자로 구성된다.
  • getter, setter 메서드를 통해 멤버 변수에 접근한다.
  • getter, setter 메서드의 접근 제한자는 public이다.

<자바빈>

// 회원을 관리하는 member 클래스를 자바 빈 구조로 만들었다.

public class member {
	
	private String id;
	private String name;
	
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
    
}

<JSP>

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<jsp:useBean id="member" class="main.webapp.ch07.member"/>
<jsp:setProperty name="member" property="*"/>


<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원 조회</title>
</head>
<body>
<h3>회원 조회</h3>
회원 id: <%=member.getId()%>
<br>
회원 이름: <%=member.getName()%>
</body>
</html>

<HTML>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원 가입</title>
</head>
<body>
<form method="post" action=memberJsp.jsp>
<input type="text" name="id" size=10>
<input type="text" name="name" size=10>
<hr>
<input type = "submit" value="가입">
</form>
</body>
</html>

<실행결과>

HTML

 

JSP

2) include

include 액션은 include 지시어와 유사하다. 다만 include 지시어의 경우 inlclude 된 파일을 포함하여 하나의 파일로 컴파일 하는 반면 include 액션은 각각 호출하여 처리된 결과만 함께 보여준다.

 

3) forward

forward 액션은 response.sendRedirect()와 유사하다. 다만 리디렉션은 서버가 클라이언트에게 다시 새 페이지로 접속하도록 응답을 보내고 클라이언트가 이를 따르는 방식인 반면 forward 액션은 서버에서 내부적으로 새 페이지로 이동하고 그 내용을 클라이언트에게 응답으로 전달한다. setAttribute로 속성값을 저장하는 경우 forward를 사용하는 이유도 이와 같다.

 

4. EL

EL(Expression Language)는 자바 객체 혹은 자바 빈 객체를 쉽게 접근하게 해준다. 

  • 변수 및 객체를 참조하기 편리하다.
  • null 객체를 참조해도 에러가 발생하지 않는다.
<!-- EL 연산 -->
${10+20}
${true && false}
${10>=20}

<!-- 배열 및 맵 연동 -->
${lst[0]}
${myMap["name"]}

<!-- 자바 빈 접근 -->
${member.name}

5. JSTL

JSTL은 JSP Standard Tag Library의 약자로 스크립트릿을 사용하지 않고 HTML 형식으로 자바 코드를 사용할 수 있도록 만들어진 태그 라이브러리이다.

 

1) <c:if>

자바의 if문과 유사하다.

<c:if test=${var2}>
	<p>이 내용을 출력합니다</p>
</c:if>

 

2) <c:forEach>

자바의 for문과 유사하다.

<!-- intArray의 내용을 num에 저장하고, 인덱스를 i에 나타냅니다 -->
<c:forEach var="num" varStatus="i" items="${intArray}">
	<li> {i.index} : ${num} </li>
</c:forEach>

 

3) <c:set>,<c:out>

<c:set>은 변수에 값을 저장하고, <c:out>은 값을 화면에 출력한다.

<c:set var="var1" value="<h2>이 내용을 저장했습니다<h2>"/>
<c:out value="${var1}" default="값이 없습니다." excapeXml=true />
<!-- default에 값이 없을 때 출력할 내용을 저장하고, excapeXml에서 태그를 일반 문자열로 출력할지 결정합니다.

 

4) <c:choose>,<c:when>,<c:otherwise>

자바의 switch case문, if else문과 유사하다,

<c:choose>
	<c:when test="${var1}">
    	<p>when이 작동하면 이 내용을 출력합니다.</p>
    </c:when>
    <c:otherwise>
    	<p>otherwise가 작동하면 이 내용을 출력합니다.</p>
    </c:otherwise>
</c:choose>

 

5) <c:forTokens>

자바의 StringTokenizer와 유사하다.

<c:forTokens var="var" items="var1,var2,var3,var4" delims"," varStatus="i">
	${var}
</c:forTokens>
<!-- delims 구분자로 item을 나누어 순서대로 출력합니다.-->

'Web' 카테고리의 다른 글

[Servlet] 서블릿이란?  (0) 2022.07.21

1. Servlet이란?

  • 서블릿은 정적인 웹에 동적인 정보 제공을 가능하게 하기 위한 도구이다. 
  • 서블릿을 이용하기 위해서는 서블릿 컨테이너가 필요한데 여기에서 서블릿 객체를 만들어 관리한다. (ex) 톰캣
  • 서블릿 컨테이너는 클라이언트의 요청에 따라 서블릿을 서비스한다.
  • 클라이언트의 서블릿 요청 → 컨테이너에서 서블릿이 존재하는지 확인 (없을 경우 서블릿 로딩) → 필요시 데이터베이스 연결 → 서블릿 응답

2. Servlet의 구현

  • 서블릿 자체는 자바로 구현하지만, 서블릿 컨테이너에 해당 클래스가 서블릿임을 알려야한다.
  • 서블릿은 HttpServlet 클래스를 상속하여 구현하며, 이때 doGet(). doPost() 메서드를 오버라이딩하게 된다.
  • doGet()은 HTTP GET 요청을 처리하며, doPost는 HTTP POST 요청을 처리한다.
  • doGet()과 doPost()는 파라미터로 HttpServletResponse, HttpServletRequest 객체를 입력받으며 이를 통해 클라이언트의 상호작용에 필요한 메서드를 사용하게 된다.

- 서블릿 등록하기

@WebServlet("/servletTest")
public class servletTest extends HttpServlet {
	private static final long serialVersionUID = 1L;

서블릿 3.0에서부터는 자바 애너테이션을 이용하여 등록한다. HttpServlet을 상속하는 것을 확인할 수 있으며, 애너테이션 옆의 괄호는 클라이언트의 어떤 요청에 해당 서블릿을 실행할지 지정하는 것이다.

 

- doGet() 메서드와 doPost() 메서드

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}
    
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

 

3. Servlet의 동작

  • 사용자가 Servlet을 요청하면 init() 메서드를 통해 서블릿이 초기화된다.
  • 이미 생성되어 있다면 서블릿의 service() 메서드가 수행되며, 이는 doGet()과 doPost()로 분기된다.
  • Servlet을 종료해야 할 때는 destroy() 메서드가 사용된다.

4. 다른 Servlet으로 리다이렉션하기

response.sendRedirect("newServlet.jsp")

데이터를 포함하지 않고 바로 리다이렉션하는 경우 'response.sendRedirect()'를 사용하여 리다이렉션한다.

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setAttribute("name",name); //"name" 변수에 name 값을 저장한다.
        RequestDispatcher dp = request.getRequestDispatcher("member.jsp"); //member.jsp로 리다이렉션한다.
        dp.forward(request, response); //이때 request 객체에 저장된 데이터를 forward를 통해 넘겨준다.
        }

데이터를 포함해야 할 때는 setArrtibute()를 통해 request 객체에 값을 저장하고 forward() 를 통해 request 객체를 리다이렉션하는 페이지로 넘겨준다. 이때 setAttribute()를 통해 저장한 값은 getAttribute()로 불러올 수 있다. 

 

- 객체 범위와 속성

데이터를 소멸시키지 않고 유지하는 방법에 대해서 조금 더 자세히 알아보자.

page 영역 하나의 JSP 페이지에서 객체를 공유
request 영역 클라이언트의 요청에 응답하기까지 객체를 공유 (포워드 된 페이지까지 공유)
session 영역 클라이언트가 접속한 후 웹페이지를 닫을 때까지 공유
application 영역
(webcontext)
웹 애플리케이션이 종료될 때까지 공유

객체가 유지되는 범위는 크게 위 네 가지로 나눌 수 있으며, 객체 속성 저장 및 참조에 아래 메서드를 사용한다.

request.setAttribute(String name, Object o); //값이 Object 타입으로 저장되므로 불러올 때 강제 형변환이 필요하다.
Object rname = (String) request.getAttribute("name");

위 코드의 'request' 자리에 session, webcontext도 들어갈 수 있다.

'Web' 카테고리의 다른 글

[JSP] JSP란?  (0) 2022.07.21

+ Recent posts