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>