본문 바로가기

컴퓨터학원(복습)(수료)

자바(JAVA)기반 안드로이드 웹&앱 개발 64일차 (MVC Model2 적용 회원관리, 필터)

학원에서 점심시간을 활용하여 정리하였습니다. (집에서는 직접 코드작성만)

※ 사전 처리사항

1. WEB-INF/lib/cos.jar, jstl.jar, standard.jar, connector.jar 를 추가해놓는다.

2. META-INF/context.xml 파일을 삽입한 후 커넥터 관련 코드를 입력해놓는다.

<Context>

<Resource name="jdbc/studydb" auth="Container"

driverClassName="com.mysql.cj.jdbc.Driver" type="javax.sql.DataSource"

username="study" password="study"

url="jdbc:mysql://localhost:3306/studydb?useSSL=false"

maxActive="500" maxIdle="100" maxWait="-1"

/>

</Context>

3. 저번 서블릿으로 구현한 회원가입에서 MemberDAO.java 와 MemberVO.java를 복사하여 붙여넣는다.

(데이터 값 표현 클래스 및 데이터 접근클래스)

[MVC Model2 적용 회원관리]

1. commandHandlerURI.properties 의 속성들을 수정한다.

1) /member/login.do=member.command.LoginHandler

(1) URI 에 localhost:8080/mvc2/member/login.do 를 입력하였을 때

member.command.LoginHandler 가 나온다.

member.command.LoginHandler 코드에는 /member/loginForm.jsp를 뷰(View)로 사용하고

있으므로 웹 브라우저에는 loginForm.jsp가 보여진다.

commandHandler.properties

2. LoginHandler.java, JoinHandler.java, IdCheckHandler.java, LogoutHandler.java 를 작성한다. (각 Handler 가 각 기능(로그인, 회원가입 등)에 맞는 것을 구현하고 ControllerUsingURI.java에서 서블릿의 공통기능을 작성한다.

1) LoginHandler.java

(1) CommandHandler를 Override한 process(), processForm(), processSubmit()로 구성되어 있다.

ㄱ) process()에서는 get, post(대소문자 상관없이 구분)에 따라 get method가 호출되면 processForm()을

호출하도록, post method가 호출되면 processSubmit()을 호출하도록 한다.

(2) processForm()

ㄱ) Get 메소드가 호출되어 processForm() 메소드가 호출되면 url 에 "/member/loginFrom.jsp"를 담고

반환한다.

(3) processSubmit()

ㄱ) post 메소드가 호출되어 processSubmit() 메소드가 호출되면 url에 "/member/loginForm.jsp"를 담고

반환한다.

ㄴ) 이때, userid, pwd를 parameter로 가져와서 MemberDAO의 Instance를 담은 객체(mDao)를 생성하여

userCheck(아이디, 비밀번호 확인)을 실행한다.

(ㄱ) userCheck의 결과를 int result 로 받아 MemberVO 1(로그인성공), 0(비밀번호 오류), -1(DB오류)

를 구분한다.

(ㄴ) int result 가 1일 때, 현재 인스턴스(userid)를 담은 MmeberVO mVo(객체)를 담고 session을

할당한 후 "/main.jsp"로 가도록 한다.

LoginHandler.java

2) JoinHandler.java

(1) LoginHandler.java 와 동일하게 CommandHandler를 Override한 process()와 processSubmit()으로

구성되어 있다.(회원가입이므로 로그인 세션을 가져오는 processForm() 이 필요없다.)

(2) processSubmit()

ㄱ) url에 "/member/loginForm.jsp"을 넣어놓고 한글처리를 해준다.

ㄴ) 회원정보를 입력할 시에 대한 정보들을(name,userid,pwd,email,phone,grade)를 파라미터로 받아와

MemberVO 새로운 객체를 생성하여 set 하여준다.

ㄷ) MemberDAO의 Instance를 가져와서 insertMember()를 호출하고 그 결과를 int result에 넣는다.

