본문 바로가기

수업내용

[Day47][JSP] filter / exception / 회원가입(JSP, Oracle)

chap04_StandardAction 05formUseBeanEnd.jsp

request.setCharacterEncoding("UTF-8");

 

-- 전송 방식이 post일 경우에 한글 깨짐을 방지하려고 위와 같이 해 주는데 매번 위와 같이 하기에는 귀찮기 때문에 filter를 이용하여 WAS가 구동되어 질 때 자동적으로 request.setCharacterEncoding("UTF-8"); 이 되어지도록 하겠다.

-- WAS가 구동되어질 때 자동적으로 되어야 하므로 배치서술자인 web.xml에 기술해야 한다.

 

▷ filter란?

: Servlet이나 JSP를 구동할 때 해당 Servlet이나 JSP를 구동하기 전 먼저 실행되어지는 클래스이다.

필터를 사용하면 클라이언트의 요청을 가로채서 서버 컴포넌트의 추가적인 다른 기능을 수행시킬 수 있다.

 

▷ filter 적용 순서

1. Filter 인터페이스를 구현하는 자바 클래스를 생성한다.
2. /WEB-INF/web.xml 에 filter 엘리먼트를 사용하여 필터 클래스를 등록한다. 

 

-- Java Resources에 Package(my.filter)와 Class(MyFilter) 생성

myFilter MyFilter.java

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class MyFilter implements Filter {

	@Override
	public void destroy() {
		
	}

	@Override
	public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
			throws IOException, ServletException {
        	request.setCharacterEncoding("UTF-8");
		chain.doFilter(request, response);
	}

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		
	}
}

 

-- destroy() : 필터 인스턴스를 종료시키기 전에 호출되는 메소드

-- doFilter() : 필터의 로직을 작성해 주는 곳

-- init() : 서블릿 컨테이너가 필터 인스턴스를 초기화하기 위해서 호출되는 메소드

 

web.xml

<filter>
  <filter-name>setCharacterEncoding</filter-name>
  <filter-class>my.filter.MyFilter</filter-class>
</filter>
<filter-mapping>
  <filter-name>setCharacterEncoding</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

 

-- 이제 WAS를 재구동하고 나면 따로 명시해 주지 않아도 POST 방식에서 한글이 깨지지 않고 나타난다.

 


Ⅰ. Exception

 

-- begin에 Folder(chap05_exception)와 JSP File(01numberInputTest) 생성

 

1. RequestDispatcher를 이용한 에러페이지 출력

 

chap05_exception 01numberInputTest.jsp head

<script type="text/javascript">
	function goSubmit(btn){
		
		var frm;
		
		switch (btn) {
			
			case 'btn1':
				frm = document.frm1;
				
				var num1 = frm.num1.value;
				var num2 = frm.num2.value;
				
				var regExp = /^[-]?[0-9]+$/;
				var bool1 = regExp.test(num1);
				var bool2 = regExp.test(num2);
				
				if(bool1 && bool2) {
					frm.submit();
				}
				else {
					alert("숫자만 입력하세요.");
					frm.num1.value = "";
					frm.num2.value = "";
					frm.num1.focus();
				}
				
				break;
                
			default:
				break;
		}
		
	}
</script>

 

chap05_exception 01numberInputTest.jsp body

<h2> try ~ catch ==> RequestDispatcher를 이용한 에러페이지 출력 </h2>
<form name="frm1" action="02tryCatchRequestDispatcher.jsp" method="post">
  num1 : <input type="text" name="num1"/><br/>
  num2 : <input type="text" name="num2"/><br/>
  <button type="button" onclick="goSubmit('btn1');">전송</button>
</form>

 

 


 

-- Folder(chap05_exception)에 JSP File(02tryCatchRequestDispatcher, 03error1) 생성

 

chap05_exception 02tryCatchRequestDispatcher.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<% 
	String str1 = request.getParameter("num1");
	String str2 = request.getParameter("num2");
	
	int num1=0, num2=0, sum=0;
	
	try {
		num1 = Integer.parseInt(str1);
		num2 = Integer.parseInt(str2);
		
		sum = num1 + num2;
	} catch(NumberFormatException e){
		RequestDispatcher dispatcher = request.getRequestDispatcher("03error1.jsp");
		dispatcher.forward(request, response);
	}
%>    
    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>02tryCatchRequestDispatcher.jsp 페이지 입니다.</title>
</head>
<body>
	<%= num1%> + <%= num2%> = <%= sum%> 입니다.
</body>
</html>

 

chap05_exception 03error1.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%
	String num1 = request.getParameter("num1");
	String num2 = request.getParameter("num2");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>NumberFormatException 페이지 내용 만들기</title>
</head>
<body>
	<h1>03error1.jsp 페이지의 내용</h1>
	<h2>try ~ catch ==> RequestDispatcher를 이용한 에러페이지 출력</h2>
	<br/>
	입력한 데이터는 숫자가 아닌 값을 입력하셨습니다. <br/><br/>
	첫 번째 수 : <%= num1 %> <br/>
	두 번째 수 : <%= num2 %> <br/>
