✿∘˚˳°∘°

53일차 : JSP, MVC1, MVC2 본문

국비수업/Server

53일차 : JSP, MVC1, MVC2

_HYE_ 2023. 2. 16. 23:17

20230213

 

1. JSP : 동적 웹페이지를 java언어를 이용하여 html, xml기반으로 작성할 수 있는기술
Servlet의 out.println("<h1>안녕하세요</h2>"); 를 개선한것

Servlet : 비즈니스 로직처리에 적합
-- out.println("<html>")
JSP : 화면로직 처리에 적합
-- <% for(int i=0; i<10; i++) %>

최종적으로는 두개를 함께 쓸것
JSP의 위치 : webapp폴더 아래(html이 메인이기 때문에)
아파치톰캣이 작성한 JSP를 알아서 java로 변환해준다(기존에 하던작업을 서버에게 위임하는것)
JSP는 재시작을 하지않아도 저장을하면 자동으로 처리해준다
<%-- 주석 --%>
<% 코드 %>
<%= 표현식 %>

 

JSP 내장객체
request, session, page, application

request : 하나의 요청을 처리할 때 사용되는 영역
session : 하나의 브라우저와 관련된 영역
--로그인 시 로그인 관련 정보가 session에 담겨서 브라우저가 종료될 때 까지 유지

 

1 - 1 ) 지시자 태그 : <%@ %>

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!-- 위태그가 지시자태그 -->
<!-- 해당 클래스에서 사용하고 싶은 클래스를 import할 때 지시자 태그 사용 -->
<%@ page import="java.util.ArrayList" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>지시자태그</h1>
	<hr>
	<h3>JSP 페이지 전체에 영향을 미치는 정보를 기술할 때 사용하는 태그</h3>
	<!-- directiveTag.jsp 구동
	     -> 아파치톰캣이라는 서버가 directiveTag_jsp.java(Servlet과 같은역할)로 변환
	     -> directiveTag_jsp.class
	     
	     서버가 자동으로 이런 변환을 해준다.
	     public class directiveTag_jsp{	
	     	public void _jspService(){
	     		out.println("<h1>지시자태그</h1>"); 
	   		    out.println("<hr>");
	     		out.println("<h3>JSP페이지에어쩌구저쩌구</h3>");
     		
	     		//이런 arraylist를 사용하기 위해선 import를 우선해줘야 사용가능하다
	     		//이럴때 사용하는게 지시자 태그
	     		ArrayList<String> list = new ArrayList<s>(); 
	     	}
	     }   
	-->
	
	<!-- 이미 작성된 jsp파일을 해당 페이지로 포함시키는 기능 -->
	<%@ include file="/jsp/test.jsp" %>
	<h3>테스트</h3>
	<button onclick="func1();">클릭</button>
	
</body>
</html>

지시자 태그를 통해 test.jsp파일을 해당 페이지로 포함시키는게 가능하다

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

    <h2>이건 test.jsp파일의 내용입니다.</h2>
    <!-- style도 script도 넣을 수 있다. -->
    <style>
    	h3{
    		color:red;
    	}
    </style>
    <script>
    	function func1(){
    		alert("!!");
    	};
    </script>

 

 

1 - 2 ) 스크립틀릿 태그 : <% %>

<%@ 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>
</head>
<body>
	<h1>스크립틀릿 태그</h1>
	<hr>
	<h3>_jspService 메소드의 수행내용을 작성할 때 사용</h3>
	<p>자바 소스코드를 작성하고 싶을 때 사용하는 태그</p>
	<!-- 
		 public class scriptletTag_jsp{	
	     	public void _jspService(){
	     		out.println("<h1>스크립틀릿 태그</h1>"); 
	   		    out.println("<hr>");
	   		    //태그의 경우에는 알아서 변환이 되지만 자바소스코드는 X
	   		    //이 경우 사용하는게 스클립틀릿 태그
	     		int age = 10;
	     		if(age > 19){
	     			<p>성인입니다</p>
	     		}else{
	     			<p>미성년자입니다</p>
	     		}   		
	     	}
	     } 
	 -->
	 int age = 10; <!-- 아무태그도 쓰지않은 글씨로 화면에 구현 -->
	 <%
	 	int age = 10; //이게 자바코드 
	 %>
	 <%if(age > 19){%> <!-- html을 사용하다가 중간에 자바코드를 사용하고 싶을 때 사용 -->
	 	<p>성인입니다</p>
	 <%}else{ %>
	 	<p>미성년자입니다</p>
	 <%} %>
