13일차

|

주요내용 :  Formatting Tag Library, 문자열 처리 Tag Library, CustomTag

<%@ page language="java" contentType="text/html; charset=UTF-8"
	import="java.util.Date"
    pageEncoding="UTF-8"
    isELIgnored="false"%>
    // 포매팅 태그라이브러리를 사용하기 위해 반드시 선언해야함.
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
	request.setCharacterEncoding("UTF-8");
%>   
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>포매팅 태그 라이브러리 예제</title>
</head>
<body>
	<h2>fmt의 number 태그를 이용한 숫자 포맷팅 예제.</h2>
   	<c:set var="price" value="100000000" />
   	<fmt:formatNumber  value="${price}" type="number" var="priceNumber" />
   	통화로 표현 시 :
    // 숫자를 원화로 표시
    // groupingUsed="true" -> 세자리 숫자마다 콤마로 표시. 설정하지 않으면 기본값이 true. false 이면 콤마가가 표시되지 않음.
    <fmt:formatNumber type="currency" currencySymbol="₩"   value="${price}" groupingUsed="true"/><br>
   	퍼센트로 표현 시 : 
    <fmt:formatNumber value="${price}" type="percent"   groupingUsed="false" /><br>
   	일반 숫자로 표현 시 : ${priceNumber}<br>
    // fmt:formatNumber 태그에서 var 속성에 정한 변수이름으로 표현 언어에서 출력함.
	<h2>formatDate 예제</h2>
	<c:set var="now" value="<%=new Date() %>" />
	<fmt:formatDate value="${now }" type="date" dateStyle="full" /><br>
	<fmt:formatDate value="${now }" type="date" dateStyle="short" /><br>
	<fmt:formatDate value="${now }" type="time" /><br>
	<fmt:formatDate value="${now }" type="both" dateStyle="full" timeStyle="full" /><br>
    // fmt:formatDate 태그의 pattern 속성에 출력한 날짜 포맷을 지정함.
	<fmt:formatDate value="${now }" pattern="YYYY-MM-dd :hh:mm:ss" /><br>
	
	<br><br>
	한국 현재 시간:
	<fmt:formatDate value="${now }" type="both" dateStyle="full" timeStyle="full"/><br><br>
	<fmt:timeZone value="America/New York"> // 뉴욕 시간대로 변경.
	뉴욕 현재시간 : 
	<fmt:formatDate value="${now }" type="both" dateStyle="full" timeStyle="full"/><br><br>
	</fmt:timeZone>
</body>
</html>

------------------------------------------
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>함수 사용</title>
</head>
<body>
<c:set var="str1" value="Functions <태그>를 사용합니다." />
<c:set var="str2" value="사용" />
<c:set var="tokens" value="1, 2, 3, 4, 5, 6, 7, 8, 9, 10" />
<c:set var="str3" value="<b><i>This is html text.</i></b>" />

length(str1) = ${fn:length(str1)}<br> <!-- 22 -->
toUpperCase(str1) = "${fn:toUpperCase(str1)}"<br> <!-- FUNCTIONS <태그>를 사용합니다.  -->
toLowerCase(str1) = "${fn:toLowerCase(str1)}"<br> <!-- functions <태그>를 사용합니다.  -->
substring(str1, 3, 6) = "${fn:substring(str1, 3, 6)}"<br> <!-- cti  -->
substringAfter(str1, str2) = "${fn:substringAfter(str1, str2)}"<br> <!-- 합니다.  -->
substringBefore(str1, str2) = "${fn:substringBefore(str1, str2)}"<br> <!-- Functions <태그>를  -->
trim(str1) = "${fn:trim(str1)}"<br> <!-- Functions <태그>를 사용합니다.  -->
replace(str1, src, dest) = "${fn:replace(str1, " ", "-")}"<br> <!-- Functions-<태그>를-사용합니다.  -->
indexOf(str1, str2) = "${fn:indexOf(str1, str2)}"<br> <!--  16 -->
startsWith(str1, str2) = "${fn:startsWith(str1,'Fun')}"<br> <!--  true -->
endsWith(str1, str2) = "${fn:endsWith(str1, "합니다.")}"<br> <!-- true  -->
contains(str1, str2) = "${fn:contains(str1, str2) }"<br> <!--  true -->
containsIgnoreCase(str1, str2) = "${fn:containsIgnoreCase(str1, str2)}"<br><!--  true -->
<c:set var="array" value="${fn:split(tokens,',')}" />
join(array, "-") = "${fn:join(array, "-")}"<br>
<!-- 1- 2- 3- 4- 5- 6- 7- 8- 9- 10  -->

