Skip to content

Latest commit

 

History

History
1203 lines (922 loc) · 37.5 KB

2018.10.24 수요일.md

File metadata and controls

1203 lines (922 loc) · 37.5 KB

2018.10.24 수요일

JSP웹 프로그래밍

@ 서블릿을 쉽게 개발하기 위한 방법,

웹 컨테이너에게 메타 방법을 통해 전달하는 효과

@ jdbcfactory 생성을 계속 하지 않도록 - init 만들었었다.

​ - 해결을 위해 Listener 활용할 수 있다.

Listener 와 Servlet Filter

  • Listener의 정의

    • 웹 어플리케이션의 시작 실행 종료 과정에서 발생하는 중요 이벤트에 대한 처리 클래스로 다양한 리스너를 제작, 등록 할 수 있다.
순번 리스너(인터페이스) 모니터링 내용
1 javax.servlet.ServletContextAttributeListener 서블릿 컨텐스트에 속성의 추가/삭제/수정
2 javax.servlet.http.HttpSessionListener 세션상태변화(사용자 접속현황)
3 javax.servlet.ServletRequestListener 사용자 요청 발생시
4 javax.servlet.ServletRequestAttributeListener Request 속성의 추가/삭제/수정
5 javax.servlet.http.HttpSessionBindingListener 속성을 넣고자 하는 대상이 세션에 포함되어 있는지 확인
6 javax.servlet.http.HttpSessionAttributeListener 세션 속성의 추가/삭제/수정
7 javax.servlet.ServletContextListener 애플리케이션 컨텍스트 생성/소멸 (이번 web_blog에서 init을 serviceContextListener를 통해 활용)
8 javax.servlet.http.HttpSessionActivationListener 세션의 활성화 상태 (액션 이벤트 처리와 비슷한 형태. )
  • Listener구현

  • package kr.or.kosta.jsp.listener;
    
    import javax.servlet.ServletContext;
    import javax.servlet.ServletContextEvent;
    import javax.servlet.ServletContextListener;
    
    import kr.or.kosta.jsp.dao.DaoFactory;
    import kr.or.kosta.jsp.dao.JdbcDaoFactory;
    
    
    /**
     * ServletContext 생명주기(생성/소멸) 관련 이벤트 리스너
     * @author 김기정
     */
    public class ServletContextLoadListener implements ServletContextListener {
    	
    	/**
    	 * ServletContext생성 이벤트 처리
         * ServletContext가 생성되면(서블릿컨테이너 초기화) 웹 애플리케이션내의
         * 모든 Servlet, JSP, Filter 등이 공유할 수 있는 객체 또는 리소스 생성 및 등록(초기화)
    	 */
    	public void contextInitialized(ServletContextEvent event)  {
    		System.out.println("[Debug] : ServletContext 생성됨 >>>");
    		DaoFactory daoFactory = new JdbcDaoFactory();
    		// 모든 서블릿, JSP들이 공유할 수 있도록 ServletContext에 DaoFactory 저장
    		ServletContext servletContext = event.getServletContext();
    		servletContext.setAttribute("daoFactory", daoFactory);
    	}
    	
    	
    	public void contextDestroyed(ServletContextEvent event)  {
    		System.out.println("[Debug] : ServletContext(서블릿컨테이너) 종료됨 >>>");
        }
    }
  • 활용 예제 - listByPage-v2 : 메소드 init을 생략 가능하다.

    //DaoFactory factory = new JdbcDaoFactory();
    DaoFactory factory = (DaoFactory)application.getAttribute("daoFactory"); //어플리케이션 등록을 통해 더 쉽게 활용 가능하다. 
    UserDao dao = factory.getUserDao();
    List<User> list = dao.listByPage(params);
    <%--이 아래 메서드는 지워도 도 된다. : servletContext가 역할 대신 수행--%>
    <%-- 여기는 index.jsp - > init 생략 능
    <%!
    public void jspInit(){
      DaoFactory daoFactory = new JdbcDaoFactory2();
      getServletContext().setAttribute("daoFactory", daoFactory);
    }
     %> --%>
  • 웹의 3대 구조 : 서블릿, 리스너, 필터

Service Filter (필터)

  • 클라이언트의 요청을 서블릿이나 JSP가 받기 전에 공통 기능을 수행하기 위해 설정하는 기능이다.

    • Web_blog프로젝트, 로그인, 인코딩, 이미지 변환 등의 작업을 공통적으로 수행 가능하다.
  • 필터의 특징

    • 필터 체인
      • 필터는 여러개 생성이 가능하며, 묶어서 처리가 가능하다.
  • 적용의 절차

    • web.xml에 태그 이용한 필터 등록
  • filter라이프사이클

    • 생성 - 초기화 - 필터링 - 종료의 4단계로 이루어져 있다.
    • 필터의 init()메소드를 호출하면 바로 요청 객체를 처리할 수 있는 상태가 된다.
    • doFilter()메소드를 통해 요청 처리한다.
    • 순서 : inti - doFilter - destroy
    • 1540343801470
      1. 요청의 필터 작업 수행 - 체인의 다음 필터 처리 - 응답의 필터링 작업 수행
  • CharacterEncodingFilter : 한글 인코딩 처리 (필터 예제)

