。゚(*´□`)゚。

코딩의 즐거움과 도전, 그리고 일상의 소소한 순간들이 어우러진 블로그

[네이버클라우드] 클라우드 기반의 개발자 과정 7기/웹프로그래밍

[NC7기-85일차(8월28일)] - 웹프로그래밍 66일차

quarrrter 2023. 8. 28. 15:38

 

JSTL

- JSTL(JSP Standard Tag Library)? 
  - JSP 확장 태그이다.
  - 기본으로 제공하지 않는다.
  - JSTL API를 구현한 외부 라이브러리를 가져와서 사용해야 한다.
- JSTL 라이브러리 가져오기
  - mvnrepository.com 에서 JSTL 검색하여 라이브러리를 정보를 알아낸다.
  - build.gradle 파일의 dependencies {} 블록에 추가한다.
  - 'gradle eclipse' 실행하여 이클립스 설정 파일을 갱신한다.
  - 이클립스 프로젝트를 리프래시 한다.
- JSTL 라이브러리 모듈
  - Core(c) : http://java.sun.com/jsp/jstl/core
  - XML(x) : http://java.sun.com/jsp/jstl/xml
  - I18N(fmt) : http://java.sun.com/jsp/jstl/fmt
  - Database(sql) : http://java.sun.com/jsp/jstl/sql
  - Functions(fn) : http://java.sun.com/jsp/jstl/functions
- JSP 페이지에서 JSTL 라이브러리의 모듈 사용하기
  - JSTL 모듈의 네임스페이스를 가져온다.
      <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
  - JSTL 태그 사용
      <접두어명:태그명 속성="값" 속성="값"/> 

https://docs.oracle.com/javaee/5/jstl/1.1/docs/tlddocs/

 

TLDDoc Generated Documentation

 

docs.oracle.com

https://www.tutorialspoint.com/jsp/jsp_standard_tag_library.htm

 

JSP - Standard Tag Library (JSTL) Tutorial

JSP Standard Tag Library (JSTL) Tutorial - In this chapter, we will understand the different tags in JSP. The JavaServer Pages Standard Tag Library (JSTL) is a collection of useful JSP tags which encapsulates the core functionality common to many JSP appli

www.tutorialspoint.com

* I18N(Internationalization 의 약자)
=> 프로그램을 짤 때 여러 언어를 고려해서 코딩하는 것을 말한다.
=> 특히 화면에서 버튼에 제목이나 라벨을 출력할 때 특정 언어로 고정된 값을 출력하지 않고,
   외부 파일(예: label_ko_KR.properties)에서 읽어 온 값을 출력하도록 프로그래밍 하는 것.
   
* L10N(Localization 의 약자)
=> 특정 언어에 대해 라벨 텍스트를 담은 프로퍼티 파일(예: label_ko_KR.properties)을 
   작성하는 것을 말한다.

처음부터 프로그램 짤 때 다국어로(국제화) 짜야함.

값을 바로 넣는 하드코딩 말고 프로퍼티 값이 출력되게 최초에 코딩해야함. 

새로운 언어가 추가되면 라벨 추가를 하면됨. 

.properties 파일에 라벨이 들어있음

 

//jstl 라이브러리
implementation 'jstl:jstl:1.2'
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<h2>오호라!!!</h2>

<%
out.println("<h2>오호라!!!</h2>");  //scirptlet
%>

<%="<h2>오호라!!!</h2>"%> //expression element

${"<h2>오호라!!!</h2>"} //expression language

<c:out value="<h2>오호라!!!<h2>"/> //JSTL


<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<h1>JSTL - c:out</h1>

<%--
- 출력문을 만드는 태그이다.
  <c:out value="출력될 값" default="기본 값"/>
  <c:out value="출력될 값>기본값<c:out>
--%>


<%
pageContext.setAttribute("name", "유관순");
%>

<c:out value="임꺽정"/><br>
<c:out value="${null}" default="홍길동"/><br>
<c:out value="${null}">홍길동</c:out><br>
<c:out value="${'임꺽정'}" default="홍길동"/><br>   // 문자열 임꺽정이 출력됨
<c:out value="${name}" default="홍길동"/><br>
<c:out value="${name2}" default="홍길동"/><br>


<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<h1>JSTL - c:set</h1>
- 보관소에 값을 저장한다.
<%--
scope을 생략하면 기본이 PageContext 이다.
 --%>

<c:set scope="request" var="name1" value="홍길동2"/>
1: ${requestScope.name1}<br>
2: ${pageScope.name1}<br>  //pageContext에 저장한적없음
3: ${name1}<br> 
<%--
scope을 생략하면 기본이 PageContext 이다.
 --%>
<c:set var="name2" value="임꺽정"/>
1: ${requestScope.name2}<br>
2: ${pageScope.name2}<br>
3: ${name2}<br>
<hr>
  시작 태그와 끝 태그 사이(content)에 값을 넣을 수 있다.
--%>
<c:set var="name3">유관순</c:set>
1: ${requestScope.name3}<br>
2: ${pageScope.name3}<br>
3: ${name3}<br>

**최초 만들어진 m1에 숫자를 넣는거 :내부적으로 m1.setNo(100); 이렇게 바뀜 

<jsp:useBean id="m1" class="eomcs.vo.Member"/>
<%--
Member m1 = (Member) pageContext.getAttribute("m1");
if (m1 == null) {
  m1 = new Member();
  pageContext.setAttribute("m1", m1);
}
 --%>
<jsp:setProperty name="m1" property="no" value="100"/>
<%-- 
m1.setNo(100); **
--%>

target : expression language 꼭 사용해야함. 

<c:set target="${pageScope.m1}" property="email" value="hong@test.com"/>
<%--
Object obj = pageContext.getAttribute("m1");
Method m = obj.getClass().getMethod("setEmail", String.class);
m.invoke(obj, "hong@test.com");

=> m1.setEmail("hong@test.com");
--%>
${pageScope.m1.no}<br>
${pageScope.m1.email}<br>

<h1>JSTL - c:remove</h1>
<pre>
- 보관소에 저장된 값을 제거한다.

아래껀 위꺼 타입의 객체임


<h1>JSTL - c:if</h1>
<pre>
- 조건문을 만든다.

 

=> pagecontext에 저장됨. 


JSTL - c:choose

- 다중 조건문을 만든다.
- 자바의 switch와 유사하다.

JSTL - c:forEach

- 반복문을 만든다.
<%
pageContext.setAttribute("names", new String[]{"홍길동", "임꺽정", "유관순"});
%>
<hr>
<ul>
<% 
String[] names = (String[]) pageContext.getAttribute("names");
for (String n : names) {%>
  <li><%=n%></li>
<%} %>
</ul>

<hr>
<ul>
<c:forEach items="${names}" var="n">
    <li>${n}</li>
</c:forEach>
</ul>
<h2>Collection 객체</h2>
<%
List<String> names2 = new ArrayList<>();
names2.add("홍길동");
names2.add("임꺽정");
names2.add("유관순");
pageContext.setAttribute("names2", names2);
%>

<ul>
<c:forEach items="${names2}" var="n">
    <li>${n}</li>
</c:forEach>
</ul>
<h2>Map 객체</h2>
<%
Map<String,Object> names3 = new HashMap<>();
names3.put("s01", "홍길동");
names3.put("s02", "임꺽정");
names3.put("s03", "유관순");
pageContext.setAttribute("names3", names3);
%>

<ul>
<%-- Map 객체에 대해 반복문을 돌리면 var로 저장되는 것은 
     key와 value를 갖고 있는 Entry 객체이다. --%>
<c:forEach items="${names3}" var="n">
    <li>${n.getKey()} : ${n.getValue()} => ${n.key} : ${n.value}</li>   
</c:forEach>
</ul>
<h2>CVS(comma separated value) 문자열</h2>
<%
pageContext.setAttribute("names4", "홍길동,임꺽정,유관순,김구");
%>

<ul>
<c:forEach items="${names4}" var="n">
    <li>${n}</li>
</c:forEach>
</ul>

JSTL - c:forTokens

- 반복문을 만든다.
- cvs 꺼내기
<h2>CVS 문자열</h2>
<%
pageContext.setAttribute("names1", "홍길동,임꺽정,유관순,김구");
<ul>
<c:forTokens items="${names1}" var="n" delims=",">
    <li>${n}</li>
</c:forTokens>
</ul>
<h2>Query String 문자열</h2>
<%
pageContext.setAttribute("qs", "name=홍길동&age=20&tel=1111-2222");
%>

<ul>
<c:forTokens items="${pageScope.qs}" var="n" delims="&">
    <li>${n}</li>
</c:forTokens>
</ul>

JSTL - c:url
- 복잡한 형식의 URL을 만들 수 있다.

 


JSTL - c:import
- HTTP 요청을 수행하는 코드를 만든다.
JSTL - c:redirect
- redirect 응답하기
<c:if test="${param.search == 'naver'}">
    <c:redirect url="http://www.naver.com"/>
    <%-- 
    response.sendRedirect("http://www.naver.com");
    --%>
</c:if>

<c:if test="${param.search == 'daum'}">
    <c:redirect url="http://www.daum.net"/>
</c:if>

<p>search 라는 이름으로 검색 엔진을 지정하세요!<br>
유효한 엔진은 'naver', 'daum' 입니다.</p>
localhost:8888/jstl/~~ naver
하면 naver로 가버림 

JSTL - fmt:parseDate</h1>
- 문자열로 지정된 날짜 값을 java.util.Date 객체로 만들기
<fmt:parseDate value="2020-04-14" pattern="yyyy-MM-dd" var="d1"/>
<fmt:parseDate value="04/14/2020" pattern="MM/dd/yyyy" var="d2"/>

<%
Date date1 = (Date)pageContext.getAttribute("d1");
Date date2 = (Date)pageContext.getAttribute("d2");

out.println(date1.toString() + "<br>");
out.println(date2.toString() + "<br>");
%>
JSTL - fmt:formatDate

- java.util.Date 객체의 값을 문자열로 만들기