<!-- html과 escapeXml 과의 차이 -->
<p>just html:${str3}</p><!-- 기울임체 -->
escapeXml(str3) = "${fn:escapeXml(str3)}"<br><!-- 그냥 글씨체 -->
</body>
</html>

------------------------------------------
<!-- TAG 잘활용하면 개발 퍼포먼스가 좋아진다!!! -->
<!-- TAG를 개발시작전에 만들어놓고 시작함. -->
<!-- 내용을 출력하는 단순 태그파일 구현 -->
<!-- body-content를 empty로 주어 Tag File이 나타내는 CustomTag의 몸체내용이 없다고 설정 -->
<%@ tag body-content="empty" pageEncoding="UTF-8"%>
<%@ tag import="java.util.Calendar" %>
<!-- Tag File에서 실핼할 작업을 코딩 -->
<%
	Calendar cal = Calendar.getInstance();
%>
<%= cal.get(Calendar.YEAR) %>년
<%= cal.get(Calendar.MONTH)+1 %>월
<%= cal.get(Calendar.DATE) %>일
------------------------------------------
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="tf" tagdir="/WEB-INF/tags" %>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>now</title>
</head>
<body>

오늘은<b><tf:now/></b>입니다.

</body>
</html>
------------------------------------------
<!-- 실습: 속성을 사용하는 태그파일 구현 -->
<%@ tag body-content="empty" pageEncoding="UTF-8"%>
<%@ tag trimDirectiveWhitespaces="true" %><!-- 소스보기할때 빈칸없어지게함. -->
<%@ attribute name="title" required="true" %>
<%@ attribute name="level" type="java.lang.Integer" %>
<%
	String headStartTag = null ;
	String headEndTag = null ;
	if(level == null){
		headStartTag = "<h1>";
		headEndTag = "</h1>";
	} else if(level == 1) {
		headStartTag = "<h1>";
		headEndTag = "</h1>";
	} else if(level == 2) {
		headStartTag = "<h2>";
		headEndTag = "</h2>";
	} else if(level == 3) {
		headStartTag = "<h3>";
		headEndTag = "</h3>";
	}
%>
<%= headStartTag %> <!--  실제 tag를 통해 표시되는 부분 -->
${title}
<%= headEndTag %>
------------------------------------------
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="tf" tagdir="/WEB-INF/tags" %>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>제목 출력</title>
</head>
<body>

<tf:header title="텍스트제목" level="2"/>

<tf:header title="${'EL제목'}" level="3"/>

<tf:header title='<%= "표현식 제목" %>' />

</body>
</html>
------------------------------------------
<!--tag 디렉티브의 dynamic-attributes 속성에 동적속성을 저장할 변수명을 입력해주어서 처리
	모든 동적 속성은 java.util.Map 타입의 EL변수에 저장된다  -->
<%@ tag body-content="empty" pageEncoding="UTF-8"%>
<%@ tag trimDirectiveWhitespaces="true" %>
<%@ tag dynamic-attributes="optionMap" %>
<%@ attribute name="name" required="true" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<select name="${name }">
	<c:forEach items="${optionMap}" var="option">
		<option value="${option.key}">${option.value}</option>
	</c:forEach>
</select>
------------------------------------------
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="tf" tagdir="/WEB-INF/tags" %>      
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>동적속성전달</title>
</head>
<body>
	<tf:select name="code" rgb="RGB모드" wb="흑백 모드"/>
	<tf:select name="genre" rock="락" ballad="발라드" metal="메탈"/>
</body>
</html>
------------------------------------------
<!-- 몸체내용에서 HTML태그를 제거해주는 태그 -->
<%@ tag body-content="scriptless" pageEncoding="UTF-8"%>
<%@ attribute name="length" type="java.lang.Integer" %>
<%@ attribute name="trail" %>
<%@ attribute name="trim" %>
<jsp:doBody var="content" scope="page"/>
<!-- 몸체 내용을 context 변수에 저장, content이름으로 setAttribute 됨. -->
<%
	String content = (String)jspContext.getAttribute("content");
	if(trim != null && trim.equals("true")){
		content = content.trim();
	}
	// 정규식 - 앞단의 모든 것들을 없애라.
	content = content.replaceAll("<(/)?([a-zA-Z]*)(\\s[a-zA-Z]*=[^>]*)?>", "");
	if(length != null && length.intValue() > 0 &&
		content.length() > length.intValue()){ // length 이상인 content 는 자른다.
		content = content.substring(0, length.intValue());
		if(trail != null){
			content = content + trail;
		}
	}