ㄹ) HttpSession session = request.getSession(); 은 회원가입 성공 시 ID 값을 로그인창에 보여주려고

하는 것이다.

ㅁ) result가 1이면 회원가입 성공이므로 ㄴ에서 만들었던 MemberVO 객체에 userid를 set하고

"/member/loginForm.jsp" 로 이동한다. 이때 ㄹ) 덕분에 userid가 그대로 따라온다.

ㅂ) reuslt가 1이 아닐 때는 회원가입 실페 메시지를 보낸 후 "/member/joinForm.jsp"로 이동한다.

JoinHandler.java

3) IdCheckHandler.java

(1) Handler 이므로 다른 Handler 와 마찬가지로 CommandHandler 인터페이스를 구현하여 process()

를 Override 한다.

ㄱ) Get 메소드가 온다면 (IdCheck니까 Post가 올일이 없나보다.) userid를 Parameter로 받아

MemberDAO의 Instance를 생성해서 confimID(userid)를 호출하여 아이디 확인절차를 int result에

담는다.

ㄴ) userid와 int result 를 담아 "/member/idCheck.jsp"로 보낸다.

IdCheckHandler.java

4) LogoutHandler.java

(1) Handler 이므로 다른 Handler 와 마찬가지로 CommandHandler 인터페이스를 구현하여 process()

를 Override 한다. process()와 processForm()으로 구성되어 있다.

(로그아웃이기 때문에, processSubmit()은 없다.)

(2) processForm()

ㄱ) 세션을 종료한 후 "/member/loginForm.jsp" 로 뷰를 이동시킨다.

LogoutHandler.java

3. WebContent/js/member.js 를 생성한다. (저번 서블릿으로 구현한 프로그램에서 복사해와도 된다.)

js/member.js

4. WebContent/index.jsp, main.jsp를 생성한다. ( 저번 서블릿으로 구현한 프로그램에서 복사해와도 된다.)

1) 복사해왔을 때, 사진 속 빨간색 줄처럼 경로에 맞게 수정하여준다.

index.jsp

main.jsp

5. WebContent/member/idCheck.jsp, joinForm.jsp, loginForm.jsp, memberUpdateForm.jsp 를 생성한다. ( 마찬가지로 저번 서블릿으로 구현한 프로그램에서 복사해온다.) [ 따로 기능구현은 확인하지 않겠습니다.. 저는 확인했습니다. ㅎㅎ....)

1) 인덱스 페이지로 접속(localhost:8080/mvc2/) 하여 이동한다.

loginForm.jsp

joinForm.jsp

IdCheck.jsp

memberUpdateForm.jsp

※ 경로가 너무 어렵네요..

index.jsp가 mvc2 바로 밑에 있기 때문에 login.do 로 가기 위해서 링크로

member/login.do를 찾아가는 것 같습니다.

login.do 로 들어갔다면 그 안에서는 같은 경로이므로 *.do를 자유롭게 이동할 수 있는 것 같습니다.

Handler 들도 mvc2 바로 밑에 있기 때문에 각 jsp에 url을 설정할 때

url의 상위폴더인 member 까지 같이 찾아주어 "/member/*.jsp"를 적어주어 이동하는 것 같습니다.

※ 핸들러와 서블릿의 차이

예전에 만들었던 LoginServlet.java와 LoginHandler.java를 비교해보면

Dispatcher 부분은 Controller에게 맡긴 것을 확인할 수 있습니다.

LoginServlet.java

LoginHandler.java

[필터]

한번 작성했었는데.. 쿠키 비웠다가 다 날라갔네요..

필터는 정리하다보니, 교안보다는 이 사이트가 더 좋은 것 같습니다.

IT 개념 카테고리에서 다시 다루겠습니다.

https://dololak.tistory.com/602

 

[서블릿/JSP] 필터(Filter)란? 필터 개념 및 설명

필터(Filter)란 필터는 이름에서도 알 수 있듯 정수기 필터, 에어컨 필터, 담배의 필터와 같이 무언가를 걸러내는 필터를 말합니다. JSP/Servlet 에서도 필터의 개념은 같지만 걸러내는 대상이 다릅니다. Jsp/Serv..

