728x90
예외 처리
- 예외 상황이 발생했을 경우 웹 컨테이너에서 제공되는 기본적인 예외페이지가 보여짐
- 개발 과정에서는 문제없지만 배포시에는 따로 만들어 둔 에러 페이지로 유도하여 사용자에게 친숙한 페이지를 보여줌
HTTP 응답 상태 코드
404: 요청한 URL을 찾을 수 없음 = 경로를 잘 못 적음
500 번대: 서버측 내부 오류 (java, JSP 페이지 내의 오류 코드)
- 200: 요청을 성공적으로 처리
- 307: 임시로 페이지를 리다이렉트
- 400 번대: 클라이언트의 요청 잘못, 통신하는 사람의 잘못
- 405: 요청 방식(get, post)을 허용하지 않음
- 503: 서버가 일시적으로 서비스를 제공할 수 없음 (일시적 서버과부하, 서버 임시 보수 등)
예외 처리 방법
1. 직접 예외 처리
- 깔끔하지 않음
- try ~ catch 사용하여 직접 예외 처리
2. 페이지 따로 지정
- JSP에서는 개발자가 지정한 JSP 페이지를 보여줄 수 있는 기능 제공
- 필요시 설명 추가
3. 응답 상태 코드별로 에러 페이지 지정
- 에러가 발생하면 에러 페이지로 넘김
- 개발 과정에서 지정되면 에러 발생시 알 수 없기 때문에 과정의 마지막에 해야 함
- 에러 코드별로 사용할 페이지를 web.xml 파일 수정(아래 코드)을 통해 지정
- 이렇게 지정한 에러페이지는 일반 jsp파일과 동일하게 작성하면 됨
<!-- 에러 처리 -->
<!-- errorpage/안의 error_view.jsp 파일을 보여줘라 -->
<error-page>
<error-code>404</error-code>
<location>/errorpage/error_view.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/errorpage/error_view.jsp</location>
</error-page>
<error-page>
<exception-type>java.lang.NullPointerException</exception-type>
<location>/errorpage/error_view.jsp</location>
</error-page>
<%@ 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>
<style>
.box {
height: 100vh;
display: flex;
align-items: center;
justify-content: center;
}
</style>
</head>
<body>
<div class="box">
<div>
요청한 페이지를 찾을 수 없어요 <img alt="오류" src="/JSPBasic/HTML/1.png"
width="100px">
</div>
</div>
</body>
</html>
forward
- Action Tag의 한 종류
- 현재 페이지에서 다른 특정 페이지로 전환할 때 사용
forward
- 요청받은 요청객체(request)를 위임하는 컴포넌트에 요청 객체값을 동일하게 전달
- 요청을 처리함과 동시에 해당 결과를 바로 보여줘야 하는 경우
- 게시판 목록에서 글 제목 클릭 - 바로 내용 보여주는 경우
RequestDispatcher 사용 - JAVA Bean 예제 확인
- 클라이언트로부터 최초로 들어온 요청을 Servlet내에서 원하는 자원으로 요청을 넘기는 역할을 수행하는 클래스
- a로 들어온 요청을 a내에서 b로 요청을 보낼 수 있거나
a에서 b로 처리를 요청하고, b에서 처리한 결과 내용을 a의 결과에 포함시킬 수 있음??
- request.getRequestDispatcher("~.jsp").forward(request, response);
- request.getRequestDispatcher("~.jsp").include();
sendRedirect
- 요청받은 요청객체(request)를 위임하는 컴포넌트에 요청 객체값을 동일하게 전달X
새로운 요청객체 생성 - 요청을 처리한 다음 새로운 요청으로 작업을 해야 할 경우
- 게시판 글 쓰기 완료 - (해당 글의 내용x) 글 목록 보여주는 경우
1. forward 예제
<%@ 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>
<form action="forward_ex02.jsp" method="port">
아이디:<input type="text" name="id"><br> 비밀번호:<input
type="password" name="pw"><br> <input type="submit"
name="로그인">
</form>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
//forward 이동
//RequestDispatcher dp = request.getRequestDispatcher("forward_ex03.jsp");
//dp.forward(request, response); //리퀘스트, 리스폰스를 만나면 3번 페이지로 넘어감
//3번 페이지에서 사용할 필요한 데이터를 담는 방법 request에 값 저장(3번페이지로 한번만 나가면 됨)
//강제로 값 저장 - request.setArribute(키, 값);
request.setAttribute("data", "홍길동");
request.getRequestDispatcher("forward_ex03.jsp").forward(request, response);
%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
//forward로 넘어온 데이터
String id = request.getParameter("id");
String pw = request.getParameter("pw");
//request.setAttribute 강제로 저장한 값 불러온 데이터
String data = (String)request.getAttribute("data");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
ID:<%=id %><br> PW:<%=pw %><br> 2번째에서 넘긴값:<%=data %><br>
</body>
</html>
2. forward 활용 예제
<%@ 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>
<h3>과제</h3>
<%--
1. form태그를 이용해서 post형식으로 이름, 국어, 영어, 수학점수을 받습니다.
2. 2번페이지 에서는 평균을 구합니다
3. 평균이 60이상이라면 성공페이지에 (평균점수를 출력하세요)
4. 평균이 60이하라면 실패페이지로 리다이렉트 시키세요
--%>
<form action="res_quiz01_result.jsp" method="post">
이름:<input type="text" name="name"><br> 국어:<input
type="number" name="kor"><br> 영어:<input type="number"
name="eng"><br> 수학:<input type="number" name="math"><br>
<input type="submit" value="확인"><br>
</form>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
request.setCharacterEncoding("utf-8");
double kornum = Double.parseDouble(request.getParameter("kor"));
double engnum = Double.parseDouble(request.getParameter("eng"));
double mathnum = Double.parseDouble(request.getParameter("math"));
double avg = (kornum + engnum + mathnum) / 3;
if(avg >= 60) {
//평균데이터를 넘긴다 (안넘기면 세번째 페이지에서 아무것도 없음)
request.setAttribute("result", avg);
//setAttribute로 실었으면 forward로 나가야 함
request.getRequestDispatcher("forward_quiz01_ok.jsp").forward(request, response);
} else {
response.sendRedirect("forward_quiz01_no.jsp");
};
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
//setAttribute로 보내서 getParameter가 아님(폼 값이 아니니까, 폼 값은 getParameter)
double result = (double)request.getAttribute("result");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
평균 점수:
<%=result %>
</body>
</html>
<%@ 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>
<h3>평균 연산 실패</h3>
</body>
</html>
3. redirect 예제
<%@ 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>
<form action="send_ex02.jsp" method="post">
아이디:<input type="text" name="id"><br> 비밀번호:<input
type="password" name="pw"><br> <input type="submit"
name="로그인">
</form>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
response.sendRedirect("send_ex03.jsp");
%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
//request 객체의 생명주기는 → 다음 페이지까지만
String id = request.getParameter("id");
String pw = request.getParameter("pw");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
ID:<%=id %><br> PW:<%=pw %><br>
</body>
</html>
JAVA Bean
자바언어 - 객체 생성
톰캣, 컨테이너 - 자바빈
- 데이터(변수)와 기능(메서드)으로 이루어진 클래스
폼의 데이터를 받아서 사용할 수 있는 클래스가 됨 ▶ VO가 됨 - 데이터베이스와의 반복적인 작업을 효율적으로 처리하기 위해 사용
- 조건: getter, setter 필수
bean 사용
<%@ 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>
<h3>자바빈 사용하기</h3>
<form action="bean_basic_ok.jsp" method="post">
아이디:<input type="text" name="id" size="10"><br> 비밀번호:<input
type="password" name="pw" size="10"><br> 이름:<input
type="text" name="name" size="10"><br> 이메일:<input
type="email" name="email" size="10"><br> <input
type="submit" value="확인">
</form>
</body>
</html>
User VO class
package com.example.bean;
public class User {
/*
* 자바빈은 form과 DB의 통신과정에서 변수처리를 설계하기 위해서 사용합니다.
* 관련변수를 동일한 이름으로 선언하고, getter, setter를 반드시 생성합니다.
*/
private String id;
private String pw;
private String name;
private String email;
//생성자 - 빈클래스의 생성사는 보통 기본생성자, 모든 변수를 초기화하는 생성자 2개를 선언합니다.
public User() { //ctrl + space
}
public User(String id, String pw, String name, String email) {
super();
this.id = id;
this.pw = pw;
this.name = name;
this.email = email;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPw() {
return pw;
}
public void setPw(String pw) {
this.pw = pw;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
<%@page import="com.example.bean.User"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%-- 자바코드 밖에 없어서(출력하는 부분이 아니기 때문에) 서블릿으로 대체 가능 --%>
<%
request.setCharacterEncoding("utf-8");
String id = request.getParameter("id");
String pw = request.getParameter("pw");
String name = request.getParameter("name");
String email = request.getParameter("email");
//데이터베이스로...
//단순히 값이 적으면 그냥 사용해도 되지만, 값이 많으면 자바빈(객체) 사용함
//1st, 각각 넣기
/*
* User user = new User();
* user.setId(id);
* user.setPw(pw);
* user.setName(name);
* user.setEmail(email);
*/
//2nd, 생성자로 한번에 넣기
User user = new User(id, pw, name, email);
request.setAttribute("user", user); //3번 페이지에서 활용
request.getRequestDispatcher("bean_basic_result.jsp").forward(request, response); //포워딩
%>
<%@page import="com.example.bean.User"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
//user안에 있는 원자값들을 화면에 출력
//가져올 때 User타입이어서 User 참조변수에 담아주고
User result = (User)request.getAttribute("user");
//아래에서 get사용하여 출력
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>bean_basic_result</h3>
아이디:
<%=result.getId()%><br> 비밀번호:
<%=result.getPw() %><br> 이름:
<%=result.getName() %><br> 이메일:
<%=result.getEmail() %><br>
</body>
</html>
오늘 하루
더보기
기억에 남는 부분
-
-
어려운 부분
-
-
문제 해결 부분
-
-
728x90
'Server > JSP' 카테고리의 다른 글
[JSP] MVC2 패턴 - 회원가입, 로그인, 회원정보 수정, 탈퇴 (0) | 2022.12.06 |
---|---|
[JSP] MVC2, JSTL, 형변환태그 (0) | 2022.12.02 |
[JSP] 내장 객체(request, response, out, application), cookie, session, path (0) | 2022.11.30 |
[JSP] JSP(태그), Servlet(서블릿) (0) | 2022.11.30 |
[JSP] 개발 환경 설정 (2) | 2022.11.29 |