</body>
</html>

int age를 스클립틀릿 태그 내에서 사용하면 java문법대로 사용가능

1 - 3 ) 표현식 태그 : <%= %>

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ page import="java.util.ArrayList" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>표현식 태그</h1>
	<hr>
	<h3>자바의 데이터를 HTML 컨텐츠로 표현하기위해 사용하는 태그</h3>
	<%
		int age = 25;
		ArrayList<String> list = new ArrayList<String>();
		list.add("일유저");
		list.add("이유저");
		list.add("삼유저");
		list.add("사유저");
		list.add("오유저");
	%>
	<%if(age > 19){ %>
		<!-- 변수에 세미콜론X -->
		<h3><%=age %>살은 성인입니다.</h3>
	<%} else{ %>
		<h3><%=age %>살은 미성년자입니다.</h3>
	<%} %>
	<hr>
	<% for(int i=0; i<list.size(); i++) {%>
		<h3><%=i %>_<%=list.get(i) %></h3>
	<%} %>
</body>
</html>

1 - 4 ) 선언식 태그 : <%! %>

<%@ 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>
</head>
<body>
	<h1>선언식태그</h1>
	<hr>
	<h3>jsp로 생성되는 클래스의 전역변수 및 추가메소드를 생성하는 태그</h3>
	
	<%!
		private int count = 10;
		public String addCount(){
			count++;
			return "카운트 증가 완료";
		}
	%>
	<h3><%=count %></h3>
	<h3><%=addCount() %></h3>
	<h3><%=count %></h3>
</body>
</html>

 

 

MVC 아키텍쳐
Model : 비즈니스 로직, 수행할 서비스 담당 - Service, Dao, Vo
View : 화면담당 - JSP, HTML 등을 통해 표현
Controller : 사용자의 요청을 받고 서비스를 호출하고 결과를 전송하는 담당 - Service를 호출하고 결과를 View에 전송
-- 어디서 무슨행동을 할 지가 명확하게 정의되어 있음

 

2. MVC1

: JSP페이지가 사용자의 요청을 받아 비즈니스 로직을 수행한 후 해당 페이지에서 결과처리까지 진행

  (소규모 프로젝트에 적합)

: Controller와 View가 같은 JSP페이지에서 진행된다.

 

index.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>
</head>
<body>
	<h1>MVC1 프로젝트</h1>
	<hr>
	<!-- MVC1에서는 Controller의 역할을 jsp가 할것 -->
	<!-- view와 controller가 같은 jsp페이지 -->
	<!-- 소규모 프로젝트에서 주로 사용 -->
   <h3><a href="/jsp/searchAll.jsp">1. 전체회원조회</a></h3>
   <h3><a href="/jsp/searchFrm.jsp">2. 아이디로 회원 조회</a></h3>
   <h3><a href="/jsp/joinFrm.jsp">3. 회원가입</a></h3>
</body>
</html>

2 - 1 ) 전체회원 조회

controller(+view)

