본문 바로가기
JSP/Java Script

2024_07_16_화

by 알케니브 2024. 7. 16.

오늘의 코딩순서

(폴더: och09_jstl)

  • color.html + colorResult.jsp + colorResult2.jsp
  • set1.jsp
  • set2.jsp + set2Result.jsp (현장 HW)
  • redirect.jsp
  • lionToken.jsp
  • formDate1.jsp+ formDate2.jsp + formDate3.jsp
  • colorToken.jsp (현장 HW)
  • formNumber.jsp
  • locale.jsp
  • timeZone.jsp
  • greet.jsp

(폴더: och09_tags, och09_cstl) >>WEB-INF에 tags 폴더 만듬

  • newLine.tag + book.jsp
  • max.tag + max.jsp

(폴더: och10_oracle) >>servlet.자카르타 파일 넣음

webapp 폴더에 dbcp, mySql, oracle 폴더 만듬

  • ora01.jsp
  • dbError.jsp + dept.html + ora02.jsp + ora03.jsp (현장 HW) + oraResult.jsp (현장 HW) /
    Dept.class + ora04.jsp
  • Emp.class + ora05.jsp + ora05Result.jsp (현장 HW)

오늘의 코딩 포인트

향상형 for문이란 무엇인가?

 


  • color.html
<%@ 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>
	<%
		String[] color={"red","orange","yellow","green","blue","navy","violet"};
		request.setAttribute("color", color);
	%>
	<jsp:forward page="colorResult.jsp"></jsp:forward>
	<!-- 위의 request.set을 받아서 colorResult로 이동함 -->
</body>
</html>
  • colorResult.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!-- 내가 "c"로 선언해두고 사용하겠다, 따라서 아래도 다 c:로 시작할 것 + c로 하기를 권장함 -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<c:forEach var="col" items="${color }">
				<!-- color라는 객체가 {"red","orange","yellow","green","blue","navy","violet"}를 받겠다는 뜻 -->
		<font color="${col }">야호</font>	<!-- Java의 향상형 for문과 같음 -->
	</c:forEach>
</body>
</html>

  • colorResult2.jsp
    Tip)

    • 향상형 for문 이용하기
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<c:forEach var="cnt" begin="1" end="7">	<!-- 향상형 for문처럼 사용하기 -->
		<c:forEach var="col" items="${color }">
			<font color="${col }" size="${cnt }">야호</font>	
		</c:forEach>
		<br>
	</c:forEach>
</body>
</html>


  • set1.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<c:set var="num1"		value="6"></c:set>
<!-- var:변수명 value:변수값 --> <!-- Java 코딩: int num1 = 6 -->
<c:set var="num2"		value="2"></c:set>
<c:set var="result"		value="${num1+num2 }"></c:set>	
<c:set var="divResult"	value="${num1/num2 }"></c:set>
	<!-- 위의 네 줄은 </head>밑에 해도, <body>밑에 해도 상관없음 -->
<body>
	덧셈: ${num1 } + ${num2 } = ${result }<p>	<!-- 변수로 선언하는 연산식도 가능 -->
	뺄셈: ${num1 } - ${num2 } = ${num1 - num2 }<p>	<!-- 직접 연산식을 넣는것도 가능 -->
	곱셈: ${num1 } * ${num2 } = ${num1 * num2 }<p>
	나눗셈1: ${num1 } / ${num2 } = ${num1 / num2 }<p>
	나눗셈2: ${num1 } / ${num2 } = ${divResult }<p>

</body>
</html>


  • set2.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<c:set var="code"	value="1112"		scope="request"></c:set>
	<!-- setAttribute, setProperty, Java의 setter와 같은 기능 -->
	<c:set var="name"	value="온도계"		scope="request"></c:set>
	<c:set var="price"	value="16,000원"	scope="request"></c:set>
	<jsp:forward page="set2Result.jsp"></jsp:forward>
</body>
</html>
  • set2Result.jsp (현장 HW)
<%@ 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>
<h2>상품정보</h2>
	코드 : ${code }<p>
	이름 : ${name }<p>
	가격 : ${price }
	
</body>
</html>


  • redirect.jsp
    Tip)
    • redirect
      또 다른 페이지 이동방법: forward, requestDispatcher
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<c:redirect url="http://www.choongang.co.kr/"></c:redirect>
</body>
</html>

  • lionToken.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<c:set var="animals" value="토끼,고양이*강아지,여우"></c:set>
	<h2>사자의 생일</h2>
	<%-- <c:forTokens var="animal" items="${animals }" delims=","> --%>
								<!-- delims: delimeter,구분 문자 -->
	<%-- <c:forTokens var="animal" items="${animals }" delims="*"> --%>
	<c:forTokens var="animal" items="${animals }" delims=",*">					
		${animal }	<p>
	</c:forTokens>

</body>
</html>


<%@page import="java.util.Date"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
	<c:set var="date1" value="<%=new Date() %>"></c:set>
							<!-- Date자동완성해서 util 삽입하는거 잊지말기! -->
<body>
	오늘 날짜 : <fmt:formatDate value="${date1 }"/><p>
	<!-- formatDate는 따로 타입을 지정하지 않으면 기본적으로 날짜만 출력됨 -->
	현재 시간 : <fmt:formatDate value="${date1 }" type="time"/>
	<!-- 하지만 시간도 원래 포함된 값이기 때문에, time type을 지정하면 시간이 출력됨 -->
