TIL 0507

먼지·2024년 5월 7일

Today I Learned

목록 보기
54/89
post-thumbnail

EL

EL 특징

  • JSP의 네가지 기본 객체가 제공하는 영역의 속성 사용
  • 집합 객체에 대한 접근 방법 제공
  • 수치 연산, 관계 연산, 논리 연산자 제공
  • 자바 클래스 메서드 호출 기능 제공
  • 표현 언어만의 기본 객체 제공

EL 표기법

${expr}

EL의 연산자

  • 수치 연산자 : +, - , *, / 또는 div, % 또는 mod
  • 비교 연산자 : == 또는 eq, != 또는 ne, < 또는 lt, > 또는 gt, <= 또는 le, >= 또는 ge
  • 논리 연산자 : && 또는 and, || 또는 or, ! 또는 not
  • empty 연산자
    1) 값이 null이면 true 반환
    2) 값이 빈 문자열(“”)이면 true 반환
    3) 값이 길이가 0인 배열이면 true 반환
    3) 값이 빈 Map이면 true를 반환
    4) 값이 빈 Collection이면 true를 반환
    5) 이외의 경우에는 false를 반환

EL의 기본객체

기본객체설명
pageContextJSP의 page 기본 객체와 동일
pageScopepageContext 기본 객체에 저장된 속성의 <속성,값>매핑을 저장한 Map 객체
requestScoperequest 기본 객체에 저장된 속성의 <속성,값> 매핑을 저장한 Map 객체
sessionScopesession 기본 객체에 저장된 속성의 <속성,값> 매핑을 저장한 Map객체
applicationScopeapplication 기본 객체에 저장된 속성의 <속성,값>매핑을 저장한 Map객체
param요청 파라미터의 <파라미터이름,값> 매핑을 저장한 Map객체
paramValues요청 정보의 <파라미터이름,값 배열> 매핑을 저장한 Map 객체
header요청 정보의 <헤더이름,값> 매핑을 저장한 Map 객체
headerValues요청 정보의 <헤더이름,값 배열> 매핑을 저장한 Map 객체
cookie<쿠키 이름, Cookie> 매핑을 저장한 Map 객체
initParam초기화 파라미터의 <이름,값> 매핑을 저장한 Map 객체

EL의 사용

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>EL 테스트</title>
</head>
<body>
 <h3>표현언어(EL)의 사용</h3>
 <table border="1" style="width: 40%">
 	<tr>
 		<th>표현식</th>
 		<th></th>
 	</tr>
 	<tr>
 		<td>\${2+5}</td>
 		<td>${2+5}</td>
 	</tr>
 	<tr>
 		<td>\${"10"+5}</td>
 		<td>${"10"+5}</td>
 	</tr>
 	<tr>
 		<td>\${"10"+"5"}</td>
 		<td>${"10"+"5"}</td>
 	</tr>
 	<tr>
 		<td>\${"십"+"5"}</td>
 		<td>에러 발생(EL에서의 +는 연산만 가능하다)</td>
 	</tr>
 	<tr>
 		<td>\${4/5}</td>
 		<td>${4/5}</td>
 	</tr>
 	<tr>
 		<td>\${5/0}</td>
 		<td>${5/0}</td>
 	</tr>
 	<tr>
 		<td>\${2 += 5}</td>
 		<td>${2 += 5}(문자열로 연결)</td>
 	</tr>
 	<tr>
 		<td>\${"한국"+="서울"}</td>
 		<td>${"한국"+="서울"}(문자열로 연결)</td>
 	</tr>
 	<tr>
 		<td>\${1+="서울"}</td>
 		<td>${1+="서울"}(문자열로 연결)</td>
 	</tr>
 </table>
</body>
</html>

EL 사용 예제

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>표현 언어의 사용 예제</title>
</head>
<body>
<h1>표현 언어의 - 파라미터 값 처리</h1>
<form action="s02_el.jsp" method="post">
<% request.setCharacterEncoding("UTF-8"); %>
이름 : <input type="text" name="name"><br>
<input type="submit" value="확인">
</form>
<br> 
이름은 <%= request.getParameter("name") %><br>
이름은 ${param.name}<br>
이름은 ${param["name"]} 입니다.
</body>
</html>