%>
<%= content %>
------------------------------------------
<%@ page language="java" contentType="text/html; charset=UTF-8"
	import="java.util.Date"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>   
<%@ taglib prefix="tf" tagdir="/WEB-INF/tags" %>       
<!DOCTYPE html>
<html>
<head>
<c:set var="dateEL" value="<%=new Date() %>"/>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<tf:removeHtml trim="true">
		<font size="10">현재 <style>시간</style>은${dateEL }입니다.</font>
		<!--  현재 시간은Mon Aug 26 15:48:25 KST 2019입니다.  -->
	</tf:removeHtml>
	<br>
	<tf:removeHtml length="15" trail="..." trim="true">
		<u>현재 시간</u>은<b>${dateEL }</b>입니다.
		<!-- 현재 시간은Mon Aug 2...   -->
	</tf:removeHtml>
	<br>
	<tf:removeHtml length="15">
		<jsp:body><u>현재 시간</u>은<b>${dateEL }</b>입니다.</jsp:body>
		<!--  현재 시간은Mon Aug 2 -->
	</tf:removeHtml>
</body>
</html>
------------------------------------------
<!-- variable 디렉티브와 name-given을 이용한 변수추가  -->
<%@ tag language="java" pageEncoding="UTF-8"%>
<%@ tag trimDirectiveWhitespaces="true" %>
<%@ attribute name="begin" required="true" type="java.lang.Integer" %>
<%@ attribute name="end" required="true" type="java.lang.Integer" %>
<%@ variable name-given="sum" variable-class="java.lang.Integer" scope="NESTED" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="sum" value="${0 }"/>
<c:forEach var="num" begin="${begin }" end="${end}">
	<c:set var="sum" value="${sum + num }" />
</c:forEach>
<jsp:doBody/> <!-- body를 출력 -->
------------------------------------------
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="tf" tagdir="/WEB-INF/tags" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>sum 사용</title>
</head>
<body>

<tf:sum begin="1" end="10">
	1-10까지 합 : ${sum } <!-- 55 -->
</tf:sum>

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

<c:set var="contextPath"  value="${pageContext.request.contextPath}"  />

<%
  request.setCharacterEncoding("UTF-8");
%>    
<html>
<head>
<meta charset="UTF-8">
 <head>
   <title>파일 업로드창</title>
 </head> <body>
	<!-- 서블릿에 요청해 파일을 업로드함 // 파일 업로드 시 반드시 enctype을 multipart-form-data로 설정해야함.-->
	<form action="${contextPath }/upload.do" method="post" enctype="multipart/form-data" >
      파일1: <input type="file" name="file1" ><br>
      파일2: <input type="file" name="file2" > <br>
      파라미터1: <input type="text" name="param1" > <br>
      파라미터2: <input type="text" name="param2" > <br>
      파라미터3: <input type="text" name="param3" > <br>
 <input type="submit" value="업로드" >
</form>
 </body>
</html>
------------------------------------------
package sec01.ex01;

import java.io.File;
import java.io.IOException;
import java.util.List;

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

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

/**
 * Servlet implementation class FileUpload
 */