</body>
</html>

  • formDate2.jsp
<%@page import="java.util.Date"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
	<c:set var="date" value="<%=new Date() %>"></c:set>
<body>
	<h2>현재 날짜와 시간</h2>
	<fmt:formatDate value="${date }" type="both" dateStyle="short"	timeStyle="short"/><p>
	<fmt:formatDate value="${date }" type="both" dateStyle="medium"	timeStyle="medium"/><p>
	<fmt:formatDate value="${date }" type="both" dateStyle="long"	timeStyle="long"/><p>
	<fmt:formatDate value="${date }" type="both" dateStyle="full"	timeStyle="full"/><p>

</body>
</html>

  • formDate3.jsp
<%@page import="java.util.Date"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
	<c:set var="date" value="<%=new Date() %>"></c:set>
<body>
	날짜 : <fmt:formatDate type="date" value="${date }" pattern="YYYY/MM/dd(E)" /><p>
						<!-- 대문자 D를 쓰면 1/1부터 지난 D-Day날짜가 나옴 -->
	시간 : <fmt:formatDate type="time" value="${date }" pattern="hh:mm:ss(a)" />
										<!-- a는 am, MM은 Month, mm은 minute -->
</body>
</html>


  • colorToken.jsp (현장 HW)
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<!-- 변수 선언 -->
	<c:set var="color"	value="red,orange,yellow,green,blue,navy,violet"></c:set>
	<c:set var="num"	value="1-2-3-4-5-6-7"></c:set>
<body>
<!-- 현장 Work -->
	<c:forTokens var="cnt" items="${num }" delims="-">
		<c:forTokens var="col" items="${color }" delims=",">
			<font color="${col }" size="${cnt }">야호</font>
		</c:forTokens>
		<br>
	</c:forTokens>
</body>
</html>

 


  • formNumber.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<fmt:formatNumber value="1000000"		groupingUsed="true"/><br>	<!-- groupingUsed: 세자리마다 반점 -->
	<fmt:formatNumber value="3.1415923"		pattern="#.###"/><br>	<!-- #자리수에서 반올림 -->
	<fmt:formatNumber value="3.14" 			pattern="#.##"/><br>
	<fmt:formatNumber value="3.1" 			pattern="#.00"/><br>	<!-- 0 개수:원하는 자리수만큼 채우기 -->
	<fmt:formatNumber value="121434323453." pattern="#,###.00"/><br>	<!-- 세자리마다 쉼표 표시 -->
	<fmt:formatNumber value="250000" 		type="currency"	currencySymbol="\\"/><br>
											<!-- \\:역슬래시 꼭! 2개, 원화표시 -->
	<fmt:formatNumber value="0.75" 			type="percent"/><br>
</body>
</html>


  • locale.jsp
<%@page import="java.util.Date"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
	<c:set var="date" value="<%=new Date() %>"></c:set>
<body>
<h2>우리나라</h2>
	<fmt:setLocale value="ko_kr"/>
	금액 : <fmt:formatNumber value="1000000" type="currency"/><br>
	일시 : <fmt:formatDate value="${date }" type="both" dateStyle="full" timeStyle="full"/><br>

<h2>미국</h2>
	<fmt:setLocale value="en_us"/>
	금액 : <fmt:formatNumber value="1000000" type="currency"/><br>
	일시 : <fmt:formatDate value="${date }" type="both" dateStyle="full" timeStyle="full"/><br>

<h2>일본</h2>
	<fmt:setLocale value="ja_jp"/>
	금액 : <fmt:formatNumber value="1000000" type="currency"/><br>
	일시 : <fmt:formatDate value="${date }" type="both" dateStyle="full" timeStyle="full"/><br>
	
</body>
</html>


  • timeZone.jsp
<%@page import="java.util.Date"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
	<c:set var="date" value="<%=new Date() %>"></c:set>
<body>
	서울 : <fmt:formatDate value="${date }" type="both"/><br>
	
	<fmt:timeZone value="Asia/Hong_Kong">
		홍콩 : <fmt:formatDate value="${date }" type="both"/><br>
	</fmt:timeZone>
	
	<fmt:timeZone value="Europe/London">
		런던 : <fmt:formatDate value="${date }" type="both"/><br>
	</fmt:timeZone>
	
	<fmt:timeZone value="America/New_York">
		뉴욕 : <fmt:formatDate value="${date }" type="both"/><br>
	</fmt:timeZone>

</body> 
</html>

 


  • greet.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
	<c:set var="greet" value="How Are You ?"></c:set>
<body>
	원글 		: ${greet }<p>
	대문자		: ${fn:toUpperCase(greet) }<p>
	소문자		: ${fn:toLowerCase(greet) }<p>
	How 위치	: ${fn:indexOf(greet,"How") }<p>	<!-- indexOf:인덱스의 위치를 숫자로 나타내줌 -->
	Are 위치	: ${fn:indexOf(greet,"Are") }<p>
	Are 변경	: ${fn:replace(greet,"Are","Were") }<p>
	문자 길이	: ${fn:length(greet) }

</body>
</html>

 



(폴더: och09_tags, och09_cstl)

  • newLine.tag
<%@ tag language="java" pageEncoding="UTF-8"%>
<%@ tag body-content="empty" %>
<%@ attribute name="color" required="true" %>
<%@ attribute name="size"  required="true" type="java.lang.Integer" %>
<font color="${color }">
	<%
		for(int i = 0; i < size; i++) {
			out.println("-");
		}

	%>
