✿∘˚˳°∘°
53일차 : JSP, MVC1, MVC2 본문
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>
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 |