**예외처리
1. 웹 프로젝트에서는 예외처리를 하지 않으면 WAS(Web Application Service - Tomcat)가 예외처리하여 내용을 출력
=> jsp나 servlet에서 예외처리를 하지 않으면 WAS가 가진 예외처리 결과 페이지가 화면에 출력
=> jsp 페이지의 경우 Servlet으로 변환될때 예외처리 코드를 자동으로 삽입하기 때문에 예외처리를 하지 않아도 됨
(예외처리를 반드시 해야하는 코드의 경우도 포함)
=> 사용자는 WAS의 예외 페이지를 볼 필요가 없는데 사용자가 알아볼수도 없고, 이유도 없기 때문
=> 서비스를 만들 때는 별도의 예외처리 페이지를 만들어서 사용자에게 제공 해야 함
2. test.jsp 파일을 만들고 일부러 오류가 발생하게 작성하여 실행
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>예외처리</title>
</head>
<body>
name :
<%=request.getParameter("name").toUpperCase() %>
</body>
</html>
=> name이라는 파라미터가 없기 때문에 null이 리턴되고, null이 toUpperCase()를 호출하여 예외가 발생
3. page별 에러 페이지 지정
=> jsp 페이지에서 에러가 발생했을 때 보여질 페이지 지정
- <%@ page errorPage="에러페이지 경로"%>
=> 에러 메시지 출력을 위한 페이지 작성
- 상단에 <%@ page isErrorPage="true"%>로 설정하면 exception 객체를 사용할 수 있음
4. 에러페이지를 설정하여 출력하기
1) text.jsp 수정
<!-- 에러가 발생한 경우 보여질 페이지 설정 -->
<%@ page errorPage="/error/viewerrormessage.jsp" %>
2) WebContent 디렉토리에 error디렉토리를 만들고, viewerrormessage.jsp 파일 생성
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!-- exception 객체를 사용할 수 있도록 설정 -->
<%@ page isErrorPage="true" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>예외발생</title>
</head>
<body>
에러메시지: <%=exception.getMessage() %><br/>
</body>
</html>
5. 에러 페이지 만들 때 유의사항
=> 구버전 IE에서는 에러페이지의 내용이 513바이트 미만이면 자체 에러페이지를 출력
=> 에러페이지에는 내용이 적은 경우 주석을 많이 추가하여 513바이트 이상이 되도록 함
=> 최근의 IE에서는 이 문제가 발생하지 않음
6. 에러 코드별 에러페이지 설정
1) web.xml 파일에 작성
<error-page>
<error-code>에러코드</error-code>
<location>에러페이지 경로</location>
</error-page>
2) 에러코드
=> 100번대 : 요청을 한 바로 직후
=> 200번대 : 정상 응답
=> 300번대 : 리다이렉트 중
=> 400번대 : Client오류
- 401 : 권한이 부족 - OpenAPI 사용중 없는 key를 사용하는 경우
- 404 : 요청한 URL을 처리 할 수없음 (잘못된 URL)
=> 500번대 : 서버 오류
- 503번 : 서버 과부하(어쩔수 없음)
3) 404에러는 별도의 페이지를 만들어서 처리하는 경우가 많음
4) web.xml 파일에 404에러에 대한 에러 페이지를 설정
5) error 디렉토리에 error404.jsp 파일을 생성하고 작성
7. 발생한 예외별 에러페이지 설정
1) web.xml 파일에 설정
<error-page>
<exception>예외클래스</exception>
<location>에러페이지 경로</location>
</error-page>
**EL(Expression Language - 표현식)
=> Java가 넘겨준 데이터를 Java코드를 사용하지 않고 출력하기 위한 표현식
1. Model1과 Model2
=> Model1은 처리와 출력은 전부 jsp 파일에서 수행하는 방식
- 단순하기 때문에 구현이 쉽지만 대규모 시스템의 경우는 유지보수가 어려워짐
=> Model2는 처리는 Servlet과 Java클래스들이 담당하고 jsp는 출력만 담당하도록 하는 방식
- 복잡하기 때문에 구현이 어렵지만 대규모 시스템의 경우 유지보수는 Model1보다 편리
=> Model2에서는 jsp파일 내에 자바코드를 사용하지 않는 것을 권장
- 데이터를 출력하거나 제어문과 같은 것들을 사용할 수 없게 되는데 이 문제를 해결하고자 등장한 것인 EL, JSTL
2. EL의 기본 형식
=> ${표현식} : 표현식의 결과를 HTML로 변환해서 출력
=> 표현식의 결과가 null인 경우 출력하지 않음
=> 표현식에는 변수가 와도 되지만 연산식이나 메소드 호출도 가능
3. Attribute 출력
=> attribute : 서버에서 처리한 결과를 클라이언트에게 전달하기 위한 데이터
=> 생성 방법
- page, request, session, application 객체를 이용하여 setAttribute(String name, Object values)를 호출하면 됨
- request에 저장한 경우는 forwarding 했을 때만 전송
- session은 어떤 방법으로 이동해도 전송
- application은 모든 클라이언트가 공유
1) 단순 출력(${attribute 이름})
=> page -> request -> session -> application 순으로 찾아서 출력
2) 특정 객체에 속한 attribute를 출력
=> pageScope, requestScope, sessionScope, applicationScope.속성명 으로 출력
4. 내장객체
=> param : 파라미터
=> paramValues : 파라미터
=> header : 헤더
=> headerValue : 헤더
=> cookie : 쿠기
=> initParam : 초기화 파라미터 - web.xml에 설정
5. 파라미터(웹 클라이언트가 웹서버에게 넘겨주는 데이터) 출력
=> ${param.파라미터이름} 또는 ${param["파라미터 이름"]};
=> ${paramValues.파라미터이름[인덱스]} 또는 ${param["파라미터 이름"][인덱스]};
=> 이 기능을 사용하는 경우는 서버에서 유효성검사를 하고 그 데이터를 클라이언트에 출력하고자 할 때 사용
6. Cookie 출력
=> cookie : 클라이언트의 정보를 웹 브라우저에 파일형태로 저장하고 서버에게 전송하는 객체
=> ${cookie.쿠키 이름} 또는 ${cookie["쿠키 이름"]};
7. initParam 출력
=> initParam(초기화 파라미터) : web.xml에 등록해두고 사용하는 것
=> 애플리케이션이 구동중에는 변하지 않고, 재배포시 변경가능성이 있는 데이터 사용시 이용
8. pageContext 출력
=> pageContext 객체의 요소를 출력
=> 현재 프로젝트 경로를 출력 : ${pageContext.request.contextPath}
- 웹앱 제작시 특정 경로를 서로 다른 디렉토리에서 요청하는 경우가 있음.
- 위의 경우 상대경로 이용시 동일경로를 요청하는데도 다른 방식으로 설정을 해야 함
- 웹 앱에서 프로젝트 내의 경로를 절대경로를 사용할 경우에는 ${pageContext.request.contextPath}부터 시작
=> 웹 앱 프로젝트 내에서 프로젝트명을 출력하는 것은 사용하지 않는 것을 권장
- 웹 앱은 프로젝트명으로 접근하지 않고 매핑된 domain name을 가지고 접근하기에 배포시 변경 가능성이 높음
=> ${pageContext.request.requestURL} : 전체 요청 경로
=> 단순 웹 페이지가 아닌 BackEnd 기반의 웹 앱을 만들경우, 상대경로보다는 절대 경로를 사용하는 것이 좋음
9. 연산자
=> EL에서는 연산자 기호 대신에 명령어로 대신할 수 있음
=> 태그와 혼란을 가져올 수 있는 연산자는 기호를 사용하지 않고 명령어를 사용하는 것이 혼란을 피할 수 있음
=> ex) > : 태그를 닫을 때 사용 + 크기표현시 사용 -> 크기 표현시 gt로 입력해도 됨
10. HTML이나 XML 에서의 특수한 문자표현
- & : &
- > : >
- < : <
- 공백 :
11. EL에서 배열과 List 그리고 Map과 DTO의 접근
=> Java에서는 배열은 [인덱스]로 접근하고, List는 get(인덱스)로 접근
- EL에서는 배열과 List 모두 [인덱스]로 접근
=> Java에서는 Map의 데이터를 접근 할 때는 get(key)를 사용하고, DTO는 get이름()을 이용해야 함
- EL에서는 Map과 DTO모두 .key나 변수명을 이용하여 접근
12. EL에서 중요한 것
1) attribute 출력
2) ContextPath를 출력
13. Attribute 출력 실습
1) attributecreate.jsp 파일을 만들어서 데이터를 생성한 후 출력하는 곳으로 포워딩
2) attributedixplay.jsp 파일을 만들어서 생성된 데이터를 출력
3) attributecreate.jsp 파일을 호출해서 결과가 제대로 출력되는 지 확인
**jsp 태그
=> jsp에서 별도의 태그를 만든 이유는 Java Web Programming에서 자주 사용하는 기능을 Java코드를 이용하지 않
고 태그를 이용해서 구현하기 위해 생성
1. jsp 액션 태그
=> jsp: 으로 시작
=> Java EE에서 제공
=> 전자정부 프레임워크(공공기관 애플리케이션 구현을 위한 Java기반의 IDE - Eclipse Plugin)에서 첫 페이지의 태그
- <jsp:forward page="포워딩할 URL"/>
- 위 태그는 Java 코드로 변경하면 아래와 같음
- RequestDispatcher 변수명 = request객체.getRequestDispatcher(String 포워딩할 URL);
변수명.foward(request객체, response객체);
=> 프로그래밍 언어에서는 태그를 만들지 않고 @로 시작하는 annotation을 만들어서 사용
(언어마다 이름은 달라도 기호는 같음)
- annotation이나 jsp태그를 이용시 구현은 쉬워지나 정확히 알지 못하면 프로그램의 구현원리는 알수 없음
2. custom tag
=> Java를 만든곳에서 생성한 것이 아니고, 다른 개발자나 단체에서 생성한 태그
=> 가장 유명한 custom 태그가 apache 재단에서 만든 JSTL
**JSTL
=> Apache 재단에서 만든 태그 라이브러리
=> JSTL을 사용하려면 JSTL 라이브러리가 포함된 jar 파일을 프로젝트에 추가
1. Java에서 외부 라이브러리를 포함시키는 방법
1) Java Application의 경우 : jar 파일을 Build Path에 추가해야 함
2) Dynamic Web Project의 경우 : jar 파일ㅇ르 WebContent/WEB-INF-lib 디렉토리에 복사
3) Maven 기반의 Project의 경우 : pom.xml 파일에 필요한 라이브러리를 기재
4) Gradle 기반의 Project(Android)의 경우 : gradle.json 파일에 필요한 라이브러리를 기재
2. jar 파일을 다운로드 받는 방법
1) 라이브러리를 만든 곳에서 직접 다운로드
2) www.mvnrepository.com에서 검색해서 다운로드하거나 의존성 조회
3. JSTL의 기능
1) core : 변수 생성이나 제어문 사용을 위한 라이브러리
2) 포맷팅 : 날짜나 숫자의 포맷이나 국제화를 위한 라이브러리
3) 데이터베이스 : 데이터베이스 연동을 위한 라이브러리
4) XML : xml처리를 위한 라이브러리
5) 함수 : 문자열 관련 함수 라이브러리
=> 보통은 core 기능 정도만 사용
=> 최근에는 Web에서도 ajax를 이용하여 데이터 출력하는 경우가 많아 그 경우 EL, JSTL이 그다지 중요하지 않음
- 이 경우 javascript를 잘 사용할 수 있어야 함(중소, 스타트업)
4. 사용방법
=> JSTL을 사용할 때는 태그 라이블러리 설정부터 해야 함
- <%@ tahlib prefix="접두어" url="http://java.sun.com/jsp/jstl/기능" %>
- <접두어:명령어 /> 형식으로 사용
5. 많이 이용하는 core 기능 3가지
=> <% taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 설정을 하고 사용
1) 변수 생성
=> <c:set var="변수명" value="값"/>
- 값의 자리에 "${표현식}"의 형태로 EL사용가능
=> 위처럼 생성시 page객체 attribute로 생성.
- scope="request | session | application"속성 추가시 원하는 객체에 생성가능
=> <c:remove var="변수명" />
- 변수를 삭제하는 것이고, scope 속성을 추가하는 것도 가능
2) 분기문
=> 여러가지 조건을 비교해야 하는 경우
=> 조건에 맞는 경우만 수행하고자 하는 경우
- <c:if test="${조건}">
</c:if>
=> else는 없음
<c:choose>
<c:when test="${조건1}">
조건1이 true일 때 수행할 내용
</c:when>
<c:when test="${조건2}">
조건2가 true일 때 수행할 내용
</c:when>
....
<c:otherwise>
앞의 모든 조건을 만족하지 않은 경우 수행할 내용
</c:otherwise>
</ch:choose>
3) 반복문
=> 횟수를 가지고 반복하는 경우
- <c:forEach begin="시작값" end="종료값" var="변수명" step="간격"> </c:forEach>
- 반드시 종료값이 시작값보다 크거나 같아야 함
- step은 생략하면 1
=> ex) 1~10까지 출력
<c:forEach begin="1" end="10" var="num" step="1">
${11-num}
</c:forEach>
=> 배열이나 List인 경우 데이터 순회
- <c:forEach var="변수명" item="${배열이나 list이름}"> </c:forEach>
=> 배열이나 List의 모든 내용을 변수에 순서대로 하나씩 대입하고 태그 안의 동작을 수행
Tip!
1. Date importing
- 시간까지 저장 - util
- 날짜만 저장 - sql
'수업 정리' 카테고리의 다른 글
53일차 수업정리(DB 연동 + 54일차 + 55일차) (0) | 2020.06.22 |
---|---|
52일차 수업 정리(HttpServlet, Model2 MVC 구조의 프로젝트 생성) (0) | 2020.06.19 |
50일차 수업 정리(요청과 결과 출력, Cookie, Session) (0) | 2020.06.17 |
49일차 수업정리(Request, Response 객체, web.xml) (0) | 2020.06.16 |
48일차 수업정리(HttpServlet, JSP) (0) | 2020.06.15 |