EL 사용 예제

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<% request.setCharacterEncoding("utf-8");%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>표현 언어의 사용 예제</title>
</head> 
<body>
<h1>표현 언어의 - 파라미터 값 처리</h1>
<form action="s03_el.jsp" method="post">
좋아하는 계절
<input type="checkbox" name="season" value="봄"><input type="checkbox" name="season" value="여름"> 여름
<input type="checkbox" name="season" value="가을"> 가을
<input type="checkbox" name="season" value="겨울"> 겨울
<input type="submit" value="확인">
</form>
<br>
${paramValues.season[0]}<br>
${paramValues.season[1]}<br>
${paramValues.season[2]}<br>
${paramValues.season[3]}<br>
--------------------------<br>
${paramValues["season"][0]}<br>
${paramValues["season"][1]}<br>
${paramValues["season"][2]}<br>
${paramValues["season"][3]}<br>
</body>
</html>

EL 텍스트

내장객체명을 생략하고 속성명을 호출하면
JSP 4개 영역에서 page, request, session, application 영역 순으로
검색해서 해당 속성명이 있으면 속성값을 반환

스크립트릿에서 선언한 변수의 값은 el에서 바로 읽을 수 없음.
변수의 값을 읽기 원한다면 JSP 4개 영역에 저장 후 읽어와야 한다

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>EL 텍스트</title>
</head>
<body>
<%	
	String str ="여름 여행";
	pageContext.setAttribute("msg", "봄");
	request.setAttribute("msg2", "여름");
	session.setAttribute("msg3", "가을");
	application.setAttribute("msg4", "겨울");
%>
page 영역 : <%= pageContext.getAttribute("msg")%><br>
request 영역 : <%= request.getParameter("msg2")%><br>
session 영역 : <%= session.getAttribute("msg3")%><br>
application 영역 : <%= application.getAttribute("msg4")%><br>
------------------------------------<br>
page 영역 : ${pageScope.msg},${msg }<br>
request 영역 : ${requestScope.msg2},${msg2}<br>
session 영역 : ${sessionScope.msg3},${msg3 }<br>
application 영역 : ${applicationScope.msg4},${msg4 }<br>
------------------------------------<br>
str : <%=str %>, ${str }
</body>
</html>

JSTL

설정
WEB-INF > lib 폴더 > JSTL-1.2.jar 삽입

  • core 라이브러리
    jsp 페이지에 core 라이브러리를 사용할 수 있도록 taglib 디렉티브 명시
    <%@ taglib prefix="c" uri=http://java.sun.com/jsp/jstl/core %>
    prefix : 접두사
    uri : core 라이브러리가 존재하는 위치

Set 태그

<c:set var="변수명" value="설정값" target="객체" property="값" scope="범위" />
지정된 변수에 값을 할당하는 태그

  • target은 값을 설정하고자 하는 객체를 명시한다. target에 객체를 명시하면 명시된 객체에 값을 셋팅할 수 있다.
  • property는 taregt에 명시된 객체의 프로퍼티를 의미하며 명시된 프로퍼티에 - value에 명시한 설정값을 셋팅합니다.
  • scope은 값을 셋팅한 범위를 의미(page,request,session,application), 생략하면 scope="page"
 <%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
  <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Set 태그</title>
</head>
<body>
<%-- 	   속성명	  속성값       영역 --%>
<c:set var="msg" value="봄" scope="page"/>
<c:set var="msg2" value="여름" scope="request"/>
<c:set var="msg3" value="가을" scope="session"/>
<c:set var="msg4" value="겨울" scope="application"/>
${pageScope.msg},${msg }<br>
${requestScope.msg2},${msg2 }<br>
${sessionScope.msg3},${msg3 }<br>
${applicationScope.msg4},${msg4 }<br>
</body>
</html>

<%
	Member member = new Member();
%>
<%-- page 영역에 Member 객체 저장  --%>
<c:set var="member" value="<%=member %>"/>
<%-- Member 객체의 name 멤버 변수에 데이터 저장 --%>
<%--
target : 값을 설정하고자 하는 객체를 명시
property : 값이 저장되는 멤버 변수
--%>
<c:set target="${member }" property="name" value="홍길동"/>
회원 이름 : ${member.name }<br>
회원 이름 : ${member.getName() }<br>

