Skip to content

Commit

Permalink
MvcWeb-day04
Browse files Browse the repository at this point in the history
  • Loading branch information
respect98 committed Dec 19, 2022
1 parent 7b3cca4 commit 1206b93
Show file tree
Hide file tree
Showing 18 changed files with 799 additions and 0 deletions.
22 changes: 22 additions & 0 deletions MvcWeb/AbstractAction.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package common.controller;

public abstract class AbstractAction implements Action{
//execute()추상 메서드 가지고 있음
private String viewPage;//보여줄 뷰페이지 이름
private boolean isRedirect;
//redirect방식의 이동이면 true, forward방식 이동이면 false값을 갖는다

//setter, getter 구성
public String getViewPage() {
return viewPage;
}
public void setViewPage(String viewPage) {
this.viewPage = viewPage;
}
public boolean isRedirect() {
return isRedirect;
}
public void setRedirect(boolean isRedirect) {
this.isRedirect = isRedirect;
}
}//////////////////////////////////
9 changes: 9 additions & 0 deletions MvcWeb/Action.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package common.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public interface Action {

void execute(HttpServletRequest req, HttpServletResponse res) throws Exception;
}
37 changes: 37 additions & 0 deletions MvcWeb/EncodingFilter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package common.filter;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpFilter;

/**
* Servlet Filter implementation class EncodingFilter
*/
@WebFilter("/*")
public class EncodingFilter extends HttpFilter implements Filter {


public void destroy() {

}
//사전처리나 사후처리 할 일이 있으면 doFilter()메서드 안에서 구현한다.
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
//post방식일 때 한글 처리를 사전에 처리해보자.
request.setCharacterEncoding("utf-8");
System.out.println("EncodingFilter doFilter()호출됨....");

chain.doFilter(request, response);
}


public void init(FilterConfig fConfig) throws ServletException {

}

}
132 changes: 132 additions & 0 deletions MvcWeb/FrontController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
package common.controller;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Properties;
import java.util.Set;

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

/*FrontController : *.do 패턴의 모든 요청을 받아들인다.
* - Command.properties 파일에 있는 매핑 정보를 읽어들여 해당 요청uri와 매핑되어 있는
* SubController(XXXAction)을 찾아 객체화 한 뒤 해당 객체의 메소드(execute)를 호출한다.
* - 서브 컨트롤러는 해당 작업을 수행한 뒤에 다시 FrontController로 돌아와 보여줘야 할 View
* 페이지(JSP) 정보를 넘긴다.
* - FrontController는 해당 뷰페이지로 이동시킨다. (forward방식 이동 or redirect방식 이동)
* */
//Command.properties파일의 절대경로를 본인의 경로에 맞게 수정해야 함/////////////////
@WebServlet(
urlPatterns = { "*.do" },
initParams = {
@WebInitParam(name = "config",
value = "C:\\myjava\\Workspace\\MvcWeb\\src\\main\\webapp\\WEB-INF\\Command.properties")
})
public class FrontController extends HttpServlet {
private static final long serialVersionUID = 1L;

private HashMap<String, Object> cmdMap=new HashMap<>();

@Override
public void init(ServletConfig conf) throws ServletException{
System.out.println("init()호출됨...");
String props=conf.getInitParameter("config");
System.out.println("props=="+props);

Properties pr=new Properties();
try {
FileInputStream fis=new FileInputStream(props);
pr.load(fis);
//Command.properties파일 정보를 Properties객체로 옮긴다.
if(fis!=null) fis.close();
//String val=pr.getProperty("/index.do");
//System.out.println("val="+val);
Set<Object> set=pr.keySet();
if(set==null) return;
for(Object key:set) {
String cmd=key.toString();//key값 "/index.do"
String className=pr.getProperty(cmd);//"common.controller.IndexAction"
if(className!=null) {
className=className.trim();//앞뒤 공백 제거
}
System.out.println(cmd+": "+className);
//className을 실제 객체로 인스턴스화
Class<?> cls=Class.forName(className);
Object cmdInstance =cls.getDeclaredConstructor().newInstance();
/////////////////////////////
cmdMap.put(cmd, cmdInstance);
//////////////////////////////
}//for------
System.out.println("cmdMap.size(): "+cmdMap.size());
}catch(Exception e) {
e.printStackTrace();
throw new ServletException(e);
}

}//--------------------------------------

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
process(request, response);
}
private void process(HttpServletRequest req, HttpServletResponse res) throws ServletException,IOException{
//1. 클라이언트의 요청 URI를 분석해보자.
/*
String uri=req.getRequestURI();
System.out.println("uri: "+uri);// "/MvcWeb/index.do"
String myctx=req.getContextPath(); //"/MvcWeb"
int len=myctx.length(); //7
String cmd=uri.substring(len);
*/
String cmd=req.getServletPath();
System.out.println("cmd===>"+cmd);

Object instance =cmdMap.get(cmd);
if(instance==null) {
System.out.println("Action이 null");
throw new ServletException("Action이 null입니다");
}
System.out.println("instance==>"+instance);
///////////////////////////////////////////////////
AbstractAction action=(AbstractAction)instance;
//////////////////////////////////////////////////

try {
//////////////////////////
action.execute(req, res);
//execute()는 컨트롤러 로직을 수행 한 뒤 뷰페이지랑 이동방식을 지정한다
String viewPage=action.getViewPage();
boolean isRedirect=action.isRedirect();
System.out.println("viewPage: "+viewPage);
if(viewPage==null) {
viewPage="index.jsp";
}

if(isRedirect) {
//redirect방식으로 페이지 이동
res.sendRedirect(viewPage);
}else {
//forward방식으로 이동
RequestDispatcher disp=req.getRequestDispatcher(viewPage);
disp.forward(req, res);
}

}catch(Exception e) {
e.printStackTrace();
throw new ServletException(e);
}
}//-----------------------------------------

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
process(request, response);
}

}


