Dev log - 62, Java #16, Servlet #6, JSP #3

박강산·2022년 7월 4일
0

Java Servlet, JSP

  • 페이지 import
<%@ page import="" session="" errorPage="" isErrorPage="" contentType="" pageEncoding=""%>

자바 빈즈(Java Beans)

  • Bean : 재사용과 같은 어떤 목적을 가지고 지정된 규칙에 따라 만들어진 클래스 혹은 컴포넌트

Bean 규악

  1. 인자가 없는 생성자를 가져야 함
  2. 프로퍼티(property)에 대한 네이밍 규칙을 준수해야 함
  3. 설정(setter) 메소드의 아규먼트와 접근(getter) 메소드의 리턴 타입은 동일해야 함
  4. 영속성을 위해 Serializable 또는 Externalizable 인터페이스를 구현할 수 있음
  5. 캡슐화를 유지

3번 ex)

- String 타입 리턴
public void setName(String name);
public String getName();

- boolean 타입 리턴
public void setFemale(boolean female);
public boolean isFemale();

JSP 표준 액션 태그(Standard Action Tag)

  • JSP는 다양한 표준 액션 태그를 제공

Bean 관련 JSP 표준 액션 태그

  • 자바 Beans를 JSP 페이지에서 좀 더 쉽게 사용할 수 있도록 제공된 태그

  • <jsp:useBean>, <jsp:setProperty>, <jsp:getProperty>, <jsp:include>, <jsp:forward>, <jsp:param>
    -> HTML 에서는 <html:div> 와 같은 형식이 생략되어 <div>로 활용하고 있음

1. <jsp:useBean>

<jsp:useBean id="emp" 
			 class="com.varxyz.jv300.domain.Manager"
             scope="request"
             type="com.varxyz.jv300.domain.Employee"/>
  • id : Bean 속성명, 구분자
  • class : 해당 Bean에 대한 완전한 클래스명 (추상 클래스 X)
  • scope : [page(default) | request | session | application]
  • type : 빈 참조 타입 (폴리모피즘 적용 시 부모 타입 명시)

2. <jsp:setProperty>

<jsp:setProperty name="user" property="userId"/>
  • name : 자바 Bean 이름(<jsp:useBean>의 id 속성과 동일)

  • property : Bean의 setProperty 명

  • 활용 방식

1번 방식

<jsp:useBean id="user" 
			 class="com.varxyz.jv300.domain.User"
             scope="request"/>
<jsp:setProperty name="user" property="userId"/>

2번 방식 : 신규로 생성될 때만 몸체 처리

<jsp:useBean id="user" 
			 class="com.varxyz.jv300.domain.User"
             scope="request"/>
<jsp:setProperty name="user" property="userId"/>
</jsp:useBean>
  • 활용 예제
<%
	user.setUserId(request.getParameter("userId"));
%>

= ( 같은 의미 )

<jsp:setProperty name="user" property="userId" value="<%= request.getParameter("userId") %>"/>
  • param과 value의 경우 Bean 타입이 String 또는 Primitive 타입이어야 함
<jsp:setProperty name="user" property="userId" param="userId"/>

<jsp:setProperty name="user" property="*"/>

3. <jsp:getProperty>

  • Bean이 가지고 있는 프로퍼티 값을 JSP 페이지에 출력할 때 사용
<jsp:getProperty name="user" property="userId"/>

4. <jsp:include>

  • 현재 JSP 페이지 내에 지정된 페이지를 포함시킬 때 사용

  • 서블릿에서는 잘 사용하지 않음

<jsp:include page="/incl/banner.jsp"/>

1. 실행 시점에 페이지에 포함
2. 수정 시 자동 업데이트 제공
3. 정적 컨텐츠, JSP, CGI 포함 가능
4. 표현식을 통해 page 속성 지정 가능
5. 매개변수 추가 가능

≒ (같으나 세부 내용이 다름)

<%@ include file="..." %>

1. 변환 시점에 페이지에 포함
2. 수정 시 자동 업데이트 불가
3. 정적 컨텐츠, JSP만 가능
4. 표현식을 통한 page 속성 지정 불가능

5. <jsp:forward>

  • JSP 페이지끼리 데이터를 전달할 때 사용

  • JSP 에서는 잘 사용하지 않음

6. <jsp:param>

  • forward 및 include 태그에 데이터 전달을 목적으로 사용되는 태그

  • 단독 사용 불가, <jsp:include> 혹은 <jsp:forward>의 자식 태그로 추가 가능

  • 다른 페이지에 여러 개의 정보를 전송해야 할 때는 다중의 param 액션 태그를 사용

  • mypage1.jsp

