반응형
5.4 서블릿에서 뷰 분리하기
1. 서블릿에서 뷰 분리하기
2. 뷰 분리
3. VO 객체 생성 실습 ( _13_MVC_jsp_VO )
MemberListServlet
package spms.servlets;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import javax.servlet.GenericServlet;
import javax.servlet.RequestDispatcher;
import javax.servlet.Servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import spms.vo.Member;
/**
* Servlet implementation class MemberListServlet
*/
@WebServlet("/member/list")
public class MemberListServlet extends GenericServlet {
/**
* @see Servlet#service(ServletRequest request, ServletResponse response)
*/
@Override
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//DB 연결
Connection conn = null;
//sql문
Statement stmt = null;
//sql문 결과
ResultSet rs = null;
String sqlSelect = "SELECT * FROM MEMBERS ORDER BY MNO ASC";
ServletContext sc = this.getServletContext();
//mysql 서버 접속정보
String driver = sc.getInitParameter("driver");
String mySqlUrl = sc.getInitParameter("url");
String id = sc.getInitParameter("username");
String pwd = sc.getInitParameter("password");
try {
// 1. MySQL 제어 객체를 로딩
//DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver());
Class.forName(driver);
// 2. MySQL 연결
conn = DriverManager.getConnection(mySqlUrl, id, pwd);
// 3. sql문 객체 생성
stmt = conn.createStatement();
// 4. sql 전송 후 결과 값 리턴받기
rs = stmt.executeQuery(sqlSelect);
// 5. 결과를 브라우저로 전송
response.setContentType("text/html;charset=UTF-8");
ArrayList<Member> members = new ArrayList<Member>();
//DB결과 값을 VO로 담음
while(rs.next()) {
members.add(new Member()
.setNo(rs.getInt("MNO"))
.setName(rs.getString("MNAME"))
.setEmail(rs.getNString("EMAIL"))
.setCreateDate(rs.getDate("CRE_DATE")));
}
//request에 회원 목록 데이터 보관
request.setAttribute("memberList", members);
//JSP로 출력 -> 화면 생성을 jsp로 위임할 때 requestDispatcher 객체 사용
RequestDispatcher rd = request.getRequestDispatcher(
"/member/MemberList.jsp"
);
rd.include(request, response);
} catch(Exception e) {
e.printStackTrace();
} finally {
try {
if(rs != null) {
rs.close();
}
} catch(Exception e) {
e.printStackTrace();
}
try {
if(stmt != null) {
stmt.close();
}
} catch(Exception e) {
e.printStackTrace();
}
try {
if(conn != null) {
conn.close();
}
} catch(Exception e) {
e.printStackTrace();
}
}
}
}
MemberList.jsp
<%@ page import="spms.vo.Member"%>
<%@ page import="java.util.ArrayList" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원 목록</title>
</head>
<body>
<h1>회원 목록</h1>
<p><a href="add">신규 회원</a></p>
<%
//MemberListServlet에서 request.setAttribute로 전달한 결과 값 꺼내쓰기
ArrayList<Member> members = (ArrayList<Member>)request.getAttribute("memberList");
for(Member member : members) {
%>
<%=member.getNo() %>,
<a href="update?no=<%=member.getNo()%>"><%=member.getName() %></a>,
<%=member.getEmail() %>,
<%=member.getCreateDate() %>
<a href="delete?no=<%=member.getNo()%>">삭제</a><br>
<%} %>
</body>
</html>
실행 결과
5.5 포워딩과 인클루딩
1. 제어권 위임
예) MemberListServlet.java 코드에서 include와 forward는 같은 결과를 출력함
//동일한 실행 결과를 가진다.
rd.include(request, response);
rd.forward(request, response);
2. 포워딩과 인클루딩 차이
- 포워딩 방식 : 서블릿 A로 돌아가지 않고 바로 서블릿 B가 실행됨
3. 포워딩과 인클루딩 실습하기
1) 인클루딩 방식 실습
Error.jsp 생성
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>시스템 오류</title>
</head>
<body>
<p>요청을 처리하는 중에 문제가 발생하였습니다. 잠시 후에 다시 요청하시기 바랍니다.
만약 계속해서 이 문제가 발생한다면 시스템 운영팀(사내번호 : 8282)에 연락하기 바랍니다.</p>
</body>
</html>
MemberListServlet.java 코드 수정
//작위적인 에러 발생시키기 (MEMBERS -> MEM)
String sqlSelect = "SELECT * FROM MEM ORDER BY MNO ASC";
// 에러 코드 변경
catch(Exception e) {
throw new ServletException(e);
실행 화면
2) 포워딩 방식 실습
MemberListServlet.java 코드 수정
//rd.include(request, response);
rd.forward(request, response);
} catch(Exception e) {
//throw new ServletException(e); // 에러 코드 변경
request.setAttribute("error", e);
RequestDispatcher rd = request.getRequestDispatcher("/Error.jsp");
rd.forward(request, response);
}
Error.jsp 파일 수정
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
Exception e = (Exception)request.getAttribute("error");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>시스템 오류</title>
</head>
<body>
<p>요청을 처리하는 중에 문제가 발생하였습니다. 잠시 후에 다시 요청하시기 바랍니다.
만약 계속해서 이 문제가 발생한다면 시스템 운영팀(사내번호 : 8282)에 연락하기 바랍니다.</p>
<p><%=e.getMessage() %></p>
</body>
</html>
실행 화면 (다시 제어권이 돌아오지 않음)
2) Header, Tail 파일을 이용해서 화면 출력 제어권 위임 실습하기
구조 확인하기
MemberListServlet.java 코드 수정
//에러 다시 되돌리기 (MEM -> MEMBERS)
String sqlSelect = "SELECT * FROM MEMBERS ORDER BY MNO ASC";
Error.jsp 수정
<%@ page import="spms.vo.Member"%>
<%@ page import="java.util.ArrayList" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원 목록</title>
</head>
<body>
<!-- jsp 인클루딩 : jsp:include/> -->
<!-- jsp 포워딩 : jsp:forward/> -->
<jsp:include page="/Header.jsp"/> <!-- 이 부분 추가 -->
<h1>회원 목록</h1>
<p><a href="add">신규 회원</a></p>
<%
//MemberListServlet에서 request.setAttribute로 전달한 결과 값 꺼내쓰기
ArrayList<Member> members = (ArrayList<Member>)request.getAttribute("memberList");
for(Member member : members) {
%>
<%=member.getNo() %>,
<a href="update?no=<%=member.getNo()%>"><%=member.getName() %></a>,
<%=member.getEmail() %>,
<%=member.getCreateDate() %>
<a href="delete?no=<%=member.getNo()%>">삭제</a><br>
<%} %>
<jsp:include page="/Tail.jsp"/> <!-- 이 부분 추가 -->
</body>
</html>
실행 화면
반응형
'👨💻 2. 웹개발_Back end > 2-4 JSP & Servlet' 카테고리의 다른 글
[JSP & Servlet] 5장 MVC 아키텍처 (4) - 뷰와 서블릿 분리 및 JSP 컨텍스트와 Action Tag (1) | 2021.10.14 |
---|---|
[JSP & Servlet] 5장 MVC 아키텍처 (3) - 데이터 보관소 (0) | 2021.10.14 |
[JSP & Servlet] 5장 MVC 아키텍처 (1) - MVC 이해하기 (0) | 2021.10.14 |
[JSP & Servlet] 4장 서블릿과 JDBC (4) - 필터 사용하기 (0) | 2021.10.14 |
[JSP & Servlet] 4장 서블릿과 JDBC (3) - 리프래시와 서블릿 초기화 매개변수 (0) | 2021.10.14 |
댓글