반응형

 

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>

반응형