<jsp:include page="header.jsp">
	<jsp:param name="subtitle" value="Welcome to varxyz"/>
</jsp:include>
  • header.jsp
<img src="">${param.subtitle}

JSP 액션 태그 실습

  • URLEncoder 를 통해 한글 인코딩 가능

  • webapp에서 각각 다른 폴더에 jsp 파일 생성

  • add_user.jsp
<%@page import="java.net.URLEncoder"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<div id="wrapper">
		<div id="header">
			<jsp:include page="/incl/banner.jsp">
				<jsp:param value="mod007 : Java Beans and include 한글 테스트" name="subtitle2" />
				<jsp:param value="<%=URLEncoder.encode(\"mod007 : Java Beans and include 한글 테스트\", \"UTF-8\")%>" name="subtitle" />
			</jsp:include>
		</div>
		<div id="content-wrapper">
			<h3>회원가입</h3>
			<form action="add_user.do" method="post">
				<p>
					회원 아이디 :
					<input type="text" name="userId">
				</p>
				<p>
					비밀번호 :
					<input type="password" name="passwd">
				</p>
				<p>
					이름 :
					<input type="text" name="userName">
				</p>
				<p>
					주민번호 :
					<input type="text" name="ssn" maxlength="6" placeholder="앞 6자리">
				</p>
				<p>
					이메일1 :
					<input type="text" name="email1" placeholder="아이디">
				</p>
				<p>
					이메일2 :
					<input type="text" name="email2" placeholder="메일도메인 ex) naver.com">
				</p>
				<p>
					주소1 :
					<input type="text" name="addr1" placeholder="도로명주소">
				</p>
				<p>
					주소2 :
					<input type="text" name="addr2" placeholder="세부주소">
				</p>

				<p>
					<input type="submit" value="확인">
					<input type="reset" value="리셋">
				</p>
			</form>
		</div>
		<div id="footer">
			<%@ include file="/incl/footer.jsp"%>
		</div>
	</div>
</body>
</html>
  • banner.jsp
<%@page import="java.net.URLDecoder"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<div id="banner">
	<h4><%=request.getParameter("subtitle2")%></h4>
	<h4><%=URLDecoder.decode(request.getParameter("subtitle"), "UTF-8") %></h4>
</div>

EL(Expression Language)

  • Since JSP 2.0 스펙에서 EL 추가

  • <% %> 형태의 자바 코드 대신에 사용 가능한 표현식

  • 크게 두가지 형태로 사용

  1. 커스텀 태그나 액션 태그의 속성 값으로 사용
  2. JSP 페이지 내에서 텍스트 출력 시 사용
  • 활용 예시

Syntax : ${addr.city}, ${user.userID} 등

-> JSP 액션 태그에서
<jsp:include page="/user/${user.id}/details.jsp"/> => /user/java/details.jsp

-> HTML 출력 시
<h3>Welcome! ${user.userName} 님 </h3> => <h3> Welcome 유비님 </h3>

-> 커스텀 태그 속성 값으로
<c:set var="name" value="${user.userName}"/>

  • ${left.right}
    left : EL 내장 객체, 자바 Bean, Map 중의 하나
    right : Bean의 경우 프로퍼티, Map의 경우 key 값,
  1. ${user.userId} = ${user["userId"]}
  2. ${requestScope.user.userId} // requestScope 는 EL 내장

Map의 경우
${nationMap.kr} = ${nationMap["kr"]}
${header.host} = ${header["host"]}

-> Servlet
Map<String, String> teachers = new HashMap<String, String>();
teachers.put("java", "유비");

request.setAttribute("teachers", teachers);

-> JSP
Your Java teacher is ${teachers["java"]}

배열의 경우
${nations[0]} = ${nations["0"]}

List의 경우
-> Servlet
List<String> hobbies = new ArrayList<String>();
hobbies.add("travel");
hobbies.add("dirve");

request.setAttribute("hobbies", hobbies);

-> JSP
Your first hobby is ${hobbies[0]}

