안드로이드&IOS 앱 개발자 양성

안드로이드&iOS 앱 개발자 양성(51일차) - 예외 처리, EL(Expression Language - 표현식), jsp 태그, JSTL

HRuler 2020. 6. 18. 18:37
더보기

 ** 예외 처리
1. 웹 프로젝트에서는 예외 처리하지 않으면 WAS(Web Application Server - Tomcat)가 예외 처리를 해서 내용을 출력한다.
2. test.jsp 파일을 만들고 접속
3. page 별 에러 페이지 지정
4. 에러 페이지를 설정해서 출력하기
5. 에러 페이지 만들 때 유의사항
6. 에러 코드별 에러 페이지 설정
7. 발생한 예외 별 에러 페이지 설정

 ** EL(Expression Language - 표현식)
1. Model1과 Model2
2. EL의 기본 형식
3. Attribute 출력
4. 내장 객체
5. 파라미터(웹 클라이언트가 웹 서버에게 넘겨주는 데이터) 출력
6. Cookie 출력
7. initParam 출력
8. pageContext 출력
9. 연산자
10. HTML이나 XML에서의 특수한 문자 표현
11. EL에서 배열과 List 그리고 Map과 DTO의 접근
12. EL에서 중요한 것
13. Attribute 출력 실습

 ** jsp 태그
1. jsp 액션 태그
2. custom tag

 ** JSTL
1. java에서 외부 라이브러리를 포함시키는 방법
2. jar 파일을 다운로드 받는 방법
3. JSTL의 기능
4. 사용방법
5. 많이 이용하는 core 기능 3가지

※ 예외 처리

1. 웹 프로젝트에서는 예외 처리하지 않으면 WAS(Web Application Server - Tomcat)가 예외처리를 해서 내용을 출력한다.

 - jsp나 servlet에서 예외처리를 하지 않으면 WAS가 가진 예외 처리 결과 페이지가 화면에 출력된다.

 - jsp 페이지의 경우는 Servlet으로 변환될 때 예외처리 코드를 자동으로 삽입하기 때문에 예외처리를 반드시 해야 하는 코드의 경우도 예외처리를 하지 않아도 된다.

 - 사용자는 WAS의 예외 페이지를 볼 필요가 없는데 사용자가 알아볼 수도 없고 알아볼 이유도 없기 때문이다.

 - 서비스를 만들 때는 별도의 예외 처리 페이지를 만들어서 사용자에게 제공해야 한다.

<%@ 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()를 호출해서 예외가 발생한다.

2. test.jsp 파일을 만들고 접속

3. page 별 에러 페이지 지정

 - jsp 페이지에서 에러가 발생했을 때 보일 페이지 지정

 - <%@ page errorPage="에러페이지 경로" %>

 - 에러 메시지 출력을 위한 페이지 작성

 - 상단에 <%@ page isErrorPage="true" %>로 설정하면 exception 객체를 사용할 수 있다.

4. 에러 페이지를 설정해서 출력하기

1) 에러가 발생한 경우 보여질 페이지 설정

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!-- 에러가 발생한 경우 보여질 페이지 설정 -->
<%@ page errorPage = "/error/viewerrormessage.jsp" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>에외 처리</title>
</head>
<body>
	name : <%=request.getParameter("name").toUpperCase() %>
</body>
</html>

2) WebContent 디렉토리에 error 디렉토리를 만들고 errorviewmessage.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(Edge)에서는 이 문제가 발생하지 않는다.

6. 에러 코드별 에러 페이지 설정

1) web.xml 파일에 작성

<error-page>

             <error-code>에러코드</error-code>

             <location>에러 페이지 경로</location>

</error-page>

2) 에러 코드

 - 100번대 : 요청을 한 바로 직후

 - 200번대 : 정상 응답

 - 300번대 : redirect 중

 - 400번대 : client 오류

 - 401 : 권한이 부족 - Open API 사용 중 없는 Key를 사용한 경우

 - 404 : 요청한 URL을 처리할 수 없음 - 잘못된 URL

 - 500번대 : 서버 오류

 - 503 : 서버 과부하

