-
210514_1(연동프로그램)HTML_JS(Sol)/JSP(sol) 2021. 5. 14. 14:15
웹 프로그램시 연동 드라이버의 위치
\WEB-INF\lib\mysql-connector-java-5.1.49-bin.jar가 되도록 붙여넣는다
이클립스에서 프로젝트구조
/프로젝/src <=== java 소스파일을 생성한다. 당연히 패키지,클래스 구조를 하고 있어야 한다.
/프로젝/WebContent <=== jsp,html, css, js등의 웹문서를 생성하는 곳 하위폴더/웹문서 구성 가능
/프로젝/WebContent/WEB_INF <===환경파일이 들어간다. 기본적으로 이곳에 웹문서를 만들면 인식하지 못한다
/프로젝/WebContent/WEB_INF/web.xml <== 배치기술자 웹어플 내부의 자원을 어떻게 호출해서 사용하는지
매핑하고, 전역 환경변수를 설정한다.
가장 중요한 역할 : 서블릿 매핑이다.
@annotation이 나옴으로 역할이 줄어듦.
ex) application.getInitParameter("키") 식으로 호출한다.<== 어플환경변수
/프로젝/WebContent/WEB_INF/lib <=== 는 주로 확장자 jar인 라이브러리를 넣는다.
ex)프로젝\WebContent\WEB-INF\lib\mysql-connector-java-5.1.49-bin.jar
/프로젝/WebContent/WEB_INF/classes <=== 컴파일된 class 파일이 패/클 형태로 자동 저장된다.배포시자동생성
/프로젝/WebContent/META-INF <=== 응용프로그램에서 배포시 실행할 대표 클래스등등 마킹하는 문서.
웹프로그램에서는 거리가 멀다.
ex)/프로젝/WebContent/META-INF/MANIFEST.MF
package chapter8; import java.sql.*; import java.sql.DriverManager; public class DriverTest { public static void main(String[] args) { Connection con; //연동정보 담는객체 try { Class.forName("org.gjt.mm.mysql.Driver").newInstance(); //동적으로 클래스를 로딩하세요 con = DriverManager.getConnection("jdbc:mysql://localhost:3306/" +"jspdb?useUnicode=true&characterEncoding=euckr", "jspuser", "1234"); System.out.println("디비 접속 성공"); } catch (SQLException ex) { System.out.println("SQLException :" + ex); } catch (Exception ex) { System.out.println("Exception :" + ex); } } }
#실행방법은 BD연결하고 블럭잡아서 alt+x Create Table member( id varchar(20) not null, passwd varchar(20) null, name varchar(20) null, mem_num1 varchar(6) null, mem_num2 varchar(7) null, e_mail varchar(30) null, phone varchar(30) null, zipcode varchar(7) null, address varchar(60) null, job varchar(30) null, primary key (id) ) engine=innodb default charset=euckr; insert into member (id,passwd, name) values('LoverBoy', '1234', '홍길동'); insert into member (id,passwd, name) values('LuckyBoy', '1234', '일지매'); select * from member;
1) jsp에 모든내용
Connection con; db서버와 연동정보를 담는 객체
Statement stmt; 쿼리를 작성하고 실행할수있는 객체
ResultSet rs; select문에서 쿼리를 실행하고 결과를 처리하는 객체
Class.ForName("팩.클"); 동적으로 드라이버를 로딩하시오. 실행할때 로딩하라./ 컴파일시에는 없어도된다.
db서버와연결하라
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/디비명?useUnicode=true&characterEncoding=EUCKR","계정","암호");
update, insert, delete ===> excuteUpdate() ===> 결과는 int 로 받는다.
select ===> excuteQuery() ===> 결과는 ResultSet으로 받는다.
rs 참이면 실행결과가 존재한다.
rs.next(); 결과 행으로 이동한다. 그래야 컬럼값을 읽을수 있다.
rs.get데이타형(컬럼명) : <===권장
rs.get데이타형(인덱스) : <===어쩔수없을때사용 : 컬럼명 자리에 함수가 올때
select 컬럼1,컬럼2 ,,,(now(), count())
자원반납: 생성순서의 역순으로 닫는다. 확인 후 닫는것이 중요함
rs.close(); if(rs!=null) rs.close();
stmt.close();
con.close();
<%@ page language="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR" import="java.sql.*"%> <%-- 주석 import="java.sql.*" 자바에서 데이터베이스 관련 라이브러리를 포함하고 있는 부분이 java.sql 패키지에 존재함 관련 패키지를 임포트해서 라이브러리를 사용하기 위한 임포트구문, 데이터베이스 관련 프로그램시 반드시 임포트해야함. --%> <% //JDBC 드라이버 로딩// //org.gjt.mm.mysql.Driver : 는 MySQL을 사용하기 위한 드라이버 로딩 Class.forName("org.gjt.mm.mysql.Driver"); /* 오라클의 경우 classes12.zip 이란 형태로 드라이버가 제공됨. Class.forName("oracle.jdbx.driver.OracleDriver"); ODBC 브리지경우 Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); */ //드라이버로딩 후 커넥션을 위한 커넥션 객체생성 //전역변수가 아니고 지역변수이기때문에 반드시 초기화를 해준다. Connection conn = null; //커넥션이 생성이 된 후 질의를 던지기 위한 객체생성 Statement stmt = null; //질의를 수행한 후의 레코드를 받을 객체 생성 //조회 질의의 경우 레코드를 받기 때문에 레코드를 받을 수 있는 객체를 생성해서 //생성한 객체로 레코드를 받음. //변경, 삭제등의 질의 경우 레코드 반환하지 않음. ResultSet rs = null; String id="", passwd = "", name="", mem_num1="", mem_num2="", e_mail="", phone="", zipcode="", address="", job=""; int counter=0; try{ //커넥션 생성 conn = DriverManager.getConnection ("jdbc:mysql://localhost:3306/jspdb?useUnicode=true&characterEncoding=EUCKR","jspuser","1234"); /* getConnection() 메소드안의 세개의 인자를 가지는데, jdbc:mysql://localhost:8806/mySB 는 JDBC URL/databaseName 의 형태. 두번째 인자: 디비로그인 계정, 세번째: 비밀번호 Oracle: conn= DriverManager.getConnection("jdbc:oracle:thin:@localhost:1512:디비명","계정","암호"); ODBC : conn = DriverManager.getConnection("jdbc:odbc:DSNname","sa","") */ //커넥션을 통해 질의를 전송하기 위한 객체(stmt) stmt = conn.createStatement(); //객체(stmt)를 통해서 질의를 수행할 메소드를 사용 //질의수행 결과는 ResultSet으로 받는다. rs = stmt.executeQuery("SELECT * From MEMBER"); %> <!DOCTYPE html> <html> <head> <meta charset="EUC-KR"> <title>JSP에서 데이터베이스 연동</title> </head> <body bgcolor="#FFFFCC"> <h2> JSP 스크립틀릿에서 데이터베이스 연동 예제입니다...</h2> <br> <br> <h3>회원정보</h3> <table bordercolor="#0000ff" border="1"> <tr> <td><strong>ID</strong></td> <td><strong>PASSWD</strong></td> <td><strong>NAME</strong></td> <td><strong>MEM_NUM1</strong></td> <td><strong>MEM_NUM2</strong></td> <td><strong>E_MAAL</strong></td> <td><strong>PHONE</strong></td> <td><strong>ZIPCODE</strong></td> <td><strong>JOB</strong></td> </tr> <% if(rs!=null){ //질의수행결과로 받은 레코드들은 하나씩 가져오는 메소드 :next() //next()메소드는 현재의 레코드를 반환하고, 다음 레코드로 포인터를 이동시킨다. //즉, 레코드가 있는 동안 next()메소드는 질의수행결과로 받은 레코드들을 하나씩 //반환한다. while(rs.next()){ // 하나의 레코드를 구성하는 각각의 칼럼에 대한 값을 추출. //각 칼럼의 성격에 따라, setString(column_name), getInt(column_name) // getInt(coulumn_name), getString(column_name) ...하거나, // column 이름대신 칼럼의 순서를 통해서 각 칼럼의 값을 가져올 수 있다. //getString(1),getString(2) ... 안좋은방법 id=rs.getString("id"); passwd =rs.getString("passwd"); name= rs.getString("name"); mem_num1 =rs.getString("mem_num1"); mem_num2 = rs.getString("mem_num2"); e_mail = rs.getString("e_mail"); phone = rs.getString("phone"); zipcode = rs.getString("zipcode"); address = rs.getString("address"); job = rs.getString("job"); %> <%-- 주석 값 출력하는 부분 --%> <tr> <td><%=id %></td> <td><%=passwd %></td> <td><%=name %></td> <td><%=mem_num1 %></td> <td><%=mem_num2 %></td> <td><%=e_mail %></td> <td><%=phone %></td> <td><%=zipcode %>/<%=address %></td> <td><%=job%></td> </tr> <% counter++; }//end while }//end if %> </table> <br> <br> total records : <%=counter%> <% //데이터베이스 연동시 필요한 예외처리... }catch(SQLException sqlException){ System.out.println("sql exception"); }catch (Exception exception){ System.out.println("exception"); }finally{ if(rs !=null) try{rs.close(); } catch(SQLException ex){} if(stmt != null) try{stmt.close(); } catch(SQLException ex){} if(conn!=null) try{ conn.close(); } catch(Exception ex){} } %> </body> </html>
주의) 블럭{ } 갯수 조심하기
2) jsp +bean 이용
UsingJDBC_bean.jsp
JSP : 요청을 받고
요청화면 <----DTO입력---->DAO 실행 <----DTO출력----> 화면 표시
DTO가 여러개이면 vector(multi-thread), ArrayList(thread)
RegsterBean.java
BEAN : DTO : data transfer object, VO value object라고 부르기도 한다.
MemberMgr.java
BEAN : DAO : data access object
===> DAO + DTO = MODEL : 모형 <==정보의 형태를 구성한다.개념
business Logic : 데이타를 가공하는로직
business Method : 데이타를 가공하는 메서드
business Layer : 데이타를 가공하는 클래스들을 모아서 하나의 단계를 만듦.
sql--실행-->rs--저장-->bean(s)--저장-->vector return : 맥락이해하기
뷰로직 view logic
루프(Vector (ArrayList) ==elementAt(i)==>Bean ==getter()==> data ===> 화면출력)
package chapter9; public class RegisterBean { private String mem_id; private String mem_passwd; private String mem_name; private String mem_num1; private String mem_num2; private String mem_email; private String mem_phone; private String mem_zipcode; private String mem_address; private String mem_job; public String getMem_id() { return mem_id; } public void setMem_id(String mem_id) { this.mem_id = mem_id; } public String getMem_passwd() { return mem_passwd; } public void setMem_passwd(String mem_passwd) { this.mem_passwd = mem_passwd; } public String getMem_name() { return mem_name; } public void setMem_name(String mem_name) { this.mem_name = mem_name; } public String getMem_num1() { return mem_num1; } public void setMem_num1(String mem_num1) { this.mem_num1 = mem_num1; } public String getMem_num2() { return mem_num2; } public void setMem_num2(String mem_num2) { this.mem_num2 = mem_num2; } public String getMem_email() { return mem_email; } public void setMem_email(String mem_email) { this.mem_email = mem_email; } public String getMem_phone() { return mem_phone; } public void setMem_phone(String mem_phone) { this.mem_phone = mem_phone; } public String getMem_zipcode() { return mem_zipcode; } public void setMem_zipcode(String mem_zipcode) { this.mem_zipcode = mem_zipcode; } public String getMem_address() { return mem_address; } public void setMem_address(String mem_address) { this.mem_address = mem_address; } public String getMem_job() { return mem_job; } public void setMem_job(String mem_job) { this.mem_job = mem_job; } }
package chapter9; import java.sql.*; import java.util.*; import chapter9.RegisterBean; public class MemberMgr { private final String JDBC_DRIVER ="org.gjt.mm.mysql.Driver"; private final String JDBC_URL = "jdbc:mysql://localhost:3306/jspdb"; private final String USER = "jspuser"; private final String PASS = "1234"; public MemberMgr() { //생성자 try { Class.forName(JDBC_DRIVER); //드라이버로딩 }catch(Exception e) { System.out.println("Error : JDBC 드라이버 로딩 실패");; } }//MemberMgr() //벡터를 반환하는 public Vector getMemberList() { //비즈니스메서드:데이터를 가공하는메서드 Connection conn = null; Statement stmt = null; ResultSet rs = null; Vector vecList = new Vector(); try{ conn = DriverManager.getConnection(JDBC_URL,USER,PASS); String strQuery = "select * from member"; stmt = conn.createStatement(); rs = stmt.executeQuery(strQuery); //루프를돌면서 벡터에다가 빈에 저장 while (rs.next()) { RegisterBean regBean = new RegisterBean(); regBean.setMem_id(rs.getString("id")); regBean.setMem_passwd(rs.getString("passwd")); regBean.setMem_name(rs.getString("name")); regBean.setMem_num1(rs.getString("mem_num1")); regBean.setMem_num2(rs.getString("mem_num2")); regBean.setMem_email(rs.getString("e_mail")); regBean.setMem_phone(rs.getString("phone")); regBean.setMem_zipcode(rs.getString("zipcode")); regBean.setMem_address(rs.getString("address")); regBean.setMem_job(rs.getString("job")); vecList.add(regBean); } }catch (Exception ex) { System.out.println("Exception" +ex); }finally { if(rs != null) try{rs.close(); }catch(SQLException e) {} if(stmt != null) try{stmt.close(); }catch(SQLException e) {} if(conn != null) try{conn.close();} catch(SQLException e) {} } return vecList; } } //class
<%@ page language="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR"%> <%@ page import = "java.util.*, chapter9.*" %> <!DOCTYPE html> <html> <head> <meta charset="EUC-KR"> <title>JSP에서 데이터베이스 연동</title> <link href="style.css" rel="stylesheet" type="text/css"> </head> <body bgcolor="$FFFFCC"> <h2> Bean을 사용한 데이터베이스 연동 예제입니다...</h2> <br> <br> <h3>회원정보</h3> <table bordercolor="#0000ff" border="1"> <tr> <td><strong>ID</strong></td> <td><strong>PASSWD</strong></td> <td><strong>NAME</strong></td> <td><strong>MEM_NUM1</strong></td> <td><strong>MEM_NUM2</strong></td> <td><strong>E_MAIL</strong></td> <td><strong>PHONE</strong></td> <td><strong>ZIPCODE</strong></td> <td><strong>JOB</strong></td> </tr> <jsp:useBean id="memMgr" class="chapter9.MemberMgr" scope="page"/> <% Vector vlist = memMgr.getMemberList(); int counter = vlist.size(); //벡터에서 빈을 꺼내고 빈에서 데이타를 꺼내고 for(int i=0; i<vlist.size(); i++){ RegisterBean regBean =(RegisterBean) vlist.elementAt(i); //i순번을 이용해서 꺼냄 %> <!-- 뷰로직 --> <tr> <td><%=regBean.getMem_id()%></td> <td><%=regBean.getMem_passwd()%></td> <td><%=regBean.getMem_name()%></td> <td><%=regBean.getMem_num1()%></td> <td><%=regBean.getMem_num2()%></td> <td><%=regBean.getMem_email()%></td> <td><%=regBean.getMem_phone()%></td> <td><%=regBean.getMem_zipcode()%> / <%=regBean.getMem_address()%></td> <td><%=regBean.getMem_job()%></td> <% } %> </tr> </table> <br> <br> total records : <%=counter %> </body> </html>
'HTML_JS(Sol) > JSP(sol)' 카테고리의 다른 글
210517_1(cookie, session) (0) 2021.05.17 210514_5(연동프로그램) (0) 2021.05.14 210513_5(sql, 데이터베이스연동 준비) (0) 2021.05.13 210513_1(jsp내부객체 application, exception, Bean프로그래밍) (0) 2021.05.13 210512_5~8(JSP내부객체 request, response, session, out) (0) 2021.05.12