<%@page import="kr.or.iei.model.vo.Member"%>
<%@page import="java.util.ArrayList"%>
<%@page import="kr.or.iei.model.service.MemberService"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%
    	//1. 인코딩
    	request.setCharacterEncoding("utf-8");
    	//2. 값추출 - 받은값이 없으므로 생략
    	//3. 비즈니스 로직
    	MemberService service = new MemberService();
    	ArrayList<Member> list = service.selectAllMember();
    	//4. 결과처리
    %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h2>전체 회원 출력</h2>
	<hr>
	<%if(list.size() == 0) {%>
		<h3>회원정보를 조회할 수 없습니다.</h3>
	<%} else{
			for(Member m : list){%>
				<ul>
					<li>회원번호 : <%=m.getMemberNo() %></li>
					<li>아이디 : <%=m.getMemberId() %></li>
					<li>비밀번호 : <%=m.getMemberPw() %></li>
					<li>이름 : <%=m.getMemberName() %></li>
					<li>전화번호 : <%=m.getMemberPhone() %></li>
					<li>주소 : <%=m.getMemberAddr() %></li>
					<%if(m.getMemberLevel() == 1) {%>
						<li>회원등급 : 관리자</li>
					<%} else if(m.getMemberLevel() == 2) {%>
						<li>회원등급 : 정회원</li>
					<%} else if(m.getMemberLevel() == 3) {%>
						<li>회원등급 : 준회원</li>
					<%} %>
					<li>가입일 : <%=m.getEnrollDate() %></li>
				</ul>
				<hr>
			<% }%>
	<%} %>
</body>
</html>

- Service

	public ArrayList<Member> selectAllMember(){
		Connection conn = JDBCTemplate.getConnection();
		ArrayList<Member> list = dao.selectAllMember(conn); 
		JDBCTemplate.close(conn);
		return list;
	}

- Dao

	public ArrayList<Member> selectAllMember(Connection conn) {
		PreparedStatement pstmt = null;
		ResultSet rset = null;
		ArrayList<Member> list = new ArrayList();
		
		String query = "select * from member_tbl";
		
		try {
			pstmt = conn.prepareStatement(query);
			rset = pstmt.executeQuery();
			while(rset.next()) {
				Member m = new Member();
				m.setEnrollDate(rset.getString("enroll_date"));
				m.setMemberAddr(rset.getString("member_addr"));
				m.setMemberId(rset.getString("member_id"));
				m.setMemberLevel(rset.getInt("member_level"));
				m.setMemberName(rset.getString("member_name"));
				m.setMemberNo(rset.getInt("member_no"));
				m.setMemberPhone(rset.getString("member_phone"));
				m.setMemberPw(rset.getString("member_pw"));
				list.add(m);
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			JDBCTemplate.close(rset);
			JDBCTemplate.close(pstmt);
		}
		
		return list;
	}

 

2 - 2 ) 아이디로 회원조회

아이디를 입력받을 폼(아이디를 입력하고 데이터를 form태그를 통해 Controller로 이동하는 역할을 해준다.)

<%@ 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>
</head>
<body>
<body>
   <!-- 아이디를 입력을 받아서 전송 -->
   <h1>아이디로 회원조회</h1>
   <hr>
   <form action="/jsp/searchId.jsp" method="post">
      <input type="text" name="memberId" placeholder="조회할 아이디">
      <input type="submit" value="조회">    
   </form>
</body>
</body>
</html>

Controller(+View)

<%@page import="kr.or.iei.model.vo.Member"%>
<%@page import="kr.or.iei.model.service.MemberService"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%
    //1.인코딩
	    request.setCharacterEncoding("utf-8");
	    //2. 값추출
	    String memberId = request.getParameter("memberId");
	    //3. 비즈니스로직
	    MemberService service = new MemberService();
	    Member m = service.selectOneMember(memberId);
	    //4. 결과처리 - body태그 안에 작성
    %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%if(m == null) {%>
		<h2>회원 정보를 조회할 수 없습니다.</h2>
	<%}else{ %>
		<ul>
			<li>회원번호 : <%=m.getMemberNo() %></li>
			<li>아이디 : <%=m.getMemberId() %></li>
			<li>비밀번호 : <%=m.getMemberPw() %></li>
			<li>이름 : <%=m.getMemberName() %></li>
			<li>전화번호 : <%=m.getMemberPhone() %></li>
			<li>주소 : <%=m.getMemberAddr() %></li>
			<%if(m.getMemberLevel() == 1) {%>
				<li>회원등급 : 관리자</li>
			<%} else if(m.getMemberLevel() == 2) {%>
				<li>회원등급 : 정회원</li>
			<%} else if(m.getMemberLevel() == 3) {%>
				<li>회원등급 : 준회원</li>
			<%} %>
			<li>가입일 : <%=m.getEnrollDate() %></li>
		</ul>
	<%} %>