3) 404 에러는 별도의 페이지를 만들어서 처리하는 경우가 많다

4) web.xml 파일에 404 에러에 대한 에러 페이지를 설정

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>javawep0618</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <!-- 404 에러가 발생한 경우 보여질 페이지를 설정 web.xml 파일에서 /로 시작하면 WebContent에서부터의 경로 -->
  <error-page>
  	<error-code>404</error-code>
  	<location>/error/error404.jsp</location>
  </error-page>
</web-app>

5) error 디렉토리에 error404.jsp 파일 작성

6) 서버를 다시 구동시키고 없는 URL을 입력해서 확인

7. 발생한 예외 별 에러 페이지 설정

1) web.xml 파일에 설정

<error-page>

          <exception>예외 클래스</exception>

          <location>예외 페이지 경로</location>

</error-page>

2) 예외 클래스에 해당하는 예외가 발생했을 때 location에 설정한 페이지가 출력

※ 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 value)을 호출하면 된다.

 - request에 저장한 경우는 forwarding 했을 때만 전송한다.

 - session은 어떤 방법으로 이동해도 전송된다.

 - application은 모든 클라이언트가 공유한다.

1) 단순 출력

${attribute 이름}

 - page -> request -> session -> application 순으로 찾아서 출력

2) 특정 객체에 속한 attribute를 출력

 - pageScope, requestScope, sessionScope, applicationScope.속성명 으로 출력한다.

ex) EL을 이용한 덧셈 페이지 구현

4. 내장 객체

 - param : 파라미터

 - paramValues : 파라미터

 - header : 헤더

 - headerValue : 헤더

 - cookie : 쿠키

 - initParam : 초기화 파라미터 - web.xml에 설정

5. 파라미터(웹 클라이언트가 웹 서버에게 넘겨주는 데이터) 출력

${param.파라미터이름} 또는 ${param["파라미터이름"]}

${paramValues.파라미터이름[인덱스]} 또는 ${paramValues["파라미터이름"][인덱스]}

 - 이 기능을 사용하는 경우는 서버에서 유효성 검사를 하고 그 데이터를 클라이언트에게 출력하고자 할 때 이용한다.

6. Cookie 출력

 - Cookie : 클라이언트의 정보를 웨 브라우저에 파일 형태로 저장하고 서버에게 전송하는 객체이다.

${cookie.쿠키이름} 또는 ${cookie["쿠키이름"]}

7. initParam 출력

 - InitParam(초기화 파라미터) : web.xml에 등록을 해두고 사용하는 것이다.

 - 애플리케이션이 구동 중에는 변하지 않고 다시 배포할 때 변경가능성이 있는 데이터를 사용할 때 이용한다.

8. pageContext 출력

 - pageContext 객체의 요소를 출력

 - 현재 프로젝트 경로를 출력 : ${pageContext.request.contextPath}

 - 웹 앱을 만들다 보면 경로를 서로 다른 디렉토리에서 요청하는 경우가 있는데 그렇게 되면 상대경로를 이용하면 동일한 경로를 요청하는데 다른 방싱으로 설정해야 한다.

 - 웹 앱에서 프로젝트 내의 경로를 절대경로를 사용하고자 하는 경우에는 ${pageContext.request.contextPath}부터 시작하면 된다.

 - 웹 앱 프로젝트 내에서 프로젝트 이름을 출력하는 것은 사용하지 않는 것이 좋다.

 - 웹 앱은 프로젝트 이름으로 접근하는 것이 아니고 매핑된 domain name을 가지고 접근하기 때문에 배포할 때 변경될 가능성이 높기 때문이다.

 - ${pageContext.request.requestURI} : 전체 요청 경로

 - 단순 웹 페이지가 아닌 Back End 기반의 웹 애플리케이션을 만들 때는 상대경로를 이용하는 것 보다는 절대경로를 사용하는 것이 좋다.

