원지의 개발
article thumbnail
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>

error_view.jsp

<%@ 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
profile

원지의 개발

@원지다

250x250