카테고리 없음

JSP MVC예제/DB연동/ JSP MVC모델1적용 예제/ MVC패턴 MVC모1

setposs 2022. 10. 18. 23:07

JSP(MVC예제/DB연동)

 

 

 

 

 

 

 

 

MVC모델1과 2가 있다고한다. 여기서는 모델 1의 적용.     #틀린부분있으면 알려주세요!

 

 

MVC 패턴의 요청 로직을 정리하면,

    

사용자는 UI(JSP,HTML)를 통해서 View에 접근 -> 두수입력-> 이벤트를 컨트롤러에게 요청을 한다.

 

Controller(여기서는 receive.jsp)는 해당 이벤트를 분별하여 Model(여기서는 Bean.java)을 참조하고,

 

Model 은 데이터베이스 처리 등 관련 이벤트 데이터를 처리하고 그 결과를 Controller에게 전달하고 그것을 다시 View에 전달한다.

 

 

 

사용자가 근본적으로 접근하는 곳이 View(HTML)인데, View에서 보고자 하는 DATA를 요청하는 곳이 Controller(jsp),

 

Controller가 요청한 DATA를 처리하는 곳이 Model이된다. 그리고 Model이 처리한 데이터를 정리하여 결과물로 전달해주는 곳이 Controller

 

 

MCV1  2?  <!--[endif]--> 

MVC1 JAVABean에 저장하고 View 처리는 JSP에서 하고, 로직은 개발자의 성향에 따라 JSP JAVABean 에 골고루 분배된다. 

MVC2 Servlet, 스트럿츠, Spring 등에서 Controller 처리를 분리한다는 점이 다르다 고한다.. MVC2패턴을 더 알아봐야할듯.

 

 

 

어쨌든 예제를 보도록하자.

MYSQL- 로그인 -> DB생성 (jspdb)  -> table생성 

 (패키지명 ch1205 -  src/ch1205/Bean.java / webcontent/ch1205/input.html+receive.jsp)

 

테이블 (+삽입내용)

 

--------------------------------------------------------------

 

사용자가 UI에서 두 수 입력( VIEW )  input.html

 

<!DOCTYPE html>

 

<html>

 

<head>

 

<meta charset="UTF-8">

 

<title>Insert title here</title>

 

</head>

 

<body>

 

 <!--[endif]-->

<form action="receive.jsp">

 

x: <input type="text" name=numx>

 

y : <input type="text" name=numy>

 

<input type="submit" value="전송">

</form>

 

</body>

 

</html>

 

--------------------------------------------------------------

 

 

 

 receive.jsp( Controller) 사용자로부터 이벤트를 분별하여 Model(Bean.java)을 참조하여 DB값 불러옴 (  Bean.java에 요청) 

 

 

<%@ page language="java" contentType="text/html; charset=UTF-8"

 

pageEncoding="UTF-8"%>

 

<%@page import="java.io.IOException"%>

 

<%@ page import="java.sql.*"%>

 

<%@ page import="ch1205.Bean"%>

 

<%@ page import="java.util.Vector"%>

 

 <!--[endif]--> 

 

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

 

<html>

 

<head>

 

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

 

<title>Insert title here</title>

 

</head>

 

<body>

 

<h2>합구하기</h2> <br>

 

<%

 

//html로 입력받은값 변수로 받기

 

int numx = Integer.parseInt(request.getParameter("numx"));

 

int numy = Integer.parseInt(request.getParameter("numy"));

 

 

//빈즈 객체생성

 

Bean a=new Bean();

 

 

//입력값 변수로 받은거를 빈즈클래스의 변수로 전달

 

a.setNumx(numx);

 

a.setNumy(numy);

  

//System.out.print("두수 합 : "+a.getSum(a));

 

 

//db로 입력받은값 넘김 ( 입력받은값 DB에 저장)

 

a.insertDB(a);

 

 

 

Vector<Bean> v = new Vector<Bean>(); //벡터사용 - Bean 클래스의 (DB에있는거갖고온)numx,numy를 배열로사용

 

 

//db값 얻어오기 (DB에 있는 값 불러오기)

 

a.getDB(v);

 

 

/* for(int i=0; i<v.size(); i++){

 

Bean b = v.get(i);

 

 

System.out.println("시작"+b.getNumx()+","+b.getNumy()+","+b.getSum());

 

} */

// 간결한 For문으로 바꾸면

 

/* for(Bean b : v){

 

System.out.println("시작"+b.getNumx()+","+b.getNumy()+","+b.getSum());// 자동으로b.toString()메소드 호출하여 출력(오버라이딩)

 

} */

 

%>

 

 

 

<table border=1>

 

<tr>

 

<td>NUMX</td><td>NUMY</td><td>SUM</td>

 

</tr>

 

 <!--[endif]--> 

<%for(Bean b : v){

 

out.println("<tr><td>"+b.getNumx()+"</td><td>"+b.getNumy()+"</td><td>"+b.getSum()+"</td></tr>");

 

}

%>

 

</table>

 

</body>

 

 

 

</html> 

 

@@ 

 

 

 

 

 

 

 

 

--------------------------------------------------------------

 

 

 

