MVC
Moder view controller
→ 시각적으로 보여지는 부분과 데이터를 처리하는 부분을 분리하여 유연한 구조를 설계
-Model
-Controller
-view
- Model1
→ JSP만을 사용하는 설계 방법
- Model 2
- 차이점
- MVC pattern
회원가입 로그인 실습
- main.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> <style type="text/css"> fieldset { display :inline; } </style> </head> <body> <fieldset> <legend> Main </legend> <a href="./Join.jsp"> <button> 회원가입 </button></a> <a href="./Login.jsp"> <button> 로그인 </button></a> </fieldset> </body> </html>-a태그에 href값 넣어주기
- join.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> <style type="text/css"> fieldset { display:inline; } </style> </head> <body> <fieldset align="center"> <legend> 회원가입 </legend> <form action="JoinProgram" method="post"> <!-- action에 적을 때 servlet을 요청 : url mapping값(확장자X) jsp로 요청 : 해당 jsp로 가기위한 상대경로 --> ID : <input type="text" name="id"><br> PW : <input type="password" name="pw"><br> NAME : <input type="text" name="name"><br> <input type="submit" value="회원가입"> </form> </fieldset> </body> </html>
- JoinProgram
System.out.println("[JoinProgram]"); // Join. jsp에서 보낸 id, pw, name 3가지 데이터를 // 받아와서 console창에 출력 //post방식 디코딩 request.setCharacterEncoding("utf-8"); //id, pw, name 데이터 받아오기 String id = request.getParameter("id"); String pw = request.getParameter("pw"); String name = request.getParameter("name"); System.out.println(id); System.out.println(pw); System.out.println(name); //DTO(Data Trasfer object) 묶기 MemberDTO dto = new MemberDTO(id,pw,name); //회원가입 기능이 있는 join메소드 호출 int row = new MemberDAO().join(dto); //원래는 ↓↓ // MemberDAO dao = new MemberDAO(); // dao.join(dto); // 성공 실패 여부 확인 // 성공 -> Login.jsp // 실패 -> Main.jsp String moveURL ; if(row > 0) { System.out.println("회원가입 성공!"); moveURL = "./Login.jsp"; }else { System.out.println("회원가입 실패!"); moveURL = "./Main.jsp"; } response.sendRedirect(moveURL);→ 데이터를 db에
- sqld에 테이블 생성
-- Member1 테이블 생성 -- id, pw, name -> varchar2(100) -- id -> pk create table Member1( id varchar2(100) primary key, pw varchar2(100), name varchar2(100) ); -- test값 넣어보기 insert into member1 values('test','test','test'); -- 조회하기 select * from member1;
- MemberDTO
//DTO(Data Transfer Object) : 데이터 전달 객체(데이터가방) //테이블 형태 그대로 생성 // 필드 private String id; private String pw; private String name; // 메소드 // 생성자 메소드 : 객체를 초기화 하기 위한 메소드 //MemberDTO dto = new MemberDTO(id,pw,name); public MemberDTO(String id, String pw, String name) { this.id = id; this.pw = pw; this.name = name; } //로그인을 위한 생성자 메소드 public MemberDTO(String id, String pw) { this.id = id; this.pw = pw; } // Getter 메소드 매개변수 필요 없음 public String getId() { return id; } public String getPw() { return pw; } public String getName() { return name; }
→ 아무것도 담기지 않은 기본 생성자
→ 둘이 같음?
-클래스는 필드와 메소드로 이루어짐
dto 전달 객체를 만들었다.→ 화장품 가방! 하나의 파우치에 모아둬서
table형태 그대로!
필드 → 카드 넣는 자리 지갑넣는 자리를 지정하는 것 praviate 걸어놔서 메소드가 있어야 접근 가능
기본 생성자는 돈이 없음
메소드 해주면 값이 채워준다
MemberDAO//DAO(Data Access Object) : DB에 접근하는 객체 Connection conn = null; //전역변수로 변경 파란색 데이터베이스에 접근하게 해주는 객체 PreparedStatement psmt = null; ResultSet rs = null; // 정보를 담을 수 있는 객체 //DB연결 하는 메소드 리턴타입 없음 public void db_conn() { try { //1. ojdbc6.jar 라이브러리 불러오기 WEB-INF lib에 드래그 //C:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib //클래스를 가져오겠다. // 2. OravleDriver class 불러오기 // OravleDriver : Java와 DB 사이에 통로를 만들어주는 역할 Class.forName("oracle.jdbc.driver.OracleDriver"); //3. DB에 접속하기 위한 카드키 설정(주소, 계정, 비번) String url = "jdbc:oracle:thin:@localhost:1521:xe"; String user = "service"; String pw = "12345"; //4. DB에 접속 -> 접속 성공 시 Connection 객체로 반환 conn = DriverManager.getConnection(url, user, pw); } catch (Exception e) { e.printStackTrace(); } } //DB연결 종료 메소드 public void db_close() { try { if(psmt !=null) psmt.close(); if(conn !=null) conn.close(); if(rs !=null) rs.close(); } catch (Exception e) { e.printStackTrace(); } } // 회원가입 메소드 public int join(MemberDTO dto) { int row = 0; try { db_conn(); //5. SQL 쿼리 작성 -> ? : 바인드변수 -> 성능향상을 위해서 (soft parsing) String sql ="insert into Member1 values(?,?,?)"; //6. SQL문장을 DB에 전달 -> 전달 성공 시 PrepareStatement 객체로 반환 psmt = conn.prepareStatement(sql); //7. 바인드변수 값 채우기 // psmt.set자료형(물음표의 순서, 넣을 값) psmt.setString(1, dto.getId()); psmt.setString(2, dto.getPw()); psmt.setString(3, dto.getName()); // 8. 실행 // executeUpdate : DB에 변화가 생겼을 때, select 구문을 제외한 모든 구문 // executeQuery : DB에 질의할 때, select 구문 // int로 return하는 이유 : 몇개의 행이 변화 되었는지 알려주는 것! row = psmt.executeUpdate(); } catch (Exception e) { e.printStackTrace(); }finally {// 오류가 나든 실행을 하든 무조건 닫아! db_close(); } return row; } // 로그인 메소드 public MemberDTO login(MemberDTO dto){ MemberDTO login_dto = null; try { // 1. DB연결 메소드 호출 db_conn(); // 2. 쿼리문 작성 String sql = "select * from Member1 where id =? and pw =?"; // 3. sql문 db에 전달 -> PRepareState객체 생성 psmt = conn.prepareStatement(sql); // 4.받아온 id와 pw를 sql문에 세팅 psmt.setString(1, dto.getId()); psmt.setString(2, dto.getPw()); //5. 실행(executeQuery 메소드 사용 -> ResultSet객체 반환) rs = psmt.executeQuery(); if(rs.next()) { String id=rs.getString(1); String pw = rs.getNString("pw"); String name = rs.getString(3); //3개를 하나로 묶음 login_dto = new MemberDTO(id, pw, name); } } catch (Exception e) { e.printStackTrace(); } finally { // 6. db연결 종료 메소드 호출 db_close(); } return login_dto;
- JoinProgram
update delete insert → psmt.executeUpdate()
돌려받아야 하는 자료가 없을 때
행만 있을 때 → 바뀐 행의 개수 → 리턴값은 int형
cf) select → psmt.executeQuery()
결과 값을 전달 받아야한다.
→ select용 메소드가 따로 있다. 리턴 값은 ResultSet객체System.out.println("[JoinProgram]"); // Join. jsp에서 보낸 id, pw, name 3가지 데이터를 // 받아와서 console창에 출력 //post방식 디코딩 request.setCharacterEncoding("utf-8"); //id, pw, name 데이터 받아오기 String id = request.getParameter("id"); String pw = request.getParameter("pw"); String name = request.getParameter("name"); System.out.println(id); System.out.println(pw); System.out.println(name); //DTO(Data Trasfer object) 묶기 MemberDTO dto = new MemberDTO(id,pw,name); //회원가입 기능이 있는 join메소드 호출 int row = new MemberDAO().join(dto); //원래는 ↓↓ // MemberDAO dao = new MemberDAO(); // dao.join(dto); // 성공 실패 여부 확인 // 성공 -> Login.jsp // 실패 -> Main.jsp String moveURL ; if(row > 0) { System.out.println("회원가입 성공!"); moveURL = "./Login.jsp"; }else { System.out.println("회원가입 실패!"); moveURL = "./Main.jsp"; } response.sendRedirect(moveURL);- LoginProgram
JSP환경에서 현재 작업중인 페이지에서 다른페이지로 이동
forward → url변화 x, 객체 재사용 o ex)로그인,회원가입,글쓰기
redirect → url변화 o, 객체 재사용 x ex)리스트보기, 검색
session 이용한 LoginProgram```java System.out.println("[LoginProgram]"); request.setCharacterEncoding("UTF-8"); String id = request.getParameter("id"); String pw = request.getParameter("pw"); System.out.println(id); System.out.println(pw); // 2개의 값 넘겨줄 거야 DAO 묶어서 MemberDTO dto = new MemberDTO(id, pw); MemberDTO login_dto = new MemberDAO().login(dto); String name = login_dto.getName(); System.out.println("DB에서 넘어온 name : "+name); if(login_dto != null) { //로그인 성공 name = URLEncoder.encode(name, "UTF-8"); System.out.println(name);//인코딩 완료된 데이터 //한글데이터가 있는 데이터를 인코딩 해주겠다. response.sendRedirect("./LoginSuccess.jsp?name="+name); }else { //로그인 실패 response.sendRedirect("./LoginFail.jsp"); } ```System.out.println("[LoginProgram]"); request.setCharacterEncoding("UTF-8"); String id = request.getParameter("id"); String pw = request.getParameter("pw"); System.out.println(id); System.out.println(pw); // 2개의 값 넘겨줄 거야 DAO 묶어서 MemberDTO dto = new MemberDTO(id, pw); MemberDTO login_dto = new MemberDAO().login(dto); //id,pw,name값이 들어있음 if(login_dto==null) { //로그인 실패 response.sendRedirect("./LoginFail.jsp"); } String name = login_dto.getName(); System.out.println("DB에서 넘어온 name : "+name) if(login_dto != null) { //로그인 성공 // sendRedirect 페이지 이동 방식!!!! //name = URLEncoder.encode(name, "UTF-8"); //System.out.println(name);//인코딩 완료된 데이터 //한글데이터가 있는 데이터를 인코딩 해주겠다. //response.sendRedirect("./LoginSuccess.jsp?name="+name); // forwarding 페이지 이동 방식 -> 서버에서 서버로 // RequestDispatcher rd = request.getRequestDispatcher("./LoginSuccess.jsp"); //위에 있는 request 객체를 재활용!! // request.setAttribute("login_dto", login_dto); //업캐스팅 // rd.forward(request, response); // session 사용해서 값 저장 후 LoginSuccess.jsp에서 name값 출력하기 // servlet에서는 session을 생성해야한다. 내장객체가 아니어서 HttpSession session = request.getSession(); session.setAttribute("login_dto", login_dto); response.sendRedirect("./LoginSuccess.jsp");
- Login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> <style type="text/css"> fieldset { display: inline; } </style> </head> <body> <fieldset align="center"> <legend> 로그인 </legend> <form action="LoginProgram" method ="post"> ID : <input type = "text" name ="id"><br> PW : <input type = "password" name ="pw"><br> <input type="submit" value="로그인"> </form> </fieldset> </body> </html>- LoginSuccess
세션 이용한 LoginSuccess<h2>로그인 성공하셨습니다.</h2> <% request.setCharacterEncoding("utf-8"); String name = request.getParameter("name"); response.setContentType("text/html;charset=utf-8"); %> <%=name %>님 환영합니다~!
<h2>로그인 성공하셨습니다.</h2>
<%
//String name = request.getParameter("name");
// MemberDTO login_dto = (MemberDTO)request.getAttribute("login_dto");
//다운캐스팅
//String name = login_dto.getName();
// 아래 없어도 됨 사실..
//MemberDTO login_dto = (MemberDTO)session.getAttribute("login_dto");
%>
<!-- el문법으로 가져왔음 -->
${login_dto.name}님 환영합니다~!
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style type="text/css">
fieldset {
display = inline;
}
</style>
</head>
<body>
<h2>로그인 실패 </h2>
<a href="./Main.jsp"><button>메인 </button></a>
<a href="./Login.jsp"><button>로그인</button></a>
</body>
</html>