Remove 태그

<c:remove var="변수명" scope="범위" />

  • 설정된 속성을 제거하는 태그
    scope은 값이 셋팅된 범위를 의미(page,request,session,application)
    생략하면 scope="page"

빈도수가 높지는 않은 태그, 저장 후 필요가 없다면 명시를 안 하면 되기 때문에 굳이 지우는 작업을 할 필요가 없음

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Remove 태그</title>
</head>
<body>
<c:set var="city" value="서울"/>
데이터 삭제 전 : ${city }<br>
------------------------------<br>
<c:remove var="city"/>
데이터 삭제 후 : ${city }<br>
</body>
</html>

If 태그

<c:if test="조건" var="변수명" scope="범위" />

  • 조건이 true이면 수행문을 수행하는 태그
    • test에서 조건을 체크해서 true 또는 false가 되면
      var에 지정된 변수의 그 값이 담김
      scope은 var에 지정한 변수가 셋팅되는 범위를 의미(page,request,session,application), 생략하면 scope="page"
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>If 태그</title>
</head>
<body>
<c:if test="true">
무조건 수행 <br>
</c:if>
</body>
</html>


링크 뒤에 ?name=dragon 넣어줘야 문구가 출력될 수 있다.
equals도 사용이 가능은 하지만 ==을 훨씬 더 많이 사용함

<c:if test="${param.name == 'dragon' }">
name 파라미터의 값이 ${param.name }입니다.<br>
</c:if>
<%-- tomcat 7버전 이상부터 equals 비교 지원 --%>
<c:if test="${param.name.equals('dragon') }">
name 파라미터의 값이 ${param.name }입니다.<br>
</c:if>


명시적으로 형변환을 하지 않아도 자동으로 숫자로 비교하여 넘어간다.

<c:if test="${param.age >= 20 }">
당신의 나이는 20세 이상입니다.<br>
</c:if>

Choose 태그

<c:choose>
  <c:when test="조건"></c:when>
  <c:when test="조건"></c:when>
  <c:otherwise></c:otherwise>
</c:choose>

  • 여러개의 when 태그에 명시한 조건을 체크하고 조건에 만족하는 수행문을 수행, 만족하는 조건이 없으면 otherwise에 명시한 수행문을 수행
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Choose 태그</title>
</head>
<body>
<c:choose>
	<c:when test="${param.name == 'dragon' && param.age >= 20 }">
		당신의 이름은 ${param.name }이고 20세 이상입니다.
	</c:when>
	<c:when test="${param.name == 'dragon'}">
		당신의 이름은 ${param.name } 입니다.
	</c:when>
	<c:when test="${param.age >= 20}">
		당신은 20세 이상입니다.
	</c:when>
	<c:otherwise>
		당신은 dragon이 아니며, 20세 이상이 아닙니다.
	</c:otherwise>
</c:choose>
</body>
</html>

name, age에 해당하는 값이 주어지지 않았을 때의 결과 화면
Otherwise에 해당하는 문구


?name=dragon 입력했을 때 나오는 결과 화면
When 2번째에 해당하는 문구


?age=21 입력했을 때 나오는 결과 화면
When 3번째에 해당하는 문구


?name=dragon&age=21입력했을 때 나오는 결과 화면
When 1번째에 해당하는 문구

For Each 태그

수행문을 반복해서 수행
<c:forEach items="객체명" begin="시작 인덱스" end="끝 인덱스" step="증감식" var="변수명" varStatus="상태변수" />

  • items : 속성에 인덱스가 존재하는 객체를 지정하여 반복수행할 때 사용
  • begin : 수행문을 반복시킬 시작 인덱스 지정
  • end : 수행문의 반복이 끝날 인덱스 지정
  • step : 증감식 지정
  • var : 현재 반복하고 있는 값이 저장되는 변수지정
  • varStatus : 반복 상태를 지정하는 변수 지정