</body>
</html>

Service

	public Member selectOneMember(String memberId) {
		Connection conn = JDBCTemplate.getConnection();
		Member m = dao.selectOneMember(conn, memberId);
		JDBCTemplate.close(conn);
		return m;
	}

Dao

	public Member selectOneMember(Connection conn, String memberId) {
		PreparedStatement pstmt = null;
		ResultSet rset = null;
		Member m = null;
		String query = "select * from member_tbl where member_id = ?";
		
		try {
			pstmt = conn.prepareStatement(query);
			pstmt.setString(1, memberId);
			rset = pstmt.executeQuery();
			if(rset.next()) {
				m = new Member();
				m.setEnrollDate(rset.getString("enroll_date"));
				m.setMemberAddr(rset.getString("member_addr"));
				m.setMemberId(rset.getString("member_id"));
				m.setMemberLevel(rset.getInt("member_level"));
				m.setMemberName(rset.getString("member_name"));
				m.setMemberNo(rset.getInt("member_no"));
				m.setMemberPhone(rset.getString("member_phone"));
				m.setMemberPw(rset.getString("member_pw"));
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			JDBCTemplate.close(rset);
			JDBCTemplate.close(pstmt);
		}
		return m;
	}

 

2 - 3 ) 회원가입

회원가입 정보를 입력할 폼

<%@ 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>
</head>
<body>
	<h2>회원가입</h2>
	<hr>
	<form action="/jsp/join.jsp" method="post">
		<table>
			<tr>
				<td><label for="id">아이디</label></td>
				<td><input type="text" name="memberId" id="id"><br></td>
			</tr>
			<tr>
				<td><label for="pw">비밀번호</label></td>
				<td><input type="password" name="memberPw" id="pw"><br></td>
			</tr>
			<tr>
				<td><label for="name">이름</label></td>
				<td><input type="text" name="memberName" id="name"><br></td>
			</tr>
			<tr>
				<td><label for="phone">전화번호</label></td>
				<td><input type="text" name="memberPhone" id="phone" placeholder="010-0000-0000"><br></td>
			</tr>
			<tr>
				<td><label for="addr">주소</label></td>
				<td><input type="text" name="memberAddr" id="addr"><br></td>
			</tr>
		</table>
		<input type="submit" value="회원가입">
		<input type="reset" value="취소">
	</form>
</body>
</html>

Controller(+view) : 회원가입 처리를 하고 가입성공여부를 화면에 출력하는 역할까지 해준다.

<%@page import="kr.or.iei.model.service.MemberService"%>
<%@page import="kr.or.iei.model.vo.Member"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%
    	//1.인코딩
    	request.setCharacterEncoding("utf-8");
    	//2.값추출
    	Member m = new Member();
    	m.setMemberId(request.getParameter("memberId"));
    	m.setMemberPw(request.getParameter("memberPw"));
    	m.setMemberName(request.getParameter("memberName"));
    	m.setMemberPhone(request.getParameter("memberPhone"));
    	m.setMemberAddr(request.getParameter("memberAddr"));
    	//3.비즈니스로직
    	MemberService service = new MemberService();
    	int result = service.joinMember(m);
    	//4.결과처리
    %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h2>회원가입</h2>
	<hr>
	<%if(result > 0) {%>
		<h3>가입성공!</h3>
	<%}else{ %>
		<h3>가입실패!</h3>
	<%} %>
	<a href="/">메인으로 돌아가기</a>
</body>
</html>

Service

	public int joinMember(Member m) {
		Connection conn = JDBCTemplate.getConnection();
		int result = dao.joinMember(conn, m);
		if(result > 0) {
			JDBCTemplate.commit(conn);
		}else {
			JDBCTemplate.rollback(conn);
		}
		return result;
	}