36 changes: 36 additions & 0 deletions MvcWeb/IdCheckAction.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package user.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import common.controller.AbstractAction;
import user.model.UserDAOMyBatis;

public class IdCheckAction extends AbstractAction {

@Override
public void execute(HttpServletRequest req, HttpServletResponse res) throws Exception {
String method=req.getMethod();
if(method.equalsIgnoreCase("get")) {

this.setViewPage("member/idCheck.jsp");
this.setRedirect(false);
}else {
String userid=req.getParameter("userid");

UserDAOMyBatis dao=new UserDAOMyBatis();

boolean isUse=dao.idCheck(userid);

String result=(isUse)? "ok": "no";

req.setAttribute("result", result);
req.setAttribute("userid", userid);

this.setViewPage("member/idCheckResult.jsp");
this.setRedirect(false);
}

}

}
21 changes: 21 additions & 0 deletions MvcWeb/IndexAction.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package common.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class IndexAction extends AbstractAction {

@Override
public void execute(HttpServletRequest req, HttpServletResponse res)
throws Exception{
System.out.println("IndexAction의 execute()호출됨...");

req.setAttribute("msg", "안녕 Index?");

//뷰페이지 지정
this.setViewPage("/index.jsp");
//이동방식 지정
this.setRedirect(false);
}//-------------------------

}////////////////////////////////////
18 changes: 18 additions & 0 deletions MvcWeb/LoginAction.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package user.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import common.controller.AbstractAction;

public class LoginAction extends AbstractAction {

@Override
public void execute(HttpServletRequest req, HttpServletResponse res) throws Exception {


this.setViewPage("login/login.jsp");
this.setRedirect(false);
}

}
58 changes: 58 additions & 0 deletions MvcWeb/LoginCheckFilter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package common.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import user.model.UserVO;

/**
* Servlet Filter implementation class LoginCheckFilter
*/
@WebFilter(urlPatterns = {"/user/*","/admin/*"})
public class LoginCheckFilter extends HttpFilter implements Filter {


public void destroy() {

}


public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
//세션에 저장되어 있는 loginUser가 있는지 체크해서
//없다면==>"로그인해야 이용할 수 있어요" 보여주고 return;
HttpServletRequest req=(HttpServletRequest)request;
HttpSession session=req.getSession();
UserVO user=(UserVO) session.getAttribute("loginUser");
if(user==null) {
String str="로그인해야 이용할 수 있어요";
String loc=req.getContextPath()+"/login.do";//절대경로

req.setAttribute("msg", str);
req.setAttribute("loc", loc);
RequestDispatcher disp=req.getRequestDispatcher("/message.jsp");
disp.forward(req, response);
return;
}


//로그인 했다면 다음 필터로 넘어간다
chain.doFilter(request, response);
}


public void init(FilterConfig fConfig) throws ServletException {

}

}
53 changes: 53 additions & 0 deletions MvcWeb/LoginEndAction.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package user.controller;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import common.controller.AbstractAction;
import user.model.NotUserException;
import user.model.UserDAOMyBatis;
import user.model.UserVO;

public class LoginEndAction extends AbstractAction {

@Override
public void execute(HttpServletRequest req, HttpServletResponse res) throws Exception {
String userid=req.getParameter("userid");
String pwd=req.getParameter("pwd");
String saveId=req.getParameter("saveId");
if(userid==null||pwd==null||userid.trim().isEmpty()||pwd.trim().isEmpty()) {
this.setViewPage("login.do");
this.setRedirect(true);
return;
}
UserDAOMyBatis dao=new UserDAOMyBatis();
try {
UserVO loginUser=dao.loginCheck(userid, pwd);
//loginUser가 null이 아니라면 회원인증 받은 것이므로 세션에 loginUser를 저장하자
HttpSession session=req.getSession();
if(loginUser!=null) {
session.setAttribute("loginUser", loginUser);
//아이저장 체크박스에 체크했다면 => 쿠키에 해당 아이디를 저장하자
Cookie ck=new Cookie("uid",loginUser.getUserid());
if(saveId!=null) {
ck.setMaxAge(7*24*60*60);//7일간 유효
}else {
ck.setMaxAge(0);//쿠키 삭제
}
ck.setPath("/");
res.addCookie(ck);
}//if------
this.setViewPage("index.do");
this.setRedirect(true);

}catch(NotUserException e) {
req.setAttribute("msg", e.getMessage());
req.setAttribute("loc", "javascript:history.back()");
this.setViewPage("message.jsp");
this.setRedirect(false);
}
}//------------------------------------

}

0 comments on commit 1206b93

Please sign in to comment.