package ch1205;

 

 

import java.sql.Connection;

 

import java.sql.DriverManager;

 

import java.sql.ResultSet;

 

import java.sql.Statement;

 

import java.util.Vector;

 

 

public class Bean {

 

private int numx

 

private int numy

 

private int sum

 

 

public int getSum() {

 

return sum

 

}

 

 

public Bean(){

 

}

 

public Bean(int numx, int numy, int sum){

 

this.numx=numx

 

this.numy=numy

 

this.sum=sum

 

}

 

 

public int getNumx() {

return numx

 

}

 

public void setNumx(int numx) {

this.numx = numx

}

 

 

public int getNumy() {

return numy

 

 

}

   

public void setNumy(int numy) {

 

this.numy = numy

}

 

 

public int getSum(Bean b) {

 

 

return b.getNumx()+b.getNumy();

}

   

 

public void insertDB(Bean b){

 

 <!--[endif]--> 

 

Connection conn=null

 

Statement stmt = null

 

 <!--[endif]--> 

 

try{

 

//드라이버 연결

 

Class.forName("com.mysql.jdbc.Driver");

 

//jspdb DB // mysql-> user root 비밀번호는 1234

 

conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/jspdb","root","1234");

 

 <!--[endif]--> 

 

if(conn==null)

 

throw new Exception("데이터베이스 연결 실패");

 

 <!--[endif]--> 

 

//연결된 상태를 stmt

 

stmt=conn.createStatement();

 

stmt.executeUpdate("insert into xytable values('"+b.getNumx()+"','"+b.getNumy()+"','"+b.getSum(b)+"');");

 

} catch (Exception e) {

 

e.printStackTrace();

 

}finally{//다썻으면 닫아줌

 

try{

stmt.close();

}catch(Exception ignored){

 

 

}

 

 <!--[endif]--> 

 

try{

 

conn.close();

 

}catch(Exception ignored){

 

}

 

}

 

}

 

 

public void getDB(Vector<Bean> a){

 

Connection conn=null

 

Statement stmt = null

 

 

 <!--[endif]--> 

try{

 

//드라이버 연결

 

Class.forName("com.mysql.jdbc.Driver");

 

//jspdb DB // mysql-> user root 비밀번호는 1234

 

 

conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/jspdb","root","1234");

 

 

 

if(conn==null)

 

throw new Exception("데이터베이스 연결 실패");

 

 

//연결된 상태를 stmt

 

stmt=conn.createStatement();

 

 <!--[endif]--> 

 

 

 <!--[endif]--> 

 

ResultSet rs = stmt.executeQuery("select * from xytable;");

 

if(!rs.next())//코드에 해당하는 정보가 없을때

 

throw new Exception("xytable 에 해당하는 데이터가 없습니다");

 

 <!--[endif]--> 

int i=0;

 

while(rs.next()){

 

if(i==0)

 

rs.previous();

 

 <!--[endif]--> 

 

//초기에 DB에 들어있는 정보를 가져와서 변수로 저장

 

int numx= rs.getInt("numx");

 

int numy = rs.getInt("numy");

int sum = rs.getInt("sum");

 

 <!--[endif]--> 

 

a.add(new Bean(numx,numy,sum));

 

 <!--[endif]--> 

 

System.out.println(numx+","+numy+","+sum);

 

i++;

 

}

/*

 

rs.next에서 next()함수는 Boolean타입으로 첫 번째 row를 읽고 값이 있으면 true 다음row에 값이 없으면 false를 리턴한다

 

previous() 는 이전 레코드로 이동하는 함수인데 previous()를 써주지 않으면 인덱스 가 0,1,2순으로 시작한다면 1부터 찍기 때문에 previous

 

()를 써서 0번째인덱스부터 즉, 처음부터 출력하기위해 써주자

 

 

rs는 결과셋을 갖고있는 놈인데 쿼리 결과를 보기위해 rs.getString/rs.getInt(“필드명”)으로 결과를 볼수있는데 먼저 그럴러면 rs.next()해서

 

 

서를 데이터가 있는곳으로 움직여준다.(이때 rs의 위치는 첫 번째 데이터의 다음데이터에 커서가 있다는 사실!)

 

다음데이터를(다음행의데이터를 가져오려면) rs.next해준다. (, next()는 커서를 다음레코드로 이동한다 previous는 이전데이타로 커서를 옮겨준다)

 

(rs의 첫위치가 rs가 갖고있는 데이터의 첫 번째가아니라 첫 번째의 다음을 가리킨다는 사실! 때문에 previous를 사용해서 첫 번째부터 출력)

 

*/

 

 

} catch (Exception e) {

 

e.printStackTrace();

 

}finally{//다썻으면 닫아줌

 

try{

 

stmt.close();

 

}catch(Exception ignored){

 

}

 

 <!--[endif]--> 

try{

 

conn.close();

 

}catch(Exception ignored){

 

} } } }

 

 <!--[endif]--> 

 

 

 

 

 

실행화면 

 

윗부분 값을 입력받는부분이 input.html

 

아래 결과화면이 receive.jsp

 

 

 

  

 

 

 소스첨부합니다.