JSP = Servlet(처리객체)
Model-1 Pattern : 한 객체안에서 디자인과 데이터처리를 전부 다 처리하는것
- 나중에 협업을 했을 때 디자인과 데이터 작업을 했을 때 합치기가 힘들고, 비효율적이다. (분업화가 되지 않음)
- 분리의 필요성이 느껴진다. 데이터처리와 디자인을 분리된 개발 환경에서 했을때 분업화가 될 수 있다.
- JSP에서의 데이터처리는 Servlet에게 맡기고, 디자인처리는 JSP에게 맡기자. (Servlet이 Java 환경이기 때문이다)
Model-2 Pattern : 비즈니스 로직(데이터 처리) 따로, 프레젠테이션 로직(화면 출력) 따로 구분해서 만드는 것
모델 1,2는 현재 사용하지 않지만, 이론을 이해해야 현재, 사용하는 MVC 패턴을 사용할 수 있다.
Directive Tag : <%@ include@%>로 두 가지 작업을 분리해서 하여 한 번에 합치는 방법
Servlet or JSP 페이지 이동방법
1. a.jsp에 요청을 하면 b.jsp의 정보를 응답으로 처리해준다
response.sendRedirect("b.jsp") 재요청을 해라 -> b.jsp 재요청 -> b.jsp에게 응답을 받는다.
(A/S 센터에 100번으로 전화했는데, 해당 기기는 101번으로 전화해야 한다고 한다. 그리고 끊었다. 그러면 고객은 101번으로 연결해서 해당 기기에 대한 A/S를 받는다 = 전화 2통)
-> 클라이언트 즉 URL에는 변경이 있어서 b.jsp에 대한 정보를 안다.
2. Dispatcher(전송하다) : a.jsp에 요청을 하면 서버내에서 b.jsp에게 forward를 통해서 request와 response를 그대로 전달해준다. (두개의 객체는 유저의 요청이 일어나면, 이 두개의 객체를 Tomcat이 만들어서 보내주게 되는데, 사용자의 요청이 일어날 때 생긴다는게 포인트이다) (소멸되는 시점은 유저에게 응답이 완료가 될 시에, request와 response는 소멸된다)
a는 b에게 request와 response 두개를 그대로 전달해줬고, b는 response를 유저에게 그대로 줬다.
(A/S 센터에 100번으로 전화했는데, 회선으로 101번을 돌려줘서 끊지 않고 전화하여 응답받을 수 있었다 = 전화 1통)
-> 클라이언트 즉 URL에는 변경이 없어서 b.jsp에 대한 정보를 모른다.
Redirect 방식
a.jsp 실행
Dispatcher 방식
c.jsp 실행
웹어플리케이션의 Scope
Tomcat이 일하는 것들 Scope(JSP, Servlet에서 둘 다 사용가능)
- PageContext는 해당 객체 자신의 할당받은 영역만 사용할 수 있다.
- request : request를 만들어주고, request를 사용할 수 있는 공간을 만들어 준다. 똑같은 request를 다른 공간에 넘겨줄 수도 있다. request에 저장된 데이터가 a면 request를 넘겨받은 공간은 a를 가져올 수 있다.
(서로가 데이터가 공유할 수 있는 공간이 생긴것이다 request 공간 = 공유공간)
request를 넘겨줌, request의 데이터 a를 request 공간에 저장, request를 공유받은 공간은 데이터 a를 사용가능하다.
(request 공간을 제일 많이 사용한다 - request 공간은 response가 처리되면 소멸된다 - 자원에 대한 부담이 줄어든다)
-> 방문증을 받고서 나갈때 방문증을 반납한다 (request 방식) -> 1회성
- 한 유저가 접속하면 session을 서버가 만들어줘서 할당해준다. 내가 브라우저를 끄지 않으면, session은 계속 유지된다. session 발급은 유저 한 명당 개개인으로 제공이 된다.
-> 내가 입사하면, 그 건물에 대한 출입증을 받고 계속 들락날락 거린다 (session 방식)
-> session 만료 = 출입증 반납
- application : 전역영역, 전체 영역에 대한 자원관리
EL : 간결하게 표현하기 위해서 사용한다. 자바 코드 썼다가, html 썼다가, 자바스크립트 썼다가 이것저것 쓰니까 정신이 없다. 이걸 통용해서 일체감있게 사용하기 위해서 사용한다.
Tag Library
<%@ 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>
<hr>
Java + HTML
<hr>
<%
for(int i = 0; i < 5; i++) {
%>
아무리 피곤해도 설거지는 하고자라 - 박정환 (동기부여 쇼츠 2분시청)<br>
<%
}
%>
<hr>
Tag 언어(Tag Library)
<hr>
<c:forEach begin="1" end="5">
아무리 피곤해도 설거지는 하고자라 - 박정환 (동기부여 쇼츠 2분시청)<br>
</c:forEach>
</body>
</html>
package action;
import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/main.do")
public class MainAction extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request,
HttpServletResponse response
) throws ServletException, IOException {
// Command Pattern
// Command 전달해서 처리내용 다양하게 할 수 있다.
// main.do
// main.do?menu=company
// main.do?menu=product
// main.do?menu=customer
String menu = request.getParameter("menu");
if(menu==null) menu = "company";
String forward_page = "";
switch(menu) {
case "company" : forward_page = "main_company.jsp"; break;
case "product" : forward_page = "main_product.jsp"; break;
case "customer" : forward_page = "main_customer.jsp"; break;
}
// Dispatcher
RequestDispatcher disp = request.getRequestDispatcher(forward_page);
disp.forward(request, response);
}
}
<%@ 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>
<ul>
<li><a href="main.do?menu=company">회사소개</a></li>
<li><a href="main.do?menu=product">상품소개</a></li>
<li><a href="main.do?menu=customer">고객센터</a></li>
</ul>
<h1>고객센터</h1>
</body>
</html>
EL 사용
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
/*
EL(Expresion Language) : 표현언어
1. JSP에 값을 표현하는 언어
2. 형식: ${ 변수/수식/연산자 }
3. 변수 : scope내에 저장된 변수만 사용가능하다
scope(pageScope > requestScope > sessinScope > applicationScope)
parameter변수 : main.do?menu=company
${ param.menu }
*/
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<hr>
EL 산술연산자
<hr>
<!-- HTML 주석 : JSP->서블릿 변환시 그대로 넘어간다 -->
<%-- JSP 주석 : JSP->서블릿 변환시 안넘어간다
EL표현방식 : ${ 값 } --%>
\${ 3+2 } => ${ 3+2 } <br>
\${ 3-2 } => ${ 3-2 } <br>
\${ 3*2 } => ${ 3*2 } <br>
\${ 3/2 } => ${ 3/2 } <%-- or \${ 3 div 2 } --%><br>
\${ 3%2 } => ${ 3%2 } <br>
<hr>
EL 관계연산자
<hr>
\${ 3 > 2 } => ${ 3 > 2 } or ${ 3 gt 2 }<br> <!-- gt : greater than -->
\${ 3 >= 2 } => ${ 3 >= 2 } or ${ 3 ge 2 }<br> <!-- ge : greater equal -->
\${ 3 < 2 } => ${ 3 > 2 } or ${ 3 lt 2 }<br> <!-- lt : less than -->
\${ 3 <= 2 } => ${ 3 >= 2 } or ${ 3 le 2 }<br> <!-- le : less equal -->
\${ 3 == 2 } => ${ 3 == 2 } or ${ 3 eq 2 }<br> <!-- eq : equal -->
\${ 3 != 2 } => ${ 3 != 2 } or ${ 3 ne 2 }<br> <!-- ne : not equal -->
<hr>
EL 3항연산자 : (조건) ? 참값 : 거짓값
<hr>
<!-- 참 인경우 : /01_el1.jsp /01_el1.jsp?msg= -->
메세지 : ${ (empty param.msg) ? "No Message" : param.msg } <br>
<hr>
논리연산자
<hr>
\${ true && true } => ${ true && true } or ${ true and true } <br>
\${ true || false } => ${ true || false } or ${ true or false } <br>
\${ not true } => ${ not true } <br>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
// 각 영역에 데이터를 저장(binding)
// key value
pageContext.setAttribute("msg", "PageContext에 저장된 변수");
request.setAttribute("msg", "request에 저장된 변수");
session.setAttribute("msg", "session에 저장된 변수");
application.setAttribute("msg", "application에 저장된 변수");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%-- ${ 영역이름.변수 } --%>
<!-- 영역이름을 생략하면 참조순서는
pageScope > requestScope > sessionScope > applicationScope
-->
pageScope : ${ msg } <br>
requestScope : ${ sessionScope.msg } <br>
pageScope : ${ pageScope.msg } <br>
sessionScope : ${ sessionScope.msg } <br>
applicationScope : ${ applicationScope.msg } <br>
</body>
</html>
JSTL 사용
<%@page import="java.util.Date"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!-- JSTL 사용설정 -->
<!-- core library -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!-- fmt library -->
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!-- fn library -->
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<%
/*
JSTL(JSP Standard Tag Library)
: 명령을 tag형태로 만든 library
1.core: if/forEach/Choose/set/..
2.fmt : 날짜/숫자(통화)
3.fn : String관련(substring/length/indexOf/replace)
JSTL을 사용하려면... Tomcat library안에 확인
JSTL내에서 사용되는 변수는 반드시 EL표현식으로 표현하게 되어있다.
EL표현값 scope영역중에 있어야 한다.
pageScope > requestScope > sessionScope > applicationScope
*/
// 날짜 출력
Date now = new Date();
pageContext.setAttribute("now", now);
int money = 1234500000;
request.setAttribute("money", money);
String str_date = "2024-06-18 16:07:50.001";
pageContext.setAttribute("str_date", str_date);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%-- 변수 안에 변수명만 적으면 pageContext로 인식을 해버린다. --%>
오늘 날짜 : <%= now %> <br>
오늘 날짜 : <fmt:formatDate value="${ pageScope.now }"/> <br>
오늘 날짜 : <fmt:formatDate pattern="YYYY년 MM월 dd일" value="${ pageScope.now }"/> <br>
오늘 날짜(String) : ${ fn:substring(str_date,0,10) } <br>
오늘 날짜(String) : ${ fn:length(str_date) } <br>
<%-- scope명은 오타나면 오류나기 때문에 안써도 된다. --%>
내가 소유한 현금(원화) : <fmt:formatNumber type="currency" value="${ requestScope.money }"/> <br>
<fmt:setLocale value="ja_jp"/>
내가 소유한 현금(엔화) : <fmt:formatNumber type="currency" value="${ money }"/> <br>
<fmt:setLocale value="en_us"/>
내가 소유한 현금(달러) : <fmt:formatNumber type="currency" value="${ money }"/>
</body>
</html>
- JSTL에서 배열에 대한 반복문 쓰기 (데이터 베이스에서 데이트 가져올 때 주로 많이 사용한다)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!-- JSTL Core -->
<%@ 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>
<!-- 반복문으로 저장된 i는 pageScope안에 저장된다. -->
<c:forEach var="i" begin="1" end="5" step="1">
<!-- i 홀수면 red -->
<c:if test="${ i%2==1 }">
<font color='red'>${ pageScope.i } : 백 번 Ctrl + Spacebar 써서 코딩하는것보다 블랙코딩 ${ pageScope.i }번 하는게 더 낫다 - 박정환 개발자 0년차</font><br>
</c:if>
<!-- i 짝수면 blue -->
<c:if test="${ i%2==0 }">
<font color='blue'>${ pageScope.i } : 백 번 Ctrl + Spacebar 써서 코딩하는것보다 블랙코딩 ${ pageScope.i }번 하는게 더 낫다 - 박정환 개발자 0년차</font><br>
</c:if>
</c:forEach>
</body>
</html>
- JSTL에서 배열에 대한 반복문 쓰기 (데이터 베이스에서 데이트 가져올 때 주로 많이 사용한다)
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
// 배열
String [] sido_array = {"서울","경기","인천","대전","강원"};
// 특정영역에 무조건 넣어야한다. request binding
// ArrayList
List<String> fruit_list = new ArrayList<String> ();
fruit_list.add("사과");
fruit_list.add("참외");
fruit_list.add("수박");
fruit_list.add("딸기");
request.setAttribute("sido_array", sido_array);
request.setAttribute("fruit_list", fruit_list);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<hr>
시도목록
<hr>
<ul>
<!-- items : 배열/컬렉션/Map -->
<!-- for(String sido : sido_array) 동일함 -->
<!-- sido와 같이 임시변수들은 전부 pageScope에 저장이 된다. -->
<c:forEach var="sido" items="${ requestScope.sido_array }">
<li>${ pageScope.sido }</li>
</c:forEach>
</ul>
<hr>
과일목록
<hr>
<ul>
<!-- for(String fruit : fruit_list) 동일 -->
<c:forEach var="fruit" items="${ requestScope.fruit_list }">
<li>${ fruit }</li>
</c:forEach>
</ul>
<hr>
과일목록
<hr>
<ul>
<!-- for(int i=0; i<fruit; i++) -->
<!-- varStatus => index(첨자), count(반복횟수)
JSTL내에 기록되는 값(변수) 표현시(EL) 공백띄우지 말것
JSTL내에 쓰는 변수는 무조건 el표현으로 사용
-->
<c:forEach var="fruit" items="${ fruit_list }" varStatus="i">
<li>${ i.count } : ${ fruit }(${ i.index })</li>
</c:forEach>
</ul>
</body>
</html>
★Java 객체와 연동하여 JSP의 el 활용하기★
- Java class Vo(Value Object)를 만들 때, getter를 만들어주지 않으면 JSP에서 객체를 불러오는게 불가능하다.
package vo;
public class PersonVo {
String name;
int age;
String addr;
public PersonVo() {
// TODO Auto-generated constructor stub
}
public PersonVo(String name, int age, String addr) {
super();
this.name = name;
this.age = age;
this.addr = addr;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
}
<%@page import="vo.PersonVo"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
PersonVo p = new PersonVo("홍길동",30,"서울 관악 남부순환로");
pageContext.setAttribute("p", p);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
p.s info
<hr>
<!-- 객체내의 속성표현방법 : .(dot)표현법 -->
<!-- -->
이름:
<input type="button" value="${ pageScope.p.name }">님 반갑습니다 <br>
나이:
<input type="button" value="${ p.age }">살 <br>
<!-- square bracket [] -->
주소: ${ p['addr'] } <br>
</body>
</html>
<%@page import="vo.PersonVo"%>
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
List<PersonVo> p_list = new ArrayList<PersonVo> ();
p_list.add(new PersonVo("일길동",30,"서울 관악 신림1동"));
p_list.add(new PersonVo("이길동",31,"서울 관악 신림2동"));
p_list.add(new PersonVo("삼길동",32,"서울 관악 신림3동"));
p_list.add(new PersonVo("사길동",33,"서울 관악 신림4동"));
p_list.add(new PersonVo("오길동",34,"서울 관악 신림5동"));
// request binding
request.setAttribute("p_list", p_list);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<table border="1">
<!-- table title -->
<tr>
<th>순번</th>
<th>이름</th>
<th>나이</th>
<th>주소</th>
</tr>
<!-- table data -->
<!-- for(PersonVo p : p_list) 동일함 -->
<c:forEach var="p" items="${ p_list }" varStatus="i">
<tr>
<td>${ i.count } <%-- or ${ i.index+1 } --%></td>
<td>${ p.name }</td>
<td>${ p.age }</td>
<td>${ p.addr }</td>
</tr>
</c:forEach>
</table>
</body>
</html>
'서버↗' 카테고리의 다른 글
EL [JSP] / JSTL (0) | 2024.06.18 |
---|---|
[본격 JSP] JSP 활용하여 Servlet 작성하기 (0) | 2024.06.17 |
[오류해결]Servlet Tomcat 실행오류, HTTP 상태 404 오류 (0) | 2024.06.17 |
Servlet 연산 예제 (0) | 2024.06.14 |
Servlet의 요청 및 응답 / Thread에 대해서 / Get, Post (0) | 2024.06.14 |