</font>
  • book.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="u" tagdir="/WEB-INF/tags"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>좋아하는 책</h2>
	<u:newLine color="red" size="20"/><p>
	단순한 진심<P>
	천 개의 파랑<P>
	책과 우연들<P>
	
</body>
</html>


  • max.tag
<%@ tag language="java" pageEncoding="UTF-8"%>
<%@ tag body-content="empty" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ attribute name="num1" type="java.lang.Integer" required="true" %>
<%@ attribute name="num2" type="java.lang.Integer" required="true" %>
<%@ variable name-given="maximum" scope="AT_END" variable-class="java.lang.Integer" %>
<%
	int result;
	if(num1 >= num2)	result = num1;
	else				result = num2;
%>
	<c:set var="maximum" value="<%=result %>"></c:set>
  • max.jsp
    Tip
    • scope="AT_END"
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="u" tagdir="/WEB-INF/tags" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h2>큰수 찾기</h2>
	<u:max num2="33" num1="77"/>
	큰값 : ${maximum }
</body>
</html>

 



(폴더: och10)

>>lib에 jakarta파일(꼭 최신버전!) 두 개 추가, ojdbc6.jar 추가, 폴더 추가(dbcp, oracle, mySql)

  • ora01.jsp
<%@page import="java.sql.DriverManager"%>
<%@page import="java.sql.Connection"%>
<%@ 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>
<%
	String driver = "oracle.jdbc.driver.OracleDriver";
	String url = "jdbc:oracle:thin:@127.0.0.1:1521:xe";
	
	Class.forName(driver);

	Connection conn = DriverManager.getConnection(url, "scott", "tiger");	//연동하기
	
	if	(conn != null)	out.println("연결 성공");
	else				out.println("연결 실패");
	conn.close();


%>
</body>
</html>


  • dbError.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" isErrorPage="true"%>
<% response.setStatus(200); %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h2>DB Error</h2>
	<%=exception.getMessage() %>

</body>
</html>
  • dept.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>부서코드 입력</h2>
	<form action="ora02.jsp">
		코드 : <input type="number" name="deptno" required="required"><p>
		<input type="submit" value="확인">
	</form>

</body>
</html>
  • ora02.jsp>>>6/11일지+JDBC 참조하기
    Tip) ⭐⭐⭐⭐⭐
    • Connection
    • DriverManager
    • Statement
    • ResultSet
    • executeQuery
      • Select 문을 실행할때만 사용하며, 결과를 ResultSet 객체로 반환함
        즉 executeQuery와 ResultSet 둘 다 select문에만 쓸 수 있음
<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.Statement"%>
<%@page import="java.sql.DriverManager"%>
<%@page import="java.sql.Connection"%>
<%@ 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>
<%
	String deptno = request.getParameter("deptno");
	String driver = "oracle.jdbc.driver.OracleDriver";
	String url = "jdbc:oracle:thin:@127.0.0.1:1521:xe";
	String sql = "select *from dept where deptno="+deptno;
	System.out.println("sql->"+sql);
	
	Class.forName(driver);
	Connection conn = DriverManager.getConnection(url,"scott","tiger");
	Statement stmt = conn.createStatement();
	ResultSet rs = stmt.executeQuery(sql);
	
	if	(rs.next())	{
		String dname = rs.getString("dname");	//rs.getString(2);
		String loc = rs.getString(3);
		out.println("부서코드 : " + deptno + "<p>");
		out.println("부서명 : " + dname + "<p>");
		out.println("근무지 : " + loc + "<p>");
	} else out.println("그게 무슨 부서야 없는데");
	
	rs.close();
	stmt.close();
	conn.close();
%>
</body>
</html>

  • ora03.jsp (현장 HW)⭐
<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.Statement"%>
<%@page import="java.sql.DriverManager"%>
<%@page import="java.sql.Connection"%>
<%@ 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>
<%
	String deptno = request.getParameter("deptno");
	String driver = "oracle.jdbc.driver.OracleDriver";
	String url = "jdbc:oracle:thin:@127.0.0.1:1521:xe";
	String sql = "select *from dept where deptno="+deptno;
	System.out.println("sql->"+sql);
	
	Class.forName(driver);
	Connection conn = DriverManager.getConnection(url,"scott","tiger");
	Statement stmt = conn.createStatement();
	ResultSet rs = stmt.executeQuery(sql);
	
	if	(rs.next())	{
		String dname = rs.getString("dname");	//rs.getString(2);
		String loc = rs.getString(3);		// 여기까지 두 줄은 밖으로 빼서 선언해도 문제없음
		out.println("부서코드 : " + deptno + "<p>");
		out.println("부서명 : " + dname + "<p>");
		out.println("근무지 : " + loc + "<p>");
		// (HW)
		//1. resqest에 저장 ===> deptno, dname, loc
		request.setAttribute("deptno", deptno);	//위의 선언을 밖으로 빼면, 여기 세 줄도 밖으로 뺄 수 있음
		request.setAttribute("dname", dname);
		request.setAttribute("loc", loc);
		
	} else out.println("그게 무슨 부서야 없는데");
	
	rs.close();
	stmt.close();
	conn.close();
	
	//2. RequestDispatcher ===> ora03Result.jsp => page이동
	RequestDispatcher rd = request.getRequestDispatcher("oraResult.jsp");
	//RequestDispatcher는 close밖에서 빼야 서버에 과부하가 안걸림
	rd.forward(request, response);
	//3. oraResult.jsp 만들기