Dao

	public int joinMember(Connection conn, Member m) {
		PreparedStatement pstmt = null;
		int result = 0;
		String query = "insert into member_tbl values(member_seq.nextval, ?, ?, ?, ?, ?, 3, to_char(sysdate, 'yyyy-mm-dd'))";
		
		try {
			pstmt = conn.prepareStatement(query);
			pstmt.setString(1, m.getMemberId());
			pstmt.setString(2, m.getMemberPw());
			pstmt.setString(3, m.getMemberName());
			pstmt.setString(4, m.getMemberPhone());
			pstmt.setString(5, m.getMemberAddr());
			
			result = pstmt.executeUpdate();
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			JDBCTemplate.close(pstmt);
		}
		return result;
	}

 

3. MVC2

: 사용자의 요청을 받아 비지니스로직을 수행하는 역할은 Servlet이 하고, 비지니스로직 수행결과를 통한  View는 JSP로 구현 (MVC1과 달리 Controller와 View 역할이 분리되어 있음)

 

index.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>
</head>
<body>
	<!-- 비즈니스로직은 Servlet이 수행 / 결과처리view는 jsp가 수행 -->
	<h1>MVC2 Project</h1>
	<hr>
	<h3><a href="/selectAll.do">1. 전체 회원 조회</a></h3>
	<h3><a href="/jsp/searchFrm.jsp">2. 아이디로 회원 조회</a></h3>
	<h3><a href="/jsp/joinFrm.jsp">3. 회원 가입</a></h3>
</body>
</html>

3 - 1 ) 전체 회원 조회

- Controller(Servlet)

package kr.or.iei.controller;

import java.io.IOException;
import java.util.ArrayList;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import kr.or.iei.model.service.MemberService;
import kr.or.iei.model.vo.Member;

/**
 * Servlet implementation class SelectAllServlet
 */
@WebServlet(name = "SelectAll", urlPatterns = { "/selectAll.do" })
public class SelectAllServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public SelectAllServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//1. 인코딩
		request.setCharacterEncoding("utf-8");
		//2. 값추출 - 생략
		//3. 비즈니스로직
		MemberService service = new MemberService();
		ArrayList<Member> list = service.selectAllMember();
		//4. 결과처리
		//4-1. jsp파일지정
		RequestDispatcher view = request.getRequestDispatcher("/WEB-INF/views/selectAllMember.jsp");
		//주소창에서 위 주소를 입력하면 찾을수없는 페이지가 뜸
		//-> WEB-INF는 바로 접근이 불가능함 -> 반드시 servlet을 들렀다 와야함
		//4-2. 화면구성에 필요한 데이터등록
		request.setAttribute("list", list);
		//4-3. jsp페이지로 사용자이동
		view.forward(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}
}

- Service

	public ArrayList<Member> selectAllMember(){
		Connection conn = JDBCTemplate.getConnection();
		ArrayList<Member> list = dao.selectAllMember(conn); 
		JDBCTemplate.close(conn);
		return list;
	}

