오늘의 코딩순서
(폴더: 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
- redirect
<%@ 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>
- formDate1.jsp
Tip)- <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
변수 c와 fmt는 다른 회사에서도 많이 쓰는 변수
- <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@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문에만 쓸 수 있음
- Select 문을 실행할때만 사용하며, 결과를 ResultSet 객체로 반환함
<%@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을 가지고 할 수 있는 일?
- 간단한 프로그램 로직의 구사 ( 자바의 변수 선언, if문, for문 등에 해당하는 로직)
- 다른 JSP 페이지 호출 ex) <c:redirect>, <c:import>
- 날짜, 시간, 숫자의 포맷
- JSP 페이지 하나로 여러 가지 언어의 웹 페이지 생성
- 데이터베이스로의 입력, 수정, 삭제, 조회
- XML 문서 처리
- 문자열을 처리하는 함수 호출, 이 호출을 제외한 나머지 기능들은 모두 커스텀 액션 형태로 제공됨
- JSTL 지시자 사용방법: <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
- JSP 페이지에서 앞 페이지의 접두어를 사용하기 위해서는 taglib 지시자를 이용해서 라이브러리의 URI 식별자와 접두어를 연결해야 함
- taglib 지시자는 다른 지시자와 마찬가지로 <%@으로 시작해서 %>로 끝남
- 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.커스텀 액션을 만드는 방법
- 태그 파일을 작성해서 만드는 방법
- 태그 클래스를 작성해서 만드는 방법
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 |