2009.11.10 16:03
편의상 그룹 번호를 ref, 그룹 내부의 순서를 step, 그리고, 답변의 깊이를 lev라고 하겠다.
새로가 글이 등록 될때마다 ref가 증가를 하게 되고, 그리고 그 글에 답변이 달릴경우 그룹 번호는 같고
글의 순서(step)를 하나 증가 시키고,답변의 깊이(lev)는 이 전글 깊이에 하나 더 더한 값을 갖게 된다.

이 상테에서 원글에 또 하나의 답변이 달리면 이전에 다린글과 똑같이 되지만 이전에 있는 글을 밀어내고 자기가 그 사이로 끼어 들어간다. 그 경우 같은 그룹내에서 이전글의 step보다 큰값을 갖고 있는 게시물들은 모두 하나씩 증가 시킨다.  예를 들어서 A라는 글이 처음으로 써지고  이글에 B라는 답글을 달고, 또 B글에 C라는 답글을 달고 나서 , A글에 D라는 답글이 또 달리게 되면
 글제목  SEQ  REF  STEP LEV 
 A  1  1  0  0
 D  4  1  1  1
 B  2  1  2(1->2)  1
 C  3  1  3(2->3)  2


이럴 경우 DB에서 불러오는 순서는 order by ref desc,step asc가 된다. 원칙은 같은 레벨에서 최근글은 위에 올리도록 한것이다. 이 원리를 설명하면서 sql로 표시해 보자

그룹의 처음글은 seq와 ref의 최고값을 가져온 후에 하나씩 더한 값을 갖게 된다. 그리고 step과 lev는 0이 된다.
INSERT INTO BOARD(SEQ,REF,STEP,LEV)VALUES(SEQ_BOARD_SEQ.NEXTVAL,SEQ_BOARD_REF.NEXTVAL,0,0)

답글을 달때 SEQ는 게시판에서 최대값에 하나 더한 값을 갖고,REF는 이전글의 것을 가져와 그대로 쓴다. 값을 저장하기 전에 자기가 들어갈 자리를 마련해야 되는데  같은 REF를 쓰는 게시물 중에서 이전글의 STEP보다 큰 경우 모두 1씩 더해준다.
UPDATE BOARD SET STEP = STEP +1 WHERE REF=원글 REF  AND STEP > 원글 STEP
LEV와 STEP에는 이전글의 값에 하나씩 더해 준 값이 입력된다.

INSERT INTO BOARD(SEQ,REF,STEP,LEV)VALUES(SEQ_BOARD_SEQ.MEXTAVL,원글 REF,원글STEP+1,원글 LEV+1);
Posted by 박쥐소년
2009.11.10 15:31
먼저 JDBC 드라이버를 로드한 다음 JDBC_URL,USER_ID,USER_PASSWORD 정보를 사용하여 커넥션(Connection)을 하나 얻어온다. 이 커넥션에 sql 문장을 보내고(Statement), 그 결과(Result)를 받아 온다. 결과셋을 닫고 뒤이어 스테이트먼트를 닫아준다. 그리고, 커넥션을 닫아주면 DB에 접속해서 결과를 가져오는 과정을 마무리 할 수 있다.

1. 드라이버를 로드한다.
2. Connection을 가져온다.
3. Statement를 준비
4. ResultSet 가져와서 처리
5. ResultSet 종료
6. Statement 종료
7. Connection 종료
Posted by 박쥐소년
2009.11.05 15:28
JSTL.JAR,Standard.jar 파일이 필요함

Posted by 박쥐소년
2009.11.05 15:17
JNDI(Java Naming and Directory Inferface)
네이밍/디렉토리 서비스는 사용자가 원하는 리소스/서비스를 등록하고 찾기 위한 모든것을 말합니다.

Posted by 박쥐소년
2009.11.05 15:06
Commons-dbcp-1.2.1.jar
Commons-collections-3.1.jar
Commons-pool-1.2.jar
위에 3가지 파일을 webapps/WEB-INF/lib폴더에 넣어 두면 된다.

톰캣 5.x버전 이후 붙너는 common/lib에 naming-factory-dbcp.jar라는 하나의 라이브러리로 제공하고 있다고 한다. 한번 사용해 보는 것도 권장을 한다.
Posted by 박쥐소년
2009.11.05 14:57

서블릿이나 웹애플리케이션에서 파일업로드를 쉽고 빠르게 해주는 file upload관련 패키지  스트러츠 FormFile에서 사용함 
Posted by 박쥐소년
2009.11.05 14:56
Database connection pooling 서비스 제공  데이타소스를 org.apache.commons.dbcp.BasicDataSource를 사용 
Posted by 박쥐소년
2009.11.05 14:55
JAVA Collection Framwork을 상속확장

Posted by 박쥐소년
2009.11.05 14:53
JDBC 연결시 꼭 필요한 파일
위치는 C:\Tomcat 60.\lib 밑에 넣어 두면 됨(이클립스에도 넣어 둬야 함)
Posted by 박쥐소년
2009.11.03 10:00
===========================
JSP에서 빈(Bean) 사용하기
===========================

---------------
자바빈즈
---------------
1. Web Application의 Logic을 캡슐화하는 자바S/W 만들고 사용하기위한 기술
2. 재사용 가능한 컴포넌트 모델
3. 빈즈를 이용하여 JSP안의 복잡한 Scriptlet을 JSP page에서 분리함으로서  
    간단한 JSP Page구성이 가능하다.