%>
</body>
</html>
  • oraResult.jsp (현장 HW)
<%@ 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>
<h2>부서정보</h2>
	부서코드 :${deptno }<p>
	부서명 : ${dname }<p>
	근무지 : ${loc }<p>
</body>
</html>


  • dept.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>부서코드 입력</h2>
	<!-- <form action="ora02.jsp"> -->
	<!--<form action="ora03.jsp"> -->
		<form action="ora04.jsp">
		코드 : <input type="number" name="deptno" required="required"><p>
		<input type="submit" value="확인">
	</form>

</body>
</html>
  • Dept.class
package och10;

public class Dept {
	private int deptno;
	private String dname;
	private String loc;
	public int getDeptno() {
		return deptno;
	}
	public void setDeptno(int deptno) {
		this.deptno = deptno;
	}
	public String getDname() {
		return dname;
	}
	public void setDname(String dname) {
		this.dname = dname;
	}
	public String getLoc() {
		return loc;
	}
	public void setLoc(String loc) {
		this.loc = loc;
	}
	
}
  • ora04.jsp

Tip)

  • MVC⭐⭐⭐⭐⭐(JSP 통틀어 제일 중요함!)
    :
    사용자의 요청을 Service에 전달하고 Service의 실행 결과를 JSP와 같은 뷰에 전달을수행하는 것으로 스프링 MVC나  스트러츠와 같은 프레임워크가 MVC 프레임워크에 해당하며 서블릿으로 직접 구현 가능
  • DTO 클래스: 
  • DAO 클래스: DB와 관련된 CRUD 작업을 처리(SQL 쿼리를 실행)
  • service 클래스: 사용자의 요청을 처리하는 기능을 제공하는 클래스로 DAO 클래스를이용해서DB 연동을처
  • View 클래스: Service 클래스가 실행한 결과를 화면에 출력해주거나 Service가 기능을수행하는데필요한데이터를전달
  • SDLC
  • Architecture
<%@page import="och10.Dept"%>
<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.Statement"%>
<%@page import="java.sql.DriverManager"%>
<%@page import="java.sql.Connection"%>
<%@ 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>
<%
	//DTO: Data Transfer Object
	//DAO: Data Access Object

	String deptno = request.getParameter("deptno");
	String driver = "oracle.jdbc.driver.OracleDriver";
	String url = "jdbc:oracle:thin:@127.0.0.1:1521:xe";
	String sql = "select *from dept where deptno="+deptno;
	
	Class.forName(driver);
	Connection conn = DriverManager.getConnection(url,"scott","tiger");
	Statement stmt = conn.createStatement();
	ResultSet rs = stmt.executeQuery(sql);
	
	//1. DTO 선언
	Dept dept = new Dept();	//Dept는 자동완성해서 호출해야함
	
	if	(rs.next())	{
		int		deptnoInt = (rs.getInt(1));
		String dname = rs.getString("dname");	//rs.getString(2);
		String loc = rs.getString(3);
		out.println("부서코드 : " + deptno + "<p>");
		out.println("부서명 : " + dname + "<p>");
		out.println("근무지 : " + loc + "<p>");
		//2. DTO 선언을 해야 Dept DTO Setting를 할 수 있음
		dept.setDeptno(deptnoInt);
		dept.setDname(dname);
		dept.setLoc(loc);
		//3. Dept(DTO) 로 저장하기 ==> setAttribute와 같은 것, DTO에 몰아둔 것임
		request.setAttribute("dept", dept);
				
	} else out.println("그게 무슨 부서야 없는데");
	
	rs.close();
	stmt.close();
	conn.close();
	
	RequestDispatcher rd = request.getRequestDispatcher("ora04Result.jsp");
	rd.forward(request, response);
%>

</body>
</html>
  • ora04Result.jsp⭐⭐⭐⭐⭐(복습필수!!!!!)
<%@page import="och10.Dept"%>
<%@ 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>
<%
	/* int deptnoInt = Integer.getInteger(request.getParameter("DeptnoInt"));
	String = request.getParameter("Dname");
	String = request.getParameter("Loc"); */
	
	Dept dept = (Dept)request.getAttribute("dept"); //여기 Dept도 자동완성해서 호출하기
	// 객체를 통째로 보냈기 때문에, 받을 때도 String 같은것이 아닌 Dept객체 통째로 받아야함
%>
<h2>Expression 부서 정보</h2>
	부서코드	: <%=dept.getDeptno() %><p>	
	<!-- 객체 통째로 입력해야함, class의 private를 통째로 가져오기 때문 -->
	부서명		: <%=dept.getDname() %><p>	<!-- 객체에도 메소드를 쓸 수 있다 -->
	근무지		: <%=dept.getLoc() %><p>

<h2>EL 표기법 부서 정보</h2>
	부서코드 : ${dept.deptno }<p>	<!-- 여기는 멤버변수 -->
	<!-- 왜 getDeptno가 아닌가? => Dept는 private로 getter,setter를 설정했기 때문
	private는 직접 접근이 아닌 이상 접근이 불가능하고, get을 붙이면 get을 통한 접근이지
	직접 접근이 아니므로, ==> get을 붙이면 직접 접근할 수 없다 -->
	부서명 : ${dept.dname }<p>	
				<!-- 여기서 dname은 getdname이나 마찬가지, 앞에 또 get을 붙이지말자 --> 
	근무지 : ${dept.loc }<p>
