Day 77

ChangWoo·2022년 12월 22일
0

중앙 HTA

목록 보기
21/51

속성과 스코프

  • HttpServletRequest : 요청파라미터로 속성이 생성된다.
  • ServletContext : 초기화 파라미터로 속성이 생성된다. (톰캣이 켜지면 생성되고, 종료되면 사라진다.)
  • HttpSession : 속성이 생성된다. (고유한 아이디를 가지며, 자동으로 생성된다.)
  • jsp가 실행되는 동안만 사용 가능한 속성 = pageContext
  • HttpServletRequest / HttpServletResponse가 FrontController로 전달된다.
  • FrontController는 String path = controller.execute(request, response) 메소드를 실행시켜서 HomeController에 request와 response를 전달해준다.
  • HomeController는 표시할 것을 나타내고 이동할 JSP 페이지를 반환한다.
  • forwoard는 다른 jsp에게 request와 response에게 전달하도록 한다.
  • home.jsp는 다양한 객체를 사용할 수 있다.
    (PageContext pageContext, ServletContext application, HttpSession session, JspWriter out)
  • FrontController에서 항상 JSP로 내부이동이 발생한다.

FrontController

  • 요청 접수
  • 컨트롤러 실행
  • 내부이동

Java 클래스

  • 요청처리
  • 업무로직 메소드 호출
  • JSP에서 표현할 데이터 저장
  • 뷰페이지 반환

JSP

  • 데이터 표현
  1. 데이터는 Java 클래스의 request.setAttribute~ 일 때 HttpServeletReqeust에 속성으로 저장된다.
  2. HttpServletRequest에서 그 데이터를 전달 받아 표현한다.
    * 표현 법 ${~~~}
  • "~~~"이라는 속성명을 저장된 속성값을 표현한다.
  • 요청객체는 다른 JSP로 전달 가능하다.
  • 요청객체는 응답이 완료되면 폐기된다.
  • 메모리 부담이 적다.
  • 모델2 방식에서 컨트롤러가 요청객체를 이용해서 뷰에게 데이터를 전달한다.

HttpSession

  • 세션객체는 클라이언트별로 생성된다.
  • 세션객체는 로그아웃 전까지 유지된다.
  • 세션객체에 저장되는 속성은 클라이언트의 고유한 개인정보(로그인한 사용자정보)다.

ServletContext

  • 로그인한 상태에서는 모두 사용가능하다.
  • 애플리케이션객체는 서버가 실행될 때 생성되고, 종료될 때 폐기된다.
  • 애플리케이션객체에 저장되는 속성은 모든 서블릿, 모든 JSP, 모든 필터, 모든 사용자에게 공유된다.

스코프

  • 스코프에는 4가지의 종류가 있다.

EL

home.jsp
<div class="row mb-3">
		<div class="col-12">
			<p>${requestScope.message }</p>
			<p>${message }</p>
		</div>
	</div>

실행결과

  • 형식은 다르지만 똑같이 사용된다.

JSTL

  • JSP 표준태그 라이브러리
  • 스크립틀릿을 사용해서 작성했던 자바코드를 대체할 수 있다.
    - 변수 선언/삭제, 값 출력, 제어문 처리, 반복문 처리, 숫자나 날짜에 대한 포맷팅, 국제화처리, URL처리
  • 사용법
    - JSTL 파일을 다운받아서 WEB-INF/lib에 복사한다.
    - JSP 파일에 사용할 태그라이브러리를 지시어를 사용해서 정의한다.
    <%@ taglib prefix="별칭" uri="태그라이브러리식별자" %>
    <별칭:태그명 value="${EL표현식}" />

JSTL 태그라이브러리의 태그 종류

1. core 태그

  • 가장 많이 사용되는 태그 라이브러디다.
  • 변수/출력/제어문/반복문/URL 처리를 지원한다.
  • JSP에 아래의 지시어를 정의한다.
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

2. fmt(formating) 태그

  • 숫자나 날짜에 대한 포맷팅을 지원한다.
  • 국제화처리를 지원한다.(원하는 언어로 지정하는 것.)
  • JSP에 아래의 지시어를 정의한다.
    <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

Core 태그 라이브러리