예) varStatus 의 사용예
<c:forEach var="list" items="itemList" varStatus="status">
   ${status.index} <- 0부터 시작하는 인덱스 표시
   ${status.count} <- 1부터 시작하여 1씩 증가
   ${status.first} <- forEach 반복의 처음 일 경우 true
   ${status.last} <- forEach 반복의 마지막 일 경우 true
</c:forEach>

예) forEach를 사용할 때 List의 크기 구하기
<%@ taglib prefix="fn" uri=http://java.sun.com/jsp/jstl/functions %>=>페이지 상단에 명시
${fn:length(itemList)}

1~100까지의 총합

<h4>1~100까지의 합</h4>
<c:set var="sum" value="0"/>
<c:forEach var="i" begin="1" end="100" step="1">
	<c:set var="sum" value="${sum+i}"/>
</c:forEach>
결과 = ${sum}


1~100의 홀수의 합

<h4>1~100까지의 홀수의 합</h4>
<c:set var="sum2" value="0"/>
<c:forEach var="i" begin="1" end="100" step="2">
	<c:set var="sum2" value="${sum2+i}"/>
</c:forEach>
결과 = ${sum2 }


구구단 반복문 사용하여 나타내기

<h4>구구단 5</h4>
<ul>
	<c:forEach var="i" begin="1" end="9">
		<li>5 * ${i} = ${5 * i}</li>
	</c:forEach>
</ul>


Array 보여주기

<h4>int형 배열</h4>
<c:set var="intArray" value="<%= new int[] {10,20,30,40,50}%>" />
<c:forEach var="i" items="${intArray }">
${i }<br>
</c:forEach>

<h4>int형 배열 - begin, end 인덱스 지정</h4>
<c:set var="intArray" value="<%= new int[] {10,20,30,40,50}%>" />
<c:forEach var="i" items="${intArray }" begin="2" end="4">
${i }<br>
</c:forEach>


varStatus 사용하기
배열 인덱스의 값 -
번호 매기기 -
각 인덱스의 값 -
첫 번째 반복이면 true, 그 외는 false -
마지막 반복이면 true, 그 외는 false

<h4>int형 배열 - varStatus 사용</h4>
<c:set var="intArray" value="<%= new int[] {10,20,30,40,50}%>" />
<c:forEach var="i" items="${intArray }" begin="2" end="4" varStatus="status">
${status.index} - ${status.count} - [${i}] - ${status.first } - ${status.last }<br>
</c:forEach>


<h4>Map</h4>
<%
	HashMap<String,String> mapData = new HashMap<String,String>();
	mapData.put("name", "홍길동");
	mapData.put("job", "소방관");
	mapData.put("hobby", "음악 듣기");
%>
<c:set var="map" value="<%=mapData %>" />
<c:forEach var="i" items="${map}">
${i.key} = ${i.value }<br>
</c:forEach>

set의 var를 map, forEach의 items="${map}"과 동일함

For Tokens 태그

문자열을 구분자로 잘라내어 출력
<c:forTokens items="객체명" delims="구분자" begin="시작 인덱스" end="끝 인덱스" step="증감식" var="변수명" varStatus="상태변수" />

  • items : 잘라내고자 하는 문자열이 담겨있는 객체
  • delims : 구분자 지정
  • begin : 시작 인덱스
  • end : 끝 인덱스
  • step : 증감식
  • var : 잘라진 문자열이 담기는 변수
  • varStatus : 반복 상태지정 변수
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>forTokens 태그</title>
</head>
<body>
 <h4>쉼표와 점을 구분자로 사용</h4>
 <c:forTokens items="빨강색,주황색.노란색.초록색,파란색,남색.보라색" var="token" delims=",.">
 	${token}<br>
 </c:forTokens>
 
 <h4>날짜를 연월일시분초로 구분해서 출력</h4>
 <c:forTokens items="2024-05-07 14:09:20" var="now" delims="- :">
 	${now}<br>
 </c:forTokens>
</body>
</html>

Import 태그

지정한 url 페이지의 내용을 읽어와 출력
<c:import url="URL" var="변수명" scope="범위" varReader="변수명" context="context" charEncoding="인코딩" />

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Import 태그</title>
</head>
<body>
<h1>import 태그 연습</h1>
<c:import url="https://www.daum.net"/>
<h1>import 태그 연습 종료</h1>
</body>
</html>

