2008. 9. 26. 16:16

로그인, 회원가입, 정보수정, 탈퇴

MVC 모델을 통한 회원가입에 대한 페이지들입니다.
전체가 참조하게 될 web.xml / MemberBean.java / MemberDAO.java 파일 입니다.
데이터베이스는 MYSQL을 사용하였고 서블릿은 TOMCAT 5.5 버전입니다.
======== web.xml ========================================================
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    version="2.4">
  <display-name>Welcome to Test0922</display-name>
  <description>
     Welcome to Test0922
  </description>
 <servlet>
  <servlet-name>login.jsp</servlet-name>
  <jsp-file>/member/login.jsp</jsp-file>
 </servlet>
 <servlet>
  <servlet-name>logout.jsp</servlet-name>
  <jsp-file>/member/logout.jsp</jsp-file>
 </servlet>
 <servlet>
  <servlet-name>welcome.jsp</servlet-name>
  <jsp-file>/member/welcome.jsp</jsp-file>
 </servlet> 
 <servlet>
  <servlet-name>LoginServlet</servlet-name>
  <servlet-class>member.control.LoginServlet</servlet-class>
 </servlet>
 <servlet>
  <servlet-name>JoinMemberServlet</servlet-name>
  <servlet-class>member.control.JoinMemberServlet</servlet-class>
 </servlet>
 <servlet>
  <servlet-name>modify.jsp</servlet-name>
  <jsp-file>/member/modify.jsp</jsp-file>
 </servlet>
 <servlet>
  <servlet-name>ModifyMemberServlet</servlet-name>
  <servlet-class>member.control.ModifyMemberServlet</servlet-class>
 </servlet>
 <servlet>
  <servlet-name>modifyok.jsp</servlet-name>
  <jsp-file>/member/modifyok.jsp</jsp-file>
 </servlet>
 <servlet>
  <servlet-name>modifyfail.jsp</servlet-name>
  <jsp-file>/member/modifyfail.jsp</jsp-file>
 </servlet>
 <servlet>
  <servlet-name>memberout.jsp</servlet-name>
  <jsp-file>/member/memberout.jsp</jsp-file>
 </servlet>
 <servlet>
  <servlet-name>OutMemberServlet</servlet-name>
  <servlet-class>member.control.OutMemberServlet</servlet-class>
 </servlet>
 <servlet>
  <servlet-name>outmemberok.jsp</servlet-name>
  <jsp-file>/member/outmemberok.jsp</jsp-file>
 </servlet>
 <servlet>
  <servlet-name>outmemberfail.jsp</servlet-name>
  <jsp-file>/member/outmemberfail.jsp</jsp-file>
 </servlet> 
 <servlet-mapping>
  <servlet-name>login.jsp</servlet-name>
  <url-pattern>/login.jsp</url-pattern>
 </servlet-mapping>
 <servlet-mapping>
  <servlet-name>logout.jsp</servlet-name>
  <url-pattern>/logout.jsp</url-pattern>
 </servlet-mapping>
 <servlet-mapping>
  <servlet-name>welcome.jsp</servlet-name>
  <url-pattern>/welcome.jsp</url-pattern>
 </servlet-mapping>
 <servlet-mapping>
  <servlet-name>LoginServlet</servlet-name>
  <url-pattern>/login.do</url-pattern>
 </servlet-mapping>
 <servlet-mapping>
  <servlet-name>JoinMemberServlet</servlet-name>
  <url-pattern>/joinmember.do</url-pattern>
 </servlet-mapping>
 <servlet-mapping>
  <servlet-name>modify.jsp</servlet-name>
  <url-pattern>/modify.jsp</url-pattern>
 </servlet-mapping>
 <servlet-mapping>
  <servlet-name>ModifyMemberServlet</servlet-name>
  <url-pattern>/modifymember.do</url-pattern>
 </servlet-mapping>
 <servlet-mapping>
  <servlet-name>modifyok.jsp</servlet-name>
  <url-pattern>/modifyok.jsp</url-pattern>
 </servlet-mapping>
 <servlet-mapping>
  <servlet-name>modifyfail.jsp</servlet-name>
  <url-pattern>/modifyfail.jsp</url-pattern>
 </servlet-mapping>
 <servlet-mapping>
  <servlet-name>memberout.jsp</servlet-name>
  <url-pattern>/memberout.jsp</url-pattern>
 </servlet-mapping>
 <servlet-mapping>
  <servlet-name>OutMemberServlet</servlet-name>
  <url-pattern>/outmember.do</url-pattern>
 </servlet-mapping>
 <servlet-mapping>
  <servlet-name>outmemberok.jsp</servlet-name>
  <url-pattern>/outmemberok.jsp</url-pattern>
 </servlet-mapping>
 <servlet-mapping>
  <servlet-name>outmemberfail.jsp</servlet-name>
  <url-pattern>/outmemberfail.jsp</url-pattern>
 </servlet-mapping> 
