🔷 JSP 2.3 & Servlet3.1 - JavaMail(메일전송), DB연결, DB연결하여 회원관리
✔ JavaMail(메일전송)
- JavaMail : Pop3, SMTP 등의 메일 프로토콜을 이용하여 메일을 주고 받을 수 있도록 제공해주는 API
- 코드 : 메일보내기(form)
<!doctype html> <html lang="ko"> <head> <title>자바 메일 보내기 폼</title> <meta charset="UTF-8"> <style> table { width:600px; margin:auto; } h1 { text-align:center; } td { border:1px solid gray; padding:10px; } </style> </head> <body> <form action="mailSend.jsp" method="post"> <h1>자바메일 보내기</h1> <table> <tr> <td>보내는 사람 메일 : </td> <td><input type="text" name="sender"></td> </tr> <tr> <td>받는 사람 메일 : </td> <td><input type="text" name="receiver"></td> </tr> <tr> <td>제목 : </td> <td><input type="text" name="subject"></td> </tr> <tr> <td>내용 : </td> <td><textarea name="content" cols="40" rows="20"></textarea></td> </tr> <tr> <td align=center colspan=2> <input type="submit" value="보내기"> </td> </tr> </table> </form> </body> </html>
- jsp코드 (시스템설정)
<%@ page language="java" contentType="text/html; charset=UTF-8"%> <%@ page import="java.util.*" %> <%@ page import="javax.mail.*" %> <%@ page import="javax.mail.internet.*" %> <%@ page import="example.*" %> <% // 클라이언트 페이지에서 메일 전송에 사용하기 위해서 전송되어 온 파라미터 값들은 받는 부분 // 자바 메일 보내기 폼에서 입력한 한글 정보가 깨지지 않도록 설정 request.setCharacterEncoding("UTF-8"); // 메일 송신자 String sender = request.getParameter("sender"); // 메일 수신자 String receiver = request.getParameter("receiver"); // 메일 제목 String subject = request.getParameter("subject"); // 메일 내용 String content = request.getParameter("content"); out.println("송신자 : " + sender + "<br>"); out.println("수신자 : " + receiver + "<br>"); out.println("제목 : " + subject + "<br>"); out.println("내용 : " + content + "<br>"); // 메일 송신자 String id = "id입력"; String pw = "pw입력"; // 시스템 설정 => 서버 정보를 Properties객체에 저장한다 // https://docs.oracle.com/javase/8/docs/api/java/lang/System.html#getProperties-- Properties p = System.getProperties(); // SMTP 사용 여부 설정 p.put("mail.smtp.starttls.enable", "true"); // SMTP 서버 설정 : smtp.naver.com 서버 명 p.put("mail.smtp.host", "smtp.naver.com"); // SMTP 인증 여부 설정 p.put("mail.smtp.auth", "true"); // STMP 포트(port) 설정 p.put("mail.smtp.port", "587"); // 네이버(naver) ID/PW 인증 -> 인증 정보 생성 Authenticator auth = new MyMailAuthenticator(id, pw); // 메일 인증 세션 Session mailSession = Session.getDefaultInstance(p, auth); // 메일 메시지 객체 MimeMessage msg = new MimeMessage(mailSession); try { // 메일 송부 날짜 설정 msg.setSentDate(new Date()); InternetAddress from = new InternetAddress(); // 송신자 메일 from = new InternetAddress(sender); msg.setFrom(from); // 수신자 메일 InternetAddress to = new InternetAddress(receiver); msg.setRecipient(Message.RecipientType.TO, to); // 메일 내용 및 인코딩 방식(encoding), MIME type(text/html) 등록 // 메일 제목 설정 msg.setSubject(subject, "UTF-8"); // 메일 내용 설정 msg.setText(content, "UTF-8"); // 메일 MIME type 설정 msg.setHeader("content-Type", "text/html"); // 메일 전송 javax.mail.Transport.send(msg); out.println("메일 송부"); } catch (AddressException e) { System.err.println("AddressException : " + e); e.printStackTrace(); } catch (MessagingException e){ System.err.println("MessagingException : " + e); e.printStackTrace(); } // try %>
- 인증코드(id,pw 인증)
package example; import javax.mail.Authenticator; import javax.mail.PasswordAuthentication; /** * 메일 인증(아이디/패쓰워드) 클래스 * * @author javateam * */ public class MyMailAuthenticator extends Authenticator { PasswordAuthentication account; // MyMailAuthenticator : PasswordAuthentication 객체 생성후 id,pw정보 받는다 public MyMailAuthenticator(String id, String pw){ account = new PasswordAuthentication(id, pw); } // Authentication 구현시 반드시 구현해 주어야 하는 메소드 public PasswordAuthentication getPasswordAuthentication(){ return account; } }
- 메일전송 코드
package example; import javax.mail.*; import javax.mail.internet.*; import java.util.Date; import java.util.Properties; public class MailSend { public static void main(String[] args) { // 네이버(naver)의 아이디/패쓰워드를 외부 인자를 통해서 입력합니다. String id = args[0].trim(); String pw = args[1].trim(); // 시스템 설정 Properties p = System.getProperties(); // SMTP 사용 여부 설정 p.put("mail.smtp.starttls.enable", "true"); // SMTP 서버 설정 p.put("mail.smtp.host", "smtp.naver.com"); // SMTP 인증 여부 설정 p.put("mail.smtp.auth", "true"); // STMP 포트(port) 설정 p.put("mail.smtp.port", "587"); // 네이버(naver) ID/PW 인증 Authenticator auth = new MyMailAuthenticator(id, pw); // 메일 인증 세션 Session session = Session.getDefaultInstance(p, auth); // 메일 메시지 객체 MimeMessage msg = new MimeMessage(session); try { // 메일 송부 날짜 설정 msg.setSentDate(new Date()); InternetAddress from = new InternetAddress(); // 송신자 메일 from = new InternetAddress("sender<alswl689@naver.com>"); msg.setFrom(from); // 수신자 메일 InternetAddress to = new InternetAddress("alswl689@naver.com"); msg.setRecipient(Message.RecipientType.TO, to); // 메일 내용 및 인코딩 방식(encoding), MIME type(text/html) 등록 // 메일 제목 설정 msg.setSubject("메일 제목입니다.", "UTF-8"); // 메일 내용 설정 msg.setText("메일 내용입니다.", "UTF-8"); // 메일 MIME type 설정 msg.setHeader("content-Type", "text/html"); // 메일 전송 javax.mail.Transport.send(msg); } catch (AddressException e) { System.err.println("AddressException : " + e); e.printStackTrace(); } catch (MessagingException e){ System.err.println("MessagingException : " + e); e.printStackTrace(); } } }
▶ 출력화면(메일전송 내역 입력)
▶ 출력화면(메일전송 입력후 전송)
▶ 출력화면(메일수신 확인)
✔ DB연결
- context.xml코드
<?xml version="1.0" encoding="UTF-8"?> <Context> <!-- oracle --> <Resource name="jdbc/xe" auth="Container" type="javax.sql.DataSource" driverClassName="oracle.jdbc.OracleDriver" factory="org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory" url="jdbc:oracle:thin:@localhost:1521:xe" username="hr" password="hr" maxActive="20" maxIdle="10" maxWait="-1" /> <!-- maria db --> <Resource name="jdbc/bigdb" auth="Container" type="javax.sql.DataSource" driverClassName="org.mariadb.jdbc.Driver" factory="org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory" url="jdbc:mariadb://localhost:3306/bigdb" username="java" password="java" maxActive="20" maxIdle="10" maxWait="-1" /> </Context>
- Oracle 연결
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> <%@ page import="java.sql.*" %> <%@ page import="javax.sql.*" %> <%@ page import="javax.naming.*" %> <% String id = ""; Connection con =null; PreparedStatement pstmt=null; ResultSet rs=null; try { Context initContext = new InitialContext(); // 참고) http://tomcat.apache.org/tomcat-9.0-doc/jndi-resources-howto.html // howto-1) // Context envCtx = (Context)initContext.lookup("java:comp/env"); // DataSource ds = (DataSource)envCtx.lookup("jdbc/xe"); // howto-2) DataSource ds = (DataSource)initContext.lookup("java:/comp/env/jdbc/xe"); con=ds.getConnection(); String sql ="SELECT employee_id FROM employees"; pstmt = con.prepareStatement(sql); rs = pstmt.executeQuery(); while (rs.next()) { id = rs.getString(1); out.println(id+" "); } } catch(Exception e) { System.out.println(e.getMessage()); e.printStackTrace(); } finally { rs.close(); pstmt.close(); con.close(); } %> <!DOCTYPE html> <html lang="ko"> <head> <meta charset="UTF-8"> <title>DBCP testing</title> </head> <body> </body> </html>
- MariaDB연결
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> <%@ page import="java.sql.*" %> <%@ page import="javax.sql.*" %> <%@ page import="javax.naming.*" %> <% String id = ""; Connection con =null; PreparedStatement pstmt=null; ResultSet rs=null; try { Context initContext = new InitialContext(); // 참고) http://tomcat.apache.org/tomcat-9.0-doc/jndi-resources-howto.html // mariaDB Connector/J 사용법 // : https://mariadb.com/kb/en/about-mariadb-connector-j/#using-drivermanager // howto-1) // Context envCtx = (Context)initContext.lookup("java:comp/env"); // DataSource ds = (DataSource)envCtx.lookup("jdbc/xe"); // howto-2) DataSource ds = (DataSource)initContext.lookup("java:/comp/env/jdbc/bigdb"); con=ds.getConnection(); String sql ="SELECT deptno FROM dept"; pstmt = con.prepareStatement(sql); rs = pstmt.executeQuery(); while (rs.next()) { id = rs.getString(1); out.println(id+" "); } } catch(Exception e) { System.out.println(e.getMessage()); e.printStackTrace(); } finally { rs.close(); pstmt.close(); con.close(); } %> <!DOCTYPE html> <html lang="ko"> <head> <meta charset="UTF-8"> <title>DBCP testing</title> </head> <body> </body> </html>
✔ DB연결 하여 회원관리 프로그램
- 로그인 코드(FORM)
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html lang="ko"> <head> <meta charset="UTF-8"> <title>회원 관리 시스템 로그인 페이지</title> <style> table{ margin : auto; width : 400px; border : 1px solid gray; text-align: center; } .td_title{ font-weight: bold; font-size: x-large; } </style> </head> <body> <!-- form영역에 있는 데이터가 전송되는 요청 URL을 loginProcess.jsp 페이지로 지정--> <form name="loginform" action="loginProcess.jsp" method="post"> <table> <tr> <td colspan="2" class = "td_title"> 로그인 페이지 </td> </tr> <tr> <!--로그인에 사용할 ID입력 양식 --> <td><label for = "id">아이디 : </label></td> <td><input type="text" name="id" id = "id"/></td> </tr> <tr> <!--로그인에 사용할 PW입력 양식 --> <td><label for = "pass">비밀번호 : </label></td> <td><input type="password" name="pass" id = "pass"/></td> </tr> <tr> <td colspan="2"> <!-- 로그인 링크를 클릭하면 js를 사용해 loginform 객체의 submit() 메소드를 호출하여 loginProcess.jsp 페이지로 요청한다 --> <a href="javascript:loginform.submit()">로그인</a> <!-- 회원가입 텍스트를 클릭하면 joinForm.jsp 로 요청을 전송하는 링크를 지정 --> <a href="joinForm.jsp">회원가입</a> </td> </tr> </table> </form> </body> </html>
▶ 출력화면(첫 화면)
- 회원가입 코드(FORM)
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html lang="ko"> <head> <meta charset="UTF-8"> <title>회원관리 시스템 회원가입 페이지</title> <style> table{ margin : auto; width : 400px; border : 1px solid gray; text-align: center; } .td_title{ font-weight: bold; font-size: x-large; } </style> </head> <body> <form name ="joinform" action = "joinProcess.jsp" method="post" /> <table border=1> <tr> <td colspan="2" class = "td_title"> 회원가입 페이지 </td> </tr> <tr> <td><label for = "id">아이디 : </label></td> <td><input type="text" name="id" id = "id"/></td> </tr> <tr> <td><label for = "pass">비밀번호 : </label></td> <td><input type="password" name="pass" id = "pass"/></td> </tr> <tr> <td><label for = "name">이름 : </label></td> <td><input type="text" name="name" id = "name"/></td> </tr> <tr> <td><label for = "age">나이 : </label></td> <td><input type="text" name="age" id = "age"/> </td> </tr> <tr> <td><label for = "gender1"></label>성별 : </td> <td> <input type="radio" name="gender" value="남" checked id = "gender1"/>남자 <input type="radio" name="gender" value="여" id = "gender2"/>여자 </td> </tr> <tr> <td><label for = "email">이메일 주소 : </label></td> <td><input type="text" name="email" id = "email"/></td> </tr> <tr> <td colspan="2"> <!-- 회원가입 링크 클릭하면 js를 이용해 joinform객체의 submit() 메소드를 호출하여 joinProcess.jsp페이지로 요청한다 --> <a href="javascript:joinform.submit()">회원가입</a> <a href="javascript:joinform.reset()">다시작성</a> </td> </tr> </table> </form> </body> </html>
- 회원가입 코드(Process)
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="java.sql.*"%> <%@ page import="javax.sql.*" %> <%@ page import="javax.naming.*" %> <% request.setCharacterEncoding("UTF-8"); String id = request.getParameter("id"); String pass = request.getParameter("pass"); String name = request.getParameter("name"); int age = Integer.parseInt(request.getParameter("age")); String gender = request.getParameter("gender"); String email = request.getParameter("email"); Connection con = null; PreparedStatement pstmt = null; try{ Context init = new InitialContext(); DataSource ds = (DataSource) init.lookup("java:/comp/env/jdbc/scott"); con = ds.getConnection(); pstmt= con.prepareStatement("INSERT INTO member VALUES (?,?,?,?,?,?)"); pstmt.setString(1,id); pstmt.setString(2,pass); pstmt.setString(3,name); pstmt.setInt(4,age); pstmt.setString(5,gender); pstmt.setString(6,email); int result = pstmt.executeUpdate(); // 데이터 삽입 성공여부 1, 0 으로 전달 if(result !=0){ // 성공시 out.println("<script>"); out.println("location.href='loginForm.jsp'"); // loginForm.jsp로 이동 out.println("</script>"); }else{ // 실패시 out.println("<script>"); out.println("location.href='joinForm.jsp'");// joinForm.jsp로 이동 out.println("</script>"); } }catch(Exception e){ e.printStackTrace(); }finally{ try{// 자원반납 pstmt.close(); con.close(); } catch(Exception e){ e.printStackTrace(); } } %>
▶ 출력화면(회원가입)
- 로그인 코드(Process)
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import = "java.sql.*" %> <%@ page import="javax.sql.*" %> <%@ page import="javax.naming.*" %> <% String id = request.getParameter("id"); String pass = request.getParameter("pass"); Connection con = null; // DB연결 PreparedStatement pstmt =null; // SQL처리 객체 ResultSet rs = null; // 결과셋 객체 try{ Context init = new InitialContext(); // JNDI 네이밍 방식 : 외부객체를 이용하기위한 기술 DataSource ds = (DataSource) init.lookup("java:/comp/env/jdbc/scott"); // lookup :참고 con = ds.getConnection();//lookup한 db연결 pstmt=con.prepareStatement("SELECT * FROM member WHERE id=?"); //SQL 문 작성 pstmt.setString(1,id); // ? 에 들어갈 인자 id로 지정 rs=pstmt.executeQuery(); if(rs.next()){ // db 순서대로 탐색 if(pass.equals(rs.getString("pass"))){//db에서 가져온 비밀번호가 입력받은 비밀번호와 일치하다면 session.setAttribute("id",id); // session영역에 입력받은 id 이름의 속성 값을 생성 out.println("<script>"); out.println("location.href='main.jsp'");//main.jsp페이지로 이동한다 out.println("</script>"); } }else{ // 일치하지 않다면 out.println("<script>"); out.println("location.href='loginForm.jsp'"); // loginForm.jsp 페이지도 이동한다 out.println("</script>"); } }catch(Exception e){ // 예외처리 e.printStackTrace(); }finally{ try{ // 자원반납 rs.close(); pstmt.close(); con.close(); } catch(Exception e){ // 자원반납시 예외처리 e.printStackTrace(); } } %>
- 회원관리 시스템 코드(main)
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% String id = null; //입력받은 id값이 세션의 id에 등록되어있는 상태라면 if(session.getAttribute("id")!=null){ id=(String)session.getAttribute("id"); //세션에 저장된 Id값을 변수에 저장한다 }else{//아니면 out.println("<script>"); out.println("location.href='loginForm.jsp'"); out.println("</script>"); } %> <html lang="ko"> <head> <meta charset="UTF-8"> <title>회원관리 시스템 메인 페이지</title> </head> <body> <h3><%=id %> 로 로그인하셨습니다.</h3> <%if(id.equals("admin")){ %> <a href="member_list.jsp">관리자모드 접속(회원 목록 보기)</a> <% }%> </body> </html>
▶ 출력화면(admin 로그인)
▶ 출력화면(일반회원 로그인)
- 회원리스트 조회 코드(member_list)
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="java.sql.*"%> <%@ page import="javax.sql.*" %> <%@ page import="javax.naming.*" %> <% String id = null; // 전달받은id값이 null이거나 admin이 아니라면 if((session.getAttribute("id") == null) || (!((String)session.getAttribute("id")).equals("admin"))) { out.println("<script>"); out.println("location.href='loginForm.jsp'"); // loginForm.jsp 페이지로 이동 out.println("</script>"); } Connection con = null; PreparedStatement pstmt = null; ResultSet rs = null; try{ Context init = new InitialContext(); DataSource ds = (DataSource) init.lookup("java:/comp/env/jdbc/scott"); con = ds.getConnection(); pstmt=con.prepareStatement("SELECT * FROM member"); rs=pstmt.executeQuery(); }catch(Exception e){ e.printStackTrace(); } %> <html lang="ko"> <head> <meta charset="UTF-8"> <title>회원관리 시스템 관리자모드(회원 목록 보기)</title> <style> table{ margin : auto; width : 400px; border : 1px solid gray; text-align: center; } .td_title{ font-weight: bold; font-size: x-large; } </style> </head> <body> <table> <tr><td colspan=2 class="td_title">회원 목록</td></tr> <!-- member 테이블에 존재하는 레코드 수 만큼 회원 정보를 출력 --> <%while(rs.next()){ %> <tr> <td> <!-- 회원아이디 클릭시 해당 회원의 정보를 보여주는 member_info.jsp페이지로 이동하는 링크 생성 정보를 보여줄 회원을 판단하기 위해 id값을 파라미터로 전송한다 --> <a href="member_info.jsp?id=<%=rs.getString("id") %>"> <!-- 회원의 id 컬럼 값을 출력 --> <%=rs.getString("id") %> </a> </td> <td> <!-- 회원정보를 삭제하는 페이지인 member_delete.jsp 페이지로 이동하는 링크 설정, 삭제할 회원 판단위해 id값을 파라미터로 전송 --> <a href="member_delete.jsp?id=<%=rs.getString("id") %>">삭제</a> </td> </tr> <% } %> </table> </body> </html> </html>
▶ 출력화면(회원 목록)
- 회원 정보 조회 코드(member_info)
m<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="java.sql.*"%> <%@ page import="javax.sql.*" %> <%@ page import="javax.naming.*" %> <% String id = null; // 입력받은 id값이 null이거나 admin이 아니라면 if((session.getAttribute("id")==null) || (!((String)session.getAttribute("id")).equals("admin"))){ out.println("<script>"); out.println("location.href='loginForm.jsp'"); // loginForm.jsp 페이지로 이동한다 out.println("</script>"); } String info_id = request.getParameter("id"); Connection conn=null; PreparedStatement pstmt=null; ResultSet rs=null; try { Context init = new InitialContext(); DataSource ds = (DataSource) init.lookup("java:/comp/env/jdbc/scott"); conn = ds.getConnection(); pstmt=conn.prepareStatement("SELECT * FROM member WHERE id=?"); pstmt.setString(1,info_id); rs=pstmt.executeQuery(); rs.next(); }catch(Exception e){ e.printStackTrace(); } %> <html lang="ko"> <head> <meta charset="UTF-8"> <title>회원관리 시스템 관리자모드(회원 정보 보기)</title> <style> table{ margin : auto; width : 400px; border : 1px solid gray; text-align: center; } </style> </head> <body> <table> <tr> <td>아이디 : </td> <td><%=rs.getString("id") %></td> </tr> <tr> <td>비밀번호 : </td> <td><%=rs.getString("pass") %></td> </tr> <tr> <td>이름 : </td> <td><%=rs.getString("name") %></td> </tr> <tr> <td>나이 : </td><td><%=rs.getString("age") %></td> </tr> <tr> <td>성별 : </td><td><%=rs.getString("gender") %></td> </tr> <tr> <td>이메일 주소 : </td> <td><%=rs.getString("email") %></td> </tr> <tr> <!-- 회원목록을 보는 페이지로 링크를 생성 --> <td colspan=2><a href="member_list.jsp">리스트로 돌아가기</a></td> </tr> </table> </body> </html>
- 회원 삭제 코드(member_delete)
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="java.sql.*"%> <%@ page import="javax.sql.*" %> <%@ page import="javax.naming.*" %> <% String id=null; if ((session.getAttribute("id")==null) || (!((String)session.getAttribute("id")).equals("admin"))) { out.println("<script>"); out.println("location.href='loginForm.jsp'"); out.println("</script>"); } String delete_id=request.getParameter("id"); Connection con=null; PreparedStatement pstmt=null; ResultSet rs=null; try { Context init = new InitialContext(); DataSource ds = (DataSource) init.lookup("java:/comp/env/jdbc/scott"); con = ds.getConnection(); pstmt=con.prepareStatement("DELETE FROM member WHERE id=?"); pstmt.setString(1,delete_id); pstmt.executeUpdate(); out.println("<script>"); out.println("location.href='member_list.jsp'"); out.println("</script>"); }catch(Exception e){ e.printStackTrace(); }finally{ try{ pstmt.close(); con.close(); } catch(Exception e){ e.printStackTrace(); } } %>
▶ DB 출력화면