</body>
</html>

 

 

 

 


2. JSP 페이지 directive(지시어)에서 errorPage 속성과 isErrorPage 속성을 이용한 에러페이지 출력

 

-- Folder(chap05_exception)에 JSP File(04directiveErrorPage, 05error2) 생성

 

chap05_exception 01numberInputTest.jsp javascript switch~case

case 'btn2':
	frm = document.frm2;
	frm.submit();
	break;

 

chap05_exception 01numberInputTest.jsp body

<h2> JSP 페이지 directive(지시어)에서 errorPage 속성과 isErrorPage 속성을 이용한 에러페이지 출력 </h2>
<form name="frm2" action="04directiveErrorPage.jsp" method="post">
	num1 : <input type="text" name="num1"/><br/>
	num2 : <input type="text" name="num2"/><br/>
	<button type="button" onclick="goSubmit('btn2');">전송</button>
</form>

 

chap05_exception 04directiveErrorPage.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" errorPage="05error2.jsp"%>
 
<% 
	String str1 = request.getParameter("num1");
	String str2 = request.getParameter("num2");
	
	int num1=0, num2=0, sum=0;
	
		num1 = Integer.parseInt(str1);
		num2 = Integer.parseInt(str2);
		
		sum = num1 + num2;
%>    
    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>04directiveErrorPage.jsp 페이지 입니다.</title>
</head>
<body>
	<%= num1%> + <%= num2%> = <%= sum%> 입니다.
</body>
</html>

 

-- errorPage : 이 페이지에서 어떠한 Exception이 발생되어지면 errorPage 속성에 기술한 페이지(지금은 05error2.jsp 페이지)로 이동을 하라는 말이다.

 

chap05_exception 05error2.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" isErrorPage="true"%>	
    		
<%
	String num1 = request.getParameter("num1");
	String num2 = request.getParameter("num2");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Exception 페이지 내용 만들기</title>
</head>
<body>
	<h1>05error2.jsp 페이지의 내용</h1>
	<h2>JSP 페이지 directive(지시어)에서 errorPage 속성과 isErrorPage 속성을 이용한 에러페이지 출력</h2>
	<br/>
	입력한 데이터에 오류가 있습니다. <br/><br/>
	에러메시지 : <%= exception.getMessage() %>
</body>
</html>

 

-- isErrorPage="true" : 선택사항, 오류가 발생되었을 때 뜨는 페이지라는 표시

-- 페이지 directive(지시어)에서 isErrorPage="true" 라고 선언했을 때만 내장객체 exception을 사용할 수 있다.

 

 


 

3. 배치서술자인 web.xml을 이용한 에러페이지 출력

 

-- Folder(chap05_exception)에 JSP File(06webXml, 07error3) 생성

 

chap05_exception 01numberInputTest.jsp javascript switch~case

case 'btn3':
	frm = document.frm3;
	frm.submit();
	break;

 

chap05_exception 01numberInputTest.jsp body

<h2> 배치서술자인 web.xml을 이용한 에러페이지 출력 </h2>
<form name="frm3" action="06webXml.jsp" method="post">
	num1 : <input type="text" name="num1"/><br/>
	num2 : <input type="text" name="num2"/><br/>
	<button type="button" onclick="goSubmit('btn3');">전송</button>
</form>

 

chap05_exception 06webXml.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<% 
	String str1 = request.getParameter("num1");
	String str2 = request.getParameter("num2");
	
	int num1=0, num2=0, sum=0;
	
		num1 = Integer.parseInt(str1);
		num2 = Integer.parseInt(str2);
		
		sum = num1 + num2;
%>    
    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>06webXml.jsp 페이지 입니다.</title>
</head>
<body>
	<%= num1%> + <%= num2%> = <%= sum%> 입니다.
</body>
</html>

 

web.xml

<error-page>
  <exception-type>java.lang.NumberFormatException</exception-type>
  <location>/begin/chap05_exception/07error3.jsp</location>
</error-page>

 

chap05_exception 07error3.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" isErrorPage="true"%>	
    	
<%
	String num1 = request.getParameter("num1");
	String num2 = request.getParameter("num2");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Exception 페이지 내용 만들기</title>
</head>
<body>
	<h1>07error3.jsp 페이지의 내용</h1>
	<h2>배치서술자인 web.xml을 이용한 에러페이지 출력</h2>
	<br/>
	입력한 데이터가 숫자가 아닙니다. <br/><br/>
	에러메시지 : <%= exception.getMessage() %>
</body>
</html>

 

 


-- WebContent - Folder(SQL, jdbc) - File(MyWeb.sql) 생성

-- File(MyWeb.sql) - open with - other - Externeal programs - browse - sqldeveloper.exe 바로가기  열기 - Use it for all '*.sql' files 체크

-- myorauser 연결하여 사용

-- MyDBConnection 복사하여 src에 붙여넣기

-- Java Resources에 Package(begin.chap06.oracle.controller) 생성

-- WebContent에 Folder(chap06Oracle) 생성

-- chap04 05formUseBeanTest 복사하여 chap06Oracle에 붙여넣고 memberRegisterForm으로 Rename

 

