✅ 값을 표현하는데 사용되는 새로운 script 언어로 jsp의 기본문법을 보완하는 역할(즉, 보다 쉽게 값을 받아 출력할 수 있도록 해주는 표현어)✅ 값을 표현하는데 사용되는 새로운 script 언어로 jsp의 기본문법을 보완하는 역할(즉, 보다 쉽게 값을 받아 출력할 수 있도록 해주는 표현어)
스크립틀릿 <%%>
이 아닌 HTML 영역에 바로 ${}를 사용하여 입력한다.
pageScope -> JspContext
requestScope -> ServletRequest
sessionScope -> HttpSession
applicationScope -> ServletContext
request.setAttribute : Servlet에서 사용되는 메서드, HttpServletRequest 객체에 데이터를 설정하는 방법. 설정한 데이터는 해당 요청이 끝날 때까지 유지되어 사용할 수 있음 -> 주로 JSP, Servlet이용하는 프로젝트에서 사용
model.addAttribute : Spring MVC에서 사용되는 메서드로, Spring MVC의 Model 객체에 데이터를 추가하는 방법. 설정한 데이터는 뷰로 전달되어 뷰에서 사용할 수 있음. -> Spring MVC 사용 시 Model을 통해 뷰에 데이터 전달시!
표기법 ${객체이름.프로퍼티}
배열, List에서 꺼내기 : ${객체이름[순서]}
Map에서 꺼내기 : ${객체이름.map 키값}
[!quote] 값을 넣고, 값을 가져올 때 보다 쉽게 데이터를 다룰 수 있도록 도와주는 표현언어이다. 뷰 단에서 자바코드로 작성하지 않고, EL표현어로 작성하는 경우가 많다.
강의 내용
게시판 작업
목적
- 게시판 목록에서 하나의 게시글을 선택했을 때, 상세보기 페이지로 이동
- 상세보기 페이지에는 상세글과 함께 댓글이 보이도록 처리
- 상세보기 클릭시 해당 게시글의 HitCount가 하나씩 추가되도록 설계
- 상세보기 기능(수정, 삭제, 목록보기)
- 댓글(추가, 삭제)
Logic에서 구현되지 않고 호출만 된 메소드 : hitCount(), commentList() -> boardDetail()에서 사용함!!
코드 실행 중 여러 예외상황 발동할 수 있음(한 번에 만명이 이용하거나 할 때, 서버가 다운될 수 있음.)
예외처리 관련 클래스 설계
- demo 밑에 exception 패키지 아래 클래스 설계-> Exception을 상속받아, 각 에러마다 메시지 표시(사용자정의 예외처리 설정이 가능해진다.)
- webapp에 error -> (예외컨트롤러)에서 보내질 페이지
예외처리 방법
- 기본 : try-catch문(기본적으로는 실행에서 바로 try-catch문을 사용하여 처리하지만, 웹페이지 구성시 오류처리 페이지 구성필요)
- 클래스 설계 : 예외처리 클래스, 예외처리 화면 별도 구성
클래스 설계 시, [[throw, thorws]]란?
throw는 예외를 강제로 발생시킨 후, 상위 블럭이나 catch문으로 예외를 던진다
throws는 자신을 호출하는 메소드에 예외처리의 책임을 떠넘기는 것
예외 처리 방법
1) try-catch (finally) - 다른 작업 흐름으로 유도
2) throws - 호출한 쪽(부모)에게 예외 처리 위임하도록
3) throw - 명확한 의미의 예외로 바로 처리 ==> 개발자들이 비즈니스 로직에서 처리하는 방식임!
db연결 시, xml과 jsp에서 컬럼명이 통일되는지 확인 필요
왜 select은 대문자고 그 외는 소문자일까??
상세보기 페이지에서 게시글은 1건, 댓글은 0, 1, n건이 될 수 있다.
따라서 게시글은 Map으로 처리하여 dmap으로 한 뒤 list의 0번 방으로 넣는다.
댓글들은 각 댓글을 Map으로 처리하여 댓글들을 묶어 List로 처리하여 commentList로 한 뒤 comments라는 변수명으로 list의 1번방으로 넣는다.
그렇게 되었을 때 상세보기 페이지 list의 구성은 아래와 같다.
[
{dmap-게시글},
{comments:[{댓글1},{댓글2},{댓글3}]}
]
<%
int size = 0;//지변이니까 초기화를 생략하면 에러발생함.
int size2 = 0;//지변이니까 초기화를 생략하면 에러발생함.
List<Map<String, Object>> bList = (List)request.getAttribute("bList");
List<Map<String, Object>> commentList = null;
Map<String,Object> rmap = new HashMap<>();
if(bList != null){
size = bList.size(); //size 변수 담기
rmap = bList.get(0); //상세보기 내용
//댓글이 없을 때 처리도 해주자!!!!
if(bList.size()==2){
//코멘트 가져오기!!
Map<String, Object> comments = (Map)bList.get(1);
if(comments.containsKey("comments")) {
List<Map<String, Object>> comList = (List)comments.get("comments");
commentList = (List)comments.get("comments");
size2 = comList.size();
}
}
}
%>
<input type="text" class="form-control" value="<%=rmap.get("B_TITLE") %>">
<input type="text" class="form-control" value="${bList[0]["B_TITLE"]}">