본문 바로가기

web/JSP

jsp 동적 테이블생성 select 추가

-_-더럽게 헷갈렸다. 점하나 잘못찍어서 몇시간을 고생햇는지..

먼저 프로세스는 간단하다.
1. DB에서 select 태그에 뿌릴 화면을 가져와서 hidden으로 처리한다.
2. 스크립트 배열에 hidden 에 들어있는 값들을 집어 넣는다.
3. 저번에 했던 동적 테이블생성 쿼리에 select 를 추가한다.

말은 참 쉽다..ㅡ,.ㅡ 개인적으로 스크립트는 않배울려고 했는데.. 빠른 결과물을 내놓기 위해선 어쩔수 없이 나의 사상과 편협해야만 했다. 머.. 배워서 나쁠껀 없긴한데.
- 소스가 쫌 길다. (MVC 패턴으로 나누지 않았다. 사실 귀찮았다.)

<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<%@ page import="java.util.*"%>
<%@ page import="java.sql.*"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>

<%
//DB커넥션 부분. 보는바와 같이 오라클커넥션풀을 쓴다.
Connection con;
Statement stmt;
ResultSet rset;
Class.forName("oracle.jdbc.driver.OracleDriver");
con = DriverManager.getConnection("jdbc:oracle:thin:@IP:PORT:TNS이름", "계정아이디","패스워드");
stmt = con.createStatement();

//DB에서 얻은 정보를 넣을 벡터
Vector vhenhouse = new Vector();

try {
//쿼리를 날려준다.
    String query = 
        "select dtcd, dtcd_nm from ba_dtcd " +
        "order by dtcd ";

    rset = stmt.executeQuery(query);
   
    while (rset.next()) {
        Hashtable htdrug = new Hashtable();
        
        if (rset.getString("dtcd_nm") != null) {
            htdrug.put("dtcd_nm", rset
                    .getString("dtcd_nm"));
        } else {
            htdrug.put("dtcd_nm", " ");
        }
        
        if (rset.getString("dtcd") != null) {
            htdrug.put("dtcd", rset
                    .getString("dtcd"));
        } else {
            htdrug.put("dtcd", " ");
        }
        
        vhenhouse.addElement(htdrug);
    }
    rset.close();
} catch (java.lang.Exception ex) {
    System.out.println("에라 발생6 = " + ex.getMessage());
    ex.printStackTrace();
    //DB종료
    stmt.close();
    con.close();
    
    %>
    
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
<script language="javascript">

//jsp 페이지가 시작되자마자 실행된다.
function window::onload(){raceinput()}

//select 의 값과 명칭을 넣을 배열들
 var vhenhousenm = new Array();
 var vhenhousecd = new Array();
 var count = 1;
 var addCount;
 
//행추가
function addInputBox() {
 for(var i=1; i<=count; i++) {
  if(!document.getElementsByName("test"+i)[0]) {
   addCount = i;
   break;
  }
  else addCount = count;
 }
 
 var addStr = "<tr><td width=10><input type=text  value ="+addCount+" name=test"+addCount+" size=2></td>";
//select 문을 정의 했다. for문을 돌려서 배열에 있는 값들을 스트링처럼 추가하는 형식이다.
   addStr += "<td width=10><select name=race> <option value=''>-----</option>";
   for( j = 0;j<vhenhousecd.length; j++){
    addStr += "<option value='"+vhenhousecd[j]+"'>"+vhenhousenm[j]+"</option>";
   }
 addStr +=   "</td></select> </td><td width=10><input type=text  value ="+addCount+" name=ttest"+addCount+" size=8></td></tr>";
 var table = document.getElementById("dynamic_table");
 var newRow = table.insertRow();
 var newCell = newRow.insertCell();
 newCell.innerHTML = addStr;
 count++;
}
 
//DB에서 받은 값을 스크립트 배열에 넣는 함수이다. 
function raceinput(){
//먼저 for문을 몇번 돌릴지 벡터의 길이를 가져온다.(vhenhousecount 라는 hidden으로 넣어놨다.)
var count = my_form.vhenhousecount.value;
//위에서 얻은 count로 배열에 hidden값에 있는 값들을 집어 넣는다. (push()함수사용)
// 스크립트는 편하게 스택처럼 배열을 사용할수 있도록 함수가 마련되있어서 좋다.
for(i=0; i<count; i++){
//race.push(document.my_form.["racehidden"+i].value);
var testemp = eval("my_form.vhenhousenmhidden"+i).value;
vhenhousenm.push(testemp);
testemp = eval("my_form.vhenhousecdhidden"+i).value;
vhenhousecd.push(testemp);
//alert(race.pop(i));
}
}

</script>
</head>
<body -nLoad="addInputBox()">
<form name="my_form" >
<!--DB에서 얻은 벡터의 길이를 포함하는 hidden -->
<input type="hidden" value="<%=vhenhouse.size() %>" name="vhenhousecount">

<!--or문을 돌면서 hidden으로 DB에서 얻은 정보를 넣는다.-->
<%
for (int i = 0; i < vhenhouse.size(); i++) {
   Hashtable htDelivery = (Hashtable) vhenhouse.get(i);
   %>
   
   <input type="hidden" value="<%=htDelivery.get("dtcd_nm") %>" name="vhenhousenmhidden<%=i%>">
   <input type="hidden" value="<%=htDelivery.get("dtcd") %>" name="vhenhousecdhidden<%=i%>">
<%} %>
<input type="button" value="행 추가" onClick="javascript:addInputBox();">
<table cellpadding=0 cellspacing=0 id="dynamic_table" border="1">

</table>
</form>

</body>
</html>

결과화면

주석으로 최대한 프로세스대로 자세하게 써 놨으니. 필요하면 뻘건 주석을 참고하기 바란다.
다른 방법으론 select자체를 않보이게 하고 <div style="display:none">  처리로 않보이게 한다음
option의 객체만을 추가하는 곳에 링크만 해주면 된다는데...-_- 몰겠다..ㅋㅋ