chap06Oracle memberRegisterForm

<form name="registerFrm" action="memberRegisterEnd.do" method="post">

 

-- Package(begin.chap06.oracle.controller)에 Servlet(MemberRegisterCtrl) - URL mappings : /memberRegisterEnd.do - Constructors from superclass 체크 해제 - Finish

 

begin.chap06.oracle MemberRegisterCtrl.java

package begin.chap06.oracle;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


@WebServlet("/memberRegisterEnd.do")
public class MemberRegisterCtrl extends HttpServlet {
	private static final long serialVersionUID = 1L;

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		excute(request, response);
	}

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		excute(request, response);
	}

	private void excute(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		String userid = request.getParameter("userid");
		String passwd = request.getParameter("passwd");
		String name = request.getParameter("name");
		String email = request.getParameter("email");
		String tel = request.getParameter("tel");
		String jubun1 = request.getParameter("jubun1");
		String jubun2 = request.getParameter("jubun2");
		String school = request.getParameter("school");
		String[] interest = request.getParameterValues("interest");
	}
}

 

-- Package(begin.chap06.oracle.model)와 Class(MemberVO) 생성

-- Package(begin.chap04_StandardAction) Class(UserDTO) getInterest까지 복사

-- Source - Generate Constructor using fields 

-- 기본 생성자 생성

 

begin.chap06.oracle.model MemberVO

private String userid;
	private String passwd;
	private String name;
	private String email;
	private String tel;
	private String jubun1;
	private String jubun2;
	private String school;
	private String[] interest;
	
	
	public MemberVO() {}
    
    // 생성자와 Getters Setters 생략 

 

begin.chap06.oracle MemberRegisterCtrl.java excute()

MemberVO member = new MemberVO(userid, passwd, name, email, tel, jubun1, jubun2, school, interest);

 

-- Package(begin.chap06.oracle.model)에 Interface(InterMemberDAO)와 Class(MemberDAO) 생성

 

begin.chap06.oracle.model InterMemberDAO.java

// 회원가입(insert)
int memberRegister(MemberVO member);

 

begin.chap06.oracle.model MemberDAO.java

package begin.chap06.oracle.model;

import java.sql.*;

import jdbc.connection.MyDBConnection;

public class MemberDAO implements InterMemberDAO {

	private Connection conn;
	private PreparedStatement pstmt;
	private ResultSet rs;
	
	// === 사용한 자원을 반납하는 close() 메소드 생성하기 ===
	public void close() {
		
		try {
			if(rs != null) rs.close(); // rs = null;
			if(pstmt != null) pstmt.close(); // ptsmt = null;
		} catch (SQLException e) {
			e.printStackTrace();
		}		
	}

	// == 회원가입(insert) == // 
	@Override
	public int memberRegister(MemberVO member) throws SQLException {
		
		int n = 0;
		
		try {
			conn = MyDBConnection.getConn();
			
			String sql = " insert into myweb_member(userid, passwd, name, email, tel, jubun, school, interest, registerday) \r\n" + 
					     " values (?, ?, ?, ?, ?, ?, ?, ?, default) ";
			
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, member.getUserid());
			pstmt.setString(2, member.getPasswd());
			pstmt.setString(3, member.getName());
			pstmt.setString(4, member.getEmail());
			pstmt.setString(5, member.getTel());
			pstmt.setString(6, member.getJubun1()+member.getJubun2());
			pstmt.setString(7, member.getSchool());
			pstmt.setString(8, String.join(",", member.getInterest()));
			
			n = pstmt.executeUpdate();
			
			if(n==1)
				conn.commit();
			
		} finally {
			close();
		}
		
		return n;
	}
}

 

 

 


Exception 처리

 

-- WebContent - chap06Oracle - JSP File(anotherError, sqlError) 생성

 

begin.chap06.oracle.controller MemberRegisterCtrl.java

catch(SQLException e) {
	String errorMsg = e.getMessage();
			
	request.setAttribute("errorMsg", errorMsg);
			
	RequestDispatcher dispatcher = request.getRequestDispatcher("/begin/chap06Oracle/sqlError.jsp");
	dispatcher.forward(request, response);
} catch(Exception e) {
	String errorMsg = e.getMessage();
			
	request.setAttribute("errorMsg", errorMsg);
			
	RequestDispatcher dispatcher = request.getRequestDispatcher("/begin/chap06Oracle/anotherError.jsp");
	dispatcher.forward(request, response);
}

 

chap06Oracle sqlError

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" isErrorPage="true"%>
    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>SQL 관련 오류 발생시 보여 주는 것</title>
</head>
<body>
처리도중 SQL 관련 오류가 발생했습니다. <br/>
오류메시지 : <span style="color: red;">${errorMsg}</span>
</body>
</html>

 

chap06Oracle anotherError

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" isErrorPage="true"%>
    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>SQL 관련 외의 오류 발생시 보여 주는 것</title>
</head>
<body>
처리도중 SQL 관련 오류가 발생했습니다. <br/>
오류메시지 : <span style="color: blue;">${errorMsg}</span>
</body>
</html>