Out 태그

지정된 값을 출력하는 태그
<c:out value="출력값" default="기본값" escapeXml="true/false" />

  • value 에 명시한 값을 출력하며 value 가 null 일경우 default에 기술한 값을 출력
  • escapeXml="true"이면 html태그 불인정(기본값)
    -escapeXml="false"이면 html태그 인정
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Out 태그</title>
</head>
<body>
<c:out value="<h1>오늘은 좋은 날!!</h1>" escapeXml="true"/>
<c:out value="<h1>오늘은 좋은 날!!</h1>" escapeXml="false"/>
</body>
</html>

Catch 태그

예외 발생시 예외 처리 태그
<c:catch var="변수명" />

예외가 발생할 수 있는 수행문 앞 뒤에 catch 태그를 배치하고 예외가 발생하면
var에 지정한 변수명에 예외 문구를 저장한다. out 태그 또는 el 를 통해 예외 문구를 호출해 출력할 수 있다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Catch 태그</title>
</head>
<body>
<h1>catch 태그 사용하기</h1>
<c:catch var="ex">
	name 파라미터의 값 = <%= request.getParameter("name") %><br>
<%
	if(request.getParameter("name").equals("test")){
%>
		${param.name }은 test입니다.	
<%
	}
%>
</c:catch>
<c:if test="${ex!=null }">
	예외가 발생하였습니다.<br>
	${ex }
</c:if>
</body>
</html>

FormatNumber 태그

사용 빈도수 아주 높음
수치 데이터를 숫자, 통화, 퍼센트로 변환
<fmt:formatNumber
    value="Number로 형식화할 수치 데이터"
    type="숫자, 통화, 퍼센트 중 하나{number|currency|percent}"
    pattern="사용자 지정 패턴"
    currencyCode="통화코드지정"
    currencySymbol="통화기호"
    groupingUsed="{true|false}출력시 그룹 분리 기호(,) 포함여부"
    maxIntegerDigits="출력시 integer 최대 자릿수 지정"
    minIntegerDigits="출력시 integer 최소 자릿수 지정"
    maxFractionDigits="출력시 소수점 이하 최대 자릿수 지정"
    minFractionDigits="출력시 소수점 이하 최소 자릿수 지정"
    var="변수"
    scope="범위"
/>

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>formatNumber 태그</title>
</head>
<body>
숫자 : <fmt:formatNumber type="number" value="10000000"/><br>
통화 : <fmt:formatNumber type="currency" value="1000000" currencySymbol="$"/><br>
통화 : <fmt:formatNumber type="currency" value="1000000" currencySymbol="\\"/><br>
퍼센트 : <fmt:formatNumber type="percent" value="0.3"/><br>
패턴 : <fmt:formatNumber value="12.345" pattern="00000.00"/><br>
</body>
</html>

Format Date 태그

날짜에 형식 지정
<fmt:formatDate
    value="형식화할 날짜와 시간 데이터"
    type="{time|date|both}"
    dateStyle="{short|full}"
    timeStyle="{short|full}"
    pattern="사용자 지정 패턴"
    timeZone="타임존 지정"
    var="변수"
    scope="범위"
/>

<%@page import="org.apache.naming.java.javaURLContextFactory"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>formatDate 태그</title>
</head>
<body>
<c:set var="now" value="<%=new java.util.Date() %>"/>
${now }<br>
<fmt:formatDate value="${now }" type="date" dateStyle="full"/><br>
<fmt:formatDate value="${now }" type="date" dateStyle="short"/><br>
<fmt:formatDate value="${now }" type="time" timeStyle="full"/><br>
<fmt:formatDate value="${now }" type="time" timeStyle="short"/><br>
<fmt:formatDate value="${now }" type="both" dateStyle="full" timeStyle="full"/><br>
<fmt:formatDate value="${now }" type="both" dateStyle="short" timeStyle="short"/><br>
---------------------------------------------------------------------<br>
<h3>패턴 지정하여 나타내기</h3>
<fmt:formatDate value="${now }" pattern="yyyy년MM월dd일 HH:mm:ss" />
</body>
</html>