</body>
</html>


  • Emp.class
package och10;

import java.util.Date;

public class Emp {
	private int empno;
	private String ename;
	private String job;
	private int mgr;
	private Date hiredate;
	private int sal;
	private int comm;
	private int deptno;
	
	
	public int getEmpno() {
		return empno;
	}
	public void setEmpno(int empno) {
		this.empno = empno;
	}
	public String getEname() {
		return ename;
	}
	public void setEname(String ename) {
		this.ename = ename;
	}
	public String getJob() {
		return job;
	}
	public void setJob(String job) {
		this.job = job;
	}
	public int getMgr() {
		return mgr;
	}
	public void setMgr(int mgr) {
		this.mgr = mgr;
	}
	public Date getHiredate() {
		return hiredate;
	}
	public void setHiredate(Date hiredate) {
		this.hiredate = hiredate;
	}
	public int getSal() {
		return sal;
	}
	public void setSal(int sal) {
		this.sal = sal;
	}
	public int getComm() {
		return comm;
	}
	public void setComm(int comm) {
		this.comm = comm;
	}
	public int getDeptno() {
		return deptno;
	}
	public void setDeptno(int deptno) {
		this.deptno = deptno;
	}
	
	
}
  • ora05.jsp
    Tip)
    • ArrayList
    • MVP 1 모델:
<%@page import="och10.Emp"%>
<%@page import="java.util.ArrayList"%>
<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.Statement"%>
<%@page import="java.sql.DriverManager"%>
<%@page import="java.sql.Connection"%>
<%@ 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>
<%
	String driver = "oracle.jdbc.driver.OracleDriver";
	String url = "jdbc:oracle:thin:@127.0.0.1:1521:xe";
	String sql = "select empno, ename, job, sal from emp";	//Oracle Emp 출력
	System.out.println("sql->"+sql);
	
	Class.forName(driver);
	Connection conn = DriverManager.getConnection(url,"scott","tiger");
	Statement stmt = conn.createStatement();
	ResultSet rs = stmt.executeQuery(sql);
	
	//1. Collection ArrayList 생성
	ArrayList<Emp> al = new ArrayList<Emp>();	/* Emp 자동완성으로 삽입 */
	
// 이 밑의 각 row가 ArrayList에 append(추가)된다
//	7369	SMITH	CLERK	1000
//	7499	ALLEN	SALESMAN	1600
//	7521	WARD	SALESMAN	1250
//	7566	JONES	MANAGER	2975
//	7654	MARTIN	SALESMAN	1250
//	7698	BLAKE	MANAGER	2850
//	7782	CLARK	MANAGER	2450
//	7788	SCOTT	ANALYST	3000
//	7839	KING	PRESIDENT	5500
//	7844	TURNER	SALESMAN	1500
//	7876	ADAMS	CLERK	1100
//	7900	JAMES	CLERK	950
//	7902	FORD	ANALYST	3000
//	7934	MILLER	CLERK	1300
//	1601	홍미숙		3500
//	2001	황보슬	position2	3500
//	3000	유지원	SALESMAN	3850
//	3100	황정후	SALESMAN	3500
//	3200	홍길동2	SALESMAN	
//	1501	홍길동		
	if	(rs.next())	{
		do	{
			Emp emp = new Emp();
			emp.setEmpno(rs.getInt(1));	//1234: 위의 String sql의 순서값
			emp.setEname(rs.getString(2));
			emp.setJob(rs.getString(3));
			emp.setSal(rs.getInt(4));
			al.add(emp);
		}while(rs.next());
		request.setAttribute("al", al);
		rs.close();
		stmt.close();
		conn.close();	//여기까지 ArrayList Setting
		
		RequestDispatcher rd = request.getRequestDispatcher("ora05Result.jsp");
		//setting된 ArrayList가 여기에 들어감
		rd.forward(request, response);
	} else	{
		out.println("데이터가 없습니당");
		stmt.close();
		conn.close();
	}
%>
</body>
</html>
  • ora05Result.jsp (현장 HW)
    Tip)
    • MVC Model1⭐⭐⭐⭐⭐
<%@page import="java.util.ArrayList"%>
<%@page import="och10.Emp"%>
<%@ 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>
<style type="text/css">
	tr:hover	{
	background-color: red;
	}
</style>
</head>
<body>
<h2>MVC Model 1 View</h2>
	<%
		//1. al(ArrayList)를 al로 가져오기
		ArrayList<Emp> al = (ArrayList<Emp>)request.getAttribute("al");
		//util 임포트 하기			//Emp 임포트하기
	%>

	<table width="100%" bgcolor="yellow" border="1">
		<tr><th>사번</th><th>이름</th><th>업무</th><th>급여</th></tr>
	<%
		for(int i= 0; i < al.size(); i++)	{
			out.println("<tr><td>" + al.get(i).getEmpno() + "</td>");
			out.println("<td>" + al.get(i).getEname() + "</td>");
			out.println("<td>" + al.get(i).getJob() + "</td>");
			out.println("<td>" + al.get(i).getSal() + "</td></tr>");
		}
	%>
	</table>