package kr.or.kosta.jsp.filter;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
/**
 * 요청파라메터 한글인코딩 처리 필터
 */
public class CharacterEncodingFilter implements Filter {
	private String encoding;
	
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		encoding = filterConfig.getInitParameter("encoding");
	}
	
	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		// 전처리
		if(encoding != null){
			request.setCharacterEncoding(encoding);
		}
		chain.doFilter(request, response);
		// 후처리
	}
	@Override
	public void destroy() {	}
}
<!-- 필터 등록 -->
	<filter>
		<filter-name>CharacterEncodingFilter</filter-name>
		<filter-class>kr.or.kosta.jsp.filter.CharacterEncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>utf-8</param-value>
		</init-param>
	</filter>
	
	<filter-mapping>
		<filter-name>CharacterEncodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
  • 브라우저 요청과 관련된 것이기 때문에 매핑이 필요한 것이다.

    • (*) 모든 요청 상황에 대한 처리를 해준다.
    • pattern 을 여러개 사용이 가능하다.
    • 모든 요청에 대한 필터링 처리 기능이 가능하다.
  • LoginCheckFilter 로그인 여부 체크를 위한 필터

package kr.or.kosta.jsp.filter;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;

/**
 * 사용자 로그인 여부 체크 필터
 */
public class LoginCheckFilter implements Filter {
	
//	private String loginPage = "/user/login.jsp";
	private String loginPage;

    @Override
	public void init(FilterConfig filterConfig) throws ServletException {
    	loginPage = filterConfig.getInitParameter("loginPage");
	}

    @Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    	System.out.println("[디버깅] : LoginCheckFiler 실행..");
		boolean isLogin = false;
		Cookie[] cookies = ((HttpServletRequest)request).getCookies();
		if(cookies != null) {
			for (Cookie cookie : cookies) {
				if(cookie.getName().equals("loginId")) {
					isLogin = true;
					break;
				}
			}
		}	
		if(isLogin) {
			chain.doFilter(request, response);
		}else {
			if(loginPage == null) {
				throw new ServletException("LoginCheckFilter에 loginPage가 설정되어 있지 않습니다.");
			}
			request.setAttribute("uri", ((HttpServletRequest)request).getRequestURI());
			request.getServletContext().getRequestDispatcher(loginPage).forward(request, response);
		}
	}    
    @Override
	public void destroy() {}

}
<filter>
		<filter-name>LoginCheckFilter</filter-name>
		<filter-class>kr.or.kosta.jsp.filter.LoginCheckFilter</filter-class>
		<init-param>
			<param-name>loginPage</param-name>
			<param-value>/user/login.jsp</param-value>
		</init-param>
	</filter>