Functions 태그

<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Functions 라이브러리</title>
</head>
<body>
<c:set var="str1" value=" Functions <태그>를 사용합니다. "/>
<c:set var="str2" value="사용"/>
<c:set var="str3" value="10,20,30-40,50,60,70,80.90,100"/>

문자열의 길이 :${fn:length(str1)}<br>
대문자로 변경 :${fn:toUpperCase(str1)}<br>
소문자로 변경 :${fn:toLowerCase(str1)}<br>
인덱스 3 ~ 6전까지 문자열 추출하기 : ${fn:substring(str1,3,6)}<br>
문자열에서 원래 문자를 지정한 문자로 대체 :${fn:replace(str1," ","-")}<br>
문자열의 앞뒤 공백 제거 :${fn:trim(str1)}<br>
문자열의 앞뒤 공백을 제거하고, 문자열의 원래 문자를 지정한 문자로 대체 :${fn:replace(fn:trim(str1), " ", "-")}<br>
지정한 문자의 인덱스 구하기 : ${fn:indexOf(str1,str2)}<br>
문자열에서 지정한 문자를 구분자로 문자열을 잘라내기 : ${fn:split(str3,',')}<br>
<c:forEach var="array" items="${fn:split(str3,',')}">
	${array }<br>
</c:forEach>
</body>
</html>

MVC

모델 1 구조

역할 분담을 할 수 없음

모델 2 구조(MVC)

모델 클래스 -> 백엔드, JSP -> 프론트엔드 역할 분담이 가능함

MVC 패턴

패턴설명
모델(M)비즈니스 영역의 상태 정보를 처리한다.[모델 클래스]
뷰(V)비즈니스 영역에 대한 프레젠테이션 뷰(즉, 사용자가 보게 될 결과 화면)를 담당한다.[JSP]
컨트롤러(C)사용자의 입력 및 흐름 제어를 담당한다.[Servlet]
  • 특징
    로직을 처리하는 모델과 결과 화면을 보여주는 뷰가 분리되 흐름 제어나 사용자의 처리 요청은 컨트롤러에 집중

Servlet - MVC패턴 연습

Dispatcher Servlet

MVC 패턴의 경우에는 web.xml로 어노테이션 하는게 더 편리함

package kr.web.mvc;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class DispatcherServlet extends HttpServlet {
	@Override
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		// 컨텐트 타입 및 캐릭터셋 지정
		response.setContentType("text/html;charset=utf-8");
		// HTML 태그 출력을 위한 스트림 생성
		PrintWriter out = response.getWriter();
		out.println("<html>");
		out.println("<head><title>MVC패턴 연습</title></head>");
		out.println("<body>");
		out.println("MVC 패턴 연습");
		out.println("</body>");
		out.println("</html>");
		
		// 자원 정리
		out.close();
	}
}

web.xml

<servlet>, <servlet-mappin><servlet-name>이 동일한 이름을 갖고 있음
DispatcheServlet 에서 /dispatcher를 호출하게 되면 <servlet-name>으로 연결이 되어 있기 때문에 <servlet-class>를 찾아서 실행시키는 방식이다.

  <!-- DispatcherServlet 설정 -->
  <servlet>
  	<servlet-name>DispatcherServlet</servlet-name>
  	<servlet-class>kr.web.mvc.DispatcherServlet</servlet-class>
  </servlet>
  
  <servlet-mapping>
  	<servlet-name>DispatcherServlet</servlet-name>
  	<url-pattern>/dispatcher</url-pattern>
  </servlet-mapping>

HTTP GET 및 POST 요청을 처리하는 메서드들을 오버라이딩하여 구현한다.
두 메서드 모두 requestPro 메서드를 호출하고 있다.

requestPro 메서드는 실제 요청을 처리하는 메서드이다.
HttpServletRequest와 HttpServletResponse를 매개변수로 받아와서 처리하고, 응답으로 전달할 컨텐츠 타입과 캐릭터셋을 설정한다.HTML을 사용하여 간단한 응답을 생성하고 응답을 반환합니다.

package kr.web.mvc;