</body>
</html>


수업교재

9. JSTL⭐⭐⭐

1. 정의 및 개요

  • JSTL이란?: JSP Standard Tag Library, JSP 표준 태그 라이브러리의 약자
    • 라이브러리?: 여러 프로그램이 공통으로 사용하는 코드를 모아놓은 코드의 집합
  • JSTL을 가지고 할 수 있는 일?
    1. 간단한 프로그램 로직의 구사 ( 자바의 변수 선언, if문, for문 등에 해당하는 로직)
    2. 다른 JSP 페이지 호출 ex) <c:redirect>, <c:import>
    3. 날짜, 시간, 숫자의 포맷
    4. JSP 페이지 하나로 여러 가지 언어의 웹 페이지 생성
    5. 데이터베이스로의 입력, 수정, 삭제, 조회
    6. XML 문서 처리
    7. 문자열을 처리하는 함수 호출, 이 호출을 제외한 나머지 기능들은 모두 커스텀 액션 형태로 제공됨
  • JSTL 지시자 사용방법: <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    1. JSP 페이지에서 앞 페이지의 접두어를 사용하기 위해서는 taglib 지시자를 이용해서 라이브러리의 URI 식별자와 접두어를 연결해야 함
    2. taglib 지시자는 다른 지시자와 마찬가지로 <%@으로 시작해서 %>로 끝남
    3. taglib 지시자에는 uri와 prefix라는 두 개의 Attribute를 써야하고, 이 두 Attribute에 각각 URI 식별자와 접두어를 값으로 주어야 함

2. JSTL을 구성하는 작은 라이브러리들

라이브러리 기능 URI 식별자 접두어
코어 - 일반 프로그래밍 언어에서 제공하는 것과 유사한 변수 선언을 함
- 실행 흐름의 제어 기능을 제공함
- 다른 JSP 페이지로 제어를 이동하는 기능도 제공함
http://java.sun.com/jsp/jstl/core c
포매팅 - 숫자, 날짜, 시간의 형식, 서식, 체제를 구축하는 기능을 제공
- 국제화, 다국어 지원 기능을 제공
http://java.sun.com/jsp/jstl/fmt fmt
데이터베이스 - 데이터베이스의 데이터를 입력, 수정, 삭제, 조회하는 기능을 제공함 http://java.sun.com/jsp/jstl/sql sql
XML - XML 문서를 처리할 떄 필요한 기능을 제공함 http://java.sun.com/jsp/jstl/xml x
함수 - 문자열을 처리하는 함수를 제공함 http://java.sun.com/jsp/jstl/functions fn

 

3. 코어 라이브러리 종류

1. <c:set>

  • 변수를 선언하고 초기값을 대입하는 커스텀 액션
  • 사용방법
<c:set var(변수이름)="num" value(초기값)="값"/>


==> 자바 프로그램네서 변수를 선언할 때는 기본적으로 변수의 타입과 이름을 기술하고, 선택적으로 초기값을 기술하지만, <c:set> 커스텀 액션을 이용해서 변수를 선언할 떄는 변수의 타입을 쓰지 않음
+++ <c:set var(변수이름)="sum" value="${num1+num2"/> ==> value 애트리뷰터 값 위치에 EL 식을 쓸 수도 있음

 

2. <c:remove>

  • page, request, session, application 데이터 영역에 저장되어 있는 Attribute를 삭제하는 기능을 함
  • 특정 영역의 Attribute만 제거하려면 scope 애트리뷰트를 사용하면 됨
  • 사용방법
<c:remove var="code" scope="request"/>

 

3. <c:if>

  • 자바 프로그램의 if문과 비슷한 역할을 함
  • 사용방법: 자바의 if문과 달리, 조건식을 괄호안에 쓰지 않고 test라는 이름의 Attribute 값으로 지정해야함

<c:if test= "${num1 > num2}"
	num1이 더 큽니다
</c:if>

 

4. <c:choose>

  • 자바의 switch문과 비슷한 역할을 함
  • <c:when>, <c:otherwise>라는 커스텀 액션과 함께 사용되며, 두 커스텀 액션은 각각 switch문의 case, default 절과 비슷한 역할을 함
  • 사용방법
<c:choose>
	<c:when test="${num == 0}">
    	처음 뵙겠습니다. <br>
    </c:when>
    <c:when test="${num == 1}">
    	반갑습니다. <br>
    </c:when>
    <c:otherwise>
    	안녕하세요. <br>
    </c:otherwise>
</c:choose>

 

5. <c:forEach>

  • 자바의 for문과 비슷한 기능을 함, 이것을 이용하면 특정 HTML 코드를 지정된 횟수만큼 반복해서 출력함
  • 사용방법
<c:forEach var="cnt" begin="1" end="10" step="2">
	${cnt(반복 실행 명령문)}<br>
</c:forEach>

 

6. <c:forTokens>

  • 자바의 for문과 java.util.StringTokenizer 클래스의 기능을 합친것 같은 기능을 제공함
  • items, delims, var라는 세 개의 Attribute를 써야함
    • items: 토큰을 포함하는 문자열
    • delims: 토큰 분리에 사용할 구획 문자
    • var: 분리된 토큰을 대입할 변수의 이름
  • 사용방법
<c:forTokens var="pet" items="문자1 문자2 문자3" delims="">
	${pet} <br>
</c:forTokens>

 

