✅ JSP의 내장객체 세가지

page는 this를 대신하는 이름 (현재 이 페이지)

  • page context - get,set을 이용해서 저장할 수 있는 저장소
  • session - 한 사용자가 저장할 수 있는 저장소
  • application - 어플리케이션 모든 사용자가 공유할 수 있는 저장소 (형식이 ServletContext이자 저장소)

👉 세가지의 공통점은 저장소!

👉 서블릿은 잠깐 생겼다 사라지므로 계속 살아있는 WAS에 담아두고 값을 공유해야함 (전역 저장소)

 

 

ServletContextListener는 웹 애플리케이션의 생명주기 이벤트를 처리하는 인터페이스. JSP 파일이 실행될 때 ServletContextListener는 다음과 같은 일을 수행한다:
  1. 웹 애플리케이션 초기화 이벤트 처리: 웹 애플리케이션(WAR 파일)이 웹 애플리케이션 서버에 배포되고 시작될 때, ServletContextListener는 contextInitialized() 메서드를 호출하여 초기화 작업을 수행한다. 이 시점에서는 웹 애플리케이션 전체의 초기화를 수행할 수 있다. 예를 들어, 데이터베이스 연결 풀을 설정하거나 애플리케이션의 전역 설정을 읽어들이는 작업을 할 수 있다.
  2. 웹 애플리케이션 종료 이벤트 처리: 웹 애플리케이션 서버가 종료되거나 웹 애플리케이션(WAR 파일)이 언바운드(해제)될 때, ServletContextListener는 contextDestroyed() 메서드를 호출하여 마무리 작업을 수행한다. 이 시점에서는 리소스의 정리 작업을 수행할 수 있다. 데이터베이스 연결 풀을 닫거나 애플리케이션에서 사용한 자원을 해제하는 등의 작업을 할 수 있다.
  3. 웹 애플리케이션 범위 데이터 설정: ServletContextListener를 사용하여 웹 애플리케이션 범위에서 공유하는 데이터를 설정할 수 있다. contextInitialized() 메서드 내에서 ServletContext에 속성을 저장하고, 이후에 서블릿, 필터, JSP 등 다양한 웹 컴포넌트에서 이 데이터를 활용할 수 있다.
  4. 환경 설정 로딩: 웹 애플리케이션 시작 시, 설정 파일이나 리소스를 로드하고 이를 웹 애플리케이션의 컴포넌트에서 사용할 수 있도록 준비하는 작업을 수행할 수 있다.
