Folder: exam
today.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@page import="java.util.Date"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
오늘 날짜 : <%= new Date() %>
</body>
</html>
image.jsp
<%@ 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>
<img src="../image/3.jpg" alt="짱구" />
</body>
</html>
회사 사이트에서 회사 마크 넣을 때 반복적으로 마크가 들어가게 되면
코드도 반복적으로 들어가므로 따로 빼서 관리를 하자는 것 !!
main.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@page import="java.util.Date"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>*** include directive ***</h3>
오늘 날짜 : <%= new Date() %>
</body>
</html>
이렇게 해도되지만 코드가 계속 중복되면 저렇게 쓰는게 굉장히 번거롭다.
today.jsp 코드가 계속 중복되면 손으로 쓰는게 아니라
main.jsp에서 today.jsp에 가서 모든 코드를 들고 가져오자는 것
-------> include라고 한다. ---------> 포함하겠다.
include 볼펜 아예 주는거
import 볼펜 저기있다 알려주기만 하는 것
이제는 include를 사용하겠다 !! today.jsp가 쥐고있는 데이터를 가져오겠다는 것!!
JSP directive (지시자)
JSP 페이지를 해당 서블릿으로 어떻게 변환하는지 웹 컨테이너에게 알려주는 메시지이다
응답에 대한 설정을 부여하는 것이다
- JSP page directive <%@ page %> -------- 현재 위치 내 페이지
- JSP include directive <%@ include %> --------- 포함하는 것
- JSP taglib directive <%@ taglib %> --------- 새로운 태그 가져오는 것
main.jsp
<%@ 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>
<h3>*** include directive ***</h3>
<%@ include file="today.jsp" %>
</body>
</html>
today에 있는 모든 코드를 끌고온다.
페이지 소스 보기를 통해서 보면 그 안에 있는 소스를 다 가져오는 것을 알 수 있다.
include를 할 때는 밑에처럼 다 버려줘야한다.
today.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@page import="java.util.Date"%>
오늘 날짜 : <%= new Date() %>
main.jsp
<%@ 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>
<h3>*** include directive ***</h3>
<%@ include file="today.jsp" %>
<h3>*** include JSP tag ***</h3>
<jsp:include page="image.jsp" />
</body>
</html>
얘도 다른 코드는 다 버리기
image.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<img src="../image/3.jpg" alt="짱구" />
hello_jsp.java (서블릿)
hello_jsp.class --> 컴파일하게 되면 (코드 바뀌거나)
<h3>*** include directive ***</h3>
<%@ include file="today.jsp" %>
include는 두 개의 파일을 먼저 합치고 서블릿으로 컴파일한다.
합친다음에 컴파일한다.
main.jsp today.jsp
a변수 a변수
합해버리면 충돌이 일어난다.
a라는 변수 2개가 못들어가게된다.
<h3>*** include JSP tag ***</h3>
<jsp:include page="image.jsp" />
main꺼 컴파일하고 image꺼 컴파일하고 나서 합친다.
컴파일시켜서 클래스 파일 만들고 / 다른 파일도 컴파일시켜서 클래스 파일 만드므로
둘이 합해도 충돌 안일어난다.
결과 집합체를 합치는 거라 상관없다. 변수명 신경 안 써도된다.
today.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@page import="java.util.Date"%>
오늘 날짜 : <%= new Date() %>
<% String name = "코난"; %>
main.jsp
<%@ 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>
<h3>*** include directive ***</h3>
<%@ include file="today.jsp" %>
<h3>*** include JSP tag ***</h3>
<jsp:include page="image.jsp" />
<%
String name = "홍길동";
%>
</body>
</html>
변수 충돌이 일어난다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@page import="java.util.Date"%>
오늘 날짜 : <%= new Date() %>
<% //String name = "코난"; %>
주석처리하고
<%@ 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>
<h3>*** include directive ***</h3>
<%@ include file="today.jsp" %>
<h3>*** include JSP tag ***</h3>
<jsp:include page="image.jsp" />
<%
String name = "홍길동";
%>
<h3>main.jsp name = <%=name %></h3>
</body>
</html>
출력해보면
image.jsp -- 에러 안 난다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<img src="../image/3.jpg" alt="짱구" />
<% String name = "코난"; %>
main.jsp
<%@ 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>
<h3>*** include directive ***</h3>
<%@ include file="today.jsp" %>
<h3>*** include JSP tag ***</h3>
<jsp:include page="image.jsp" />
<%
String name = "홍길동";
%>
<h3>main.jsp name = <%=name %></h3>
</body>
</html>
main.jsp -- 3초 뒤에 네이버 이동하게 하기
<%@ 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>
<h3>*** include directive ***</h3>
<%@ include file="today.jsp" %>
<h3>*** include JSP tag ***</h3>
<jsp:include page="image.jsp" />
<%
String name = "홍길동";
%>
<h3>main.jsp name = <%=name %></h3>
<h3>*** 3초 뒤에 네이버 이동</h3>
<% response.setHeader("Refresh", "3;url=https://www.naver.com"); %>
</body>
</html>
request(apple) request
response response
aa.jsp → bb.jsp
sendRedirect
페이지 이동할 때 데이터를 가지고 움직일 수 없다. ( 단순히 이동만 하는 것 )
데이터 공유가 안된다. ( 데이터 같이 쓸 수가 없다. )
page page
(내장객체) -- 자바의 this랑 똑같다.
get방식, post방식으로 이동하면 문자열 String 타입만 넘긴다.
숫자를 넘겨도 문자열 타입으로 받는다.
클래스 객체는 넘길 수 없다.
넘기려면
1. session 을 이용해야한다.
2. request 객체를 가지고 이동한다.
request에 데이터를 실고 이동하는 것
request(apple) request --> 여기서도 apple 데이터 보인다. bb.jsp는 request가 없기 때문에
response response
aa.jsp → bb.jsp
forward
페이지 이동
page page
요청은 aa.jsp를 했는데 보이는 화면은 bb.jsp가 되는 것
aa.jsp는 결과가 X
aa.jsp와 bb.jsp가 하나로 묶이는 것
그렇게 되면 bb.jsp의 request, response는 X
aa.jsp request, response만 !
주소는 aa.jsp이지만 결과는 bb.jsp가 보여주는 것
데이터가 공유된다.
데이터를 aa.jsp에 실었지만 bb.jsp에서도 데이터를 볼 수 있다.
공유하는 것이므로 forward 쓰는 것
말만 두 페이지인 것이지 하나로 합병된 것이다.
bb.jsp에서도 모든 정보를 다 볼 수 있다.
page보다 request가 범위가 크다.
request보다 큰 게 session
session보다 큰 게 application
page < request < session < application
start.jsp
<%@ 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>
<font color="red">
<b>
start.jsp - sendProc.jsp - sendResult.jsp 페이지 이동합니다.<br>
sendRedirect로 이동하므로 데이터는 공유하지 않습니다.<br>
주소는 sendResult.jsp가 보인다.<br>
</b>
</font>
<br>
<font color="blue">
<b>
start.jsp - forwardProc.jsp - forwardResult.jsp 페이지로 이동합니다.<br>
forward로 이동하므로 데이터는 공유합니다.<br>
주소는 forwardProc.jsp로 보이지만 결과는 forwardResult.jsp가 나온다.<br>
</b>
</font>
<br>
<input type="button" value="sendRedirect" onclick="location.href='sendProc.jsp'">
<input type="button" value="forward" onclick="location.href='forwardProc.jsp'">
</body>
</html>
sendProc.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
request.setAttribute("apple", "사과");
//페이지 이동
response.sendRedirect("sendResult.jsp");
%>
- sendResult.jsp로 가라
sendResult.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
String apple = (String)request.getAttribute("apple");
%>
<%=apple%>
두 jsp의 request는 다른 아이다.
각각의 꺼다 !!
forwardProc.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
request.setAttribute("apple", "사과");
//페이지 이동
%>
<jsp:forward page="forwardResult.jsp" />
- forward Result.jsp로 가라
forward Result.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
String apple = (String)request.getAttribute("apple");
%>
결과 = <%=apple%>
RequestDispatcher가 어떤 페이지랑 합병할 것인지 적는 것
절대번지로 적으면 안된다 ! 상대번지로 적어야한다.
http://localhost:8080/EL_JSTL/exam/forwardResult.jsp
/EL_JSTL/exam/forwardResult.jsp -------- X
forwardResult.jsp ------ O
request, response 제어권을 넘기는 것이다.
forwardProc.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
request.setAttribute("apple", "사과");
//페이지 이동
RequestDispatcher dispatcher = request.getRequestDispatcher("forwardResult.jsp"); //상대번지
dispatcher.forward(request, response); // 제어권 넘기기
%>
<%-- <jsp:forward page="forwardResult.jsp" /> --%>
JSP EL / JSTL
page pageScope
request requestScope
session sessionScope
application applicationScope
Folder: JSTL
jstlStart.jsp
<%@ 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>
<input type="button" value="sendRedirect" onclick="location.href='sendRedirectStart.jsp'"/>
<input type="button" value="forward" onclick="location.href='forwardStart.jsp'"/>
</body>
</html>
sendRedirectStart.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%
//자바 역할
List<String> list = new ArrayList<String>();
list.add("호랑이");
list.add("사자");
list.add("기린");
list.add("코끼리");
list.add("타조");
list.add("코알라");
list.add("여우");
//submit, button을 통해서 넘어가는 데이터는 문자열(String)만 가능하다.
//절대 객체를 넘길 수 없다.
request.setAttribute("list", list);
//페이지 이동 - 데이터 공유 X
response.sendRedirect("sendRedirectEnd.jsp");
%>
sendRedirectEnd.jsp
<%@ 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>
<h3>
sendRedirect로 보내면 데이터는 공유하지 않는다.<br>
주소도 화면도 sendRedirectEnd.jsp가 보인다.
</h3>
결과 = ${requestScope.list} <%-- request.getAttribute("list"); --%>
</body>
</html>
주소가 end까지 오는 것을 확인할 수 있다.
forwardStart.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%
//자바 역할
List<String> list = new ArrayList<String>();
list.add("호랑이");
list.add("사자");
list.add("기린");
list.add("코끼리");
list.add("타조");
list.add("코알라");
list.add("여우");
//submit, button을 통해서 넘어가는 데이터는 문자열(String)만 가능하다.
//절대 객체를 넘길 수 없다.
request.setAttribute("list", list);
//페이지 이동
%>
<jsp:forward page="forwardEnd.jsp" />
forwardEnd.jsp 로 가라
forwardEnd.jsp
<%@ 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>
<h3>
forward로 보내면 데이터는 공유한다.<br>
주소는 forwardStart.jsp가 보이지만 화면은 forwardEnd.jsp가 보인다.
</h3>
결과 = ${requestScope.list} <%-- request.getAttribute("list"); --%>
</body>
</html>
list의 주소값이 보여야하는데 여기서는 [ ] 이게 주소값
오버라이딩했기 때문에 list로 보이는 것
list의 값이 아니라 list의 주소값이 나온거라고 보면된다.
forwardEnd.jsp
<%@ 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>
<h3>
forward로 보내면 데이터는 공유한다.<br>
주소는 forwardStart.jsp가 보이지만 화면은 forwardEnd.jsp가 보인다.
</h3>
결과 = ${requestScope.list} <%-- request.getAttribute("list"); --%>
<br><br>
3번째 항목 = ${requestScope.list[2] }
</body>
</html>
pageScope에 가서 list를 찾고 엇으면 requestScope에 가서 찾는다.
또 없으면 sessionScoper로 간다.
여러 곳에 list가 있으면 구분해줘야한다.
pageScope → requestScope → sessionScope → applicationScope 순으로 호출
<c:forEach var="data" items="${list }"> <%-- for(String data : requestScope.list) --%>
${data }<br>
</c:forEach>
Package: com.jstl
Class: PersonDTO.java
package com.jstl;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import lombok.Setter;
@NoArgsConstructor
@AllArgsConstructor
@RequiredArgsConstructor
@Setter
@Getter
public class PersonDTO {
@NonNull
private String name;
private int age;
}
package com.jstl;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import lombok.Setter;
@NoArgsConstructor
@AllArgsConstructor
@RequiredArgsConstructor
//@Setter
//@Getter
@Data
public class PersonDTO {
@NonNull
private String name;
private int age;
}
forwardStart.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@page import="com.jstl.PersonDTO"%>
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%
//자바 역할
List<String> list = new ArrayList<String>();
list.add("호랑이");
list.add("사자");
list.add("기린");
list.add("코끼리");
list.add("타조");
list.add("코알라");
list.add("여우");
PersonDTO aa = new PersonDTO("홍길동", 25);
PersonDTO bb = new PersonDTO("라이언", 23);
PersonDTO cc = new PersonDTO("프로도", 30);
List<PersonDTO> list2 = new ArrayList<PersonDTO>();
list2.add(aa);
list2.add(bb);
list2.add(cc);
//submit, button을 통해서 넘어가는 데이터는 문자열(String)만 가능하다.
//절대 객체를 넘길 수 없다.
request.setAttribute("list", list);
request.setAttribute("list2", list2);
//페이지 이동
//forward와 같은의미로 사용
RequestDispatcher dispatcher = request.getRequestDispatcher("forwardEnd.jsp"); // 상대번지
dispatcher.forward(request, response); //제어권 넘기기
%>
<%-- <jsp:forward page="forwardEnd.jsp" /> --%>
list2 안에 aa, bb, cc의 주소값이 담기게 된다. 데이터 안 담겨있다.
forwardEnd.jsp
<c:forEach var="personDTO" items="${list2 }"><%-- for(PersonDTO personDTO : list2) --%>
${personDTO }<br>
</c:forEach>
주소로 표시가 된다.
데이터를 하나씩 꺼내고싶으면 !?
<c:forEach var="personDTO" items="${list2 }">
${personDTO.getName() }   ${personDTO.getAge() } <br>
</c:forEach>
JSTL에서는 메서드의 이름을 변수명처럼 사용한다.
personDTO.getName()
↓
personDTO.name
<c:forEach var="personDTO" items="${list2 }">
${personDTO.getName() }   ${personDTO.getAge() } <br>
<%-- JSTL에서는 메서드의 이름을 변수명처럼 사용한다. --%>
${personDTO.name }   ${personDTO.age } <br>
</c:forEach>
personDTO의 name 변수가 아니라
getName( ) 함수명을 변수명처럼 사용하는 것 !!!
메소드 호출시 접두사 set/get를 생략 할 수 있다
메소드명을 변수명처럼 사용 할 수 있다
jstlFormat.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" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<br>
<fmt:formatNumber type="number" value="123456789" /> <br>
<fmt:formatNumber type="number" value="123456789.88" /> <br>
<fmt:formatNumber type="number" value="123456789.88" maxFractionDigits="1"/> <br>
<br>
<fmt:formatNumber type="number" value="123456.78" pattern="#,###"/> <br>
<fmt:formatNumber type="number" value="123456.789" pattern=".##"/> <br>
<fmt:formatNumber type="number" value="123456.789" pattern="#,###.##"/> <br>
<br>
<fmt:formatNumber type="number" value="0000.00" pattern="#,###.##"/> <br>
<fmt:formatNumber type="number" value="0000.00" pattern="0,000.00"/> <br> <!-- 강제로 0을 표시 -->
<fmt:formatNumber type="number" value="12.3" pattern="000.00"/> <br>
<br>
<c:set var="now" value="<%=new java.util.Date() %>" />
<c:out value="${now}" /> <br>
data : <fmt:formatDate value="${now}" type="date"/><br>
time : <fmt:formatDate value="${now}" type="time"/><br>
both : <fmt:formatDate value="${now}" type="both"/><br>
<br>
<fmt:formatDate value="${now}" pattern="yyyy-MM-dd hh:mm" type="both"/><br>
<fmt:formatDate value="${now}" pattern="yyyy-MM-dd" type="date"/><br>
<fmt:formatDate value="${now}" pattern="yy-MM-dd E요일 a" type="date"/><br>
<fmt:formatDate value="${now}" pattern="HH:mm:ss" type="time"/><br>
</body>
</html>
'JSP & Servlet' 카테고리의 다른 글
DAY 53 - projectMVC - 로그인 / 로그아웃 / 회원가입 / 회원정보수정 / 글쓰기 / 글목록 (0) | 2024.09.19 |
---|---|
DAY 52 - MVC ( 2024.09.13 ) (0) | 2024.09.13 |
DAY 51 - MVC ( 2024.09.12 ) (2) | 2024.09.12 |
DAY 50 - EL_JSTL ( 2024.09.11 ) (4) | 2024.09.11 |
DAY 49 - MyBatis (2024.09.10) (0) | 2024.09.10 |