dololak.tistory.com

https://dololak.tistory.com/602

 

[서블릿/JSP] 필터(Filter)란? 필터 개념 및 설명

필터(Filter)란 필터는 이름에서도 알 수 있듯 정수기 필터, 에어컨 필터, 담배의 필터와 같이 무언가를 걸러내는 필터를 말합니다. JSP/Servlet 에서도 필터의 개념은 같지만 걸러내는 대상이 다릅니다. Jsp/Serv..

dololak.tistory.com

[로그인 검사 필터]

1.LoginCheckFilter.java를 생성한다.

filter/LoginCheckFilter.java

1) init()

(1) 웹컨테이너(톰캣)이 시작될 때 필터 객체를 생성하는데, 이 때 객체가 생성되면서 최초에 한 번 호출되는

메서드입니다. FilterConfig 객체를 넘겨주기 때문에 이를 통해 여러가지 설정 값을 넘겨 받을 수 있고 필터에서

처리 시 필요한 객체등을 초기화(예: JDBC 커넥션 등) 하는데 사용됩니다.

2) destroy()

(1) 필터 객체가 제거될 때 실행되는 메서드입니다. 보통 초기화 시 생성했던 자원들을 종료하는 기능에 사용

3) doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

(1) doFilter()는 클라이언트의 요청이 있을 때마다 매번 실행됩니다.

(2) ServletRequest와 ServletResponse 객체를 넘겨주기 때문에 이를 가지고

요청과 응답을 조작할 수 있습니다.

(3) FilterChain을 통해 조작 이후 요청을 원래 목적지인 서블릿으로 전달할 수 있습니다.

(4) 사진 속 doFilter() 를 보시면

ㄱ) HttpServletRequest로 request를 받습니다.

ㄴ) httpRequest = (HttpRequest.getSession(false);는

이미 세션이 있다면 그 세션을 돌려주고, 세션이 없으면 null을 돌려줍니다.

https://gbsb.tistory.com/81

ㄷ) login 에 false를 넣어준 후 session 이 null이 아니라면 현재 세션의 "loginUser"가 null 이 아닌지

(로그인 된 사용자인지) 묻고 null이 아니라면 login을 true로 바꿔줍니다.

ㄹ) login이 true라면 chain.doFilter로 url에 접근을 허용하게 합니다.

(FilterChain을 통해 조작 이후 요청을 원래 목적지인 서블릿으로 전달할 수 있기 때문입니다.)

ㅁ) else로 login이 false라면 /member/loginForm.jsp 로 보내 로그인할 수 있게 합니다.

2. web.xml 에 필터를 설정한다.

1) <filter>

(1) 필터태그에서는 필터를 등록할 수 있습니다.

(2) <filter-name>이네느 필터의 이름(LoginCheck)를 지정하고 <filter-class>에서는 구현한 필터 클래스를

패키지명을 포함하여 지정해줍니다. 웹 컨테이너는 서버를 띄울 때 web.xml 설정의 <filter> 태그를 읽어들여

필터 객체를 생성하고 초기화 합니다.

2) <filter-mapping>

(1) 등록한 필터의 동작할 범위(대상)을 설정할 수 있습니다.

(2) <filter-name>은 앞서 등록한 필터명을 지정합니다.

(3) <url-pattern>에는 URL 패턴을 입력하는데, 서블릿을 설정할 때와 규칙이 같습니다.

/member/update.do 로 지정해 주었기에 브라우저로부터 이 경로가 요청되었을 때 작성한

LoginCheck 필터가 동작합니다.

[캐릭터 인코딩 필터]

1. filter/CharacterEncodingFilter.java 필터클래스 생성하기

filter/CharacterEncodingFilter.java(생성할 시 others에서 filter로 생성하여야 합니다.)

2. JoinHandler.java에서 기존에 사용했던 UTF-8을 지워줍니다.(필터가 생성되었기 때문에)