EL 내장 객체

  • pageScope / requestScope / sessionScope / applicationScope

  • param ex) ${param.userName}

  • paramValues ex) ```${paramValues.fruit[0}

  • header / headerValues ex) ${}

  • cookie ex) ${cookie.userName.value}
    =>

	if(cookie[i].getName().equals("userName")){
		out.println(cookie[i].getValue());
	}
  • initParam

  • pageContext ex) ${pageContext.request.method} = ${requestScope.method}

EL 연산

  • ${ 1 + 2 * 4 } = 9

  • ${ "1" + 10 } = 11

  • ${ null + 1 } = 1

  • ${ 3 div(= '/') 4 } = 0.75

  • ${ 32 % 10 } = 2

  • ==, eq <-> !=, ne

  • ${empty someVar}

  1. someVar 가 빈 객체인지 여부를 검사
  2. true : null, "", 길이 0 등 외에는 false
  • null 값에 대한 EL 처리 방법
  1. 속성/프로퍼티가 존재하지 않을 경우 에러 대신 그 부분에 어떤 내용도 출력하지 않음
  2. 산술 연산에서 null 값은 0으로 처리
  3. 논리 연산에서 null 값은 false로 처리

EL 2.2 객체 메소드 호출

  • ${x.메소드()} => JSP 2.1 이전 버전에서는 컴파일 에러

  • 잘 사용하지는 않음

<%
	Calculator calc = new Calculator();
    request.setAttribute("calc", calc);
%>

${calc.setAdd(1, 3)}
${calc.getAdd()}

JSTL(JSP Standard Tag Library)과 커스텀 태그

  • JSTL은 표준 태그 라이브러리(Standard Tag Library)로써, 커스텀 태그 중에서 많이 사용하는 것들을 모아 JSTL 규약을 만듬

  • JSTL을 사용함으로써, 스크립트 코드를 사용할 때보다 더 간결하고 이해하기 쉬운 JSP 코드를 작성할 수 있음

  • 커스텀 태그는 사용자가 직접 개발한 사용자 정의 태그로써, 특정 업무나 기능을 가진 태그를 개발자가 직접 커스터마이징 할 수 있음

특징

  • JSP에서 자바 코드를 제거할 수 있음
  • 커스텀 태그는 재사용이 가능
  • 코드에 대한 가독성과 유지보수가 쉬움
  • XML 기반의 태그 형식
  • 다양한 커스텀 태그 라이브러리 제공

JSTL 태그의 종류

  • 코어 라이브러리 : 변수 지원, 흐름 제어, URL 처리 (접두어 : c)

  • XML 라이브러리 : XML 제어, 변환 (접두어 : x)

  • 국제화 라이브러리 : 지역, 메세지, 숫자, 날짜 형식 (접두어 : fmt)

  • 데이터베이스 라이브러리 : SQL (접두어 : sql)

  • 함수 라이브러리 : 컬렉션, String 처리 (접두어 : fn)

JSTML 코어 라이브러리

  • set / if / forEach / url / out

set 태그

  • EL 변수의 값이나 EL 변수의 프로퍼티 값을 지정할 때 사용
<c:set var="pageTitle">회원가입</c:set>

<html>
	<head><title>${pageTitle}</title></head>
    ...
</html>

if 태그

  • 자바의 if블록과 유사한 기능을 제공
<c:if test="조건식"> 조건인 참일 경우 실행코드 </c:if>

<c:if test="${not empty errorMsgs}"> 에러 처리를 여기서 </c:if>

forEach 태그

  • 배열, 컬렉션, 맵의 데이터를 순차적으로 처리할 때 사용
<c:forEach var="message" items="${errorMsgs}">
	<li>${message}</li>
</c:forEach>

<c:forEach var="num" begin="1" end="10">
	${num} // 1부터 10까지 값 출력
</c:forEach>

url 태그

  • 컨텍스트(Context) 경로를 포함한 URL을 생성

  • 컨텍스트 경로는 웹프로그래밍을 위한 물리적인 디렉토리 구조(찾아가기 위한 경로 Context root)

  • value 속성은 절대 경로/상대 경로 모두 가능

<form action='<c:url value="add_user.do">' method="post">
<form action='/add_user.do' method="post">

out 태그

  • 데이터를 출력할 때 사용되는 태그로써, 특수 문자를 변경할 수 있는 기능을 제공

  • escapeXml=true 값이 기본값으로 설정되어 있어, 태그가 화면에 출력됨

<c:out value="${param.email}" default="no email provided" />
<c:out ...> 출력 내용 </c:out>

JSTL 코어 라이브러리 실습

  • JSP 페이지 위에 하단 태그 기입
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

Servlet엔 리스트 객체가 생성되어 있음

JSP

<c:forEach var="message" items="${errorMsgs}">
	<li><c:out value="${message}" /></li>
</c:forEach>

보충

  • JSTL의 if 와 elseif 방법
<c:if test="${not empty errorMsgs}">
	<ul>
		<c:forEach var="message" items="${errorMsgs}">
			<li><c:out value="${message}" /></li>
		</c:forEach>
		<c:when test="">
			<c:choose></c:choose>
			<c:otherwise></c:otherwise>
		</c:when>
	</ul>
</c:if>
profile
안녕하세요. 맡은 업무를 확실하게 수행하는 웹 개발자가 되기 위하여 끊임없이 학습에 정진하겠습니다.

0개의 댓글

관련 채용 정보