1. <c:out> 태그

  • 값을 출력한다.
    <%=값 %>, 표현식과동일한작업을수행한다.XSS(CrossSiteScripting)취약점공격에대한가장기본적인방어을지원한다.XSS는악의적인사용자가공격하려는사이트에스크립트를넣어서쿠키나세션아이디와같은정보를취득하는것을말한다.주로공개된게시판의게시글에htmlscript코드를입력해서해당스크립트를실행시키는것이다.사이트이용자가작성하는컨텐츠는반드시<c:out/>태그를사용해서출력하자.사용법<c:outvalue="{표현식} 과 동일한 작업을 수행한다. XSS(Cross Site Scripting) 취약점 공격에 대한 가장 기본적인 방어을 지원한다. XSS는 악의적인 사용자가 공격하려는 사이트에 스크립트를 넣어서 쿠키나 세션아이디와 같은 정보를 취득하는 것을 말한다. 주로 공개된 게시판의 게시글에 html과 script 코드를 입력해서 해당 스크립트를 실행시키는 것이다. 사이트 이용자가 작성하는 컨텐츠는 반드시 <c:out />태그를 사용해서 출력하자. 사용법 <c:out value="{표현식}" />
    주요 속성
    value
    출력할 값을 지정한다.
    생략할 수 없음
    <c:out value="${book.title}" />
    escapeXml
    특수문자(< > " ' &)를 변환할지 여부를 지정한다.
    기본값은 true다.
    생략가능
    default
    value에서 지정한 값이 null인 경우 표현할 값을 지정한다.
    생략가능
package com.sample.controller;

import com.sample.model2.Controller;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

public class CoreController implements Controller{

	@Override
	public String execute(HttpServletRequest request, HttpServletResponse response) throws Exception {
		
		request.setAttribute("content1", "안녕하세요");
		request.setAttribute("content2", "<button>버튼</button>");
		
		return "core.jsp";
	}
}
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" trimDirectiveWhitespaces="true"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/css/bootstrap.min.css" rel="stylesheet" >
<title>웹 애플리케이션</title>
</head>
<body>
<div class="container">
   	<div class="row mb-3">
   		<div class="col-12">
   			<h1>Core 태그 라이브러리</h1>
   		</div>
   	</div>
   	
   	<div class="row mb-3">
   		<div class="col-12">
   			<h3>out 태그</h3>
   			<p>EL 표현식으로 값 표현: ${content1 }</p>
   			<p>EL 표현식으로 값 표현: ${content2 }</p>
   			<p>out 태그로 값 표현: <c:out value="${content1 }" /></p>
   			<p>out 태그로 값 표현: <c:out value="${content2 }" /></p>	
   		</div>
   	</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/js/bootstrap.bundle.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.1/jquery.min.js"></script>
</body>
</html>

실행결과

  • out표현식은 <>를 태그로 인식하지 않기 때문에 button 태그가 활성화 되지 못한다.

그래서,

<p>out 태그로 값 표현: <c:out value="${content2 }" escapeXml="false" /></p>	

를 추가해야 한다.

실행 결과

2. <c:if> 태그

if문과 동일한 역할을 수행한다.
else에 해당하는 태그는 없다.
사용법
<c:if test="${표현식}">
HTML 컨텐츠
</c:if>

주요 속성
test
검사조건을 정의한다.
결과값이 boolean 타입이어야 한다.
생략할 수 없다.

request.setAttribute("score", 65);
<div class="row mb-3">
		<div class="col-12">
			<h3>if 태그</h3>
			<c:if test="${score >= 60 }">
				<p>합격입니다.</p>
			</c:if>
		</div>
	</div>

실행결과

request.setAttribute("score", 45);

실행결과

3. <c:choose> <c:when> <c:otherwise> 태그

if ~ else if ~ else if ~ else 와 동일한 역할을 수행한다.
사용법
<c:choose>
<c:when test="${조건식1}">
HTML 컨텐츠

  <!-- test에서 제시한 조건식1이 true면 HTML 컨텐츠가 화면에 출력된다. --->
</c:when>
<c:when test="${조건식2}">
  HTML 컨텐츠
  <!-- test에서 제시한 조건식2이 true면 HTML 컨텐츠가 화면에 출력된다. --->
</c:when>
<c:when test="${조건식3}">
  HTML 컨텐츠
  <!-- test에서 제시한 조건식3이 true면 HTML 컨텐츠가 화면에 출력된다. --->
</c:when>
<c:otherwise>
  HTML 컨텐츠
  <!-- test에서 제시한 조건식1, 조건식2, 조건식3이 전부 false면 HTML 컨텐츠가 화면에 출력된다. --->
</c:otherwise>

</c:choose>
<c:when>과 <c:otherwise>는 반드시 <c:choose>안에 위치해야 한다.
<c:when>은 조건식을 다르게 해서 여러 번 정의할 수 있다.
<c:otherwise>는 생략할 수 있고, 맨 마지작 <c:when> 다음에 정의해야 한다.
<c:when>으로 제시한 조건식이 true가 되면 남아있는 <c:when>은 검사하지 않는다.
<c:otherwise>는 <c:when>으로 제시한 조건이 모두 false로 판정될 때만 실행된다.

profile
한 걸음 한 걸음 나아가는 개발자

0개의 댓글