</web-app>
==========================================================================
회원가입 항목인 필드들을 정의 하였습니다.
======== MemberBean.java ================================================
package member.model;
public class MemberBean {
 protected String num;
 protected String name;
 protected String id;
 protected String passwd;
 protected String tel;
 protected String add;
 public String getAddr() {
  return add;
 }
 public void setAddr(String add) {
  this.add = add;
 }
 public String getId() {
  return id;
 }
 public void setId(String id) {
  this.id = id;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public String getNum() {
  return num;
 }
 public void setNum(String num) {
  this.num = num;
 }
 public String getPasswd() {
  return passwd;
 }
 public void setPasswd(String passwd) {
  this.passwd = passwd;
 }
 public String getTel() {
  return tel;
 }
 public void setTel(String tel) {
  this.tel = tel;
 } 
}
==========================================================================
데이터베이스 연결 및 처리부분에 대한 DAO 파일입니다.
======== MemberDAO.java ================================================
package member.model;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class MemberDAO {
  public MemberBean memberInfo(String id){
  MemberBean temp=null;
  String sql="select * from member where id=?";
  PreparedStatement  pstmt=null;
  ResultSet rest=null;
  try{
   pstmt=conn.prepareStatement(sql);
   pstmt.setString(1,id);
   rest=pstmt.executeQuery();
   if(rest.next()){
    temp=new MemberBean();
    temp.setNum(rest.getString(1));
    temp.setName(rest.getString(2));
    temp.setId(rest.getString(3));
    temp.setPasswd(rest.getString(4));
    temp.setTel(rest.getString(5));
    temp.setAddr(rest.getString(6));
   }
  }catch (Exception e) {
   e.printStackTrace();
  }
  return temp;
 }
 public boolean memberJoin(MemberBean mb){
  PreparedStatement pstmt=null;
  String sql3="insert into member values(?,?,?,?,?,?);";
  try {
   pstmt=conn.prepareStatement(sql3);
   pstmt.setString(1, mb.getNum());
   pstmt.setString(2, mb.getName());
   pstmt.setString(3, mb.getId());
   pstmt.setString(4, mb.getPasswd());
   pstmt.setString(5, mb.getTel());
   pstmt.setString(6, mb.getAddr());
   pstmt.executeUpdate();
   return true;
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  return false;
 }
 public boolean memberModify(MemberBean mb){
  PreparedStatement pstmt=null;
  String sql4="update member set name=?, id=?, passwd=?, tel=?, addr=? where num=?;";
  try {
   pstmt=conn.prepareStatement(sql4);   
   pstmt.setString(1, mb.getName());
   pstmt.setString(2, mb.getId());
   pstmt.setString(3, mb.getPasswd());
   pstmt.setString(4, mb.getTel());
   pstmt.setString(5, mb.getAddr());
   pstmt.setString(6, mb.getNum());
   pstmt.executeUpdate();
   return true;
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  return false;
 }
 public boolean outmember(MemberBean mb){
  PreparedStatement pstmt=null;
  String sql4="delete from member where num=?;";
  try {
   pstmt=conn.prepareStatement(sql4);   
   pstmt.setString(1, mb.getName());
   pstmt.setString(2, mb.getId());
   pstmt.setString(3, mb.getPasswd());
   pstmt.setString(4, mb.getTel());
   pstmt.setString(5, mb.getAddr());
   pstmt.setString(6, mb.getNum());
   pstmt.executeUpdate();
   return true;
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  return false;
 }
 public boolean loginCheck(String id,String passwd){
  String sql1="select * from member  where  id='kim123'";
  sql1="select * from member  where  id='"+id+"'   and  passwd='"+passwd+"'";
    String sql2="select * from member  where  id=? and passwd=?";
  //
    PreparedStatement  pstmt=null;
    ResultSet  rest=null;
    try {
   pstmt=conn.prepareStatement(sql2);
   pstmt.setString(1, id);
   pstmt.setString(2, passwd);
   rest=pstmt.executeQuery();
   if(rest.next())
   return true;
  
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  return false;
 } 
 Connection conn;
 public MemberDAO(){
  //DB에 접속하는 부분
  //driver load
  //connection
  try {
   Class.forName("com.mysql.jdbc.Driver");
   String url="jdbc:mysql://localhost:3306/mydb";
   String user="root";
   String passwd="admin";
   conn=DriverManager.getConnection(url, user, passwd);
  } catch (ClassNotFoundException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }// properties file에서 선택적으로 가져올수 있도록
            // 톰캣의web.xml에 애초에 설정하고 들어가는 방법
                                    // 현재app의 web.xml설정
  catch (SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 } 
}
==========================================================================
로그인 페이지입니다.
======== index.jsp ========================================================
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>환영합니다.</title>
</head>
<body>
 환영합니다. <%@include file="member/login.jsp" %>
</body>
</html>
======== login.jsp ========================================================
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title> Login JSP</title>
</head>
<body>
 <form action="login.do"  method="post">
 아이디:<input type="text"  name="id"><br>
 암  호:<input  type="password"  name="passwd"><br>
 <input type="submit" value="로그인">
 <input type="reset" value="취소" >
 <%-- 회원가입 버튼으로 바꾸어야함 --%>
 </form>
 <form action="member/joinmember.jsp"  method="post">
 <input type="submit" value="회원가입">
 <%-- 회원가입 버튼으로 바꾸어야함 --%>
 </form> 
</body>
</html>
======== LoginServlet.java =================================================
package member.control;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import member.model.MemberBean;
import member.model.MemberDAO;

public class LoginServlet extends HttpServlet {
 public void doPost(HttpServletRequest req,HttpServletResponse res)throws IOException,ServletException{
  //  client로부터 받은 id,passwd가 존재하는지 확인
  String id= req.getParameter("id").trim();
  String passwd=req.getParameter("passwd").trim();
  //id,passwd는 null이 아니라는 전제  
  // MemberDAO 에 id,passwd를 전달해서 결과를 통보 받은후
   MemberDAO dao=new MemberDAO();
   //필요할때마다 커넥션을 만드는 것은 좋지 않은 방법
   boolean isMember=dao.loginCheck(id, passwd);
   if(isMember){
    //멤버의 데이타를 받아옴
    MemberBean loginMember=dao.memberInfo(id);
    if(loginMember==null){
     //???
    }else{
    //로그인상태에서 로그아웃할때까지 멤버데이타 값을 기억시키고
    HttpSession  session=  req.getSession(); 
    //필요하면 언제든지 사용할 수 있도록 유지
    session.setAttribute("loginMemberData", loginMember);    
    // welcome.jsp
    //login.do 에의해서 현재서블릿이 호출된 상태
    req.getRequestDispatcher("welcome.jsp").forward(req,res);
    }
   }else {
    //loginfaile.jsp
    res.sendRedirect("member/loginfail.jsp");    
   }  
 }//doPost() end
}//class end
======== loginok.jsp ===============================================
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>loginfail</title>
</head>
<body>
 loginfail
</body>
</html>
======== logout.jsp =======================================================
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>logout</title>
</head>
<body>
 이용해 주셔서 감사합니다.<br>
 <%
  if(!session.isNew())session.invalidate();
 %>
</body>
</html>
==========================================================================
회원가입 페이지입니다.
======== joinmember.jsp ==================================================
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>JOIN MEMBER JSP</title>
</head>
<body>
 JOIN MEMBER<br> 
 <form action="../joinmember.do"  method="post">
  번호:<input type="text"  name="num"><br>
  이름:<input type="text"  name="name"><br>
  아이디:<input type="text"  name="id"><br>
  암  호:<input  type="password"  name="passwd"><br>  
  연락처:<input type="text"  name="tel"><br>
  주소:<input type="text"  name="addr"><br>
  <input type="submit" value="회원가입">
  <input type="reset" value="취소" >  
 </form> 
</body>
</html>
======== JoinMemberServlet.jsp ===========================================
package member.control;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import member.model.MemberBean;
import member.model.MemberDAO;

public class JoinMemberServlet extends HttpServlet{
 @Override
 protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
  // joinmember.jsp 값을 받는다
  MemberDAO dao=new MemberDAO();
  MemberBean mb=new MemberBean();
  mb.setNum(req.getParameter("num"));
  mb.setName(req.getParameter("name"));
  mb.setId(req.getParameter("id"));
  mb.setPasswd(req.getParameter("passwd"));
  mb.setTel(req.getParameter("tel"));
  mb.setAddr(req.getParameter("addr"));
  boolean isSuccess=dao.memberJoin(mb);
  if(isSuccess){
   HttpSession session=req.getSession();
   session.setAttribute("loginMemberData", mb);
   req.getRequestDispatcher("welcome.jsp").forward(req,res);
  }
  else {
   res.sendRedirect("member/loginfail.jsp");
  }
 } 
}
======== welcome.jsp ====================================================
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@page import="member.model.MemberBean"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Welcome jsp</title>
 <script type="text/javascript" language="javascript">
    function logout(){
     document.location="logout.jsp";
    }
 </script>
 <script type="text/javascript" language="javascript">
    function modify(){
     document.location="modify.jsp";
    }
 </script>
 <script type="text/javascript" language="javascript">
    function memberout(){
     document.location="memberout.jsp";
    }
 </script>
</head>
<body>
Welcome<br>
 <%
 MemberBean loginMember = new MemberBean();
 session = request.getSession();
 
 loginMember=
   (MemberBean)session.getAttribute("loginMemberData");
 %>

 <%=loginMember.getName() %>님 환영합니다.<br> 
 <input type="button" value="정보수정"  onclick="modify()"> 
 <input type="button" value="로그아웃"  onclick="logout()">
 <input type="button" value="회원탈퇴"  onclick="memberout()">
</body>
</html>
==========================================================================
정보수정 페이지 입니다.
======== modify.jsp =======================================================
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@page import="member.model.MemberBean"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Modify JSP</title>
</head>
<body>
 정보 수정
 <%
 session = request.getSession(); 
 MemberBean mb = new MemberBean();
 mb = (MemberBean)session.getAttribute("loginMemberData");
 %>
 <form action="modifymember.do"  method="post">
  번호:<%=mb.getNum() %><br>
  이름:<input type="text"  name="name" value = <%=mb.getName() %>><br>
  아이디:<input type="text"  name="id" value = <%=mb.getId() %>><br>
  암  호:<input  type="password"  name="passwd" value = <%=mb.getPasswd() %>><br>  
  연락처:<input type="text"  name="tel" value = <%=mb.getTel() %>><br>
  주소:<input type="text"  name="addr" value = <%=mb.getAddr() %>><br>
  <input type="submit" value="완료">
  <input type="reset" value="취소" >  
 </form> 
</body>
</html>
======== ModifyMemberServlet.java =======================================
package member.control;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import member.model.MemberBean;
import member.model.MemberDAO;

public class ModifyMemberServlet extends HttpServlet{
 @Override
 protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
  MemberDAO dao=new MemberDAO();
  MemberBean mb=new MemberBean();
  mb.setNum(req.getParameter("num"));
  mb.setName(req.getParameter("name"));
  mb.setId(req.getParameter("id"));
  mb.setPasswd(req.getParameter("passwd"));
  mb.setTel(req.getParameter("tel"));
  mb.setAddr(req.getParameter("addr"));
  boolean isSuccess=dao.memberModify(mb);
  if(isSuccess){
   HttpSession  session=  req.getSession();
   session.setAttribute("loginMemberData", mb);
   req.getRequestDispatcher("modifyok.jsp").forward(req,res);
  }else{   
   // 센드 리다이렉트로 처리한다.
   res.sendRedirect("modifyfail.jsp");
  }   
 } 
}
=== modifyok.jsp & modifyfail.jsp 는 텍스트 파일이라 올리지 않습니다. ========
==========================================================================
회원탈퇴페이지입니다.
======== memberout.jsp ==================================================
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@page import="member.model.MemberDAO"%>
<%@page import="member.model.MemberBean"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Memberout JSP</title>
</head>
<body>
 아래의 정보를 삭제하시겠습니까?
 <% 
 MemberBean mb=(MemberBean)session.getAttribute("loginMemberData"); 
 %>
 <form action="outmember.do"  method="post">
  번호:<%=mb.getNum() %><br>
  이름:<%=mb.getName() %><br>
  아이디:<%=mb.getId() %><br>
  암  호:<%=mb.getPasswd() %><br>  
  연락처:<%=mb.getTel() %><br>
  주소:<%=mb.getAddr() %><br>
  <input type="submit" value="회원탈퇴">
 </form>
</body>
</html>
======== OutMemberServlet.jsp ============================================
package member.control;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import member.model.MemberBean;
import member.model.MemberDAO;

public class OutMemberServlet extends HttpServlet {
 @Override
 protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
  MemberDAO dao=new MemberDAO();
  MemberBean mb=new MemberBean();
  mb.setNum(req.getParameter("num"));
  mb.setName(req.getParameter("name"));
  mb.setId(req.getParameter("id"));
  mb.setPasswd(req.getParameter("passwd"));
  mb.setTel(req.getParameter("tel"));
  mb.setAddr(req.getParameter("addr"));
  boolean isSuccess=dao.memberModify(mb);
  if(isSuccess){
   HttpSession  session=  req.getSession();
   session.setAttribute("loginMemberData", mb);
   req.getRequestDispatcher("outmemberok.jsp").forward(req,res);
  }else{   
   // 센드 리다이렉트로 처리한다.
   res.sendRedirect("outmemberfail.jsp");
  }
 }
}
==========================================================================
아이디 제한 등 예외처리는 별도의 클래스를 만들어서 처리할 계획입니다.
==========================================================================

2008. 9. 23. 15:54

[0923]jspBean, forward, include

멤버 필드에 있는 값은 초기화 되어 사용된다.
boolean은 false 값으로 상수형은 0값으로 문자형은 null 값으로

아래의 예제는 클라이언트가 페이지를 호출할 때 값이 어떻게 변하는지 보여준다.
init() 메서드의 a 값은 처음에 한번 불려지는데 이 값은 static한 멤버필드가 되어
은행의 이율처럼 인스턴스가 생성되기 전부터 고정적인 상수 값을 가지게 되며,
b값은 클라이언트가 브라우져를 호출할때마다 값이 갱신되며,
c값은 클라이언트가 어떤 값을 입력할때마다 그 값이 변경된다.
======== mem.jsp ========================================================
======== http://localhost:9090/Test0923/mem.jsp?c=10======================
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
 <%!
 int a;
 int b;
 %>
 <%!
 @Override
 public void init(){
  a++;  
 }
 %>
 <%
 int c=Integer.parseInt(request.getParameter("c"));
 b++;
 %>
 <%="a = "+a%><br>
 <%="b = "+b%><br>
 <%="c = "+c%><br>
</body>
</html>
======== foo.MemberFieldTestServlet.java =================================
= http://localhost:9090/Test0923/servlet/foo.MemberFieldTestServlet.jsp?c=50 =
package foo;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MemberFieldTestServlet extends HttpServlet{
 int a;
 int b;
 @Override
 protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
  b++;
  int c=0;
  c=Integer.parseInt(req.getParameter("c"));
  System.err.println("doGet() a :"+a+"<br>");
  System.err.println("doGet() b :"+b+"<br>");
  System.err.println("doGet() c :"+c+"<br>");
  PrintWriter out=res.getWriter();
  out.println("doGet() a :"+a+"<br>");
  out.println("doGet() b :"+b+"<br>");
  out.println("doGet() c :"+c+"<br>");
 }// doGet end
 @Override
 public void init() throws ServletException {
  a++;
  System.err.println("init :"+a);
 }// init() end
}// class end
=========================================================================
아래 예제는 에러가 발생했을때 에러페이지로 이동하라는 소스가 담겨 있다.
======== test1.jsp ========================================================
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<%@page errorPage="errPage.jsp" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
 <%
 int a=4/0;
 %>
</body>
</html>
======== errPage.jsp ====================================================
=== 주의 사항 : 에러페이지의 내용이 너무 짧으면 에러 처리가 안 될 수도 있다.=
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
    <%@page isErrorPage="true" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
 Error Handling Page<br>
 <%
 out.print("Exception : "+exception.getClass().getName()+"<br>");
 %>
</body>
</html>
=========================================================================
useBean을 이용한 예와 그렇지 않은 경우 소스를 비교해 본다.
======== test2.jsp ========================================================
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@page import="mem.MemberBean"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
 <%
 MemberBean mem1=new MemberBean();
 session.setAttribute("mem1",mem1);
 mem1.setName("이강국");
 out.print(mem1.getName()+"<br>");
 %>
 <jsp:useBean id="mem2" class="mem.MemberBean" scope="session" />
 <jsp:setProperty name="mem2" property="name" value="김강국" />
 <jsp:getProperty name="mem2" property="name"/><br>
</body>
</html>
======== mem.MemberBean ===============================================
package mem;
public class MemberBean {
 protected String num;
 protected String name;
 protected String id;
 protected String passwd;
 protected String tel;
 protected String add;
 public String getAdd() {
  return add;
 }
 public void setAdd(String add) {
  this.add = add;
 }
 public String getId() {
  return id;
 }
 public void setId(String id) {
  this.id = id;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public String getNum() {
  return num;
 }
 public void setNum(String num) {
  this.num = num;
 }
 public String getPasswd() {
  return passwd;
 }
 public void setPasswd(String passwd) {
  this.passwd = passwd;
 }
 public String getTel() {
  return tel;
 }
 public void setTel(String tel) {
  this.tel = tel;
 }
}
=========================================================================
자바빈을 이용한 두번째 예제 폼에서 데이터를 입력 받아 출력
======== test3call.jsp ====================================================
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
 <form action="test3.jsp">
 번호 : <input type="text" name="num"><br>
 이름 : <input type="text" name="name"><br>
 아이디 : <input type="text" name="id"><br>
 비밀번호 : <input type="password" name="passwd"><br>
 연락처 : <input type="text" name="tel"><br>
 주소 : <input type="text" name="add"><br>
 <input type="submit" value="전송">
 <input type="reset" value="취소">
 </form>
</body>
</html>
======== test3.jsp ========================================================
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@page import="mem.MemberBean"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
 <%
 MemberBean mem11=new MemberBean();
 mem11.setNum(request.getParameter("num").trim());
 mem11.setName(request.getParameter("name").trim());
 mem11.setId(request.getParameter("id").trim());
 mem11.setPasswd(request.getParameter("passwd").trim());
 mem11.setTel(request.getParameter("tel").trim());
 mem11.setAdd(request.getParameter("add").trim());
 %>
 <jsp:useBean id="mem22" class="mem.MemberBean"/>
 <jsp:setProperty name="mem22" property="*"/>
 <jsp:getProperty name="mem22" property="name"/><br>
 mem22.getAdd()==<%=mem22.getAdd()%><br>
 mem11.getAdd()==<%=mem11.getAdd()%><br>
</body>
</html>
=========================================================================
include와 forward를 이용한 정적, 동적 데이터 호출에 관한 예
test4include.jsp 와 test4_1include.jsp를 호출했을때의 차이점
include "test4_1include.jsp" 호출이 되지 않는다. ㅡㅡ;
forward를 호출했을 경우 앞의 include는 무시된다.
======== test4.jsp ========================================================
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
 test4.jsp start<br>
 <%
 int c=50;
 %>
 <%@include file="test4include.jsp" %>
 test4.jsp end<br>
 동적으로 부를수 있는가?<br>
 <jsp:include flush="true" page="test4_1include.jsp" >
 <jsp:param name="d" value="이강국" />
 </jsp:include>
</body>
</html>
======== test4include.jsp =================================================
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <%
 int a=40;
 int b=a*c;
 out.print(a+"*"+c+"="+b);
 %>
======== test4_1include.jsp ===============================================
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <%
 int c=3;
 int a=40;
 int b=a*c;
 request.setCharacterEncoding("EUC=KR");
 out.print(a+"*"+c+"="+b+request.getParameter("d"));
 %>
======== test4_2.jsp ======================================================
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
 forward file
</body>
</html>
======== test4forward.jsp ================================================
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
 test4.jsp start<br>
 <%
 int c=50;
 %>
 <%@include file="test4include.jsp" %>
 test4.jsp end<br>
 동적으로 부를수 있는가?<br>
 <jsp:forward page="test4forward.jsp"/>
</body>
</html>
=========================================================================

2008. 9. 17. 17:52

Chap 1. 서블릿과 JSP는 어디에 쓰는 물건인고?

학습 목표 : GET, POST 등 HTTP 메소드에 대해 장점과 기능을 알아봅시다.

GET 는 서버로부터 뭔가를 돌려 받는다고 생각하시면 됩니다.
GET 메소드는 폼 데이터를 URL 뒤에 추가합니다.
POST는 서버에게 자원을 요청할 때 필요한 정보를 함께 넘겨줍니다.
POST 메소드는 요청의 몸체(body)에 폼 데이터를 포함합니다.

사용자 삽입 이미지
사용자 삽입 이미지

MINE 타입은 브라우저에게 어떤 종류의 데이터를 받을 것이라는 정보를 미리 알려주어, 브라우저가 데이터를 어떻게 다룰지 준비하도록 합니다.


'수업 > Head First Servlets & JSP' 카테고리의 다른 글

로그인, 회원가입, 정보수정, 탈퇴  (2) 2008.09.26
[0923]jspBean, forward, include  (0) 2008.09.23
2008. 9. 11. 18:18

[기타] 성적 처리 프로그램 - 포스팅 중

학생의 번호, 이름, 국어, 영어, 수학 점수를 입력 받아 총점, 평균, 등급(A~F), 랭킹을 구하시오.
설계 과정
1. 기본값 출력 테스트
각 필드의 변수명을 정하고 출력 되는지 확인한다.
2. 변수 입력 받은 후 출력
입력 받은 변수명을 연산하고 출력한다.
3. 유효성 검사
유효하지 않은 값과 입력 시, 에러를 해결한다.
4. (1~3까지의 1명의 성적을 처리했다면) 여러 명의 점수를 입력 받아서 처리한다.
5. Swing로 대체한다.
===========1. 기본값 출력 테스트 ===================================================
===============================
Score.java
package scorecalc;
public class Score {
 protected int num;
 protected String name;
 protected int kor;
 protected int eng;
 protected int math;
 protected int total;
 protected double avg;
 protected char grade='*';
 protected int rank;
 public void outPut(){
  System.out.println(num+" "+name+" "+kor+" "+eng+" "+math+" "+total+" "+avg+" "+grade+" "+rank);
 }
 public void titlePrint(){
  System.out.println("번호"+" "+"이름"+" "+"국어"+" "+"영어"+" "+"수학"+" "+"총점"+" "+"평균"+" "+"등급"+" "+"랭킹");
 }
}
===========================================
ScoreMain.java
package scorecalc;
public class ScoreMain {
 public static void main(String[] args) {
  Score sc = new Score();
  sc.titlePrint();
  sc.outPut();
 }
}
===========2. 변수를 입력 받은 후 출력 ==============================================
=======================
Score.java
package scorecalc;
public class Score {
 protected int num;
 protected String name;
 protected int kor;
 protected int eng;
 protected int math;
 protected int total;
 protected double avg;
 protected char grade='*';
 protected int rank;
}
=======================
ScoreIO.java
package scorecalc;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class ScoreIO extends Score{
 public void outPut(){
  System.out.println(num+" "+name+" "+kor+" "+eng+" "+math+" "+total+" "+avg+" "+grade+" "+rank);
 }
 public void titlePrint(){
  System.out.println("성적처리를 시작합니다.");
  System.out.println("번호"+" "+"이름"+" "+"국어"+" "+"영어"+" "+"수학"+" "+"총점"+" "+"평균"+" "+"등급"+" "+"랭킹");
 }
 public void standInput() throws IOException {
  BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  System.out.println("번호를 입력하세요.");
  num = Integer.parseInt(br.readLine().trim());
  System.out.println("이름을 입력하세요.");
  name = br.readLine().trim();
  System.out.println("국어점수를 입력하세요.");
  kor = Integer.parseInt(br.readLine().trim());
  System.out.println("영어점수를 입력하세요.");
  eng = Integer.parseInt(br.readLine().trim());
  System.out.println("수학점수를 입력하세요.");
  math = Integer.parseInt(br.readLine().trim());
  calc();
 }
 public void calc(){
  total = kor + eng + math;
  avg = (double)total/3.;
  if(avg>100 || avg <0)grade='*';  
  else if(avg>=90)grade='A';
  else if(avg>=80)grade='B';
  else if(avg>=70)grade='C';
  else if(avg>=60)grade='D';
  else grade='F';
 }
}
=======================
ScoreMain.java
package scorecalc;
import java.io.IOException;
public class ScoreMain {
 public static void main(String[] args) throws IOException {
  ScoreIO sc = new ScoreIO();
  sc.standInput();
  sc.titlePrint();
  sc.outPut();
 }
}
============ 3. 유효성 검사 ========================================================
유효성 검사를 위해서 별도의 메서드(inputCheck)를 만들어 ScoreIO.java 파일의 standInput() 메서드를 다시 기술한다.
파일명 ScoreIO.java

protected void standInput() throws IOException {
  BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  num = inputCheck("번호?", br);
  System.out.println("이름을 입력하세요."); // 이름은 String형이므로 inputCheck에서 제외
  name = br.readLine().trim();
  kor = inputCheck("국어?",br);
  eng = inputCheck("영어",br);
  math = inputCheck("수학?", br);
  calc();
 }
 private int inputCheck(String str, BufferedReader br) throws IOException{
  System.out.println(str);
  int temp=-1;
  try {
   temp=Integer.parseInt(br.readLine().trim());
   if(str.startsWith("번호")) return temp;
   else if (temp>=0 && temp<=100) return temp;
  } catch (NumberFormatException e) {
   System.out.println("숫자를 다시 입력 해 보세요");
  }
  temp=inputCheck(str,br);
  return temp;    
 }
=============== 4. 여러명 처리 =====================================================
여러명의 데이터를 입력 받아 처리하기 위해 ArrayList로 처리한다.
파일명 ScoreArray.java
package scorecalc;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
public class ScoreArray {
 private ArrayList<Score> stus = new ArrayList<Score>();
 public void init(){
  stus.add(new Score());
  BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
  System.out.println("추가로 입력? y/n");
  try {
   String yn=br.readLine().trim();
   if(yn.equalsIgnoreCase("y")) init();
   else {
    Collections.sort(stus);
    output();
   }
  } catch (IOException e) {
   e.printStackTrace();
  }
 }
 public void output(){
  if(stus==null || stus.size()==0){
   System.out.println("출력할 자료가 없음");
   return;
  }
  for(Score s:stus)
   s.output();
  /*for(int i=0;i<stus.size();i++){ // for문 해석문
   stus.get(i).outPut();
  }*/
 }
}
==========================
파일명 ScoreArrayUse.java
package scorecalc;
public class ScoreArrayUse {
 public static void main(String[] args) {
  ScoreArray stus=new ScoreArray();
  stus.init();
 }
}
============ 5. Swing으로 화면 연결 ================================================
===================================================================================
===================================================================================
===================================================================================
===================================================================================
===================================================================================
===================================================================================
===================================================================================


2008. 8. 29. 16:02

Chap 14. 뷰

뷰(view)는 물리적인 테이블에 근거한 논리적인 가상테이블이다.
실질적으로 데이터를 저장하고 있지 않지만 실제 테이블을 사용하는 것과 동일하게 뷰를 사용하여 테이블을 관리할 수 있다.
뷰는 반복적으로 쿼리를 날리는 것을 방지하기 위해서 사용된다.

뷰의 기본형식
create view view_name
as
select_statement

=========== 30번 부서에 소속된 사원들의 사번 및 이름 출력==================
create view emp_view30
as
select empno, ename, deptno
from emp_cp01
where deptno=30;

desc emp_view30; // 뷰의 구조 보기
select * from emp_view30; // emp_view30 내용 보기
======================================================================
================= insert 문으로 뷰에 행을 추가하기 =========================
insert into emp_view30
values(1111, 'AAAA',30);
select * from emp_view30; // view에 데이터가 추가된 것을 확인할 수 있다.
select * from emp_cp01; // emp_cp01에 데이터가 추가된 것을 확인할 수 있다.
=====================================================================

뷰의 종류
단순 뷰 : 하나의 테이블에 의해 정의한 뷰
새로 생성되는 뷰에 대해 컬럼명을 제시하지 않으면 기본테이블의 컬럼명을 상속 받는다.
================= insert 문으로 뷰에 행을 추가하기 ====================
create view dept_sum
as
select deptno, sum(sal) sum_sal
// 함수를 사용할 경우 반드시 별칭을 반드시 지정해야 한다.
from emp_cp01
group by deptno;
==================================================================

복합 뷰 : 두 개 이상의 기본 테이블에 의해 정의한 뷰
================= 사번과 이름 부서명을 복합뷰로 검색 =================
create view emp_view_join
as
select e.empno, e.ename, d.dname
from emp e, dept d
where e.deptno=d.deptno;
select * from emp_view_join;
=====================================================================

뷰의 제거
drop view view_name
뷰의 변경
create or replace view view_name
select_statement
2008. 8. 28. 14:18

Part 6. AWT - IV 입력관련 이벤트 처리

입력 관련 이벤트 처리에서 인터페이스의 구현과 Adapter 클래스의 구현을 알아보도록 합니다. 아래는 샘플 코드입니다.
입력은 KeyEvent와 MouseEvent로 나누어 볼 수 있습니다.
===================================================================================
package pack02;
import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
class FrameTest extends Frame{
 FrameTest(){
  setSize(300,200);
  setVisible(true);
  addWindowListener(new WindowAdapter(){
   @Override
   public void windowClosing(WindowEvent arg0) {
    dispose();
    System.exit(0);
   }      
  }
  );
 }
}
public class Ex01 {
 public static void main(String[] args) {
  new FrameTest();
 }
}
===================================================================================
KeyListener 인터페이스를 통한 구현
인터페이스를 implements 하므로 인터페이스의 모든 추상메소드를 오버라이딩 해야 한다.
===================================================================================
package pack01;
import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
// 이벤트 처리를 위해서 이벤트 소스를 포함한 클래스를 이벤트 처리 객체로 만들어 준다.
class FrameTest extends Frame implements KeyListener{
 public void keyPressed(KeyEvent e) {
  ta.append(e.getKeyChar()+"가 눌림\n");
  //ta.append((String)e.getKeyChar());
  // 소스가 에러를 일으키는 이유 : 기본형 char를 String로 캐스팅 하지 못한다.
 }
 public void keyReleased(KeyEvent e) {
 }
 public void keyTyped(KeyEvent e) {
 }
 TextField txt; // 이벤트 소스
 TextArea ta;
 FrameTest(){
  add(txt=new TextField(20), BorderLayout.NORTH);
  // 이벤트 소스와 이벤트 처리 객체를 연결
  txt.addKeyListener(this);
  add(ta=new TextArea(5,2), BorderLayout.CENTER);
  setSize(300,200);
  setVisible(true);
  addWindowListener(new WindowAdapter(){
   @Override
   public void windowClosing(WindowEvent arg0) {
    dispose();
    System.exit(0);
   }      
  }
  );
 }
}
public class Ex01 {
 public static void main(String[] args) {
  new FrameTest();
 }
}
===================================================================================
KeyAdapter 클래스를 통한 구현
어댑터 클래스를 내부 무명객체로 생성하여 이벤트 처리 하기
클래스를 불러오므로 원하는 메소드만 오버라이딩 하면 된다.
===================================================================================
package pack02;
import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
class FrameTest extends Frame{
 TextField txt;
 TextArea ta;
 FrameTest(){
  add(txt=new TextField(20), BorderLayout.NORTH);
  // 객체 생성하면서 클래스 설계 - 무명 클래스
  // 어댑터 클래스를 내부 무명객체로 생성하여 이벤트 처리해보기
  txt.addKeyListener(
    new KeyAdapter(){
     @Override
     public void keyPressed(KeyEvent e) {
      ta.append(e.getKeyChar()+"가 눌림\n");
     }    
    }
  );
  add(ta=new TextArea(5,2), BorderLayout.CENTER);
  setSize(300,200);
  setVisible(true);  
  addWindowListener(new WindowAdapter(){
   @Override
   public void windowClosing(WindowEvent arg0) {
    dispose();
    System.exit(0);
   }      
  }
  );
 }
}
public class Ex01 {
 public static void main(String[] args) {
  new FrameTest();
 }
}
===================================================================================
MouseListener 인터페이스를 통한 구형 - 마우스를 클릭하면 점 이동하기
===================================================================================
package pack03;
import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
class FrameTest extends Frame implements MouseListener{
 public void mouseClicked(MouseEvent e) {
  x=e.getX(); y=e.getY();
  repaint();
 }
 public void mouseEntered(MouseEvent e) {
 }
 public void mouseExited(MouseEvent e) {
 }
 public void mousePressed(MouseEvent e) {
 }
 public void mouseReleased(MouseEvent e) {
 }
 int x=10, y=100;
 @Override
 // 이벤트에 의해서 호출되는 메서드
 public void paint(Graphics g) {
  g.setColor(new Color(250,0,250));
  g.fillOval(x, y, 20, 20);
 }
 FrameTest(){
  addMouseListener(this);
  setSize(300,200);
  setVisible(true);
  addWindowListener(new WindowAdapter(){
   @Override
   public void windowClosing(WindowEvent arg0) {
    dispose();
    System.exit(0);
   }      
  }
  );
 }
}
public class Ex01 {
 public static void main(String[] args) {
  new FrameTest();
 }
}
===================================================================================
MouseAdapter 클래스를 통한 구형 - 마우스를 클릭하면 점 이동하기
===================================================================================
package pack04;
import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
class FrameTest extends Frame{
 int x=10, y=100;
 @Override
 public void paint(Graphics g) {
  g.setColor(new Color(250,0,250));
  g.fillOval(x, y, 20, 20);
 }
 FrameTest(){
  // 어댑터 클래스를 내부 무명객체로 생성하여 이벤트 처리해보기
  addMouseListener(new MouseAdapter(){
   @Override
   public void mouseClicked(MouseEvent e) {
    x=e.getX(); y=e.getY();
    repaint();
   }  
  }
  );
  setSize(300,200);
  setVisible(true);
  addWindowListener(new WindowAdapter(){
   @Override
   public void windowClosing(WindowEvent arg0) {
    dispose();
    System.exit(0);
   }      
  }
  );
 }
}
public class Ex01 {
 public static void main(String[] args) {
  new FrameTest();
 }
}
===================================================================================
MouseMotionListener 인터페이스를 통한 구현 - 드래그 시, 점 이동
===================================================================================
package pack05;
import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
class FrameTest extends Frame implements MouseMotionListener{
 public void mouseDragged(MouseEvent e) {
  x=e.getX(); y=e.getY();
  repaint();
 }
 public void mouseMoved(MouseEvent e) {
 }
 int x=10, y=50;
 @Override
 public void paint(Graphics g) {
  addMouseMotionListener(this);
  g.setColor(Color.RED);
  g.fillOval(x,y,20,20);
 }
 FrameTest(){
  setSize(300,200);
  setVisible(true);
  addWindowListener(new WindowAdapter(){
   @Override
   public void windowClosing(WindowEvent arg0) {
    dispose();
    System.exit(0);
   }      
  }
  );
 }
}
public class Ex01 {
 public static void main(String[] args) {
  new FrameTest();
 }
}
===================================================================================
MouseMotionAdapter 클래스를 통한 구현 - 드래그 시, 점 이동
===================================================================================
package pack06;
import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
class FrameTest extends Frame{
 int x=10, y=50;
 @Override
 public void paint(Graphics g) {
  g.setColor(Color.RED);
  g.fillOval(x,y,20,20);
 }
 FrameTest(){
  // 어댑터 클래스를 내부 무명객체로 생성하여 이벤트 처리해보기
  addMouseMotionListener(new MouseMotionAdapter(){
   @Override
   public void mouseDragged(MouseEvent e) {
    x=e.getX(); y=e.getY();
    repaint();
   }  
  }
  );
  setSize(300,200);
  setVisible(true);
  addWindowListener(new WindowAdapter(){
   @Override
   public void windowClosing(WindowEvent arg0) {
    dispose();
    System.exit(0);
   }      
  }
  );
 }
}
public class Ex01 {
 public static void main(String[] args) {
  new FrameTest();
 }
}
===================================================================================
2008. 8. 27. 17:55

Chap 13. 무결성 제약 조건

데이터 무결성 제약 조건(data integrity constraint rule) 이란 테이블에 부적절한 자료가 입력되는 것을 방지하기 위해서 테이블을 생성할 때 각 컬럼에 대해서 정의하는 여러가지 규칙을 말합니다.
데이터 무결성 제약 조건은 데이터베이스 설계 단계에서 데이터의 정확성을 유지하기 위해서 다양한 규칙을 고려하여 테이블을 생성할 때 표현하게 됩니다.

무결성 제약 조건

역할

NOT NULL

해당 컬럼 값으로 NULL을 허용하지 않음

UNIQUE

테이블 내에서 해당 컬럼 값은 항상 유일무이한 값을 가질 것

PRIMARY KEY

해당 컬럼 값은 반드시 존재해야 하고 유일해야 한다는 조건
즉, NOT NULL 조건과 UNIQUE 조건을 결합한 형태

FOREIGN KEY

해당 컬럼의 값이 타컬럼의 값을 참조해야만 함
즉, 참조되는 컬럼에 없는 값은 입력 불가함

CHECK

해당 컬럼에 저장 가능한 데이터 값의 범위나 사용자 조건을 지정


기본 키(PRIMARY KEY) 제약 조건 : 기본 키는 테이블 내의 해당 행을 다른 행과 구분할 수 있도록 하는 식별 기능을 가진 가장 대표적인 컬럼으로 NULL 값이나 중복되는 값을 가질 수 없습니다.

무결성 제약 조건에는 컬럼 레벨 정의 방법과 테이블 레벨 정의 방법이 있습니다.
컬럼 레벨 정의 방법은 아래에서 보듯이 테이블을 정의할 때 컬럼내에서 제약조건(기본키)을 정의하는 것을 말합니다.
create table dept02
(deptno number(2) constraint dept02_deptno_pk primary key,
dname varchar2(15),
loc varchar2(15));
일반적으로 제약조건을 지정할 때는 constraint dept02_deptno_pk 제약조건 테이블명_컬럼명_제약조건 유형 의 형태로 기술합니다.

테이블 레벨 정의 방법은 주로 하나의 컬럼에 여러개의 제약조건을 부여할 경우 사용되며
아래에서 보듯이 컬럼 정의를 먼저 내리고 따로 생성된 컬럼에 대한 제약조건을 지정하는 것을 말합니다.
이때 주의하실 사항은 not null 조건은 테이블 레벨 정의 방법으로는 지정할 수 없습니다. 
create table dept02
(deptno number(02),
dname varchar2(15),
loc varchar(15),
constraint dept02_deptno_pk primary key(deptno));

제약 조건 확인하기
select constraint_name, constraint_table from user_constraints;
// 해당 유저의 제약조건을 전부 검색

제약 조건 변경하기
조건 변경은 이미 생성된 테이블을 변경하는 것이므로 alter table 문을 이용해야 합니다.

제약조건 추가 시
alter table dept02
add constraint dept03_deptno_fk foreign key(deptno);
제약 조건 제거 시
alter table dept02
drop constraint dept03_deptno_fk ;

제약 조건 타입

constraint_type

의미

P

PRIMARY KEY

R

FOREIGN KEY

U

UNIQUE

C

CHECK, NOT NULL


부모 테이블과 자식 테이블
주체가 되는 테이블을 부모 테이블이라 하며 관계가 능동형으로 표현된다
주체 관계가 모호한 경우에는 어느 테이블의 데이터가 먼저 정의되어야 하는가를 기준으로 부모테이블과 자식테이블을 나눈다.

부자관계의 테이블에서는 부모테이블의 기본키가 자식테이블의 외래키가 되어야한다.
2008. 8. 27. 16:39

Chap 11. 트랜잭션 관리

트랜잭션(transaction)이란 SQL 명령문들을 하나의 논리적인 작업 단위로 처리하는 것을 말하며, 데이터의 일관성을 유지하면서 안정적으로 데이터를 복구시키기 위해 도입되었다.
트랜잭션은 하나 또는 여러개의 DML(Data Manipulation Language)명령 (INSERT, UPDATE, DELETE)을 모두 묶어 놓은 하나의 논리적인 작업 단위를 의미합니다.

트랜잭션 제어를 위한 명령어에는
COMMIT : 트랜잭션이 발생하는 경우 새롭게 생성되거나 갱신된 데이터들이 물리적으로 영구히 저장되는 것을 의미합니다.
일단 COMMIT이 실행되면 다시 복구할 수 있는 방법은 없습니다.
ROLLBACK : 이전 상태로 다시 돌아가도록 함으로서 지금까지 수행했던 데이터베이스의 변경을 모두 무효화하겠다는 의미를 갖습니다.
즉, DML 트랜잭션이 실행되고 나서 DML 트랜잭션이 COMMIT 되기 전에는 언제든지 트랜잭션이 발생하기 전 상태로 되돌아갈 수 있습니다.
SAVEPOINT : 여러 개의 SQL문의 실행을 수반하는 트랜잭션의 경우, 사용자가 트랜잭션 중간 단계에서 세이브포인트를 지정할 수 있으며, 세이브포인트는 롤백과 함께 사용해서 현재 트랜잭션 내의 특정 세이브포인트까지 롤백합니다.

자동 커밋 : DDL(Data Definition Language - CREATE, ALTER, DROP, RENAME, TRUNCATE)문은 자동으로 COMMIT이 발생합니다.
DDL문은 실행 중에 에러가 발생하여 제대로 실행되지 않았어도 자동으로 COMMIT이 실행됩니다.

특정 세이브포인트까지 작업을 되돌릴 때의 유의 사항
(세이브포인트)
 A           B           C           D
--------------------------------------------
| IUD        |    IU     |    IUN    |     IU     |
--------------------------------------------
                           <---------------------

C 지점으로 롤백하기 위해서 다음과 같은 문장을 실행합니다.
SQL>ROLLBACK TO  C;
그 후에 D지점으로 롤백하기 위해서 다음과 같은 문장을 실행한다면 어떻게 될까요?
SQL>ROLLBACK TO  D;
D지점으로 롤백 하는 명령어는 실행할 수 없습니다. ROLLBACK TO  C;를 수행함으로써 그 다음 세이브포인트인 D의 위치도 사라지기 때문입니다.

2008. 8. 27. 16:19

Part 6. AWT - III 윈도우창에 메뉴바와 메뉴 만들기

===================================================================================
CardLayout을 통한 메인
===================================================================================
package pack01;
import java.awt.CardLayout;
import java.awt.Frame;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
class FrameTest extends Frame implements ActionListener{
 CardLayout card;
 MenuItem mi01, mi02, mi03, mi04, mi05;
 public void actionPerformed(ActionEvent e) {
  Object menu=e.getSource();
  if(menu == mi01 || menu == mi02 || menu == mi03 ){
  card.show(this, e.getActionCommand());
  }
  else if(menu==mi04){
   CalcDialog dlg=new CalcDialog();
  }
  else if(menu==mi05){
   AboutDialog adlg=new AboutDialog(this);
  }
 }
 FrameTest(){
  card=new CardLayout();
  Panel p01=new CusPanel();
  Panel p02=new VideoPanel();
  Panel p03=new RentPanel();  
  // 패널을 프레임에 추가하되 배치관리자가 CardLayout일 경우에는 이름을 주어야 한다.
  setLayout(card);
  add(p01,"고객 관리");
  add(p02,"비디오 관리");
  add(p03,"대여 관리");  
  card.show(this, "대여관리");
  MenuBar mb=new MenuBar();
  setMenuBar(mb);  
  Menu m01=new Menu("비디오 대여관리");
  mb.add(m01);
  Menu m02=new Menu("도움말");
  mb.add(m02);
  mi01=new MenuItem("고객 관리");
  m01.add(mi01);
  mi02=new MenuItem("비디오 관리");
  m01.add(mi02);
  mi03=new MenuItem("대여 관리");
  m01.add(mi03);
  mi04=new MenuItem("계산기");
  m02.add(mi04);
  mi05=new MenuItem("about 비디오관리");  
  m02.add(mi05);
  mi01.addActionListener(this);
  mi02.addActionListener(this);
  mi03.addActionListener(this);
  mi04.addActionListener(this);
  mi05.addActionListener(this);
  setSize(300,200);
  setVisible(true);
  addWindowListener(new WindowAdapter(){
   @Override
   public void windowClosing(WindowEvent arg0) {
    dispose();
    System.exit(0);
   }      
  }
  );
 }
}
public class Ex01 {
 public static void main(String[] args) {
  new FrameTest();
 }
}
===================================================================================
고객관리 CusPanel.java, 비디오관리 VideoPanel, 대여관리 RentPanel
===================================================================================
package pack01;
import java.awt.Label;
import java.awt.Panel;
public class CusPanel extends Panel {
 CusPanel(){
  add(new Label("고객 관리"));
 }
}

package pack01;
import java.awt.Label;
import java.awt.Panel;
public class VideoPanel extends Panel{
 VideoPanel(){
 add(new Label("비디오 관리"));
 }
}

package pack01;
import java.awt.Label;
import java.awt.Panel;
public class RentPanel extends Panel{
 RentPanel(){
  add(new Label("대여관리"));
 }
}
===================================================================================
도움말 메뉴 - 계산기
===================================================================================
package pack01;
import java.awt.Dialog;
import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class CalcDialog extends Dialog {
 CalcDialog(){
  super(new Frame());
  setSize(200,100);
  setVisible(true);
  addWindowListener(new WindowAdapter(){
   @Override
   public void windowClosing(WindowEvent e) {
    dispose();
   }  
  }
  );
 }
}
===================================================================================
도움말 메뉴 - about 비디오관리
===================================================================================
package pack01;
import java.awt.Dialog;
import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class AboutDialog extends Dialog {
 FrameTest fe;
 public AboutDialog(FrameTest fe) {
  super(fe);
  this.fe = fe;
  setSize(200,100);
  setVisible(true);
  addWindowListener(new WindowAdapter(){
   @Override
   public void windowClosing(WindowEvent e) {
    dispose();
   }  
  }
  );
 }
}
===================================================================================
2008. 8. 27. 15:25

Part 6. AWT - II 컴포넌트의 이벤트 처리(2)

===================================================================================
라디오 버튼 세 개를 만들고 이벤트 발생 시, 배경색을 변경하는 소스
===================================================================================
package training;
import java.awt.Checkbox;
import java.awt.CheckboxGroup;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
class FrameTest extends Frame implements ItemListener {
 public void itemStateChanged(ItemEvent e) {
  this.setTitle((String)e.getItem());
  // 현재 이벤트를 받은 라디오 버튼을 구분해서 프레임의 배경색을 변경하시오.
  if(e.getSource()==c1){
   setBackground(Color.RED);
  }
  else if(e.getSource()==c2){
   setBackground(Color.GREEN);
  }
  else if(e.getSource()==c3){
   setBackground(Color.BLUE);
  }
 }
 CheckboxGroup colorGp=new CheckboxGroup();
 Checkbox c1,c2,c3;
 FrameTest(){
  setLayout(new FlowLayout());
  add(c1=new Checkbox("빨강",colorGp,false));
  add(c2=new Checkbox("초록",colorGp,false));
  add(c3=new Checkbox("파랑",colorGp,false));
  c1.addItemListener(this);
  c2.addItemListener(this);
  c3.addItemListener(this);  
  setSize(300,200);
  setVisible(true);
  addWindowListener(new WindowAdapter(){
   @Override
   public void windowClosing(WindowEvent e) {
    dispose();
    System.exit(0);
   }      
  }
  );
 }
}
public class Ex01 {
 public static void main(String[] args) {
  new FrameTest();
 }
}

===================================================================================
선택 컴포넌트와 아이템 이벤트
===================================================================================
package pack02;
import java.awt.BorderLayout;
import java.awt.List;
import java.awt.Frame;
import java.awt.TextArea;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
class FrameTest extends Frame implements ItemListener{
 public void itemStateChanged(ItemEvent e) {
  // 현재 선택된 이벤트 소스를 얻어옴
  Object o=e.getSource();
  List li=(List) o;
  ta.append(li.getSelectedItem()+"\n");  
 }
 List list;
 TextArea ta;
 FrameTest(){
  add(list=new List(), BorderLayout.NORTH);
  list.addItemListener(this);
  add(ta=new TextArea(), BorderLayout.CENTER);
  list.add("사과"); list.add("바나나");
  list.add("오렌지"); list.add("파인애플");
  list.add("토마토"); list.add("키위");
  pack();
  setVisible(true);
  addWindowListener(new WindowAdapter(){
   @Override
   public void windowClosing(WindowEvent arg0) {
    dispose();
    System.exit(0);
   }      
  }
  );
 }
}
public class Ex01 {
 public static void main(String[] args) {
  new FrameTest();
 }
}
===================================================================================
리스트 컴포넌트와 아이템 이벤트
===================================================================================
package pack02;
import java.awt.BorderLayout;
import java.awt.List;
import java.awt.Frame;
import java.awt.TextArea;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
class FrameTest extends Frame implements ItemListener{
 public void itemStateChanged(ItemEvent e) {
  // 현재 선택된 이벤트 소스를 얻어옴
  Object o=e.getSource();
  List li=(List) o;
  ta.append(li.getSelectedItem()+"\n");  
 }
 List list;
 TextArea ta;
 FrameTest(){
  add(list=new List(), BorderLayout.NORTH);
  list.addItemListener(this);
  add(ta=new TextArea(), BorderLayout.CENTER);
  list.add("사과"); list.add("바나나");
  list.add("오렌지"); list.add("파인애플");
  list.add("토마토"); list.add("키위");
  pack();
  setVisible(true);
  addWindowListener(new WindowAdapter(){
   @Override
   public void windowClosing(WindowEvent arg0) {
    dispose();
    System.exit(0);
   }      
  }
  );
 }
}
public class Ex01 {
 public static void main(String[] args) {
  new FrameTest();
 }
}
===================================================================================