- Dao

	public ArrayList<Member> selectAllMember(Connection conn) {
		PreparedStatement pstmt = null;
		ResultSet rset = null;
		ArrayList<Member> list = new ArrayList();
		
		String query = "select * from member_tbl";
		
		try {
			pstmt = conn.prepareStatement(query);
			rset = pstmt.executeQuery();
			while(rset.next()) {
				Member m = new Member();
				m.setEnrollDate(rset.getString("enroll_date"));
				m.setMemberAddr(rset.getString("member_addr"));
				m.setMemberId(rset.getString("member_id"));
				m.setMemberLevel(rset.getInt("member_level"));
				m.setMemberName(rset.getString("member_name"));
				m.setMemberNo(rset.getInt("member_no"));
				m.setMemberPhone(rset.getString("member_phone"));
				m.setMemberPw(rset.getString("member_pw"));
				list.add(m);
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			JDBCTemplate.close(rset);
			JDBCTemplate.close(pstmt);
		}
		
		return list;
	}

- View(jsp)

<%@page import="kr.or.iei.model.vo.Member"%>
<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%
    //서블릿이 보내준 객체를 꺼내기   
    //object를 실제로 만들기위해 ArrayList<Member>타입으로 다운캐스팅(형변환)
    //object를 다 상속한다는 걸 이용
    ArrayList<Member> list = (ArrayList<Member>)request.getAttribute("list");
    //servlet을 거치지않고 직접 주소창에 ip/jsp/selectAllMember.jsp를 입력해서 접근하면 에러발생
    //->list라는 데이터는 servlet에서 온거기때문에 nullPoint에러가 발생한다
    %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%if(list.size() == 0) {%>
	<h1>회원정보가 없습니다.</h1>
	<%} else{%>
	<table>
		<tr>
			<th>회원번호</th>
			<th>아이디</th>
			<th>비밀번호</th>
			<th>이름</th>
			<th>전화번호</th>
			<th>주소</th>
			<th>회원등급</th>
			<th>가입일</th>
		</tr>
		<%for(Member m : list) {%>
		<tr>
			<td><%=m.getMemberNo() %></td>
			<td><%=m.getMemberId() %></td>
			<td><%=m.getMemberPw() %></td>
			<td><%=m.getMemberName() %></td>
			<td><%=m.getMemberPhone() %></td>
			<td><%=m.getMemberAddr() %></td>
			<%if(m.getMemberLevel() == 1) {%>
			<td>관리자</td>
			<%}else if(m.getMemberLevel() == 2) {%>
			<td>정회원</td>
			<%}else if(m.getMemberLevel() == 3) {%>
			<td>준회원</td>
			<%} %>
			<td><%=m.getEnrollDate() %>
		</tr>
	<%} %>
	</table>
	<%} %>	
	
</body>
</html>

3 - 2 ) 아이디로 회원 조회