<!-- 요청하는 페이지 목록을 선택적으로 활용 가능하다. -->
	<filter-mapping>
		<filter-name>LoginCheckFilter</filter-name>
		<url-pattern>/user/list.jsp</url-pattern>
		<url-pattern>/user/listByPage.jsp</url-pattern>
		<url-pattern>/user/listByPage-v2.jsp</url-pattern>
		<url-pattern>/some/*</url-pattern>
	</filter-mapping>

EL(Expression Language) 표현언어

  • JSP의 단점
    • HTML템플릿 텍스트와 자바 언어를 사용하는 원소의 혼재로 가독성 떨어짐
 EL   : ${ applicationScope.mail }
 JSP : <%=application.getAttribute(“mail”) %>
  • JSP에 자바 스크립트 코드를 사용할 수 있게 해주는 것

    • Property를 통해 자동으로 접근 가능하다.
  • EL(Expression Language)

    • 스크립트 언어로 자바코드 대신에 값을 쉽고 간결하게 표현 가능하다.
    • JSP의 표현식을 대체하고, <jsp: getProperty>액션태그 보완을 위해 사용한다.
    • JSTL과 함께 사용하면, 가독성과 유지보수를 높일 수 있다.
  • 주요 기능_

    • 스코프, 객체에 저장된 자바빈의 속성이나 Collection객체의 원소를 대체 가능
    • 연산자 사용 , 디폴트 객체(11개 - 미리 생성된 객체)
    • 자바 객체의 인스턴스 및 클래스 메서드를 호출 가능하다.
<c:if test="${b.like_check == 'Y' }">
                        <li><a
                           href="javascript:likeUp(${b.board_no },'<%=session.getAttribute("id") %>')"
                           class="icon fa-heart" id="icon${b.board_no}">${b.b_like_cnt }</a></li>
                     </c:if>
                     <c:if test="${b.like_check == 'N' }">
                        <li><a
                           href="javascript:likeUp(${b.board_no },'<%=session.getAttribute("id") %>')"
                           class="icon fa-heart-o" id="icon${b.board_no}">${b.b_like_cnt }</a></li>
                     </c:if>
<%-- JSP 표현식(출력문) 대신 사용--%>
<%= request.getAttribute(“user”).getName() %>
EL로 간단히 표현 ☞ ${requestScope.user.name}  또는 ${user.name}
<%-- 액션태그의 속성으로 사용--%>
<jsp:include page=“/module/${skin.id}/header.jsp” />
  • getName -> user.name으로 접근 가능하다.

  • 자바스크립트 언어와 똑같다고 생각하면 된다~

  • EL언어 활용 예제

  • <%@ page contentType="text/html; charset=utf-8" %>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>EL연습</title>
    </head>
    <body>
    ${"김기정" }
    ${'김기정'}
    ${10 }
    ${NULL }
    ${true }
    ${false }
        
    <br>
    
    <%=10 + "20" %>,${10+"20" }<br>
    
    ${ true && false }, ${true and false  }
    ${empty null }
    ${empty "" }
        
    </body>
    </html>
  • EL코드를 통해 자바 스크립트를 이용한다.

  • empty - null, 빈문자열, 컬렉션 체크 모두 가능

    • ${ true && false }, ${true and false  }
      
      ${empty null }
      ${empty "" }
    • 산술 및 논리 연산자 활용가능하다. / empty를 통해 쉽게 빈문자 체크 가능

  • EL에서 사용가능한 디폴트 기본 객체(11개, 다 MAP 구조다. )

    • RequestScope : 기본 객체에 저장된 속성 <key, 값>

    • 디폴트객체 기 능
      pageScope pageContext 기본 객체에 저장된 속성<키, 값> 매핑을 저장한 Map 객체
      requestScope request 기본 객체에 저장된 속성<키, 값> 매핑을 저장한 Map 객체
      sessionScope session 기본 객체에 저장된 속성<키, 값> 매핑을 저장한 Map 객체
      applicationScope application 기본 객체에 저장된 속성<키, 값> 매핑을 저장한 Map 객체
      param 요청 파라미터의 <파라미터이름, 값> 매핑을 저장한 Map 객체 request.getParameter(“파라미터이름”)의 결과와 동일
      paramValues 요청 파라미터의 <파라미터이름, 값배열> 매핑을 저장한 Map 객체 request.getParameterValues(“파라미터이름”)의 결과와 동일
      header 요청 정보의 <헤더이름, 값> 매핑을 저장한 Map 객체 request.getHeader(“헤더이름”)의 결과와 동일
      headerValues 요청 정보의 <헤더이름, 값배열> 매핑을 저장한 Map 객체 request.getHeaders(“헤더이름”)의 결과와 동일
      initParam web.xml의 의 초기파라미터 <이름, 값> 매핑을 저장한 Map 객체 application.getInitParameter(“파라미터이름”)의 결과와 동일
      cookie <쿠키이름, Cookie> 매핑을 저장한 Map 객체 request.getCookies()의 결과와 동일
      pageContext jsp의 pageContex와 동일한 자바 빈객체

param - > map 구조 : 요청 파라미터의 매핑을 저장한 MAP객체

paramValues -> 요청 파라미터의 매핑을 저장한 Map객체

EL이 NULL값일 경우 - 빈 문자열이 찍힌다. : 유용하게 활용 가능하다. 에러 발생의 빈도 수를 줄여준다.

  • 쿠키 받기 위한 방법 (Cookie)

    • <쿠키이름, Cookie> 매핑을 저장한 Map객체

    • request.getCookies()의 결과와 동일하다

    • ${sessionScope}<br>
      ${applicationScope}<br>
      
      모든 스코프객체에서 검색 : ${name}<br>
      
      <%=request.getParameter("id") %>
      ${param.id}<br>
      
      ${paramValues}<br>
      ${paramValues.hobby[0]},${paramValues.hobby[1]}
      
      ${header}<br>
      브라우저 정보 : ${header["user-agent"]}<br>
      
      ${headerValues}<br>
      
      ${initParam}<br>
      ${initParam.message}<br>
      ${cookie}<br>
      쿠키이름 : ${cookie.loginCookie.name}<br>
      쿠키값 : ${cookie.loginCookie.value}
      
      
  • EL디폴트 객체 (11개)

    • <%@ page contentType="text/html; charset=utf-8" %>
      <!DOCTYPE html>
      <html>
      <head>
      <meta charset="utf-8">
      <title>EL 디폴트 객체 (11개)</title>
      </head>
      <body>
      <br>
      ${pageScope }
      --------------------------------------페이지스코프<br>
      ${requestScope }
      -------------------------------------리퀘스트 스코프<br>
      ${SessionScope }
      -------------------------------------세션스코프<br>
      <%--${applicationScope } --%>
      -------------------------------------<br>
      ${param.name }, ${param["name"] }
      -------------------------------------파람.네임<br>
      ${paramValues.hobby[0] }, ${paramValues.hobby[1] }
      -------------------------------------파람벨류.하비<br>
      ${header["user-agent"]}
      --------------------------------------헤더.유저에이전트<br>
      ${headerValues["user-agent"]}
      --------------------------------------헤더벨류.유저에이전트<br>
      ${param["name"] }
      
      
      --------------------------------------쿠키<br>
      쿠키 : ${cookie.loginId.name }, ${cookie.loginId.value }
      --------------------------------------<br>
      ${pageContext.request.method }
      <%request.getMethod() %><br>
      
      </body>
      </html>
      
    • Scope객체에 존재하는 데이터 저장하기 (EL의 응용이해)

    • 기존의 출력문을 EL이 대체하고 있는 것이다.

    • 액션 태그의 getProperty를 보완하는 역할이다. 점을 여러개 사용하여 하위 객체까지 접근 가능하다.

    • <%@page import="java.util.Calendar"%>
      <%@ page contentType="text/html; charset=utf-8" %>
      <!DOCTYPE html>
      <html>
      <head>
      <meta charset="utf-8">
      <title>EL 디폴트 객체 (11개)</title>
      </head>
      <body>
      <%
      // 테스트를 위한 Scope객체에 데이터 저장
      String today = String.format("%1$tF %1$tT", Calendar.getInstance());
      request.setAttribute("today", today);
      
      session.setAttribute("id", "bangry");
      
      String[] names = {"김기정", "박기정", "최기정"}; //얘는 단지 지역변수 일 뿐이다. Scope객체에 접근방법 
      %>
      
      <%--날짜 호출을 위한 두가지 방법 --%>
      <%=request.getAttribute("today") %>
      ${requestScope.today}<br>
      ${today}<br>
      
      <%--아이디 호출을 위한 두가지 방법 --%>
      <%=pageContext.findAttribute("id") %>
      ${id}<br>
      
      <%--배열 생성 후 접근 : 접근 불가능하다!!!!!.  --%>
      ${names[0]}, ${names[1]}, ${names[2]}<br>
      
      <%--jsp usebean태그로 user/ dog java 접근 --%>
      <jsp:useBean id="dog" class="kr.or.kosta.jsp.el.Dog" scope="page"/>
      <jsp:setProperty property="name" name="dog" value="강아지루니루니"/>
      
      <jsp:useBean id="student" class="kr.or.kosta.jsp.el.Student" scope="page"/>
      <jsp:setProperty property="name" name="student" value="학생이름이혜림"/>
      <jsp:setProperty property="dog" name="student" value="${dog}"/>
      
      
      <%--
      <jsp:getProperty property="id" name="student"/>
      <jsp:getProperty property="name" name="student"/>
      <jsp:getProperty property="dog" name="student"/>
      --%>
      
      <%--dog객체의 toString 으로출력된다. 결과 : Dog [name=강아지루니루니] --%>
      <jsp:getProperty property="dog" name="student"/><br>
      학생이름 : 
      ${student.name }<br>
      강아지 이름 : 
      ${student.dog.name }<br>
      <%--
      ${student.id},
      ${student.name}, 
      ${student.dog.name}<br>
       --%>
      
      
      </body>
      
      
      </body>
      </html>
    • 결과 화면 : 2018-10-24 12:43:33 2018-10-24 12:43:33 2018-10-24 12:43:33 bangry bangry , , Dog [name=강아지루니루니] 학생이름 : 학생이름이혜림 강아지 이름 : 강아지루니루니

  • 표현언어 자바 메서드 사용

    • annotation과 비슷한 표현
      • TLD파일에 함수 표현
  • <%@page isELIgnored="true" %>

    • EL이 TEXT메시지 형태로 나올 수 있다.

JSTL(JSP Standard Tag Library)

  • JSP스크립트 요소의 자바 코드를 사용하지 않고도, HTML태그와 같이 표준화된 태그만으로 쉽게 사용 가능한 JSP 표준 태그 라이브러리

  • 태그 사용 종류

      1. 액션 태그
      2. Custom태그
      3. JSPL 미리 만들어진 TAG라이브러리

JSTC Core라이브러리

1540358959408

  • jsp 파일 위치

C:\KOSTA187\tools\apache-tomcat-8.0.53\webapps\examples\WEB-INF\lib

복사 -> WEB-INF -> lib -> 붙여넣기 이용

  • JSTL Core 라이브러리 활용 예제

  • c : out 태그
    • 1. 태그 내용 없이 사용하는 경우
      <c:out value="value" [escapeXml="{true|false}"] [default="defaultValue"] />  
      
      2. 태그 내용이 있는 경우
      <c:out value="value" [escapeXml="{true|false}"]> 
        default value (value에 내용이 없을 때 출력될 기본 값)
      </c:out>
      
      
    • 
      <c:out value="김기정"/><br>
      ${message }<br>
      <c:out value="${message }" default="기본 메시지 입니다..."/><br>
      <%--위의 두가지 태그의 차이점 
      
      1. 꺽쇠가 있을 경우이 결과 창이 달라진다. 
      2. EL은 있는 그대로 출력한다.
      3. out 태그는 다 바꾸어 준다. 
      4. out 태그 메시지 안에 오류 발생시, 디폴트 값을 지정해주어서 오류를 막아줄 수 있다. 
      
      
  • c: set태그

    • JSP 4개의 스코프 객체에 속성을 설정하거나 빈의 프로퍼티 사용시 사용한다.

    • 1. 스코프 객체에 속성을 추가하는 경우
      <c:set value="value" var="varName" [scope="{page|request|session|application}"]/>
      
      2. 특정 빈 객체의 프로퍼티 값을 설정하는 경우
      <c:set value="value" target="target" property="propertyName"/>
      
      
    • VAR 입력값이 : KEY값이 된다.

    • VALUE : 저장하고자 하는 값이 될 수 있다.

      1. 스코프 객체에 속성을 추가하는 경우 예제
    • <%@ page contentType="text/html; charset=utf-8" %>
      <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
      <%--태그만 활용하여 스코프 객체에 저장할 수 있다. --%>
      <c:set var="message" value="JSTL <연습>입니다." scope="page"/>
      
      <!DOCTYPE html>
      <html>
      <head>
      <meta charset="utf-8">
      <title></title>
      </head>
      <body>
      
      <c:out value="김기정"/><br>
      ${message }<br>
      <c:out value="${message }" default="기본 메시지 입니다..."/><br>
      <%--위의 두가지 태그의 차이점 
      
      1. 꺽쇠가 있을 경우이 결과 창이 달라진다. 
      2. EL은 있는 그대로 출력한다.
      3. out 태그는 다 바꾸어 준다. 
      4. out 태그 메시지 안에 오류 발생시, 디폴트 값을 지정해주어서 오류를 막아줄 수 있다. 
      
       --%>
      </body>
      </html>
      1. 특정 빈 객체에 프로퍼티 값을 설정하는 경우
      <%@ page contentType="text/html; charset=utf-8" %>
      <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
      <%--태그만 활용하여 스코프 객체에 저장할 수 있다. --%>
      <c:set var="message" value="JSTL <연습>입니다." scope="page"/>
      <%--특정 빈 객체에 프로퍼티 값을 설정하는 경우 --%>
      <jsp:useBean id="dog" class="kr.or.kosta.jsp.el.Dog"/>
      <c:set target="${dog}" property="name"  value="루니"/>
      
      
      
      <!DOCTYPE html>
      <html>
      <head>
      <meta charset="utf-8">
      <title></title>
      </head>
      <body>
      
      <c:out value="김기정"/><br>
      ${message }<br>
      <c:out value="${message }" default="기본 메시지 입니다..."/><br>
      <%--위의 두가지 태그의 차이점 
      
      1. 꺽쇠가 있을 경우이 결과 창이 달라진다. 
      2. EL은 있는 그대로 출력한다.
      3. out 태그는 다 바꾸어 준다. 
      4. out 태그 메시지 안에 오류 발생시, 디폴트 값을 지정해주어서 오류를 막아줄 수 있다. 
      
       --%>
       
      강아지 이름 : ${dog.name }
      </body>
      </html>
  • C: remove 태그

    • 4개의 스코프 객체에 저장된 속성 제거시 사용.

    • <c:remove var="message"/>
      
    • 기존 메시지가 지워지고, message 내의 default값이 나온다.

  • C: catch 태그

    • <c:catch [var="varName"]> 
        예외 처리 
      </c:catch>
      
    • 오류 발생시 나타나는 화면을 변경해준다 -> try catch 개념

  • <%@ page contentType="text/html; charset=utf-8" %>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    <title></title>
    </head>
    <body>
    <c:catch var="ex">
    <%= 100/0 %>
    </c:catch>
    ${ex }예외가 발생하였습니다.
    </body>
    </html>

    결과 화면 : java.lang.ArithmeticException: / by zero예외가 발생하였습니다.

  • C:IF 태그

    • 조건이 맞는 경우, 태그 바디 부분 처리( IF문과 유사하지만 else는 지원하지 않음)

    • 1. 바디 내용이 없는 경우 
      <c:if test="testCondition" var="varName" scope="{page|request|session|application}"]/>
      
      2. 바디 내용이 있는 경우
      <c:if test="testCondition" [var="varName"] [scope="{page|request|session|application}"]> 
         body content 
      </c:if>
      
    • var 키워드 옆에는 scope값이 따라온다.

    • <%@ page contentType="text/html; charset=utf-8" %>
      <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
      
      <c:set var="score" value="85" scope="request"/>
      <!DOCTYPE html>
      <html>
      <head>
      <meta charset="utf-8">
      <title></title>
      </head>
      <body>
      <c:if test="${score>50 }">
      통과
      </c:if>
      <c:if test="${empty param }">
        <c:set var="page" value="1">  </c:set>
      </c:if>
      
      ${page }
      </body>
      </html>
  • C:Choose / C: when / C :otherwise

    • Switch 문과 유사한 기능. 하나의 태그에는 여러개의 when 태그가 존재한다.

    • <c:choose> 
           body content (<when> and <otherwise> subtags) 
        <c:when test="testCondition"> 
          body content 
        </c:when>
        <c:otherwise> 
          conditional block 
        </c:otherwise>
      </c:choose>
      
    • <%@ page contentType="text/html; charset=utf-8" %>
      <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
      <c:set var="score" value="85" scope="request"/>
      <!DOCTYPE html>
      <html>
      <head>
      <meta charset="utf-8">
      <title></title>
      </head>
      <body>
      <c:choose>
        <c:when test="${score >=90 }">수</c:when>
          <c:when test="${score >=80 }">우</c:when>
          <c:when test="${score >=70 }">미</c:when>
          <c:when test="${score >=60 }">양</c:when>
        <c:otherwise>가</c:otherwise>
      </c:choose>
      </body>
      </html>
    • Switch문으로 활용 가능한 => choose

  • c:forEach태그

    • 자바의 for 문과 유사하며 가장 유용한 JSTL태그 중 하나

    • 1. 지정된 회수 반복
      <c:forEach [var="varName"] [varStatus="varStatusName"] begin="begin" end="end“ [step="step"]> 
          body content 
      </c:forEach>
      
      2. 컬렉션 객체의 사이즈 만큼 반복(확장 for문과 유사)
      <c:forEach [var="varName"] items="collection" [varStatus="varStatusName"] [begin="begin"] [end="end"] [step="step"]> 
          body content 
      </c:forEach>
      
    • varStatus = 상태 정보 변화 / begin = 반복 언제부터 시작 / end = 어디부터 어디까지 / step = 증가

    • 김기정 입니다를 10번 출력하기 위한 forEach 태그

    • <%@ page contentType="text/html; charset=utf-8" %>
      <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
      <%--김기정 입니다. 10번 출력하는 forEach 태그 --%>
      <!DOCTYPE html>
      <html>
      <head>
      <meta charset="utf-8">
      <title></title>
      </head>
      <body>
      <c:forEach var="i" begin="1" end="10">
      ${ i} : 김기정 입니다.<br>
      </c:forEach>
      </body>
      </html>
    • 구구단 인출하기

    • <%@ page contentType="text/html; charset=utf-8" %>
      <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
      <%--김기정 입니다. 10번 출력하는 forEach 태그 --%>
      <!DOCTYPE html>
      <html>
      <head>
      <meta charset="utf-8">
      <title></title>
      </head>
      <body>
      <c:forEach var="i" begin="1" end="10">
      ${i } : 김기정 입니다.<br>
      </c:forEach>
      <table border="3">
      <c:forEach var="i" begin="2" end="9">
      <tr>
        <c:forEach var="j" begin="1" end="9">
        <td>${i } * ${j } = ${i*j }</td>
        </c:forEach>
        </tr>
      </c:forEach>
      </table>
      </body>
      </html>
    • 동적으로 옵션 박스 만들기 (teams로 들어있는 값 인출 / User의 값 테이블 출력)

    • <%@page import="kr.or.kosta.jsp.dao.User"%>
      <%@page import="java.util.List"%>
      <%@page import="java.util.ArrayList"%>
      <%@ page contentType="text/html; charset=utf-8" %>
      <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
      <%--가상의 데이터를 만들고 forEach 문을 돌려 데이터 인출하기 --%>
      <%
      List<String> teams = new ArrayList();
      teams.add("한화 이글즈");
      teams.add("두산 베어즈");
      teams.add("SK 와이번즈");
      request.setAttribute("teams", teams);
      
      List<User> users = new ArrayList<User>();
      users.add(new User("bangry1","이혜림","1111","nina3355@naver.com","2018"));
      users.add(new User("bangry2","이혜림","1111","nina3355@naver.com","2018"));
      users.add(new User("bangry3","이혜림","1111","nina3355@naver.com","2018"));
      users.add(new User("bangry4","이혜림","1111","nina3355@naver.com","2018"));
      users.add(new User("bangry5","이혜림","1111","nina3355@naver.com","2018"));
      request.setAttribute("users", users);
      %>
      
      <%--김기정 입니다. 10번 출력하는 forEach 태그 --%>
      <!DOCTYPE html>
      <html>
      <head>
      <meta charset="utf-8">
      <title></title>
      </head>
      <body>
      <c:forEach var="i" begin="1" end="10">
      ${i } : 김기정 입니다.<br>
      </c:forEach>
      
      <%--구구단 만들기 테이블 --%>
      <table border="3">
      <c:forEach var="i" begin="2" end="9">
      <tr>
        <c:forEach var="j" begin="1" end="9">
        <td>${i } * ${j } = ${i*j }</td>
        </c:forEach>
        </tr>
      </c:forEach>
      </table>
      
      <%-- SELECT 팀이름 작성하기 --%>
      <select>
        <c:forEach var="team" items="${teams }">
          <option>${team }</option>
        </c:forEach>
      </select>
      
      <%--User의 입럭 데이터 인출하기 --%>
      
      <table border="1">
       <tr>
       <td>아이디</td>
       <td>이름</td>
       <td>비밀번호</td>
       <td>이메일</td>
       <td>가입일자</td>
       </tr>
       
       <c:choose>
       <c:when test="${not empty users}">
       <c:forEach var="user" items="${users }" varStatus="status">
       <tr>
       <td>${status.index} ${user.id }</td>
       <td>${user.name }</td>
       <td>${user.passwd }</td>
       <td>${user.email }</td>
       <td>${user.regdate }</td>
       </tr>
      </c:forEach>
       </c:when>
       <c:otherwise>
       <tr>
       <td colspan="5">회원이 존재하지 않습니다.</td>
       </tr>
       </c:otherwise>
       </c:choose>
      </table>
      
      <%
      String ssn = "940308-1111111";
      request.setAttribute("ssn", ssn);
      %>
      
      <c:forTokens var="token" items="${ssn }" delims="-">
      ${token },
      </c:forTokens>
      </body>
      </html>
  • C:import 태그

    • <%@ include %> 지시어와 <jsp:include /> 액션태그와 달리 웹 컨테이너 외부 자원도 포함 가능

    • 포함 하고자 하는 자원을 문자열 형태로 포함 하는 경우
      <c:import url="url" [context="context"] [var="varName"] [scope="{page|request|session|application}"] [charEncoding="charEncoding"]> 
         optional body content for <c:param />
      </c:import> 
    • <%@page import="kr.or.kosta.jsp.dao.User"%>
      <%@page import="java.util.List"%>
      <%@page import="java.util.ArrayList"%>
      <%@ page contentType="text/html; charset=utf-8" %>
      <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
      
      
      <!DOCTYPE html>
      <html>
      <head>
      <meta charset="utf-8">
      <title></title>
      </head>
      <body>
      <%-- <c:import url="http://www.naver.com" ></c:import>--%>
      <c:import url="https://www.naver.com" var="output"></c:import>
      
      안녕안녕 여기에 임시저장해놓았어! 
      <%-->${output } --%>
      <c:out value="${output }"></c:out>
      
      </body>
      </html>
  • C:URL 태그

    • URL재작성

    • 1. 바디가 없는 경우
      <c:url value="value" [context="context"] [var="varName"] [scope="{page|request|session|application}"]/> 
      
      2. 바디가 있는 경우
      <c:url value="value" [context="context"] [var="varName"] [scope="{page|request|session|application}"]> 
          <c:param/> 
      </c:url>
      
    • <%@page import="kr.or.kosta.jsp.dao.User"%>
      <%@page import="java.util.List"%>
      <%@page import="java.util.ArrayList"%>
      <%@ page contentType="text/html; charset=utf-8" %>
      <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
      <!DOCTYPE html>
      <html>
      <head>
      <meta charset="utf-8">
      <title></title>
      </head>
      <body>
      <%
      String url = "https://www.naver.com?name=bangry";
      %>
      <a href="<%=url%>">이동</a>
      
      <c:url var="url" value="https://www.naver.com">
        <c:param name="id" value="bangry"/>
        <c:param name="name" value="김기정"/>
      </c:url>
      <a href="${url }">이동</a>
      </body>
      </html>

      복잡했던 주소값의 전달을 더 쉽고 간단하게 처리할 수 있다.

  • C: param 태그

    • import, url, redirect 태그에서 파라미터를 설정할 때 사용하는 태그
    • 1. 바디가 없는 경우
      <c:param name="name" value="value"/> 
      
      2. 바디 내용을 속성 값으로 사용하는 경우
      <c:param name="name"> 
          parameter value 
      </c:param>
      
      <%@page import="kr.or.kosta.jsp.dao.User"%>
      <%@page import="java.util.List"%>
      <%@page import="java.util.ArrayList"%>
      <%@ page contentType="text/html; charset=utf-8" %>
      <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
      
      <%-- c:param 태그 --%>
      <%-- import, url, redirect 태그에서 파라미터 설정할 때 사용하는 태그 --%>
      
      <c:redirect url="https://www.daum.net">
        <c:param name="name" value="bangry"/>
      </c:redirect>
      

      <c:redirect url="https://www.daum.net">

      • 이렇게만 작성하여도 페이지 실행시 바로 홈페이지 실행된다
    • <c:redirect url="https://www.daum.net"> <c:param name="name" value="bangry"/> </c:redirect>

      • 파라미터 전송 시에도 활용 가능하다.
      • 주의 : PATH가 일치하여야 한다.
<%@page import="kr.or.kosta.jsp.dao.User"%>
<%@page import="java.util.List"%>
<%@page import="java.util.ArrayList"%>
<%@ page contentType="text/html; charset=utf-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<%-- c:param 태그 --%>
<%-- import, url, redirect 태그에서 파라미터 설정할 때 사용하는 태그 --%>

<%--
<c:redirect url="https://www.daum.net">
 --%>

<%--
<c:redirect url="https://www.daum.net">
  <c:param name="name" value="bangry"/>
</c:redirect>
 --%>

<c:redirect url="/user/login.jsp" context="/jsp"></c:redirect>

core, function, fmt, spring

http://noritersand.tistory.com/256

JSTL:fmt

1540369660960

  • 숫자 형태 포메팅 예제

<%@page import="kr.or.kosta.jsp.dao.User"%>
<%@page import="java.util.List"%>
<%@page import="java.util.ArrayList"%>
<%@ page contentType="text/html; charset=utf-8" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>


<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<fmt:formatNumber value="1700600"/>
<!-- 1,700,600 -->

<fmt:formatNumber value="1700600" type="number"/>
<!-- 1,700,600 -->

<fmt:formatNumber value="1700600" type="number" groupingUsed="false"/>
<!-- 1700600 -->

<fmt:formatNumber value="1700600" type="currency" groupingUsed="true"/>
<!-- ₩1,700,600 -->

<fmt:formatNumber value="1670400" type="currency"  currencySymbol="&"/>
<!-- &1,670,400 -->

<fmt:formatNumber value="0.5" type="percent"/>
<!-- 50% -->

<fmt:formatNumber value="999" minIntegerDigits="5" minFractionDigits="2"/>
<!-- 00,999.00 -->

<fmt:formatNumber value="9876543.61" pattern=".000" />
<!-- 9876543.610 -->

<fmt:formatNumber value="9876543.612345" pattern="#,#00.0#"/>
</body>
</html>
  • 날짜 형식 포메팅 예제

  • <c:out value="${now}"/> <!-- Wed Apr 22 17:14:22 KST 2015 -->
    
    <fmt:formatDate value="${now}" type="date"/>
    <!-- 2015. 4. 22 -->
    
    <fmt:formatDate value="${now}" type="time"/>
    <!-- 오후 5:14:22 -->
    
    <fmt:formatDate value="${now}" type="both"/>
    <!-- 2015. 4. 22 오후 5:14:22 -->
    
    <fmt:formatDate value="${now}" type="both" dateStyle="default" timeStyle="default"/>
    <!-- 2015. 4. 22 오후 5:14:22-->
    
    <fmt:formatDate value="${now}" type="both" dateStyle="short" timeStyle="short"/>
    <!-- 15. 4. 22 오후 5:14 -->
    
    <fmt:formatDate value="${now}" type="both" dateStyle="medium" timeStyle="medium"/>
    <!-- 2015. 4. 22 오후 5:14:22 -->
    
    <fmt:formatDate value="${now}" type="both" dateStyle="long" timeStyle="long"/>
    <!-- 2015년 4월 22일 (수) 오후 5시 14분 22초 -->
    
    <fmt:formatDate value="${now}" type="both" dateStyle="full" timeStyle="full"/>
    <!-- 2015년 4월 22일 수요일 오후 5시 14분 22초 KST -->
    
    <fmt:formatDate value="${now}" type="both" pattern="yyyy년MM월dd일 HH시mm분ss초 E요일"/>
    <!-- 2015년04월22일 17시14분22초 금요일 -->