7. <c:catch>

  • 자바 프로그래밍 언어의 try문 비슷한 기능을 함
  • <c:catch> 시작 태그와 끝 태그 사이에서 에러가 발생하면 실행의 흐름이 곧바로 <c:catch> 액션 다음에 있는 코드로 넘어감
  • 사용방법
//1. exception 개체를 저장할 변수
<c:catch var="e">
	<%int result = num1 / num2%>	//에러가 발생할 수 있는 부분
    <%=result%>
</c:catch>

//2. exception이 발생했는지 체크하는 조건식, 즉 에러 출력 코드
<c:if test="${e != null}">
	에러 메시지: ${e.message}	//${e.message}: exception 객체 e에 대해 getMessage 메서드를 호출함
</c:if>

 

8. <c:redirect>

  • sendRedirect 메서드를 통해 다른 웹 자원을 호출함, 호출할 웹 자원의 URL 은 url attribute를 이용해서 지정함
  • 사용방법
<c:redirect url="http://www.naver.com"/>

 

9. <c:import>

  • <jsp:include>표준액션과 비슷하지만 다른 JSP 페이지 뿐만 아니라 다른 종류의 웹 자원도 호출할 수 있다는 점이 다름
  • 호출할 웹 자원의 URL은 url attribute를 이용해서 지정함
<c:import url="http://www.naver.com"/>
	<c:param name="데이터 이름" value="데이터 값"/>
</c:import>

 

10. <c:url>

  • <c:set>처럼 변수의 선언에 사용되지만, URL을 쉽게 다룰 수 있는 방법을 제공한다는 점이 다름
  • 사용방법
<c:url var="변수이름" value="변수 값">
	<c:param name="변수이름'" value="변수값"/>	
    //<c:param> 커스텀 액션을 쓰면 URL 뒤에 쿼리 스트링 형태로 덧붙는 데이터를 지정할 수 있음
</c:url>

 

11. <c:out>

  • 데이터를 출력할 때 사용, 출력할 데이터는 value attribute에 지정함
  • 웹 브라우저에 의해 특수한 문자로 해석되는 <, >, &, ', "를 포함하는 데이터를 출력할 때 편리함
  • 사용방법
//1.
<c:out value="<INPUT>은 <FORM>의 서브엘리먼트입니다."/>
//괄호 안의 두 태그는 HTML 태그로 해석되지 않고, 웹 브라우저 상에 그대로 나타남

//2.
<c:out value="${str}" default="No Data"/>
//중괄호{}안의 값이 없으면 큰따옴표""안의 값을 대신 출력함

 

4. 포매팅 라이브러리 종류

1. <fmt:requestEnconding>

  • Request 객체로부터 전달받은 값들을 인코딩할 때 사용
  • 보통 한글값이 넘어올경우 <%request.setCharacterEncoding(“UTF-8”);%>코드로 Request 객체로 받는 값을 한글에 맞게 코딩함
  • 사용방법
<fmt:requestEncoding value="인코딩값">

 

2. <fmt:setLocale>

  • 다국어 페이지를 사용할 때 언어를 지정하는 태그
  • value 속성은 어떤 언어를 사용할지 지정하는 속성이며 언어코드를 입력함
  • variant 속성은 브라우저의 스펙을 지정할 때 사용함
  • 사용방법
<fmt:setLocale value="값" variant="" scope="범위">

 

3. <fmt:timeZone>

  • 지정한 지역값으로 시간대를 맞출 때 사용함
  • 첫 태그와 끝 태그 사이의 Body 부분 내용에 적용되며, 페이지 전체에 작용되지는 않음
  • 사용방법
<fmt:timeZone value="값">

 

4. <fmt:setTimeZone>

  • 지정한 지역값으로 시간대를 맞추는 기능, 페이지 전체에 작용됨
  • var 속성의 변수에 지정한 시간대 값이 저장됨, scope로 범위로 지정됨
  • 사용방법
<fmt:setTimeZone value="값" var="변수명" scope="범위">

 

5. <fmt:bundle>

  • properties 확장명을 가진 파일의 리소스를 불러올 때 사용됨
  • basename에는 properties 확장명을 가진 파일을 지정함, prefix는 properties내의 키값에 쉽게 접근할 수 있도록 간략한 접근어를 사용할 수 있게 해줌
  • 불러온 리소스는 이 태그의 Body 내에서만 사용할 수 있음
  • 사용방법
<fmt:bundle basename="properties 확장명 가진 파일" prefix="prefix">

 

6. <fmt:setBundle>

  • <fmt:bundle>태그와 같은 기능이지만 사용범위가 페이지 전체에 적용됨
  • var에는 설정한 리소스 내용을 가지고 있을 변수명을 입력함, scope로 범위를 지정함
  • 사용방법
<fmt:setBundle basename="basename" var="변수명" scope="범위">

 

7. <fmt:message>

  • 설정한 properties 파일의 리소스 내용을 읽을 때 사용함
    properties 파일에는 여러 key 값들로 내용이 구분되어 있으며, <fmt:message> 태그의 key 속성으로 키값으로설정된내용을 가져올 수 있음
  • 사용방법
<fmt:message key="키값" bundle="bundle변수" var="변수명" scope="범위">

 

8. <fmt:param>: <fmt:message> 태그로 읽어온 리소스 내용에 파라미터를 전달하는 태그

 