4. 컴포넌트 속성인 재사용성(reusability), 은닉성(encapsulation), 독립성을 가지고  
    있다.
5. 빈은 자신의 내부 데이터를 속성(Property)라는것으로 외부에 노출시킨다.
6. 자바에서 Bean의 속성은 private, protected의 형태로 구현
7. Bean은 public ‘getXXX’ ‘setXXX’ 메소드를 통해서 자신의 내부데이터에 접근할수  
   있게 한다.(접근자 메소드, Accessor Method)
8. 접근자 메소드를 작성할려면 우선 빈으로 사용할 클래스를 정의하고 거기에  
    메소드들이 접근하고자 하는 필드를 추가한다.
    예) import java.beans.*;
          class TestBean {
                private int height;
                private String desc;
                protected boolean debug = false;
             }
9. JavaBeans 사양에 나온 접근자 메소드의 형식
    public void setXXX(속성형 value);
    public 속성형 getXXX();
    public boolean isXXX();
    예) public void setHeight(int i){ height = I; }
             public int getHeight(){ return height; }
             public void setDesc(String s) { desc = s; }
             public String getDesc(){ return desc; }
             public void setDebug(boolean b) { debug = b; }
             public String isDebug(){ return debug; }

10.JSP에서 사용할 빈을 작성하는 경우에는 대부분 읽기와 쓰기 메소드를 모두    
    작성할 필요는 없다.
    JSP1.1에서는 색인화된 속성도 지원한다.

    public void setXXX(속성형[] value);
    public void setXXX(int index, 속성형 value);
    public 속성형 getXXX(int index);
    public 속성형[] getXXX();
    예) private String[] partNo;
          setPartNo(3,”aaa”);
          String s = getPartNo(7);


----------------
빈즈의 요건
----------------
1. No Prameter Constructor 필요
      JSP컨테이너가 자동으로 자바빈즈를 사용하는 경 우에 참조하는 생성자    
     자바빈즈 클래스에서 생성자를 별도로 제시하지 않은 경우에는 무인자 생성자가  
     자동으로 만들어 지기때문에 실행시에 에러가 발생하지 않으나 가급적 만들어  
     주는편이 낫다.
2. Serializable 인터페이스를 구현해야 한다.
     JSP에서는 ‘Serializable’을 명시하지 않아도 제대로 작동한다. 따라서  
     implements Serializable을 생략해도 된다.  
3. 속성인터페이스를 가지고있어야 한다.
       자바빈즈의 속성을 제어하기 위한것
       속성인터페이스가 없는 빈도 가능하나 실행되면 제어할 방법이 없기에 실제  
       개발에서는 별로 쓰이지 않는다.



----------------------------------------
예제(빈을 이용한 LogIn처리)
----------------------------------------
[LoginBean.java]
/* LoginBean.java Login을 위한 빈 만들자! */
Import java.sql.*;
public class LoginBean {
private String id;
private String password;
// 생성자
public  LoginBean(){
id = null;
password = null;
}
               //id
public void setId(String id) {
this.id = id;
}
public String getId() {  return id;  }
                //password
public void setPassword(String password)
{
this.password = password;
}
public String getPassword()
{
return password;
}

                //DB에서 id와 password를 비교하는 Logic
public boolean isOK() {
  Connection con=null;
  boolean ok=false;
                  try {
                       // 오라클 드라이버를 Load 한다
                       Class.forName("oracle.jdbc.driver.OracleDriver");
                      // 데이타 베이스에 접속을 한다.
                      con = DriverManager.getConnection
                                ("jdbc:oracle:thin:@127.0.0.1:1521:wink",
                                                                          "scott", "tiger");
                      // Statement object를 생성한다.
                     Statement stmt = con.createStatement();
                    // ResultSet을 얻기위해 SQL query를 실행한다.
                   ResultSet rs = stmt.executeQuery("select passwd from users where  
                                                                    id = ‘ " + id + “ ‘ “);
                   if (rs.next()) {  
                     if (password.compareTo(rs.getString(1))==0) ok=true;  
                  }
                  else ok=false;
                  con.close();  
  }
  catch(Exception e) {  
  try  {
    if (con != null) con.close();  
  }
  catch (Exception e1) {  }      
  }            
  return ok;
   }
}


-------------------------------
[Login.html]
<!--Login.html Login창을 만드는 html-->
<html>
<head>
<title>빈을 이용한 로그인 예제</title>
</head>
<body>
<form name=Login action=/jsp/Login.jsp method=post >
<h2>Login</h2>
<br>
ID : <INPUT type=text name=id size=8 ><br>
Password : <INPUT type=password name=password size=8>
<p>
<INPUT TYPE=submit  VALUE=LogIn>
</form></body></html>

---------------------------------------------
[Login.jsp LoginBean을 통한 Login 결과를 출력하는 JSP]
<%@ page  contentType="text/plain;charset=euc-kr" %>
<jsp:useBean id="loginBean" scope="request" class="LoginBean" />
<jsp:setProperty name="loginBean" property="id" />
<jsp:setProperty name="loginBean" property="password" />
        빈을 이용한 로그인 인증  
<%
String id = loginBean.getId();  
String pass = loginBean.getPassword();
if( loginBean.isOK()) {
%>
환영합니다. <%=id%>님
<% }else{ %>

실패!!, <%=id%>님 다시 로그인을 해주세요.

<% } %>
Posted by 박쥐소년

티스토리 툴바