아이디를 입력받을 폼(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>
</head>
<body>
	<h1>아이디로 회원 조회</h1>
	<hr>
	<!-- mvc2패턴은 폼을 servlet의 주솟값으로 보내준다 -->
	<form action="/searchId.do" method="get">
		<input type="text" name="memberId" placeholder="조회할 아이디">
		<input type="submit" value="조회">
	</form>
</body>
</html>

Controller(Servlet)

package kr.or.iei.controller;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import kr.or.iei.model.service.MemberService;
import kr.or.iei.model.vo.Member;

/**
 * Servlet implementation class SearchIdServlet
 */
@WebServlet(name = "SearchId", urlPatterns = { "/searchId.do" })
public class SearchIdServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public SearchIdServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//1. 인코딩
		request.setCharacterEncoding("utf-8");
		//2. 값추출
		String memberId = request.getParameter("memberId");
		//3. 비즈니스로직
		MemberService service = new MemberService();
		Member m = service.selectOneMember(memberId);
		//4. 결과처리
		//4-1. 결과를 처리할 jsp파일을 지정
		RequestDispatcher view = request.getRequestDispatcher("/jsp/searchId.jsp");
		//4-2. 화면구성에 필요한 데이터를 등록
		//HashMap<String, Object>라고 생각하면 된다
		request.setAttribute("m", m); //m이라는 이름으로 Member객체를 저장
		//4-3. jsp페이지로 사용자 이동
		view.forward(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

Service

	public Member selectOneMember(String memberId) {
		Connection conn = JDBCTemplate.getConnection();
		Member m = dao.selectOneMember(conn, memberId);
		JDBCTemplate.close(conn);
		return m;
	}

Dao

	public Member selectOneMember(Connection conn, String memberId) {
		PreparedStatement pstmt = null;
		ResultSet rset = null;
		Member m = null;
		String query = "select * from member_tbl where member_id = ?";
		
		try {
			pstmt = conn.prepareStatement(query);
			pstmt.setString(1, memberId);
			rset = pstmt.executeQuery();
			if(rset.next()) {
				m = new Member();
				m.setEnrollDate(rset.getString("enroll_date"));
				m.setMemberAddr(rset.getString("member_addr"));
				m.setMemberId(rset.getString("member_id"));
				m.setMemberLevel(rset.getInt("member_level"));
				m.setMemberName(rset.getString("member_name"));
				m.setMemberNo(rset.getInt("member_no"));
				m.setMemberPhone(rset.getString("member_phone"));
				m.setMemberPw(rset.getString("member_pw"));
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			JDBCTemplate.close(rset);
			JDBCTemplate.close(pstmt);
		}
		return m;
	}

View(jsp)

<%@page import="kr.or.iei.model.vo.Member"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%
    //servlet이 보내준 데이터를 꺼내오는 작업
    //servlet이 보재눈 데이터는 형태가 다양하기 때문에 항상 Object타입
    //사용하고싶은 객체 타입으로 DownCasting(형변환)해줘야 한다.
    Member m = (Member)request.getAttribute("m");//꺼내오면 Object 타입 - Member형식으로 사용하고 싶기 때문에 형변환
    %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%if(m != null) {%>
	<ul>
		<li>회원번호 : <%=m.getMemberNo() %></li>
		<li>회원아이디 : <%=m.getMemberId() %></li>
		<li>회원비밀번호 : <%=m.getMemberPw() %></li>
		<li>회원이름 : <%=m.getMemberName() %></li>
		<li>회원전화번호 : <%=m.getMemberPhone() %></li>
		<li>회원주소 : <%=m.getMemberAddr() %></li>
		<%if(m.getMemberLevel() == 1) {%>
		<li>관리자</li>
		<%} else if(m.getMemberLevel() == 2) {%>
		<li>정회원</li>
		<%} else if(m.getMemberLevel() == 3) {%>
		<li>준회원</li>
		<%} %>
		<li>가입일 : <%=m.getEnrollDate() %></li>
	</ul>
	<%}else { %>
	<h3>회원정보를 조회할 수 없습니다.</h3>
	<%} %>
</body>
</html>

3 - 3 ) 회원 가입

가입할 정보를 입력받을 폼 (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>
</head>
<body>
	<h2>회원가입</h2>
	<hr>
	<form action="/joinMember.do" method="post">
		<table>
			<tr>
				<td><label for="id">아이디</label></td>
				<td><input type="text" name="memberId" id="id"><br></td>
			</tr>
			<tr>
				<td><label for="pw">비밀번호</label></td>
				<td><input type="password" name="memberPw" id="pw"><br></td>
			</tr>
			<tr>
				<td><label for="name">이름</label></td>
				<td><input type="text" name="memberName" id="name"><br></td>
			</tr>
			<tr>
				<td><label for="phone">전화번호</label></td>
				<td><input type="text" name="memberPhone" id="phone" placeholder="010-0000-0000"><br></td>
			</tr>
			<tr>
				<td><label for="addr">주소</label></td>
				<td><input type="text" name="memberAddr" id="addr"><br></td>
			</tr>
		</table>
		<input type="submit" value="회원가입">
		<input type="reset" value="취소">
	</form>
</body>
</html>

Controller(Servlet)

package kr.or.iei.controller;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import kr.or.iei.model.service.MemberService;
import kr.or.iei.model.vo.Member;

/**
 * Servlet implementation class JoinMemberServlet
 */
@WebServlet(name = "JoinMember", urlPatterns = { "/joinMember.do" })
public class JoinMemberServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public JoinMemberServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//1. 인코딩
		request.setCharacterEncoding("utf-8");
		//2. 값추출
		Member m = new Member();
		m.setMemberId(request.getParameter("memberId"));
		m.setMemberPw(request.getParameter("memberPw"));
		m.setMemberName(request.getParameter("memberName"));
		m.setMemberPhone(request.getParameter("memberPhone"));
		m.setMemberAddr(request.getParameter("memberAddr"));
		//3. 비즈니스로직
		MemberService service = new MemberService();
		int result = service.joinMember(m);
		
		//4. 결과처리1 - 최종적으론 mvc구조가 살짝 틀려있음(성공실패의 판단은 모두 servlet에서 이루어져야함)
		//4-1. jsp 경로지정
		/*
		RequestDispatcher view = request.getRequestDispatcher("/jsp/joinComplete.jsp");
		//4-2. 데이터보내기
		request.setAttribute("result", result); 
		//여기서 보내는 result는 Object(객체)이기 때문에 원래는 형변환을 해줘야함(기본자료형은 객체로 들어갈 수 없음)
		//실제로는 Integer num = new Integer(result); 작업을 하고 request.setAttribute("result", num);
		//으로 넣어줘야함 
		//Integer num = result; 오토박싱에 의해 이렇게 집어넣어도 result는 Integer의 형태가된다.
		//자동 박싱/언박싱 기능때문에 적어주지 않아도 되는 것
		
		//4-3. 사용자가 jsp로 이동
		view.forward(request, response);
		*/
		//4. 결과처리2 - 회원가입 성공시 [이름]님 환영합니다 / 회원가입 실패시 회원가입페이지로이동
		if(result > 0) {
			//4-1. 결과처리할 페이지 지정
			//결과화면에 데이터등록을 하기위해선 반드시 아래방식으로 해야함 - response.sendRedirect();는 사용불가
			RequestDispatcher view = request.getRequestDispatcher("/jsp/joinSuccess.jsp");
			//4-2. 화면구현에 필요한 데이터 등록
			request.setAttribute("memberName", m.getMemberName());
			//4-3. 페이지 이동
			view.forward(request, response);
		}else {
			/*
			//4-1. 결과처리할 페이지 지정
			RequestDispatcher view = request.getRequestDispatcher("/jsp/joinFrim.jsp");
			//4-2. 화면구현에 필요한 데이터등록 - 없으므로생략
			//4-3. 페이지이동
			view.forward(request, response);
			*/
			response.sendRedirect("/jsp/joinFrm.jsp");
		}
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

Service

	public int joinMember(Member m) {
		Connection conn = JDBCTemplate.getConnection();
		int result = dao.joinMember(conn, m);
		if(result > 0) {
			JDBCTemplate.commit(conn);
		}else {
			JDBCTemplate.rollback(conn);
		}
		return result;
	}

Dao

	public int joinMember(Connection conn, Member m) {
		PreparedStatement pstmt = null;
		int result = 0;
		String query = "insert into member_tbl values(member_seq.nextval, ?, ?, ?, ?, ?, 3, to_char(sysdate, 'yyyy-mm-dd'))";
		
		try {
			pstmt = conn.prepareStatement(query);
			pstmt.setString(1, m.getMemberId());
			pstmt.setString(2, m.getMemberPw());
			pstmt.setString(3, m.getMemberName());
			pstmt.setString(4, m.getMemberPhone());
			pstmt.setString(5, m.getMemberAddr());
			
			result = pstmt.executeUpdate();
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			JDBCTemplate.close(pstmt);
		}
		return result;
	}

View 1 : 결과처리1에 대한 jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%
    	int result = (int)request.getAttribute("result");
    	//이것도 원래 
    	//Integer num = (Integer)request.getAttribute("result");
    	//int result = num.intValue();작업을 해줘야 하지만 오토 언박싱 때문에 그냥 작성해도 된다.
    	//wrapper클래스는 자동 언박싱이 되기때문에 작성하지 않아도 된다.
    %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%if(result > 0) {%>
	<h1>가입성공</h1>
	<%}else{ %>
	<h1>가입실패</h1>
	<%} %>
	<a href="/">메인으로 돌아가기</a>
</body>
</html>

View  2 : 결과처리2에 대한 jsp - 성공시  아래 view를 화면에 뜨게하고, 실패 시 회원가입화면으로 되돌아간다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%
    String memberName = (String)request.getAttribute("memberName");
    %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>[<%=memberName %>]님 환영합니다.</h1>
</body>
</html>

 

 

- 응답할 VIEW 페이지가 동적 페이지인 경우

RequestDispatcher 사용

- 응답할 VIEW페이지가 정적 페이지인 경우(화면을 생성할 필요가 없을 경우)

sendRedirect() 사용

'국비수업 > Server' 카테고리의 다른 글

56일차 : mvc2WebProject - 3  (0) 2023.02.16
55일차 : mvc2WebProject - 2  (0) 2023.02.16
54일차 : mvc2WebProject - 1  (0) 2023.02.16
52일차 : DB연결  (0) 2023.02.10
51일차 2 : web, servlet 기초  (0) 2023.02.09
Comments