9. <fmt:formatNumber>

  • 숫자 형식의 패턴을 설정할 때 사용
  • value 속성에는 패턴을 적용시킬 원래의 값을 입력
  • type은 숫자의 타입을 의미함, 숫자, 통화, 퍼센트 중 원하는 타입으로 설정 가능
  • pattern 속성은 지정한 값을 어떤 패턴으로 변화시킬지를 정할 수 있음
  • currencyCode는 통화코드를 의미하며, 숫자타입이 통화일 경우만 유효함
  • currencySymbol도 숫자타입이 통화일 때 유효하며, 통화기호를 지정할수있음
  • groupingUsed는 그룹기호의 포함여부를 나타냄
  • maxIntegerDigits는 최대 정수 길이
  • minIntegerDigits는 최소 정수 길이
  • maxFractionDigits은 최대 소수점 자릿수
  • minFractionDigits는최소 소수점 자릿수를 의미
  • 사용방법
<fmt:formatNumber value="값" type="타입" pattern="패턴" 

currencyCode="값"
currencySymbol="값"
groupingUsed="True 또는 False"
maxIntegerDigits="값"
minIntegerDigits="값"
maxFractionDigits="값"
minFractionDigits="값"
						var="변수명 scope="범위">

 

10. <fmt:parseNumber>

  • 문자열을 숫자, 통화 또는 퍼센트의 형태로 변환할 때 사용하는 태그
  • value 속성에 문자열 값을 입력, type에는 숫자, 통화, 퍼센트 중 변환할 타입을 설정, pattern 속성은 value 속성의 값을 설정된 타입으로 변환하면서 어떤 패턴을 갖게 할 것인지를 지정할 수 있음
  • parseLocale은 파싱할 기본 패턴을 지정
  • integerOnly는 지정된 값 중 정수 부분만 해석할지의 여부를 지정하는 속성
  • 사용방법
<fmt:parseNumber value="값" type="타입" pattern="패턴" 
parseLocale="값"
integerOnly="true 또는 False"
								var="변수명" scope="범위">

 

11. <fmt:formatDate>

  • 날짜 형식의 패턴을 설정할 때 사용되는 태그
  • value 속성에는 날짜 또는 시간을 입력, type 속성으로 날짜인지 시간인지 또는 날짜와 시간 둘 다 포함한 타입인지를 지정
  • dateStyle은 날짜의 스타일을지정, type 속성이 date 또는both일 때만 적용
  • timeStyle은 시간의스타일을 지정, type 속성이 time 또는 both일 때만 적용
  • timeZone 속성은 날짜와 시간이 표시될 시간대를 지정
  • 사용방법
<fmt:formatDate value="값" type="타입"
datestyle="값"
timeStyle="값"
timeZone="값"
				pattern="패턴" var="변수명" scope="범위">

 

12. <fmt:parseDate>

  • 문자열을 날짜와 시간의 형태로 변환하는 태그
  • value 속성에 입력된 문자열 값을 type 속성에 지정된 타입으로 날짜와 시간의 형태로 변환
  • 나머지 속성은 앞에서 설명한 <fmt:formatDate>의 속성과 기능 동일
  • <fmt:parseDate>는 문자열 값을 파싱하여날짜, 시간 형태로 변환

5. JSTL 라이브러리에 있는함수의 종류

 함수 제공하는 기능 예시
     
     
     
toUpperCase(str)   ${fn:toUpperCase("Hello")}
     
     
     
     
     
     
     
     
     
     
     
     

6. 태그 파일

1.태그 파일이란?: tag file, JSP 페이지와 비슷한 문법으로 작성하는 텍스트 파일
JSP 페이지처럼 웹 컨테이너의 특정 디렉터리에 저장해 놓기만 하면 바로 사용할 수 있고, 설치 방법 또한 간단함

 

2.커스텀 액션을 만드는 방법

  1. 태그 파일을 작성해서 만드는 방법
  2. 태그 클래스를 작성해서 만드는 방법

3. 태그 파일에 사용하는 지시자

이름 역할
include 다른 태그 파일을 포함, JSP 페이지에서와 똑같은 역할을 함
taglib 태그 파일에서 사용할 다른 커스텀 액션의 태그 라이브러리(tag library)에 대한 정보를 기술,
JSP 페이지에서와 똑같은 역할을 함
tag 웹 컨테이너가 태그 파일을 처리할 때 필요한 정보를 기술, 태그 파일에서만 사용 가능
attribute 커스텀 액션의 애트리뷰트에 대한 정보를 기술, 태그 파일에서만 사용 가능
variable 커스텀 액션의 변수에 대한 정보를 기술, 태그 파일에서만 사용 가능

 

4. 문제점

: 커스텀 액션은 color와 size 애트리뷰트를 모두 썼을때는 정상적으로 작동하지만, size 애트리뷰트를 쓰지 않으면 선이 전혀 출력되지 않음

==> 이런 문제는 size 애트리뷰트를 필수 애트리뷰트로 만들어서 해결할 수 있음, attribute 지시자에 required 애트리뷰트를 추가하고 그 값으로 true를 지정하면 됨

'JSP > Java Script' 카테고리의 다른 글

2024_07_18_목  (0) 2024.07.18
2024_07_17_수  (0) 2024.07.17
2024_07_15_월  (0) 2024.07.15
2024_07_12_금  (0) 2024.07.12
2024_07_11_목  (0) 2024.07.11