import java.io.IOException;
import java.io.PrintWriter;

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(name = "DispatcherServlet", urlPatterns = {"/dispatcher"})*/
public class DispatcherServlet extends HttpServlet {
	@Override
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		requestPro(request, response);
	}

	@Override
	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		requestPro(request, response);
	}
	private void requestPro(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
		// 컨텐트 타입 및 캐릭터셋 지정
		response.setContentType("text/html;charset=utf-8");
		// HTML 태그 출력을 위한 스트림 생성
		PrintWriter out = response.getWriter();
		out.println("<html>");
		out.println("<head><title>MVC패턴 연습</title></head>");
		out.println("<body>");
		out.println("MVC 패턴 연습");
		out.println("</body>");
		out.println("</html>");

		// 자원 정리
		out.close();
	}

}



Forward 방식으로 view(messageView.jsp)를 호출한다.
client가 서블릿에 요청하고 -> JSP를 forward해서 -> client에게 응답한다

Message View JSP

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

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MVC 패턴 연습</title>
</head>
<body>
<h1>MVC 패턴 연습</h1>
</body>
</html>

Dispatch Servlet

package kr.web.mvc;

import java.io.IOException;
import java.io.PrintWriter;

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(name = "DispatcherServlet", urlPatterns = {"/dispatcher"})*/
public class DispatcherServlet extends HttpServlet {
	@Override
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		requestPro(request, response);
	}

	@Override
	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		requestPro(request, response);
	}
	private void requestPro(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
		//forward 방식으로 view(messageView.jsp) 호출하기
		RequestDispatcher dispatcher = request.getRequestDispatcher("/views/messageView.jsp");
		dispatcher.forward(request, response);
	}

}

http://localhost:5495/ch03_JSP/dispatcher
주소가 JSP로 바뀌지 않고 유지되기 때문에 Forward 처리되었다는 것을 확인할 수 있다.
=> Client는 JSP의 코드를 확인할 수 없다.


  1. 클라이언트는 DispatcherServlet을 요청하여 requestPro 메서드를 호출
  2. requestPro 메서드에서는 클라이언트로부터 전달된 message 파라미터를 확인하고, 해당하는 결과를 계산
    이 결과를 result라는 이름의 속성으로 request 객체에 저장
  3. RequestDispatcher를 사용하여 "/views/messageView.jsp" 페이지로 forward
    request 객체에 저장된 속성들은 유지되며, JSP 페이지에서 이를 활용할 수 있음
  4. 클라이언트는 서블릿이 포워딩한 JSP 페이지를 받아 결과를 확인
    JSP 페이지에서는 request.getAttribute("result") 또는 ${result}를 통해 결과를 출력

Message View 2

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

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MVC 패턴 연습</title>
</head>
<body>
결과 : <%= request .getAttribute("result") %><br>
결과 : ${result} <br>
</body>
</html>

Dispatcher Servlet 2

package kr.web.mvc;

import java.io.IOException;
import java.io.PrintWriter;

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(name = "DispatcherServlet", urlPatterns = {"/dispatcher"})*/
public class DispatcherServlet extends HttpServlet {
	@Override
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		requestPro(request, response);
	}

	@Override
	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		requestPro(request, response);
	}
	private void requestPro(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
		
		String message = request.getParameter("message");
		String result = null;
		if (message == null || message.equals("")) {
			result = "메세지가 없습니다.";
		} else if (message.equals("name")) {
			result = "홍길동";
		} else if (message.equals("base")) {
			result="기본 호출입니다.";
		} else {
			result = "잘못된 호출입니다.";
		}
						//	 속성명	   속성값
		request.setAttribute("result",result );
		
		//forward 방식으로 view(messageView.jsp) 호출하기
		RequestDispatcher dispatcher = request.getRequestDispatcher("/views/messageView.jsp");
		dispatcher.forward(request, response);
	}

}

Dispatcher Servlet 실행시켰을 때

?message=name 주소에 추가하여 실행했을 때 설정한 홍길동 출력

?message=base 주소에 추가하여 실행했을 때 설정한 기본 호출입니다. 출력

?message=0 주소에 추가하여 실행했을 때 else의 잘못된 호출입니다 출력

profile
Lucky Things🍀

0개의 댓글