주요내용 : 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();
}
}
------------------------------------------