9. 연산자

 - EL에서는 연산자 기호 대신에 명령어로 대신할 수 있다.

 - 태그와 혼란을 가져올 수 있는 연산자는 기호를 사용하지 않고 명령어를 사용하는 것이 혼란을 피할 수 있기 때문이다.

 - > : 태그를 닫을 때 사용하는 기호

 - 크다를 표현하고자 할 때는 gt로 입력해도 된다.

10. HTML이나 XML에서의 특수한 문자 표현

& : &amp;

> : &gt;

< : &lt;

공백 : &nbsp;

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) attributedisplay.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);

 - 변수명.forward(request객체, response객체);

 - 프로그래밍 언어에서는 태그를 만들지 않고 @로 시작하는 annotation을 만들어서 사용한다. 언어마다 부르는 이름은 다르지만 기호는 동일하다.

 - annotation이나 jsp 태그를 이용하면 구현은 쉬워지지만 정확하게 알지 못하면 프로그램이 어떤 식으로 구현되는지 알 수 없다.

2. custom tag

 - Java를 만든 곳에서 생성한 것이 아니고 다른 개발자나 단체에서 생성한 태그

 - 가장 유명한 custom tag가 apche 재단에서 만든 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  에서 검색해서 다운로드 하거나 의존성을 조회

 

Maven Repository: Search/Browse/Explore

XS2A Core Last Release on Jun 17, 2020

mvnrepository.com

3. JSTL의 기능

 - 보통은 core 기능 정도만 사용

 - 최근에는 Web에서도 ajax를 이용해서 데이터 출력을 많이 하기 때문에 그런 경우에는 EL이나 JSTL이 그다지 중요하지 않다.

 - 이 경우에는 javascript를 잘 사용할 수 있어야 한다.

1) core : 변수 생성이나 제어문 사용을 위한 라이브러리

2) 포맷팅 : 날짜나 숫자의 포맷이나 국제화를 위한 라이브러리

3) 데이터베이스 : 데이터베이스 연동을 위한 라이브러리

4) XML : xml 처리를 위한 라이브러리

5) 함수 : 문자열 관련 함수 라이브러리

4. 사용방법

 - JSTL을 사용할 때는 태그 라이브러리 설정부터 해야 한다.

<%@ taglib prefix="접두어" uri="http://java.sun.com/jsp/jstl/기능" %>

- 사용할 때는 접두어를 붙어서 사용한다.

<접두어:명령어/> 형식으로 사용

5. 많이 이용하는 core 기능 3가지

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core %>

1) 변수 생성

 - <접두어:set var="변수명" value="값"/>

2) 분기문 생성

- 조건에 맞는 경우만 수행하고자 하는 경우

<c:if test = "${조건}">

</c:if>

 - core 기능 분기문에는 else가 없다.

- 여러가지 조건을 비교해야 하는 경우

<c:choose>

             <c:when test="${조건1}>

                       조건1이 true일 때 수행할 내용

             </c:when>

             <c:when test="${조건2}>

                       조건2가 true일 때 수행할 내용

             </c:when>

             ...

             <c:otherwise>

                       앞의 모든 조건을 만족하지 않은 경우 수행할 내용

             </c:otherwise>

</c:choose>

3) 반복문 생성

 - 횟수를 가지고 반복을 하는 경우

<c:forEach begin="시작값" end="종료값" var="변수명" step = "간격">

        ${반복할 내용}

</c:forEach>

 - 반드시 종료값이 시작값보다 크거나 같아야 한다.

 - step은 생략하면 1

 - 1 - 10까지 출력

<c:forEach begin="1" end="10" var="num" step="1">

          ${num}

</c:forEach>

 - 10 - 1까지 출력

<c:forEach begin="1" end="10" var="num" step="1">

          ${11-num}

</c:forEach>