모델2 )
로그인 / 회원가입
컨트롤러 / 서비스 중요함
mvc > src/main/java> xyz. itwill.dao )
UserinfoModelTwoDAO.java (수정?)
package xyz.itwill.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import xyz.itwill.dto.UserinfoDTO;
public class UserinfoModelTwoDAO extends JdbcDAO {
private static UserinfoModelTwoDAO _dao;
private UserinfoModelTwoDAO() {
// TODO Auto-generated constructor stub
}
static {
_dao=new UserinfoModelTwoDAO();
}
public static UserinfoModelTwoDAO getDAO() {
return _dao;
}
//회원정보를 전달받아 USERINFO 테이블의 회원정보로 삽입하고 삽입행의 갯수를 반환하는 메소드
public int insertUserinfo(UserinfoDTO userinfo) throws SQLException {
Connection con=null;
PreparedStatement pstmt=null;
int rows=0;
try {
con=getConnection();
String sql="insert into userinfo values(?,?,?,?,?)";
pstmt=con.prepareStatement(sql);
pstmt.setString(1, userinfo.getUserid());
pstmt.setString(2, userinfo.getPassword());
pstmt.setString(3, userinfo.getName());
pstmt.setString(4, userinfo.getEmail());
pstmt.setInt(5, userinfo.getStatus());
rows=pstmt.executeUpdate();
} finally {
close(con, pstmt);
}
return rows;
}
//회원정보를 전달받아 USERINFO 테이블에 저장된 회원정보를 변경하고 변경행의 갯수를 반환하는 메소드
public int updateUserinfo(UserinfoDTO userinfo) throws SQLException {
Connection con=null;
PreparedStatement pstmt=null;
int rows=0;
try {
con=getConnection();
String sql="update userinfo set password=?, name=?, email=?, status=? where userid=?";
pstmt=con.prepareStatement(sql);
pstmt.setString(1, userinfo.getPassword());
pstmt.setString(2, userinfo.getName());
pstmt.setString(3, userinfo.getEmail());
pstmt.setInt(4, userinfo.getStatus());
pstmt.setString(5, userinfo.getUserid());
rows=pstmt.executeUpdate();
} finally {
close(con, pstmt);
}
return rows;
}
//아이디를 전달받아 USERINFO 테이블에 저장된 회원정보를 삭제하고 삭제행의 갯수를 반환하는 메소드
public int deleteUserinfo(String userid) throws SQLException {
Connection con=null;
PreparedStatement pstmt=null;
int rows=0;
try {
con=getConnection();
String sql="delete from userinfo where userid=?";
pstmt=con.prepareStatement(sql);
pstmt.setString(1, userid);
rows=pstmt.executeUpdate();
} finally {
close(con, pstmt);
}
return rows;
}
//아이디를 전달받아 USERINFO 테이블에 저장된 회원정보를 검색하여 DTO 객체로 반환하는 메소드
public UserinfoDTO selectUserinfo(String userid) throws SQLException {
Connection con=null;
PreparedStatement pstmt=null;
ResultSet rs=null;
UserinfoDTO userinfo=null;
try {
con=getConnection();
String sql="select * from userinfo where userid=?";
pstmt=con.prepareStatement(sql);
pstmt.setString(1, userid);
rs=pstmt.executeQuery();
if(rs.next()) {
userinfo=new UserinfoDTO();
userinfo.setUserid(rs.getString("userid"));
userinfo.setPassword(rs.getString("password"));
userinfo.setName(rs.getString("name"));
userinfo.setEmail(rs.getString("email"));
userinfo.setStatus(rs.getInt("status"));
}
} finally {
close(con, pstmt, rs);
}
return userinfo;
}
//USERINFO 테이블에 저장된 모든 회원정보를 검색하여 List 객체로 반환하는 메소드
public List<UserinfoDTO> selectUserinfoList() throws SQLException {
Connection con=null;
PreparedStatement pstmt=null;
ResultSet rs=null;
List<UserinfoDTO> userinfoList=new ArrayList<>();
try {
con=getConnection();
String sql="select * from userinfo order by userid";
pstmt=con.prepareStatement(sql);
rs=pstmt.executeQuery();
while(rs.next()) {
UserinfoDTO userinfo=new UserinfoDTO();
userinfo.setUserid(rs.getString("userid"));
userinfo.setPassword(rs.getString("password"));
userinfo.setName(rs.getString("name"));
userinfo.setEmail(rs.getString("email"));
userinfo.setStatus(rs.getInt("status"));
userinfoList.add(userinfo);
}
} finally {
close(con, pstmt, rs);
}
return userinfoList;
}
}
mvc > src/main/java> xyz. itwill.mvc )
Action .java [인터페이스]
package xyz.itwill.mvc;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//모든 모델 역활의 클래스가 반드시 상속 받아야 되는 인터페이스
// => 모델 역활의 클래스에 요청 처리 메소드에 대한 작성 규칙 제공
// => 컨트롤러 역활의 서블릿에서 모델 객체로 요청 처리 메소드를 쉽게 호출할 수 있으며 유지보수의 효율성 증가
//인터페이스는 요청 처리 메소드를 추상 메소드로 선언
// => 인터페이스를 상속받은 모든 자식클래스는 반드시 추상메소드를 오버라이드 선언 - 메소드 작성 규칙 제공
// => 요청 처리 메소드는 매개변수로 HttpServletRequest 객체와 HttpServletResponse 객체를 전달
//받을 수 있도록 작성하고 뷰 관련 정보(ActionForward 객체)를 반환하도록 작성
// => 요청 처리 메소드의 명령으로 발생되는 ServletException과 IOException은 예외를 처리하지
//않고 요청 처리 메소드를 호출하는 명령으로 전달되도록 작성
public interface Action {
public ActionForward execute(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException;
}
ActionForward .java
package xyz.itwill.mvc;
//뷰(View) 관련 정보를 저장하기 위한 클래스
public class ActionForward {
//페이지 이동 방식에 대한 정보를 저장하기 위한 필드
// => false : 리다이렉트 이동 , true : 포워드 이동
//리다이렉트 이동 : 클라이언트에게 URL 주소(/XXX.do)를 전달하여 다시 요청하도록 응답 처리
// => 클라이언트 브라우저의 요청 URL 주소 변경
//포워드 이동 : 서블릿(컨트롤러)의 스레드를 JSP(뷰)로 이동하여 응답 처리
// => 클라이언트 브라우저의 요청 URL 주소 미변경
private boolean forward;
//페이지 이동을 위한 웹프로그램의 URL 주소를 저장하기 위한 필드
// => 리다이렉트 이동 : /XXX.do, 포워드 : /XXX.jsp
private String path;
public ActionForward() {
// TODO Auto-generated constructor stub
}
public boolean isForward() {
return forward;
}
public void setForward(boolean forward) {
this.forward = forward;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
}
ControllerServlet .java [써블릿으로]
package xyz.itwill.mvc;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//컨트롤러(Controller - Servlet) : 클라이언트의 모든 요청을 받아 모델(Model - Class) 역활의
//객체로 요청 처리 메소드를 호출하여 클라이언트의 요청을 처리하고 처리결과를 뷰(View - JSP)로
//전달하여 응답되도록 프로그램의 흐름을 제공하는 웹프로그램
//1.클라이언트의 모든 요청을 받을 수 있도록 서블릿을 설정하여 단일 진입점의 기능 구현
// => Front Controller Pattern
//@WebServlet("url") : 클래스를 웹프로그램(서블릿)으로 등록하고 요청 URL 주소를 매핑하는 어노테이션
// => 매핑 설정될 URL 주소에 패턴문자(* : 전체, ? : 문자 하나)를 사용하여 URL 패턴 등록 가능
// => @WebServlet("*.do") : 클라이언트가 [XXX.do] 형식의 URL 주소를 요청한 경우 웹프로그램(서블릿) 실행
// => @WebServlet 어노테이션 대신 [web.xml] 파일의 엘리먼트를 사용하여 클래스를 웹프로그램으로
//등록하고 URL 매핑 처리 가능
//@WebServlet("*.do")
public class ControllerServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//System.out.println("ControllerServlet 클래스의 service() 메소드 호출");
//2.클라이언트의 요청 분석 : 요청 URL 주소 이용 - http://localhost:8000/mvc/XXX.do
//HttpServletRequest.getRequestURI() : 요청 URL 주소에서 URI 주소를 반환하는 메소드
String requestURI=request.getRequestURI();
//System.out.println("requestURI = "+requestURI);//requestURI = /mvc/XXX.do
//HttpServletRequest.getContextPath() : 요청 URL 주소에서 컨텍스트 경로를 반환하는 메소드
String contextPath=request.getContextPath();
//System.out.println("contextPath = "+contextPath);//contextPath = /mvc
String command=requestURI.substring(contextPath.length());
//System.out.println("command = "+command);//command = /XXX.do
//3.모델(Model) 객체를 이용하여 요청 처리 메소드를 호출해 클라이언트의 요청을 처리하고
//뷰(View) 관련 정보를 반환받아 저장
// => 하나의 요청에 대해 하나의 모델 객체가 요청을 처리하도록 설정 - Command Controller Pattern
// => 요청 처리 메소드가 선언된 모델 역활의 클래스 작성 - 모델 역활의 클래스는 인터페이스를 상속받아 작성
//회원관리 프로그램에서 클라이언트 요청(Command)에 대한 모델 객체가 매핑되도록 설정
// => [/loginform.do] >> LoginFormModel 클래스
// => [/login.do] >> LoginModel 클래스
// => [/logout.do] >> LogoutModel 클래스
// => [/writeform.do] >> WriteFormModel 클래스
// => [/write.do] >> WriteModel 클래스
// => [/list.do] >> ListModel 클래스
// => [/view.do] >> ViewModel 클래스
// => [/modifyform.do] >> MojdifyFormModel 클래스
// => [/modify.do] >> ModifyModel 클래스
// => [/remove.do] >> RemoveModel 클래스
// => [/error.do] >> ErrorModel 클래스
//모델 역활의 클래스가 상속받기 위한 인터페이스로 참조변수 생성
// => 인터페이스로 생성된 참조변수에는 인스페이스를 상속받은 모든 자식클래스(모델)의 객체 저장 가능
Action action=null;
//클라이언트 요청정보를 구분하여 요청을 처리하기 위한 모델 역활의 클래스로 객체를
//생성하여 인터페이스 참조변수에 저장
if(command.equals("/loginform.do")) {
action=new LoginFormModel();
} else if(command.equals("/login.do")) {
action=new LoginModel();
} else if(command.equals("/logout.do")) {
action=new LogoutModel();
} else if(command.equals("/writeform.do")) {
action=new WriteFormModel();
} else if(command.equals("/write.do")) {
action=new WriteModel();
} else if(command.equals("/error.do")) {
action=new ErrorModel();
} else {//클라이언트 요청에 대한 모델 역활의 클래스가 없는 경우
action=new ErrorModel();
}
//인터페이스 참조변수로 추상메소드를 호출하면 참조변수에 저장된 모델 객체의 요청
//처리 메소드를 호출하고 뷰 관련 정보를 반환받아 저장 - 오버라이드의 의한 다형성
ActionForward actionForward=action.execute(request, response);
//4.응답 관련 정보가 저장된 ActionForward 객체를 이용하여 응답 처리
if(actionForward.isForward()) {//ActionForward 객체의 forward 필드값이 [true]인 경우
//JSP 문서로 포워드 이동하여 JSP 문서의 실행결과(HTML)로 클라이언트에게 전달하여 응답 처리
request.getRequestDispatcher(actionForward.getPath()).forward(request, response);
} else {//ActionForward 객체의 forward 필드값이 [false]인 경우
//서블릿에서 클라이언트에게 URL 주소(/XXX.do)를 전달하여 응답 처리
// => URL 주소를 전달받은 클라이언트는 브라우저의 URL 주소를 변경하여 서블릿 요청
response.sendRedirect(actionForward.getPath());
}
}
}
ErrorModel .java
package xyz.itwill.mvc;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//클라이언트가 [/error.do]로 요청한 경우 객체로 생성될 모델 역활의 클래스
// => [user_error.jsp]로 포워드 이동하기 위한 정보가 저장된 ActionForward 객체 반환
public class ErrorModel implements Action {
@Override
public ActionForward execute(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ActionForward actionForward=new ActionForward();
actionForward.setForward(true);
actionForward.setPath("/model_two/user_error.jsp");
return actionForward;
}
}
LoginFormModel .java
package xyz.itwill.mvc;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//클라이언트가 [/loginform.do]로 요청한 경우 객체로 생성될 모델 역활의 클래스
// => [user_login.jsp]로 포워드 이동하기 위한 정보가 저장된 ActionForward 객체 반환
public class LoginFormModel implements Action {
@Override
public ActionForward execute(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ActionForward actionForward=new ActionForward();
actionForward.setForward(true);
actionForward.setPath("/model_two/user_login.jsp");
return actionForward;
}
}
LoginModel .java
package xyz.itwill.mvc;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import xyz.itwill.exception.AuthFailException;
import xyz.itwill.service.UserinfoService;
//클라이언트가 [/login.do]로 요청한 경우 객체로 생성될 모델 역활의 클래스
// => 로그인정보를 전달받아 USERINFO 테이블에 저장된 회원정보와 비교하여 인증 처리한 후 인증
//성공시 세션에 권한 관련 객체를 속성값으로 저장하고 [/loginform.do] 페이지로 리다이렉트 이동
//하기 위한 정보가 저장된 ActionForward 객체 반환
// => 인증 실패시 [user_login.jsp] 문서로 포워드 이동하기 위한 정보가 저장된 ActionForward
//객체 반환 - 에러메세지와 아이디를 request 객체의 속성값으로 저장하여 JSP 문서에 제공
public class LoginModel implements Action {
@Override
public ActionForward execute(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ActionForward actionForward=new ActionForward();
//클라이언트 요청에 대한 명령을 실행하면서 발생되는 모든 예외를 처리하기 위한 기능 구현
try {
//[/login.do] 페이지를 GET 방식으로 요청한 경우 - 비정상적인 요청
if(request.getMethod().equals("GET")) {
throw new Exception();//인위적인 예외 발생
}
//서블릿(컨트롤러) 요청시 전달된 값을 반환받아 저장
// => 서블릿(컨트롤러)의 request 객체를 요청 처리 메소드의 매개변수로 전달받아 사용
String userid=request.getParameter("userid");
String password=request.getParameter("password");
//모델 클래스의 요청 처리 매소드에서는 Service 클래스의 객체로 메소드를 호출하여
//데이타 처리 관련 기능이 실행되도록 작성
//UserinfoService 클래스의 auth() 메소드를 호출하여 인증 처리
// => AuthFailException이 발생된 경우 인증 실패
UserinfoService.getService().auth(userid, password);
//인증 성공시 세션에 권한 관한 객체를 속성값으로 저장
HttpSession session=request.getSession();
//Session Scope : 동일한 세션을 바인딩하여 사용하는 모든 웹프로그램에서 속성값을 객체로 반환받아 사용 가능
// => 웹브라우저가 종료되면 클라이언트의 정보로 바인딩 세션은 자동으로 삭제 처리
session.setAttribute("loginUserinfo", UserinfoService.getService().getUserinfo(userid));
actionForward.setForward(false);
actionForward.setPath(request.getContextPath()+"/loginform.do");
} catch (AuthFailException e) {
//인증 실패시 발생되는 예외에 대한 명령 작성
//Request Scope : 스레드가 이동된 웹프로그램(JSP)에서만 속성값을 객체로 반환받아 사용 가능
request.setAttribute("message", e.getMessage());
request.setAttribute("userid", request.getParameter("userid"));
actionForward.setForward(true);
actionForward.setPath("/model_two/user_login.jsp");
} catch (Exception e) {//모든 예외를 전달받아 예외 처리하기 위한 명령 작성
e.printStackTrace();//서버 콘솔에 예외가 발생한 예외정보 출력
//[error.do] 페이지로 리다이렉트 이동하기 위한 정보를 ActionForward 객체에 저장
actionForward.setForward(false);
actionForward.setPath(request.getContextPath()+"/error.do");
}
return actionForward;
}
}
LogoutModel.java
package xyz.itwill.mvc;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
//클라이언트가 [/logout.do]로 요청한 경우 객체로 생성될 모델 역활의 클래스
// => 로그아웃 처리 후 [/loginform.do] 페이지로 리다이렉트 이동하기 위한 정보가 저장된 ActionForward 객체 반환
public class LogoutModel implements Action {
@Override
public ActionForward execute(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
HttpSession session=request.getSession();
//session.removeAttribute("loginUserinfo");
session.invalidate();
ActionForward actionForward=new ActionForward();
actionForward.setForward(false);
actionForward.setPath(request.getContextPath()+"/loginform.do");
return actionForward;
}
}
WriteFormModel.java
package xyz.itwill.mvc;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import xyz.itwill.dto.UserinfoDTO;
//클라이언트가 [/writeform.do]로 요청한 경우 객체로 생성될 모델 역활의 클래스
// => 관리자만 요청 가능하도록 권한 설정
//=> [user_write.jsp]로 포워드 이동하기 위한 정보가 저장된 ActionForward 객체 반환
public class WriteFormModel implements Action {
@Override
public ActionForward execute(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ActionForward actionForward=new ActionForward();
try {
HttpSession session=request.getSession();
UserinfoDTO loginUserinfo=(UserinfoDTO)session.getAttribute("loginUserinfo");
//비로그인 상태의 사용자이거나 로그인 사용자가 관리자가 아닌 경우 - 비정상적인 요청
if(loginUserinfo==null || loginUserinfo.getStatus()!=9) {
throw new Exception();
}
actionForward.setForward(true);
actionForward.setPath("/model_two/user_write.jsp");
} catch (Exception e) {
e.printStackTrace();
actionForward.setForward(false);
actionForward.setPath(request.getContextPath()+"/error.do");
}
return actionForward;
}
}
WriteModel.java
package xyz.itwill.mvc;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import xyz.itwill.dto.UserinfoDTO;
import xyz.itwill.exception.ExistsUserinfoException;
import xyz.itwill.service.UserinfoService;
//클라이언트가 [/write.do]로 요청한 경우 객체로 생성될 모델 역활의 클래스
// => 회원정보를 전달받아 USERINFO 테이블에 회원정보로 삽입하고 [/loginform.do] 페이지로
//리다이렉트 이동하기 위한 정보가 저장된 ActionForward 객체 반환
public class WriteModel implements Action {
@Override
public ActionForward execute(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ActionForward actionForward=new ActionForward();
UserinfoDTO userinfo=null;
try {
if(request.getMethod().equals("GET")) {
throw new Exception();
}
request.setCharacterEncoding("utf-8");
String userid=request.getParameter("userid");
String password=request.getParameter("password");
String name=request.getParameter("name");
String email=request.getParameter("email");
int status=Integer.parseInt(request.getParameter("status"));
userinfo=new UserinfoDTO();
userinfo.setUserid(userid);
userinfo.setPassword(password);
userinfo.setName(name);
userinfo.setEmail(email);
userinfo.setStatus(status);
//UserinfoService 클래스의 addUserinfo() 메소드를 호출하여 회원등록 처리
// => 전달받은 아이디가 USERINFO 테이블에 저장된 기존 회원정보의 아이디와 중복될 경우
//ExistsUserinfoException 발생
UserinfoService.getService().addUserinfo(userinfo);
actionForward.setForward(false);
actionForward.setPath(request.getContextPath()+"/loginform.do");
}catch (ExistsUserinfoException e) {
//아이디가 중복된 경우 발생되는 예외에 대한 예외처리 명령 작성
request.setAttribute("message", e.getMessage());
request.setAttribute("userinfo", userinfo);
actionForward.setForward(true);
actionForward.setPath("/model_two/user_write.jsp");
} catch (Exception e) {
e.printStackTrace();
actionForward.setForward(false);
actionForward.setPath(request.getContextPath()+"/error.do");
}
return actionForward;
}
}
mvc > src/main/java> xyz. itwill.service )
UserinfoService.java
package xyz.itwill.service;
import java.sql.SQLException;
import java.util.List;
import xyz.itwill.dao.UserinfoModelTwoDAO;
import xyz.itwill.dto.UserinfoDTO;
import xyz.itwill.exception.AuthFailException;
import xyz.itwill.exception.ExistsUserinfoException;
import xyz.itwill.exception.UserinfoNotFoundException;
//Service 클래스 : 모델 클래스의 요청 처리 메소드에서 데이타 처리 기능을 메소드로 제공하기 위한 클래스
// => 단위 프로그램(모듈 프로그램) : 컴퍼넌트(Component)
// => 다수의 DAO 클래스의 메소드를 호출하여 데이타 처리에 필요한 기능을 제공 - 모듈화
// => 데이타 처리 기능 구현시 발생되는 모든 문제에 대한 인위적 예외 발생 - 모델 클래스에서 예외 처리
public class UserinfoService {
private static UserinfoService _service;
private UserinfoService() {
// TODO Auto-generated constructor stub
}
static {
_service=new UserinfoService();
}
public static UserinfoService getService() {
return _service;
}
//회원정보를 전달받아 USERINFO 테이블에 회원정보를 삽입하는 메소드
// => 매개변수로 전달받은 회원정보의 아이디가 USERINFO 테이블에 저장된 기존 회원정보의
//아이디와 중복될 경우 인위적 예외 발생
public void addUserinfo(UserinfoDTO userinfo) throws SQLException, ExistsUserinfoException {
if(UserinfoModelTwoDAO.getDAO().selectUserinfo(userinfo.getUserid())!=null) {
//사용자 정의 예외클래스를 이용하여 인위적 예외 발생
throw new ExistsUserinfoException("이미 사용중인 아이디를 입력 하였습니다.");
}
UserinfoModelTwoDAO.getDAO().insertUserinfo(userinfo);
}
//회원정보를 전달받아 USERINFO 테이블에 저장된 회원정보를 변경하는 메소드
// => 매개변수로 전달받은 회원정보가 USERINFO 테이블에 없는 경우 인위적 예외 발생
public void modifyUserinfo(UserinfoDTO userinfo) throws SQLException, UserinfoNotFoundException {
if(UserinfoModelTwoDAO.getDAO().selectUserinfo(userinfo.getUserid())==null) {
throw new UserinfoNotFoundException("회원정보가 존재하지 않습니다.");
}
UserinfoModelTwoDAO.getDAO().updateUserinfo(userinfo);
}
//아이디를 전달받아 USERINFO 테이블에 저장된 회원정보를 삭제하는 메소드
// => 매개변수로 전달받은 아이디의 회원정보가 USERINFO 테이블에 없는 경우 인위적 예외 발생
public void removeUserinfo(String userid) throws SQLException, UserinfoNotFoundException {
if(UserinfoModelTwoDAO.getDAO().selectUserinfo(userid)==null) {
throw new UserinfoNotFoundException("회원정보가 존재하지 않습니다.");
}
UserinfoModelTwoDAO.getDAO().deleteUserinfo(userid);
}
//아이디를 전달받아 USERINFO 테이블에 저장된 회원정보를 검색하여 DTO 객체로 반환하는 메소드
// => 매개변수로 전달받은 아이디의 회원정보가 USERINFO 테이블에 없는 경우 인위적 예외 발생
public UserinfoDTO getUserinfo(String userid) throws SQLException, UserinfoNotFoundException {
UserinfoDTO userinfo=UserinfoModelTwoDAO.getDAO().selectUserinfo(userid);
if(userinfo==null) {
throw new UserinfoNotFoundException("회원정보가 존재하지 않습니다.");
}
return userinfo;
}
//USERINFO 테이블에 저장된 모든 회원정보를 검색하여 List 객체로 반환하는 메소드
public List<UserinfoDTO> getUserinfoList() throws SQLException {
return UserinfoModelTwoDAO.getDAO().selectUserinfoList();
}
//로그인정보(아이디와 비밀번호)를 전달받아 인증 처리하는 메소드
// => 인증 실패시 인위적 예외 발생 - 예외가 발생하지 않은 경우 인증 성공
public void auth(String userid, String password) throws SQLException, AuthFailException {
UserinfoDTO userinfo=UserinfoModelTwoDAO.getDAO().selectUserinfo(userid);
if(userinfo==null || !userinfo.getPassword().equals(password)) {
throw new AuthFailException("입력된 아이디가 잘못 되었거나 비밀번호가 맞지 않습니다.");
}
}
}
mvc > src/main/java> xyz. itwill.exception )
AuthFailException.java
package xyz.itwill.exception;
//인증 처리시 인증 실패된 경우 발생되는 예외를 표현하기 위한 클래스
public class AuthFailException extends Exception {
private static final long serialVersionUID = 1L;
public AuthFailException() {
// TODO Auto-generated constructor stub
}
public AuthFailException(String message) {
super(message);
}
}
ExistsUserinfoException .java
package xyz.itwill.exception;
//아이디가 중복될 경우 발생될 예외를 표현하기 위한 클래스
// => 예외 클래스는 반드시 Exception 클래스를 상속받아 작성
public class ExistsUserinfoException extends Exception {
private static final long serialVersionUID = 1L;
public ExistsUserinfoException() {
// TODO Auto-generated constructor stub
}
public ExistsUserinfoException(String message) {
super(message);
}
}
UserinfoNotFoundException .java
package xyz.itwill.exception;
//회원정보가 없는 경우 발생되는 예외를 표현하기 위한 클래스
public class UserinfoNotFoundException extends Exception {
private static final long serialVersionUID = 1L;
public UserinfoNotFoundException() {
// TODO Auto-generated constructor stub
}
public UserinfoNotFoundException(String message) {
super(message);
}
}
mvc/src > main >webapp > WEB-INF)
web .xml (수정)
!!! 리다렉트 이동 &포워드 이동 중요!!!
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
<display-name>mvc</display-name>
<!-- servlet : 클래스를 웹프로그램(서블릿)으로 등록하기 위한 엘리먼트 -->
<servlet>
<servlet-name>controller</servlet-name>
<servlet-class>xyz.itwill.mvc.ControllerServlet</servlet-class>
</servlet>
<!-- servlet-mapping : 웹프로그램(서블릿)에 URL 패턴을 등록하기 위한 엘리먼트 -->
<servlet-mapping>
<servlet-name>controller</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.jsp</welcome-file>
<welcome-file>default.htm</welcome-file>
</welcome-file-list>
</web-app>
main >webapp > model_two )
user_error .jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%-- 에러메세지를 클라이언트에게 전달하여 응답하는 JSP 문서 --%>
<%-- => [메인으로] 태그를 클릭한 경우 [/loginform.do] 문서 요청 --%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MVC</title>
<style type="text/css">
body {
text-align: center;
}
.message {
color: red;
font-size: 1.5em;
}
</style>
</head>
<body>
<h1>에러페이지</h1>
<hr>
<p class="message">프로그램 실행에 예기치 못한 오류가 발생하였거나 비정상적인 방법으로
프로그램을 요청하여 오류가 발생 하였습니다.</p>
<button type="button" onclick="location.href='<%=request.getContextPath()%>/loginform.do';">메인으로</button>
</body>
</html>
user_login .jsp
<%@page import="xyz.itwill.dto.UserinfoDTO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%-- 비로그인 상태의 사용자인 경우 - 사용자로부터 로그인정보를 입력받기 위한 JSP 문서 --%>
<%-- => [로그인] 태그를 클릭한 경우 [/login.do] 페이지 요청 - 입력값 전달 --%>
<%-- 로그인 상태의 사용자인 경우 - 환영메세지를 클라이언트에게 전달하여 응답하는 JSP 문서 --%>
<%-- => [회원목록] 태그를 클릭한 경우 [/list.do] 페이지 요청 --%>
<%-- => [로그아웃] 태그를 클릭한 경우 [/logout.do] 페이지 요청 --%>
<%-- => [회원등록] 태그를 클릭한 경우 [/writeform.do] 페이지 요청 - 관리자에게만 링크 제공 --%>
<%
UserinfoDTO loginUserinfo=(UserinfoDTO)session.getAttribute("loginUserinfo");
String message=(String)request.getAttribute("message");
if(message==null) {
message="";
}
String userid=(String)request.getAttribute("userid");
if(userid==null) {
userid="";
}
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>MVC</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<%-- 요청 서블릿(컨트롤러)의 URL 주소 경로와 응답하는 JSP 문서의 경로가 서로 다르므로
웹자원의 경로는 절대경로로 표현하는 것을 권장 --%>
<%-- <link rel=stylesheet href="<%=request.getContextPath() %>/model_two/css/user.css" type="text/css"> --%>
<link rel=stylesheet href="${pageContext.request.contextPath}/model_two/css/user.css" type="text/css">
<script language="JavaScript">
function userLogin() {
if ( f.userid.value == "" ) {
alert("아이디를 입력하십시요.");
f.userid.focus();
return;
}
if ( f.password.value == "" ) {
alert("비밀번호를 입력하십시요.");
f.password.focus();
return;
}
f.action = "<%=request.getContextPath() %>/login.do";
f.submit();
}
</script>
</head>
<body bgcolor=#FFFFFF text=#000000 leftmargin=0 topmargin=0 marginwidth=0 marginheight=0>
<br>
<table width=780 border=0 cellpadding=0 cellspacing=0>
<tr>
<td width="20"></td>
<td style="color: red;"><%=message%></td>
</tr>
<tr>
<td width="20"></td>
<td>
<!--contents-->
<table width=590 border=0 cellpadding=0 cellspacing=0>
<tr>
<td bgcolor="f4f4f4" height="22"> <b>회원관리 - 로그인</b></td>
</tr>
</table>
<br>
<% if(loginUserinfo==null) {//비로그인 상태의 사용자인 경우 %>
<!-- login Form -->
<form name="f" method="post">
<table border="0" cellpadding="0" cellspacing="1" width="590" bgcolor="BBBBBB">
<tr>
<td width=100 align=center bgcolor="E6ECDE" height="22">사용자 아이디</td>
<td width=490 bgcolor="ffffff" style="padding-left:10px;">
<input type="text" style="width:150" name="userid" value="<%=userid%>">
</td>
</tr>
<tr>
<td width=100 align=center bgcolor="E6ECDE" height="22">비밀번호</td>
<td width=490 bgcolor="ffffff" style="padding-left:10px;">
<input type="password" style="width:150" name="password">
</td>
</tr>
</table>
</form>
<br>
<table width=590 border=0 cellpadding=0 cellspacing=0>
<tr>
<td align=center>
<input type="button" value="로그인" onClick="userLogin();">
</td>
</tr>
</table>
<% } else {//로그인 상태의 사용자인 경우 %>
<table border="0" cellpadding="0" cellspacing="1" width="590" bgcolor="BBBBBB">
<tr>
<td align=center bgcolor="E6ECDE" height="22">
<%=loginUserinfo.getName() %>님, 환영합니다.
</td>
</tr>
</table>
<br>
<table width=590 border=0 cellpadding=0 cellspacing=0>
<tr>
<td align=center>
<button type="button" onclick="location.href='<%=request.getContextPath() %>/list.do';">회원목록</button>
<button type="button" onclick="location.href='<%=request.getContextPath() %>/logout.do';">로그아웃</button>
<% if(loginUserinfo.getStatus()==9) { %>
<button type="button" onclick="location.href='<%=request.getContextPath() %>/writeform.do';">회원등록</button>
<% } %>
</td>
</tr>
</table>
<% } %>
</td>
</tr>
</table>
</body>
</html>
user_write.jsp
<%@page import="xyz.itwill.dto.UserinfoDTO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%-- 사용자로부터 회원정보를 입력받기 위한 JSP 문서 --%>
<%-- => [회원등록] 태그를 클릭한 경우 [write.do] 페이지 요청 - 입력값(회원정보) 전달 --%>
<%-- => [로그인] 태그를 클릭한 경우 [loginform.do] 문서 요청 --%>
<%
String message=(String)request.getAttribute("message");
if(message==null) {
message="";
}
UserinfoDTO userinfo=(UserinfoDTO)request.getAttribute("userinfo");
if(userinfo==null) {
userinfo=new UserinfoDTO();
userinfo.setUserid("");
userinfo.setPassword("");
userinfo.setName("");
userinfo.setEmail("");
userinfo.setStatus(1);
}
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>MVC</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel=stylesheet href="<%=request.getContextPath() %>/model_two/css/user.css" type="text/css">
<script language="JavaScript">
function userCreate() {
if ( f.userid.value == "" ) {
alert("아이디를 입력하십시요.");
f.userid.focus();
return;
}
if ( f.password.value == "" ) {
alert("비밀번호를 입력하십시요.");
f.password.focus();
return;
}
if ( f.name.value == "" ) {
alert("이름을 입력하십시요.");
f.name.focus();
return;
}
f.action = "<%=request.getContextPath() %>/write.do";
f.submit();
}
</script>
</head>
<body bgcolor=#FFFFFF text=#000000 leftmargin=0 topmargin=0 marginwidth=0 marginheight=0>
<br>
<table width=780 border=0 cellpadding=0 cellspacing=0>
<tr>
<td width="20"></td>
<td style="color: red;"><%=message%></td>
</tr>
<tr>
<td width="20"></td>
<td>
<table width=590 border=0 cellpadding=0 cellspacing=0>
<tr>
<td bgcolor="f4f4f4" height="22"> <b>회원관리 - 회원등록</b></td>
</tr>
</table>
<br>
<form name="f" method="post">
<table border="0" cellpadding="0" cellspacing="1" width="590" bgcolor="BBBBBB">
<tr>
<td width=100 align=center bgcolor="E6ECDE" height="22">아이디</td>
<td width=490 bgcolor="ffffff" style="padding-left:10px;">
<input type="text" style="width:150" name="userid" value="<%=userinfo.getUserid()%>">
</td>
</tr>
<tr>
<td width=100 align=center bgcolor="E6ECDE" height="22">비밀번호</td>
<td width=490 bgcolor="ffffff" style="padding-left:10px;">
<input type="password" style="width:150" name="password" value="<%=userinfo.getPassword()%>">
</td>
</tr>
<tr>
<td width=100 align=center bgcolor="E6ECDE" height="22">이름</td>
<td width=490 bgcolor="ffffff" style="padding-left:10px;">
<input type="text" style="width:240" name="name" value="<%=userinfo.getName()%>">
</td>
</tr>
<tr>
<td width=100 align=center bgcolor="E6ECDE" height="22">이메일</td>
<td width=490 bgcolor="ffffff" style="padding-left:10px;">
<input type="text" style="width:240" name="email" value="<%=userinfo.getEmail()%>">
</td>
</tr>
<tr>
<td width=100 align=center bgcolor="E6ECDE" height="22">회원등급</td>
<td width=490 bgcolor="ffffff" style="padding-left:10px;">
<select name="status">
<option value="1" <% if(userinfo.getStatus()==1) { %>selected<% } %>>일반회원</option>
<option value="9" <% if(userinfo.getStatus()==9) { %>selected<% } %>>관리자</option>
</select>
</td>
</tr>
</table>
</form>
<br>
<table width=590 border=0 cellpadding=0 cellspacing=0>
<tr>
<td align=center>
<input type="button" value="회원등록" onClick="userCreate();">
<input type="button" value="로그인" onClick="location.href='<%=request.getContextPath()%>/loginform.do';">
</td>
</tr>
</table>
</td>
</tr>
</table>
</body>
</html>
main >webapp > model_two > css)
user.css
A:link { color: #333333; font-family: "µ¸¿ò", "±¼¸²"; font-size: 12px; text-decoration:none;}
A:visited { color: #333333; font-family: "µ¸¿ò", "±¼¸²"; font-size: 12px; text-decoration:none;}
A:active { color: #333333; font-family: "µ¸¿ò", "±¼¸²"; font-size: 12px; text-decoration:none;}
A:hover { color: #BEA12C; font-family: "µ¸¿ò", "±¼¸²"; font-size: 12px; text-decoration:underline;}
A.user:link { color: #333333; font-family: "µ¸¿ò", "±¼¸²"; font-size: 12px; text-decoration:underline;}
A.user:visited { color: #333333; font-family: "µ¸¿ò", "±¼¸²"; font-size: 12px; text-decoration:underline;}
A.user:active { color: #333333; font-family: "µ¸¿ò", "±¼¸²"; font-size: 12px; text-decoration:underline;}
td {font-family:µ¸¿ò; font-size:12px; color:#333333; line-height:18px;}
.title {font-family:µ¸¿ò; font-size:12pt; color:#000000; line-height:22px;}
/* Form css */
.text { font-family:µ¸¿ò; font-size:8pt; color:#333333;}
.textarea { font-family:µ¸¿ò; font-size:8pt; color:#333333;}
.password { font-family:µ¸¿ò; font-size:8pt; color:#333333;}
.file { font-family:µ¸¿ò; font-size:8pt; color:#333333;}
.select { font-family:µ¸¿ò; font-size:8pt; color:#333333;}
7월 10일
회원목록 - 미구현 (에러페이지 나옴)
68Day
목록만들기
do로 요청하기. jsp로는 응답 x
main > java > xyz.itwill.mvc)
ControllerServlet .java (수정)
package xyz.itwill.mvc;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//컨트롤러(Controller - Servlet) : 클라이언트의 모든 요청을 받아 모델(Model - Class) 역활의
//객체로 요청 처리 메소드를 호출하여 클라이언트의 요청을 처리하고 처리결과를 뷰(View - JSP)로
//전달하여 응답되도록 프로그램의 흐름을 제공하는 웹프로그램
//1.클라이언트의 모든 요청을 받을 수 있도록 서블릿을 설정하여 단일 진입점의 기능 구현
// => Front Controller Pattern
//@WebServlet("url") : 클래스를 웹프로그램(서블릿)으로 등록하고 요청 URL 주소를 매핑하는 어노테이션
// => 매핑 설정될 URL 주소에 패턴문자(* : 전체, ? : 문자 하나)를 사용하여 URL 패턴 등록 가능
// => @WebServlet("*.do") : 클라이언트가 [XXX.do] 형식의 URL 주소를 요청한 경우 웹프로그램(서블릿) 실행
// => @WebServlet 어노테이션 대신 [web.xml] 파일의 엘리먼트를 사용하여 클래스를 웹프로그램으로
//등록하고 URL 매핑 처리 가능
//@WebServlet("*.do")
public class ControllerServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
//여러개의 엔트리(Entry)를 추가할 수 있는 Map 객체를 저장하기 위한 필드
// => 하나의 엔트리는 요청정보(Key - String)와 모델객체(Value - Action)를 이용하여 생성
// => Map 객체를 사용하면 요청정보(Key)를 이용하여 모델객체(Value)를 빠르게 제공받아 사용 가능
private Map<String, Action> actionMap=new HashMap<>();
//클라이언트가 서블릿(컨트롤러)를 최초로 요청할 경우 서블릿 클래스를 객체로 생성한 후
//가장 먼저 한번만 호출되는 메소드 - 생성자 대신 초기화 작업을 실행하기 위한 메소드
@Override
public void init(ServletConfig config) throws ServletException {
//System.out.println("ControllerServlet 클래스의 init() 메소드 호출");
/*
//Map 객체에 엔트리(Entry) 추가
// => 모델 객체를 하나만 생성하여 제공 - 메모리 효율 증가
actionMap.put("/loginform.do", new LoginFormModel());
actionMap.put("/login.do", new LoginModel());
actionMap.put("/logout.do", new LogoutModel());
actionMap.put("/writeform.do", new WriteFormModel());
actionMap.put("/write.do", new WriteModel());
actionMap.put("/list.do", new ListModel());
actionMap.put("/view.do", new ViewModel());
actionMap.put("/modifyform.do", new ModifyFormModel());
actionMap.put("/modify.do", new ModifyModel());
actionMap.put("/remove.do", new RemoveModel());
actionMap.put("/error.do", new ErrorModel());
*/
//Properties 파일에 요청정보와 모델 클래스를 저장하고 Properties 파일을 읽어 Map 객체의
//엔트리로 추가 - 유지보수의 효율성 증가
// => 컨트롤러를 변경하지 않고 Properties 파일만 변경하여 요청정보에 대한 모델 객체 관리
//Properties 파일(XXX.properties) : 프로그램 실행에 필요한 값을 제공하기 위한 텍스트 파일
//Properties 파일의 내용을 저장하기 위한 Properties 객체 생성
Properties properties=new Properties();
//ServletConfig.getInitParameter(String name) : [web.xml] 파일에서 init-param 엘리먼트로
//제공된 값을 읽어와 반환하는 메소드
String configFile=config.getInitParameter("configFile");
//Properties 파일의 파일 시스템 경로를 반환받아 저장
//String configFilePath=config.getServletContext().getRealPath("/WEB-INF/model.properties");
String configFilePath=config.getServletContext().getRealPath(configFile);
//System.out.println("configFilePath = "+configFilePath);
try {
//Properties 파일의 내용을 읽기 위한 파일 입력스트림 생성
FileInputStream in=new FileInputStream(configFilePath);
//Properties 파일의 내용을 읽어 Properties 객체의 엔트리로 저장
properties.load(in);
} catch (IOException e) {
e.printStackTrace();
}
//Properties 객체에 저장된 모든 엔트리의 이름(Key)이 저장된 Set 객체를 반환받아
//for 구문을 이용하여 반복 처리
for(Object key : properties.keySet()) {
//Properties 객체에 저장된 엔트리의 이름(Key)을 반환받아 저장 - 요청정보
String command=(String)key;
//Properties 객체에 저장된 엔트리의 값(Value)을 반환받아 저장 - 모델 클래스
String actionClass=(String)properties.get(key);
try {
//모델 클래스로 모델 객체를 생성하여 저장 - 리플렉션 기능 사용
//리플렉션(Reflection) : 프로그램의 명령 실행시 Class 객체(Clazz)로 객체를
//생성하여 객체의 필드 또는 메소드에 접근하도록 제공하는 기능
//Class.forName(String className) : 매개변수로 전달받은 문자열로 표현된 클래스를
//읽어 메모리에 저장하고 Class 객체(Clazz)를 반환하는 메소드
// => ClassNotFoundException 발생
//Class.getDeclaredConstructor() : Class 객체의 생성자가 저장된 Constructor
//객체를 반환하는 메소드
//Constructor.newInstance() : Constructor 객체에 저장된 생성자를 이용하여
//Object 타입의 객체를 생성하여 반환하는 메소드
Action actionObject=(Action)Class.forName(actionClass).getDeclaredConstructor().newInstance();
//Map 객체에 엔트리(Key : 요청정보, Value : 모델 객체) 추가
actionMap.put(command, actionObject);
} catch (Exception e) {
e.printStackTrace();
}
}
}
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//System.out.println("ControllerServlet 클래스의 service() 메소드 호출");
//2.클라이언트의 요청 분석 : 요청 URL 주소 이용 - http://localhost:8000/mvc/XXX.do
//HttpServletRequest.getRequestURI() : 요청 URL 주소에서 URI 주소를 반환하는 메소드
String requestURI=request.getRequestURI();
//System.out.println("requestURI = "+requestURI);//requestURI = /mvc/XXX.do
//HttpServletRequest.getContextPath() : 요청 URL 주소에서 컨텍스트 경로를 반환하는 메소드
String contextPath=request.getContextPath();
//System.out.println("contextPath = "+contextPath);//contextPath = /mvc
String command=requestURI.substring(contextPath.length());
//System.out.println("command = "+command);//command = /XXX.do
//3.모델(Model) 객체를 이용하여 요청 처리 메소드를 호출해 클라이언트의 요청을 처리하고
//뷰(View) 관련 정보를 반환받아 저장
// => 하나의 요청에 대해 하나의 모델 객체가 요청을 처리하도록 설정 - Command Controller Pattern
// => 요청 처리 메소드가 선언된 모델 역활의 클래스 작성 - 모델 역활의 클래스는 인터페이스를 상속받아 작성
//회원관리 프로그램에서 클라이언트 요청(Command)에 대한 모델 객체가 매핑되도록 설정
// => [/loginform.do] >> LoginFormModel 클래스
// => [/login.do] >> LoginModel 클래스
// => [/logout.do] >> LogoutModel 클래스
// => [/writeform.do] >> WriteFormModel 클래스
// => [/write.do] >> WriteModel 클래스
// => [/list.do] >> ListModel 클래스
// => [/view.do] >> ViewModel 클래스
// => [/modifyform.do] >> MojdifyFormModel 클래스
// => [/modify.do] >> ModifyModel 클래스
// => [/remove.do] >> RemoveModel 클래스
// => [/error.do] >> ErrorModel 클래스
/*
//모델 역활의 클래스가 상속받기 위한 인터페이스로 참조변수 생성
// => 인터페이스로 생성된 참조변수에는 인스페이스를 상속받은 모든 자식클래스(모델)의 객체 저장 가능
Action action=null;
//클라이언트 요청정보를 구분하여 요청을 처리하기 위한 모델 역활의 클래스로 객체를
//생성하여 인터페이스 참조변수에 저장
if(command.equals("/loginform.do")) {
action=new LoginFormModel();
} else if(command.equals("/login.do")) {
action=new LoginModel();
} else if(command.equals("/logout.do")) {
action=new LogoutModel();
} else if(command.equals("/writeform.do")) {
action=new WriteFormModel();
} else if(command.equals("/write.do")) {
action=new WriteModel();
} else if(command.equals("/list.do")) {
action=new ListModel();
} else if(command.equals("/view.do")) {
action=new ViewModel();
} else if(command.equals("/modifyform.do")) {
action=new ModifyFormModel();
} else if(command.equals("/modify.do")) {
action=new ModifyModel();
} else if(command.equals("/remove.do")) {
action=new RemoveModel();
} else if(command.equals("/error.do")) {
action=new ErrorModel();
} else {//클라이언트 요청에 대한 모델 역활의 클래스가 없는 경우
action=new ErrorModel();
}
*/
//Map 객체에 저장된 엔트리에서 요청정보(Key)를 이용하여 모델객체(Value)를 반환받아 저장
// => 가독성 증가
Action action=actionMap.get(command);
if(action==null) {
action=actionMap.get("/error.do");
}
//인터페이스 참조변수로 추상메소드를 호출하면 참조변수에 저장된 모델 객체의 요청
//처리 메소드를 호출하고 뷰 관련 정보를 반환받아 저장 - 오버라이드의 의한 다형성
ActionForward actionForward=action.execute(request, response);
//4.응답 관련 정보가 저장된 ActionForward 객체를 이용하여 응답 처리
if(actionForward.isForward()) {//ActionForward 객체의 forward 필드값이 [true]인 경우
//JSP 문서로 포워드 이동하여 JSP 문서의 실행결과(HTML)로 클라이언트에게 전달하여 응답 처리
request.getRequestDispatcher(actionForward.getPath()).forward(request, response);
} else {//ActionForward 객체의 forward 필드값이 [false]인 경우
//서블릿에서 클라이언트에게 URL 주소(/XXX.do)를 전달하여 응답 처리
// => URL 주소를 전달받은 클라이언트는 브라우저의 URL 주소를 변경하여 서블릿 요청
response.sendRedirect(actionForward.getPath());
}
}
}
ListModel .java (수정)
package xyz.itwill.mvc;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import xyz.itwill.dto.UserinfoDTO;
import xyz.itwill.service.UserinfoService;
//클라이언트가 [/list.do]로 요청한 경우 객체로 생성될 모델 역활의 클래스
// => 로그인 상태의 사용자만 요청 가능하도록 권한 설정
// => USERINFO 테이블에 저장된 모든 회원정보를 검색하여 request 객체의 속성값으로 저장하고
//[user_list.jsp]로 포워드 이동하기 위한 정보가 저장된 ActionForward 객체 반환
public class ListModel implements Action {
@Override
public ActionForward execute(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ActionForward actionForward=new ActionForward();
try {
HttpSession session=request.getSession();
UserinfoDTO loginUserinfo=(UserinfoDTO)session.getAttribute("loginUserinfo");
//비로그인 상태의 사용자인 경우 - 비정상적인 요청
if(loginUserinfo==null) {
throw new Exception();
}
//UserinfoService 클래스의 getUserinfoList() 메소드를 호출하여 검색된 회원목록을
//List 객체로 반환받아 request 객체의 속성값 저장
// => 포워드 이동에 의해 스레드가 이동될 JSP에서 request 객체의 속성값을 반환받아 사용
request.setAttribute("userinfoList", UserinfoService.getService().getUserinfoList());
actionForward.setForward(true);
actionForward.setPath("/model_two/user_list.jsp");
} catch (Exception e) {
e.printStackTrace();
actionForward.setForward(false);
actionForward.setPath(request.getContextPath()+"/error.do");
}
return actionForward;
}
}
ModifyFormModel .java
package xyz.itwill.mvc;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import xyz.itwill.dto.UserinfoDTO;
import xyz.itwill.service.UserinfoService;
//클라이언트가 [/modifyform.do]로 요청한 경우 객체로 생성될 모델 역활의 클래스
// => 관리자만 요청 가능하도록 권한 설정
// => 아이디를 전달받아 USERINFO 테이블에 저장된 회원정보를 검색하여 request 객체의 속성값으로
//저장하고 [user_modify.jsp]로 포워드 이동하기 위한 정보가 저장된 ActionForward 객체 반환
public class ModifyFormModel implements Action {
@Override
public ActionForward execute(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ActionForward actionForward=new ActionForward();
try {
HttpSession session=request.getSession();
UserinfoDTO loginUserinfo=(UserinfoDTO)session.getAttribute("loginUserinfo");
//비로그인 상태의 사용자이거나 로그인 사용자가 관리자가 아닌 경우 - 비정상적인 요청
if(loginUserinfo==null || loginUserinfo.getStatus()!=9) {
throw new Exception();
}
if(request.getParameter("userid")==null) {//전달값이 없는 경우 - 비정상적인 요청
throw new Exception();
}
String userid=request.getParameter("userid");
//UserinfoService 클래스의 getUserinfo() 메소드를 호출하여 검색된 회원정보를
//DTO 객체로 반환받아 request 객체의 속성값 저장
// => UserinfoService 클래스의 getUserinfo() 메소드를 호출하여 검색된 회원정보가
//없는 경우 UserinfoNotFoundException 발생 - 비정상적인 요청
request.setAttribute("userinfo", UserinfoService.getService().getUserinfo(userid));
actionForward.setForward(true);
actionForward.setPath("/model_two/user_modify.jsp");
} catch (Exception e) {
e.printStackTrace();
actionForward.setForward(false);
actionForward.setPath(request.getContextPath()+"/error.do");
}
return actionForward;
}
}
ModifyModel .java
package xyz.itwill.mvc;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import xyz.itwill.dto.UserinfoDTO;
import xyz.itwill.service.UserinfoService;
//클라이언트가 [/modify.do]로 요청한 경우 객체로 생성될 모델 역활의 클래스
//=> 회원정보를 전달받아 USERINFO 테이블에 저장된 회원정보를 변경하고 [/view.do]로
//리다이렉트 이동하기 위한 정보가 저장된 ActionForward 객체 반환 - 아이디 전달
public class ModifyModel implements Action {
@Override
public ActionForward execute(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ActionForward actionForward=new ActionForward();
try {
if(request.getMethod().equals("GET")) {
throw new Exception();
}
request.setCharacterEncoding("utf-8");
String userid=request.getParameter("userid");
String password=request.getParameter("password");
String name=request.getParameter("name");
String email=request.getParameter("email");
int status=Integer.parseInt(request.getParameter("status"));
UserinfoDTO userinfo=new UserinfoDTO();
userinfo.setUserid(userid);
if(password==null || password.equals("")) {
//비밀번호 전달값이 없는 경우 - 기존 회원정보의 비밀번호로 필드값 변경
userinfo.setPassword(UserinfoService.getService().getUserinfo(userid).getPassword());
} else {
//비밀번호 전달값이 없는 경우 - 전달값(비밀번호)으로 필드값 변경
userinfo.setPassword(password);
}
userinfo.setName(name);
userinfo.setEmail(email);
userinfo.setStatus(status);
//UserinfoService 클래스의 modifyUserinfo() 메소드를 호출하여 회원정보 변경 처리
UserinfoService.getService().modifyUserinfo(userinfo);
actionForward.setForward(false);
actionForward.setPath(request.getContextPath()+"/view.do?userid="+userid);
} catch (Exception e) {
e.printStackTrace();
actionForward.setForward(false);
actionForward.setPath(request.getContextPath()+"/error.do");
}
return actionForward;
}
}
RemoveModel .java
package xyz.itwill.mvc;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import xyz.itwill.dto.UserinfoDTO;
import xyz.itwill.service.UserinfoService;
//클라이언트가 [/remove.do]로 요청한 경우 객체로 생성될 모델 역활의 클래스
// => 관리자만 요청 가능하도록 권한 설정
// => 아이디를 전달받아 USERINFO 테이블에 저장된 회원정보를 삭제하고 [/list.do]로 리다이렉트
//이동하기 위한 정보가 저장된 ActionForward 객체 반환
// => 관리자가 자신을 삭제 처리한 경우 [/logout.do]로 리다이렉트 이동하기 위한 정보가 저장된 ActionForward 객체 반환
public class RemoveModel implements Action {
@Override
public ActionForward execute(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ActionForward actionForward=new ActionForward();
try {
HttpSession session=request.getSession();
UserinfoDTO loginUserinfo=(UserinfoDTO)session.getAttribute("loginUserinfo");
//비로그인 상태의 사용자이거나 로그인 사용자가 관리자가 아닌 경우 - 비정상적인 요청
if(loginUserinfo==null || loginUserinfo.getStatus()!=9) {
throw new Exception();
}
if(request.getParameter("userid")==null) {//전달값이 없는 경우 - 비정상적인 요청
throw new Exception();
}
String userid=request.getParameter("userid");
//UserinfoService 클래스의 removeUserinfo() 메소드를 호출하여 회원정보 삭제 처리
UserinfoService.getService().removeUserinfo(userid);
actionForward.setForward(false);
if(loginUserinfo.getUserid().equals(userid)) {
actionForward.setPath(request.getContextPath()+"/logout.do");
} else {
actionForward.setPath(request.getContextPath()+"/list.do");
}
} catch (Exception e) {
e.printStackTrace();
actionForward.setForward(false);
actionForward.setPath(request.getContextPath()+"/error.do");
}
return actionForward;
}
}
ViewModel .java
package xyz.itwill.mvc;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import xyz.itwill.dto.UserinfoDTO;
import xyz.itwill.service.UserinfoService;
//클라이언트가 [/view.do]로 요청한 경우 객체로 생성될 모델 역활의 클래스
// => 로그인 상태의 사용자만 요청 가능하도록 권한 설정
// => 아이디를 전달받아 USERINFO 테이블에 저장된 회원정보를 검색하여 request 객체의 속성값으로
//저장하고 [user_view.jsp]로 포워드 이동하기 위한 정보가 저장된 ActionForward 객체 반환
public class ViewModel implements Action {
@Override
public ActionForward execute(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ActionForward actionForward=new ActionForward();
try {
HttpSession session=request.getSession();
UserinfoDTO loginUserinfo=(UserinfoDTO)session.getAttribute("loginUserinfo");
//비로그인 상태의 사용자인 경우 - 비정상적인 요청
if(loginUserinfo==null) {
throw new Exception();
}
if(request.getParameter("userid")==null) {//전달값이 없는 경우 - 비정상적인 요청
throw new Exception();
}
String userid=request.getParameter("userid");
//UserinfoService 클래스의 getUserinfo() 메소드를 호출하여 검색된 회원정보를
//DTO 객체로 반환받아 request 객체의 속성값 저장
// => UserinfoService 클래스의 getUserinfo() 메소드를 호출하여 검색된 회원정보가
//없는 경우 UserinfoNotFoundException 발생 - 비정상적인 요청
request.setAttribute("userinfo", UserinfoService.getService().getUserinfo(userid));
actionForward.setForward(true);
actionForward.setPath("/model_two/user_view.jsp");
} catch (Exception e) {
e.printStackTrace();
actionForward.setForward(false);
actionForward.setPath(request.getContextPath()+"/error.do");
}
return actionForward;
}
}
main > webapp > model_two)
user_list .jsp
<%@page import="xyz.itwill.dto.UserinfoDTO"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%-- request 객체의 속성값으로 저장된 회원목록을 반환받아 클라이언트에게 전달하여 응답하는 JSP 문서 --%>
<%-- => 회원정보에서 [회원이름] 태그를 클릭한 경우 [view.do] 페이지 요청 - 아이디 전달 --%>
<%-- => [회원등록] 태그를 클릭한 경우 [writeform.do] 페이지 요청 - 관리자에게만 링크 제공 --%>
<%-- => [로그아웃] 태그를 클릭한 경우 [logout.do] 페이지 요청 --%>
<%
UserinfoDTO loginUserinfo=(UserinfoDTO)session.getAttribute("loginUserinfo");
List<UserinfoDTO> userinfoList=(List<UserinfoDTO>)request.getAttribute("userinfoList");
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>MVC</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel=stylesheet href="<%=request.getContextPath() %>/model_two/css/user.css" type="text/css">
</head>
<body bgcolor=#FFFFFF text=#000000 leftmargin=0 topmargin=0 marginwidth=0 marginheight=0>
<br>
<table width=780 border=0 cellpadding=0 cellspacing=0>
<tr>
<td width="20"></td>
<td>
<table width=590 border=0 cellpadding=0 cellspacing=0>
<tr>
<td bgcolor="f4f4f4" height="22"> <b>회원관리 - 회원목록</b></td>
</tr>
</table>
<br>
<table border="0" cellpadding="0" cellspacing="1" width="590" bgcolor="BBBBBB">
<tr>
<td width=190 align=center bgcolor="E6ECDE" height="22">아이디</td>
<td width=200 align=center bgcolor="E6ECDE">이름</td>
<td width=200 align=center bgcolor="E6ECDE">이메일</td>
</tr>
<% for(UserinfoDTO userinfo : userinfoList) { %>
<tr>
<td width=190 align=center bgcolor="ffffff" height="20">
<%=userinfo.getUserid() %>
</td>
<td width=200 align=center bgcolor="ffffff">
<a href="<%=request.getContextPath() %>/view.do?userid=<%=userinfo.getUserid() %>" class="user">
<%=userinfo.getName() %>
</a>
</td>
<td width=200 align=center bgcolor="ffffff">
<!-- JSP 표현식(Expression)은 NULL을 [null] 문자열로 변환하여 출력 처리 -->
<%-- => JSP 표현식(Expression)의 값이 NULL인 경우 출력되지 않도록 if 구문 사용 --%>
<% if(userinfo.getEmail()!=null) { %>
<%=userinfo.getEmail() %>
<% } %>
</td>
</tr>
<% } %>
</table>
<br>
<table border="0" cellpadding="0" cellspacing="1" width="590">
<tr>
<td align="right">
<% if(loginUserinfo.getStatus()==9) { %>
<input type="button" value="회원등록" onclick="location.href='<%=request.getContextPath() %>/writeform.do';"/>
<% } %>
<input type="button" value="로그아웃" onclick="location.href='<%=request.getContextPath() %>/logout.do';"/>
</td>
</tr>
</table>
</td>
</tr>
</table>
</body>
</html>
user_view .jsp
<%@page import="xyz.itwill.dto.UserinfoDTO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%-- request 객체의 속성값으로 저장된 회원정보를 반환받아 클라이언트에게 전달하여 응답하는 JSP 문서 --%>
<%-- => [수정] 태그를 클릭한 경우 [modifyform.do] 문서 요청 - 아이디 전달 --%>
<%-- => [삭제] 태그를 클릭한 경우 [remove.do] 문서 요청 - 아이디 전달 --%>
<%-- => [목록] 태그를 클릭한 경우 [list.do] 문서 요청 --%>
<%-- => [수정] 태그와 [삭제] 태그는 관리자에게만 링크 제공 --%>
<%
UserinfoDTO loginUserinfo=(UserinfoDTO)session.getAttribute("loginUserinfo");
UserinfoDTO userinfo=(UserinfoDTO)request.getAttribute("userinfo");
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>MVC</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel=stylesheet href="<%=request.getContextPath() %>/model_two/css/user.css" type="text/css">
<script language="JavaScript">
function userRemove(userid) {
if (confirm("정말로 삭제 하시겠습니까?") ) {
location.href='<%=request.getContextPath() %>/remove.do?userid='+userid;
}
}
</script>
</head>
<body bgcolor=#FFFFFF text=#000000 leftmargin=0 topmargin=0 marginwidth=0 marginheight=0>
<br>
<table width=780 border=0 cellpadding=0 cellspacing=0>
<tr>
<td width="20"></td>
<td>
<table width=590 border=0 cellpadding=0 cellspacing=0>
<tr>
<td bgcolor="f4f4f4" height="22"> <b>회원관리 - 회원정보</b></td>
</tr>
</table>
<br>
<table border="0" cellpadding="0" cellspacing="1" width="590" bgcolor="BBBBBB">
<tr>
<td width=100 align=center bgcolor="E6ECDE" height="22">아이디</td>
<td width=490 bgcolor="ffffff" style="padding-left:10px;">
<%=userinfo.getUserid() %>
</td>
</tr>
<tr>
<td width=100 align=center bgcolor="E6ECDE" height="22">이름</td>
<td width=490 bgcolor="ffffff" style="padding-left:10px;">
<%=userinfo.getName() %>
</td>
</tr>
<tr>
<td width=100 align=center bgcolor="E6ECDE" height="22">이메일</td>
<td width=490 bgcolor="ffffff" style="padding-left:10px;">
<% if(userinfo.getEmail()!=null) { %>
<%=userinfo.getEmail() %>
<% } %>
</td>
</tr>
</table>
<br>
<table width=590 border=0 cellpadding=0 cellspacing=0>
<tr>
<td align=center>
<% if(loginUserinfo.getStatus()==9) { %>
<input type="button" value="수정" onClick="location.href='<%=request.getContextPath() %>/modifyform.do?userid=<%=userinfo.getUserid()%>';">
<input type="button" value="삭제" onClick="userRemove('<%=userinfo.getUserid()%>');">
<% } %>
<input type="button" value="목록" onClick="location.href='<%=request.getContextPath() %>/list.do';">
</td>
</tr>
</table>
</td>
</tr>
</table>
</body>
</html>
user_modify .jsp
<%@page import="xyz.itwill.dto.UserinfoDTO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%-- request 객체의 속성값으로 저장된 회원정보를 반환받아 입력태그의 초기값으로 설정한 후
사용자로부터 변경값을 입력받기 위한 JSP 문서 --%>
<%-- => [수정] 태그를 클릭한 경우 [modify.do] 페이지 요청 - 입력값(회원정보) 전달 --%>
<%-- => [목록] 태그를 클릭한 경우 [list.do] 페이지 요청 --%>
<%
UserinfoDTO userinfo=(UserinfoDTO)request.getAttribute("userinfo");
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>MVC</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel=stylesheet href="<%=request.getContextPath() %>/model_two/css/user.css" type="text/css">
<script language="JavaScript">
function userModify() {
if ( f.name.value == "" ) {
alert("이름을 입력하십시요.");
f.name.focus();
return false;
}
f.action = "<%=request.getContextPath() %>/modify.do";
f.submit();
}
</script>
</head>
<body bgcolor=#FFFFFF text=#000000 leftmargin=0 topmargin=0 marginwidth=0 marginheight=0>
<br>
<table width=780 border=0 cellpadding=0 cellspacing=0>
<tr>
<td width="20"></td>
<td>
<table width=590 border=0 cellpadding=0 cellspacing=0>
<tr>
<td bgcolor="f4f4f4" height="22"> <b>회원관리 - 회원정보수정</b></td>
</tr>
</table>
<br>
<form name="f" method="post">
<input type="hidden" name="userid" value="<%=userinfo.getUserid()%>">
<table border="0" cellpadding="0" cellspacing="1" width="590" bgcolor="BBBBBB">
<tr>
<td width=100 align=center bgcolor="E6ECDE" height="22">아이디</td>
<td width=490 bgcolor="ffffff" style="padding-left:10px;">
<%=userinfo.getUserid() %>
</td>
</tr>
<tr>
<td width=100 align=center bgcolor="E6ECDE" height="22">비밀번호</td>
<td width=490 bgcolor="ffffff" style="padding-left:10px;">
<input type="password" style="width:150" name="password">
<span style="color: red;">** 비밀번호를 변경하지 않을 경우 입력하지 마세요.</span>
</td>
</tr>
<tr>
<td width=100 align=center bgcolor="E6ECDE" height="22">이름</td>
<td width=490 bgcolor="ffffff" style="padding-left:10px;">
<input type="text" style="width:240" name="name" value="<%=userinfo.getName() %>">
</td>
</tr>
<tr>
<td width=100 align=center bgcolor="E6ECDE" height="22">이메일 주소</td>
<td width=490 bgcolor="ffffff" style="padding-left:10px;">
<% if(userinfo.getEmail()!=null) { %>
<input type="text" style="width:240" name="email" value="<%=userinfo.getEmail() %>">
<% } else { %>
<input type="text" style="width:240" name="email">
<% } %>
</td>
</tr>
<tr>
<td width=100 align=center bgcolor="E6ECDE" height="22">회원등급</td>
<td width=490 bgcolor="ffffff" style="padding-left:10px;">
<select name="status">
<option value="1" <% if(userinfo.getStatus()==1) { %>selected<% } %>>일반회원</option>
<option value="9" <% if(userinfo.getStatus()==9) { %>selected<% } %>>관리자</option>
</select>
</td>
</tr>
</table>
</form>
<br>
<table width=590 border=0 cellpadding=0 cellspacing=0>
<tr>
<td align=center>
<input type="button" value="수정" onClick="userModify();">
<input type="button" value="목록" onClick="location.href='<%=request.getContextPath() %>/list.do';">
</td>
</tr>
</table>
</td>
</tr>
</table>
</body>
</html>
main > webapp > WEB-INF)
model.properties
#Command(Key) = ModelClass(Value)
/loginform.do = xyz.itwill.mvc.LoginFormModel
/login.do = xyz.itwill.mvc.LoginModel
/logout.do = xyz.itwill.mvc.LogoutModel
/writeform.do = xyz.itwill.mvc.WriteFormModel
/write.do = xyz.itwill.mvc.WriteModel
/list.do = xyz.itwill.mvc.ListModel
/view.do = xyz.itwill.mvc.ViewModel
/modifyform.do = xyz.itwill.mvc.ModifyFormModel
/modify.do = xyz.itwill.mvc.ModifyModel
/remove.do = xyz.itwill.mvc.RemoveModel
/error.do = xyz.itwill.mvc.ErrorModel
web.xml (수정) **el 과 섞여있음.
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
<display-name>mvc</display-name>
<!-- context-param : 모든 웹프로그램에게 값을 제공하기 위한 엘리먼트 -->
<context-param>
<param-name>name</param-name>
<param-value>홍길동</param-value>
</context-param>
<!-- servlet : 클래스를 웹프로그램(서블릿)으로 등록하기 위한 엘리먼트 -->
<servlet>
<servlet-name>controller</servlet-name>
<servlet-class>xyz.itwill.mvc.ControllerServlet</servlet-class>
<!-- init-param : 서블릿 클래스에 필요한 값을 제공하기 위한 엘리먼트 -->
<init-param>
<param-name>configFile</param-name>
<param-value>/WEB-INF/model.properties</param-value>
</init-param>
<!-- load-on-startup : 클라이언트 요청 없이 서블릿 클래스를 객체로 생성하기 위한 엘리먼트 -->
<!-- => WAS 프로그램 프로그램이 실행될 때 서블릿 클래스로 객체를 미리 생성 -->
<!-- => 서블릿 객체를 생성되고 init() 메소드가 자동 호출되어 초기화 작업 -->
<!-- => 엘리먼트의 값은 0 이상의 정수값으로 설정하며 정수값이 작을수록 먼저 서블릿 객체로 생성 -->
<load-on-startup>1</load-on-startup>
</servlet>
<!-- servlet-mapping : 웹프로그램(서블릿)에 URL 패턴을 등록하기 위한 엘리먼트 -->
<servlet-mapping>
<servlet-name>controller</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.jsp</welcome-file>
<welcome-file>default.htm</welcome-file>
</welcome-file-list>
</web-app>
'5월 ~ 7월) 웹 > mvc' 카테고리의 다른 글
71Day - (0) | 2023.07.18 |
---|---|
70Day - 커스텀 태그 / core - 흐름제어태그 & el지원 (0) | 2023.07.13 |
66 ~ 67Day - 기사 링크 / 책검색 / [mvc] 로그인페이지 만들기 ( 모델1 ) (0) | 2023.07.07 |