✅ JSP의 내장객체 세가지
- page context - get,set을 이용해서 저장할 수 있는 저장소
- session - 한 사용자가 저장할 수 있는 저장소
- application - 어플리케이션 모든 사용자가 공유할 수 있는 저장소 (형식이 ServletContext이자 저장소)
👉 세가지의 공통점은 저장소!
👉 서블릿은 잠깐 생겼다 사라지므로 계속 살아있는 WAS에 담아두고 값을 공유해야함 (전역 저장소)
ServletContextListener는 웹 애플리케이션의 생명주기 이벤트를 처리하는 인터페이스. JSP 파일이 실행될 때 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링크의 주소로 박아넣음
<%@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표현식
'😵 ~23.11.10' 카테고리의 다른 글
0912 | 컨트롤분리와 POJO / 스프링MVC / POJO 컨트롤러 만들기 (0) | 2023.09.13 |
---|---|
0911 | MVC 모델 개념 / JSP action tag / JSTL / MVC모델2 (1) | 2023.09.11 |
0907 | 서블릿 생명주기와 startUp 옵션 / @WebServlet과 @WebListener / servlet context (2) | 2023.09.07 |
0906 | 사용자입력 - 쿼리스트링 & 키 전달법 / jsp개념 / jsp 코드블록 (0) | 2023.09.06 |
0905 | 톰캣을 이용해서 웹프로젝트 띄우기 / root설정 / 한글설정 / 사용자입력 -get방식 (0) | 2023.09.05 |