요약하면, ServletContextListener는 웹 애플리케이션의 초기화 및 마무리 작업을 수행하고, 웹 애플리케이션 전역에서 사용할 데이터나 리소스를 설정 및 관리하는 역할을 한다. 이를 통해 웹 애플리케이션의 생명주기 관리와 초기화 작업을 보다 효율적으로 처리할 수 있다.
@WebListener
public class AppContextListner implements ServletContextListener {
	@Override
	public void contextInitialized(ServletContextEvent event) {
		System.out.println("서버시작이벤트 발생");
		String resource = "mybatis-config.xml";
		InputStream inputStream;

		//jsp에서는 내장객체로 준비가 되어있음 (이름: application. 형태는 ServletContext)
		//여기선 서버가 시작될 때 전역객체로 준비될 수 있도록 세팅을 해준다
		try {
			inputStream = Resources.getResourceAsStream(resource);
			SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
			event.getServletContext().setAttribute("sqlSessionFactory", sqlSessionFactory);
			event.getServletContext().setAttribute("a", "hello"); // 값을 꽂아준다
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

	@Override
	public void contextDestroyed(ServletContextEvent sce) {
		System.out.println("서버종료이벤트 발생");
	}

}
<%@ 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>
	<!-- 리스너에서 담은 값을 꺼낼수있는지 출력 -->
	<h1>메뉴목록<%=application.getAttribute("a")%></h1>
	<ul>
		<li>아메리카노(Americano)</li>
		<li>카페라떼 (CafeLatte)</li>
	</ul>
</body>
</html>

 

 

 

✅ JSP파일에 repository 객체와 메서드 연결해서 웹화면으로 데이터 뽑아내기

 

#️⃣ 데이터베이스에서 for문으로 값 받아와서 변수에 담아 출력해보기

: ContextListener에 있는 resource의 xml을 통해서 DB와 연결되어있음!

String resource = "mybatis-config.xml";

<%@page import="kr.co.rland.web.entity.Menu"%>
<%@page import="java.util.List"%>
<%@page import="kr.co.rland.web.repository.MenuRepository"%>
<%@page import="org.apache.ibatis.session.SqlSession"%>
<%@page import="org.apache.ibatis.reflection.SystemMetaObject"%>
<%@page import="org.apache.ibatis.session.SqlSessionFactory"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>

<%
SqlSessionFactory sqlSessionFactory = (SqlSessionFactory) application.getAttribute("sqlSessionFactory");
SqlSession sqlSession = sqlSessionFactory.openSession();
//mapper의 구현체이자 객체가 repository
MenuRepository repository = sqlSession.getMapper(MenuRepository.class);

List<Menu> list = repository.findAll();
System.out.println(list); // 콘솔출력
out.println(list); // 웹출력
%>

<%=sqlSessionFactory%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<!-- 리스너에서 담은 값을 꺼내보기 -->

	<h1>
		메뉴목록<%=application.getAttribute("a")%></h1>

	<h2>첫번째</h2>
	<%
	for (int i = 0; i < list.size(); i++) {

		String korName = list.get(i).getKorName();
		String engName = list.get(i).getEngName();
	%>

	<li><%=korName%>(<%=engName%>)</li>

	<%
	}
	%>
		<h2>두번째</h2>
		<%
	for (Menu m : list) {

		String korName = m.getKorName();
		String engName = m.getEngName();
	%>

		<li><%=korName%>(<%=engName%>)</li>
	
	<%
	}
	%>
	<ul>
	
		<li>아메리카노(Americano)</li>
		<li>카페라떼 (CafeLatte)</li>
	</ul>
</body>
</html>

 

 

#️⃣ 화면 넘어다니면서 파라미터 전달해서 해당 페이지로 이동하기

<%@page import="kr.co.rland.web.entity.Menu"%>
<%@page import="java.util.List"%>
<%@page import="kr.co.rland.web.repository.MenuRepository"%>
<%@page import="org.apache.ibatis.session.SqlSession"%>
<%@page import="org.apache.ibatis.reflection.SystemMetaObject"%>
<%@page import="org.apache.ibatis.session.SqlSessionFactory"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>

<%
SqlSessionFactory sqlSessionFactory = (SqlSessionFactory) application.getAttribute("sqlSessionFactory");
SqlSession sqlSession = sqlSessionFactory.openSession();
//mapper의 구현체이자 객체가 repository
MenuRepository repository = sqlSession.getMapper(MenuRepository.class);

List<Menu> list = repository.findAll();
//System.out.println(list);
//out.println(list);
%>

<h2>두번째</h2>
	<ul>
		<%
		for (Menu m : list) {

			String korName = m.getKorName();
			String engName = m.getEngName();

			long id = m.getId();
		%>

		<li><a href="detail.jsp?id=<%=id%>"><%=korName%>(<%=engName%>)</a></li>

		<%
		}
		%>
	</ul>

👉 받아온 id값을 html에 출력할 때 a링크의 주소로 박아넣음

 

hover시 아이디값이 들어가있음이 확인됨

 

<%@page import="kr.co.rland.web.entity.Menu"%>
<%@page import="java.util.List"%>
<%@page import="kr.co.rland.web.repository.MenuRepository"%>
<%@page import="org.apache.ibatis.session.SqlSession"%>
<%@page import="org.apache.ibatis.reflection.SystemMetaObject"%>
<%@page import="org.apache.ibatis.session.SqlSessionFactory"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
	
<%
SqlSessionFactory sqlSessionFactory = (SqlSessionFactory) application.getAttribute("sqlSessionFactory");
SqlSession sqlSession = sqlSessionFactory.openSession();
MenuRepository repository = sqlSession.getMapper(MenuRepository.class);

long id = Long.parseLong(request.getParameter("id"));
Menu m = repository.findById(id);

System.out.println(m);
%>


<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

	<dl>
		<dt>메뉴이름:</dt>
		<dd><%=m.getKorName()%>(<%=m.getEngName()%>)
		</dd>
		<dt>가격</dt>
		<dd><%=m.getPrice()%>
		</dd>
		<dt>img</dt>
		<dd><%=m.getImg()%>
		</dd>

	</dl>

	<a href="list.jsp">목록</a>

</body>
</html>

 

 

 

 

 

✅ JSP의 단점과 컨트롤러의 역할 & Model의 생성 (MVC)

출력할 값에 대한 변수가 만들어짐

 

 

👉 출력에 사용되는 코드블럭도 줄이고 단순화 시키고자함 (뷰에서는 출력만 담당) ▶ 출력 표현식으로 EL을 사용하게 됨

👉 control 과 view를 한 장소에 두지 않으므로 지역변수를 사용하지 않고 저장소를 사용해서 값을 전달함.

 

applictaion (Servelet Context) 웹 애플리케이션 전체에서 데이터를 공유하는데 사용됨. 웹 애플리케이션이 시작되고 종료될때까지 데이터가 유지된다
pageContext  JSP페이지의 범위에서 데이터 저장, 공유하는데 사용됨. JSP 페이지가 처리되는 동안만 데이터가 유지됨 (getter, setter)
session (HttpSession) 특정 사용자 세션에 대한 데이터 저장, 공유에 사용됨. 브라우저 세션이 유지되는동안 데이터가 유지됨
request (HttpServletRequest) 현재 요청 범위에서 데이터를 저장하고 공유하는데 사용됨. 하나의 HTTP요청이 처리되는동안만 데이터가 유지됨

 

 

 

✅ 코드블럭을 간편하게 표현하기 위한 EL표현식

 

 

 

 

+ Recent posts