@WebServlet("/upload.do")
public class FileUpload extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doHandle(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doHandle(request, response);
	}
	
	protected void doHandle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		request.setCharacterEncoding("utf-8");
		String encoding = "utf-8";
		File currentDirPath = new File("C:\\Users\\bit\\Documents\\카카오톡 받은 파일"); // 업로드할 파일 경로를 지정
		DiskFileItemFactory factory = new DiskFileItemFactory();
		factory.setRepository(currentDirPath);// 파일 경로를 설정(임시 디렉토리)
		factory.setSizeThreshold(1024*1024); // 최대 업로드 가능한 파일 크기를 설정. 단위 byte
		ServletFileUpload upload = new ServletFileUpload(factory);
		try { // list로 input 된것들을 다 받음.
			List items = upload.parseRequest(request); // request 객체에서 매개변수를 List로 가져옴.
			for(int i=0; i<items.size(); i++) {
				FileItem fileItem = (FileItem) items.get(i); // 파일업로드 창에서 업로드된 항목들을 하나씩 가져옴.
				if(fileItem.isFormField()) { //// 단순 form file인지 여부, false이면 File.  폼필드이면 전송된 매개변수 값을 출력.
					System.out.println(fileItem.getFieldName()+ "=" + fileItem.getString(encoding));
				} else { // 파일일경우(폼필드가 아니면) 파일 업로드 기능을 수행.
					System.out.println("매개변수이름 : " + fileItem.getFieldName());
					System.out.println("파일이름 : " + fileItem.getName());
					System.out.println("파일크기 : " + fileItem.getSize() + "bytes");
					// 업로드한 파일 이름을 가져옴.
					if(fileItem.getSize() > 0) {
						int idx = fileItem.getName().lastIndexOf("\\"); // 마지막 " " 부터 찾는다.
						if(idx == -1) {
							idx = fileItem.getName().lastIndexOf("/");
						}
						String fileName = fileItem.getName().substring(idx+1);
						// 업로드한 파일 이름으로 저장소에 파일을 업로드함.
						File uploadFile = new File(currentDirPath + "\\" + fileName);
						fileItem.write(uploadFile);
					} // end if
				} // end if
			}// end for
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

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

<%
  request.setCharacterEncoding("utf-8");
%>
<html>
<head>
<meta charset="UTF-8">
<title>파일 다운로드 요청하기</title>
</head>
<body>
	<form method="post" action="result.jsp">
	<!-- 다운로드할 파일 이름을 매개변수로 전달. -->
		<input type=hidden name="param1" value="duke.png"/><br>
		<input type=hidden name="param2" value="duke2.jpg"/><br>
		<input type="submit" value="이미지 다운로드">
	</form>
</body>
</html>
------------------------------------------
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"
    isELIgnored="false" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="contextPath"  value="${pageContext.request.contextPath}"  />
<%
  request.setCharacterEncoding("UTF-8");
%>    
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<!-- 다운로드할 파일 이름을 가져옴 -->
	<c:set var="file1" value="${param.param1}"  />    
<c:set var="file2" value="${param.param2}"  />
 
<title>이미지 파일 출력하기</title>
</head>
<body>
파라미터 1 :<c:out value="${file1}"  /><br>
파라미터 2 :<c:out value="${file2}"  /><br>
<c:if test="${not empty file1 }">
	 <!--  파일 이름으로 서블릿에서 이미지를 다운로드해 표시함. -->
	 <img src="${contextPath}/download.do?fileName=${file1}"  width=300 height=300 /><br>
	</c:if>
	<br>
	<c:if test="${not empty file2 }">
	 <!--  파일 이름으로 서블릿에서 이미지를 다운로드해 표시함. -->
	 <img src="${contextPath}/download.do?fileName=${file2}"  width=300 height=300 /><br>
	</c:if>
	파일 내려받기 :<br>
	 <!-- 이미지를 파일로 다운로드함. -->
	<a href="${contextPath}/download.do?fileName=${file2}" >파일 내려받기</a><br>
</body>
</html>
------------------------------------------
package sec01.ex01;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;

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

/**
 * Servlet implementation class FileDownload
 */
@WebServlet("/download.do")
public class FileDownload extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doHandle(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response)	throws ServletException, IOException {
		doHandle(request, response);
	}

	private void doHandle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html; charset=utf-8");
		String file_repo="C:\\Users\\bit\\Documents\\카카오톡 받은 파일";
		String fileName = (String)request.getParameter("fileName"); // 매개변수로 전송된 파일 이름을 읽어옴.
		System.out.println("fileName=" + fileName);
		OutputStream out = response.getOutputStream(); // response에서 OutputStream 객체를 가져옴.
		String downFile = file_repo + "\\" + fileName;
		File f = new File(downFile);
		// 파일을 다운로드 할수 있음.
		response.setHeader("Cache-Control", "no-cache"); // 파일 다운로드는 캐싱안되도록 설정
		response.addHeader("Content-disposition", "attachment; fileName=" + fileName); // file download처리 시 attachmemt 로 설정
		// attachment: 파일 다운로드 대상상자가 뜸.
        // inline: 바로 다운로드 됨(pdf 다운로드 누르면 크롬에서 바로 뜨는 형식을 생각하면 됨.)
		FileInputStream in = new FileInputStream(f);
		byte[] buffer = new byte[1024 * 8];
		while (true) {
			int count = in.read(buffer);
			if (count == -1)
				break;
			out.write(buffer, 0, count);
		}
		in.close();
		out.close();
	}

}


------------------------------------------

'Bitcamp > BITCAMP - Servlet & JSP' 카테고리의 다른 글

15일차  (0) 2019.08.28
14일차  (0) 2019.08.27
게시판  (0) 2019.08.26
12일차  (0) 2019.08.19
11일차  (0) 2019.08.14
And