👩💻 자바 개발자 양성과정 30일차
- 에러페이지 코드별 설정하기
- EL로 기본객체 조작하기
- JSTL 주요 기능 예제
29일차 날아갔다 ㅠ_ㅠ
🎀 에러페이지 설정하기
두가지 방법이 있다.
1. 오류코드별로 다른 페이지 보여주기
2. 오류가 발생할 경우 공통적인 페이지 보여주기
1. 오류코드별로 다른 페이지 보여주기
web.xml에 코드별로 페이지를 설정해준다.
<%-- xml.jsp --%>
<error-page>
<error-code>404</error-code>
<location>/404error.jsp</location>
</error-page>
- 404오류 발생시 /404error.jsp페이지가 열리게 한다. (포워딩 방식)
2. 오류코드에 상관없이, 오류가 발생할 경우 공통적인 오류 페이지 보여주기
에러페이지에 isErrorPage="true" 로 설정하고, 오류 발생 페이지에 errorPage="에러페이지 경로"를 적어준다
오류발생 페이지
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page errorPage="/error.jsp"%>
<%
String name = null;
%>
<%=name.length()%>
오류페이지
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isErrorPage="true"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>요청하신 페이지가 존재하지 않습니다.</h1>
</body>
</html>
🎀 EL 내장 객체
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
//page영역에 uesremail이라는 속성이름으로 사용자 이메일 정보를 저장한다.
pageContext.setAttribute("userEmail", "java@naver.com");
//page영역에 저장된 이메일 정보를 구한다.
String userEmail = (String)pageContext.getAttribute("userEmail");
%>
<%-- 페이지 영역에 바인딩된 값은 아래와 같이 가져올수있다. --%>
<h3>${pageScope.userEmail}</h3>
pageScope
requestScope
sessionScope
applicationScope
param
paramValues
header
headerValues
cookie
initParam
pageContext
🎀 EL예제 - EL표현 방식
자바 빈(java bean) ?
생성자 메서드랑 getter setter 설정까지 해준 경우
package domain;
//자바 빈(bean) - 생성자 메서드랑 getter setter 설정까지 해준 경우
//데이터를 표현하는 클래스
public class MemberVo {
//property
private String name;
private int age;
public MemberVo(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="domain.MemberVo" %>
<%
//page영역에 member라는 속성이름으로 회원정보를 저장한다.
pageContext.setAttribute("member", new MemberVo("julla", 10));
//page영역에 저장된 이메일 정보를 구한다.
MemberVo member = (MemberVo)pageContext.getAttribute("member");
%>
<%-- 페이지 영역에 바인딩된 값은 아래와 같이 가져올수있다. --%>
<h3>el버전 : ${pageScope.member.name}</h3>
<h3>el버전 : ${pageScope.member.age}</h3>
-> memberVo에 getName이 없으면 오류가 발생한다.
즉, ${pageScope.member.name} = member.getName();
🎀 pageContext기본 객체에 ArraytList저장시, EL출력방식
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import ="domain.MemberVo, java.util.*" %>
<%
ArrayList<MemberVo> members = new ArrayList<MemberVo>();
members.add(new MemberVo("dd", 10));
members.add(new MemberVo("hh", 30));
members.add(new MemberVo("gg", 70));
pageContext.setAttribute("memberList", members);
%>
${pageScope.memberList[0].name}, ${pageScope.memberList[0].age} <br>
${pageScope.memberList[1].name}, ${pageScope.memberList[1].age} <br>
${pageScope.memberList[2].name}, ${pageScope.memberList[2].age}
🎀 pageContext기본 객체에 Map저장시, EL출력방식 2가지
- 꺽세를 사용하는 방법 : ${pageScope.memberList["java1"].name}
- .을 사용하는 방법 : ${pageScope.memberList.java1.name}
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import ="domain.MemberVo, java.util.*" %>
<%
Map<String, MemberVo> map = new HashMap<String, MemberVo>();
map.put("java1", new MemberVo("ju",10));
map.put("java2", new MemberVo("jfdf",14));
map.put("java3", new MemberVo("gds",66));
pageContext.setAttribute("memberList", map);
%>
방식 1<br>
${pageScope.memberList["java1"].name}<br>
${pageScope.memberList["java1"].age}<br><br>
방식 2<br>
${pageScope.memberList.java1.name}<br>
${pageScope.memberList.java1.age}<br>
🎀 request기본 객체에 저장한 값을 forwarding한 곳에서 EL방식으로 출력하기
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
//request영역에 member라는 속성이름으로 회원정보를 저장한다.
request.setAttribute("userEmail", "java@bave.om");
//viewRequestSet.jsp페이지로 이동한다.
RequestDispatcher dispatcher = request.getRequestDispatcher("/viewRequestSet.jsp");
dispatcher.forward(request, response);
%>
viewRequestSet.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
${requestScope.userEmail}
🎀 session기본 객체에 저장한 값을 redirect한 곳에서 EL방식으로 출력하기
<%@page import="domain.MemberVo"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page session="true"%>
<%
session.setAttribute("java1", new MemberVo("ju",10));
/* 리다이렉트 방식으로 이동한다 */
response.sendRedirect(request.getContextPath() + "/viewSessionScope.jsp");
%>
viewSessionScope.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
${sessionScope.java1.name}
🎀 application기본 객체에 저장한 값을 다른 곳에서 EL방식으로 출력하기
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page session="true"%>
<%
application.setAttribute("adminEmail", "admin@naver.com");
%>
위에 코드를 먼저 실행시켜 application에 저장하고
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
관리자이메일 : ${applicationScope.adminEmail}
위 코드를 실행시키면 application이 켜져있는 동안 값이 유지된다.
- redirect로 값이 유지가 되는건 session이랑 application이다.
- 웹에서 application이 켜졌다 꺼졌다 한다는건 "서버가 켜졌다 꺼졌다" 한다는 것이다.
🎀 파라미터를 통해 다른 곳에서 EL방식으로 출력하기
param_1.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form onsubmit="return false" id="form">
<label for="name">이름 :</label><input type="text" name="name" id="name"><br>
<label for="name">닉네임 :</label><input type="text" name="name" id="name"><br>
<label for="age">나이 :</label><input type="text" name="age" id="age"><br>
<button type="reset" id="resetBtn">취소</button>
<button id="submitBtn">로그인</button>
</form>
<script>
const form = document.getElementById("form");
const submitBtn = document.getElementById("submitBtn");
submitBtn.addEventListener("click", function () {
form.action = "${pageContext.request.contextPath}/param_2.jsp";
form.mothod = "POST";
form.submit();
})
</script>
</body>
</html>
param_2.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%--동일한 name의 파라미터 값이 있는 경우 "paramValues" 사용--%>
이름 : ${paramValues.name[0]}
닉네임 : ${paramValues.name[1]}
<%--유일한 name의 파라미터 값이 있는 경우 "param" 사용--%>
나이 : ${param.age}
🎀 Header 기본객체를 통해 EL방식으로 출력하기
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%-- 브라우저에 대한 정보 출력 --%>
user-agent : ${header["User-Agent"]}
${header["User-Agent"]}
🎀 cookie 기본객체를 통해 EL방식으로 출력하기
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
Cookie cookie = new Cookie("userEmail", "java@gmail.com");
cookie.setMaxAge(60*60*24);
response.addCookie(cookie);
%>
쿠키 저장!
위에 코드를 먼저 실행시켜 cookie를 생성하고
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
사용자 이메일 (cookie) : ${cookie.userEmail.value}
사용자 이메일 (cookie) : ${cookie.userEmail.name}
${cookie.userEmail.value}
🎀 web.xml에 설정한 포기화 파라미터를 initParam기본객체를 통해 EL방식으로 출력하기
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
id="WebApp_ID" version="4.0">
<display-name>jspWebApp</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>
<context-param>
<param-name>adminEmail</param-name>
<param-value>admin@naver.com</param-value>
</context-param>
</web-app>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
컨텍스트 초기화 파라미터 관리자 이메일 : ${initParam.adminEmail}
${initParam.adminEmail}
🎀 EL에서 제공하는 연산자 - empty, not empty
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import ="domain.MemberVo, java.util.*" %>
<%
ArrayList<MemberVo> members = new ArrayList<MemberVo>();
members.add(new MemberVo("dd", 10));
members.add(new MemberVo("hh", 30));
members.add(new MemberVo("gg", 70));
pageContext.setAttribute("memberList", members);
%>
<%-- el에서 제공하는 연산자 중에 하나 --%>
${empty pageScope.memberList}<br>
${not empty pageScope.memberList}<br>
${1+5}
empty - 값이 존재하는지 확인한다. 존재하면 true
not empty - 값이 존재하지 않는지 확인한다. 존재하지 않으면 true
🎀 JSTL을 이용해서 page기본객체 사용하기
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
//page영역에 uesremail이라는 속성이름으로 사용자 이메일 정보를 저장한다.
//pageContext.setAttribute("userEmail", "java@naver.com");
%>
<%-- page영역에 "userEmail"이라는 속성이름으로 사용자 이메일 정보를 저장한다. --%>
var - 변수이름
value - 값
<c:set var="userEmail" value="java@naver.com" scope="page"/>
<%-- 페이지 영역에 바인딩된 값은 아래와 같이 가져올수있다. --%>
<h3>${pageScope.userEmail}</h3>
pageContext.setAttribute("userEmail", "java@naver.com");
<c:set var="userEmail" value="java@naver.com" scope="page"/>
두개의 코드가 동일한 작동을 한다.
🎀 JSTL을 사용하기 위해서 라이브러리 설치
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
🎀 JSTL을 이용해서 SESSION기본객체 사용하기
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%-- session영역에 "userId"이라는 속성이름으로 사용자 이메일 정보를 저장한다. --%>
<c:set var="userId" value="java@naver.com" scope="session"/>
<%-- 페이지 영역에 바인딩된 값은 아래와 같이 가져올수있다. --%>
<h3>${sessionScope.userId}</h3>
🎀 JSTL을 이용해서 Request기본객체 사용하기
<%@page import="domain.MemberVo"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
MemberVo member = new MemberVo("julla", 10);
%>
<%-- request영역에 "member"이라는 속성이름으로 사용자 정보를 저장한다. --%>
var - 영역에 바인딩된 속성이름
<c:set var="m" value="<%=member %>" scope="request"/>
<%-- 페이지 영역에 바인딩된 값은 아래와 같이 가져올수있다. --%>
<h3>${requestScope.m.name}</h3>
<h3>${requestScope.m.age}</h3>
🎀 JSTL을 이용해서 IF문 작성하기
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import ="domain.MemberVo, java.util.*" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
ArrayList<MemberVo> members = new ArrayList<MemberVo>();
/* members.add(new MemberVo("dd", 10));
members.add(new MemberVo("hh", 30));
members.add(new MemberVo("gg", 70)); */
%>
<c:set var="memberList" value="<%=members %>" scope="page"></c:set>
<c:if test="${not empty pageScope.memberList}">
${pageScope.memberList[0].name}, ${pageScope.memberList[0].age} <br>
${pageScope.memberList[1].name}, ${pageScope.memberList[1].age} <br>
${pageScope.memberList[2].name}, ${pageScope.memberList[2].age} <br>
</c:if>
<c:if test="${empty pageScope.memberList}">
회원정보가 없습니다.
</c:if>
<c:if test="${not empty pageScope.memberList(조건)}">
조건이 참인 경우 실행할 코드
</c:if>
🎀 JSTL을 이용해서 Case문 작성하기
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import ="domain.MemberVo, java.util.*" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="season" value="fail" scope="page"></c:set>
<c:choose>
<c:when test="${pageScope.season == 'spring'} }">봄</c:when>
<c:when test="${pageScope.season == 'summer'} }">여름</c:when>
<c:when test="${pageScope.season == 'summer'} }">가을</c:when>
<c:when test="${pageScope.season == 'summer'} }">겨울</c:when>
<c:otherwise>계절을 정확히 작성하세요</c:otherwise>
</c:choose>
🎀 JSTL을 이용해서 ForEach문 작성하기/ForEach Index 값 받기
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import ="domain.MemberVo, java.util.*" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
ArrayList<MemberVo> members = new ArrayList<MemberVo>();
members.add(new MemberVo("dd", 10));
members.add(new MemberVo("hh", 30));
members.add(new MemberVo("gg", 70));
%>
<c:set var="memberList" value="<%=members %>" scope="page"></c:set>
<c:if test="${not empty pageScope.memberList}">
<c:forEach var="member" items="${pageScope.memberList}" varStatus="loop">
${loop.count} : ${loop.index} : ${member.name}, ${member.age}<br>
</c:forEach>
</c:if>
🎀 JSTL을 이용해서 Url작성하기
- 파라미터 전송에 가독성이 좋다
- 주소 작성시 컨텍스 패스를 작성할 필요가 없어서 편리하다
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import ="domain.MemberVo, java.util.*" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%-- value를 보면 슬레이시로만 시작하는데, 이는 컨텍스 패스값을 포함하기 때문에 편리하다. --%>
<c:url var="url" value="/url.jsp" scope="page">
<c:param name="email" value="java@gmail.com"></c:param>
<c:param name="age" value="10"></c:param>
</c:url>
<a href="${pageScope.url}">이동</a>
url.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import ="domain.MemberVo, java.util.*" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
${param.email} / ${param.age}
</body>
</html>
🎀 JSTL을 이용해서 디폴트 값을 설정한다.
- value에 들어있는 값을 출력한다. 만약 값이 없는 경우 디폴트 값을 설정할수 있다.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import ="domain.MemberVo, java.util.*" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
value에 들어있는 값을 출력한다. 만약 값이 없는 경우 디폴트 값을 설정할수 있다.
<c:set var="email" value="thwls@navr.cpm" scope="page"></c:set>
<c:out value="${pageScope.email}" default="no"></c:out>
<c:out value="${sessionScope.email}" default="no"></c:out>
🎀 JSTL을 이용해서 Redirect하기 -sendredirect와 같은 기능
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import ="domain.MemberVo, java.util.*" %>
<%@ page session="true" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%-- sendredirect와 같은 기능 --%>
<c:redirect url="/redirect.jsp" >
<c:param name="email" value="thwls@naver.com"/>
</c:redirect>
/redirect.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import ="domain.MemberVo, java.util.*" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
이메일 : ${param.email}
🎀 JSTL 내장 function
jstl내장 function을 사용하기 위해선 관련 라이브러리를 설정해줘야한다.
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
🎀 JSTL 내장 function - 데이터 갯수 카운팅하기 (fn:length)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import ="domain.MemberVo, java.util.*" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%
ArrayList<MemberVo> members = new ArrayList<MemberVo>();
members.add(new MemberVo("dd333322", 10));
members.add(new MemberVo("hh", 30));
members.add(new MemberVo("gg", 70));
%>
<c:set var="memberList" value="<%=members %>" scope="page"></c:set>
${fn:length(pageScope.memberList)}