<!-- Sidebar -->
<div class="sidebar">
<!-- Sidebar user panel (optional) -->
<div class="user-panel mt-3 pb-3 mb-3 d-flex">
<div class="image">
<img src="<%=request.getContextPath() %>/member/getPicture.do?picture=${loginUser.picture}" class="img-circle elevation-2" alt="User Image">
</div>
<div class="info">
<div class="row">
<a href="#" class="d-block">${loginUser.name }</a><br>
<button class="btn btn-xs btn-primary col-xs-3" type="button">LOGOUT</button><br>
</div>
<a href="tel:${loginUser.phone }" class="d-block">tel : ${loginUser.phone }</a>
<a href="mailto:${loginUser.email }" class="d-block">email : ${loginUser.email }</a>
</div>
</div>
indexPage.jsp로 가보자
로그인햇더니 main.html로 열림
로그인핸들러 수정
로그인하면 index.do로 가게 하자
이제 ㄱ로그인하고 로컬호스트 다시치면 메인화면으로,
로그인안하고 로컬호스트치면 로긴폼으로
왼쪽에 로그인사용자화면내보재보자
이제 여기에 로긴사용자의 정보ㅠ랑 로긴아웃버튼도 넣을거임
indexPage.jsp
159번줄
<!-- Sidebar -->
<div class="sidebar">
<!-- Sidebar user panel (optional) -->
<div class="user-panel mt-3 pb-3 mb-3 d-flex">
<div class="image">
<img src="<%=request.getContextPath() %>/member/getPicture.do?picture=${loginUser.picture}" class="img-circle elevation-2" alt="User Image">
</div>
<div class="info">
<div class="row">
<a href="#" class="d-block">${loginUser.name }</a><br>
<button class="btn btn-xs btn-primary col-xs-3" type="button">LOGOUT</button><br>
</div>
<a href="tel:${loginUser.phone }" class="d-block">tel : ${loginUser.phone }</a>
<a href="mailto:${loginUser.email }" class="d-block">email : ${loginUser.email }</a>
</div>
</div>
로그아웃하기
1. 서브밋/
2. ajax로 url 포스트치는거 (rest)/
3. location
세가지중에 무슨방법으로?
셋 모두 핸들러가 필요한건 마찬가지임
답은 3번
ajax는 왜썼던거임? 레스트방식은 왜한거임
1. 화면을 고칠필요가없을때 (새고가되면안될때)
2. 동기방식을 사용자를 기다리게함.
3. 화면은 니가만들어 나는 데이터만 줄게
이 내용이 로그아웃이랑 맞지않으니 ajax는 재낀다
form태그는 왜 안쓸까?
1. 넘길 파라미터가 없으니까
로그아웃할때 아무것도 안넘겨도됨! 왜? 세션에 있으니까
세션객체는 서버에게잇음
먼가 넘길파라미터가있었다면 로케이션보다는 폼태그가 나앗을거임
암튼 로케이션으로 한다. (핸들러는 다필요함. 왜? 받는 요청이 하나밖에없고 요청이오면 다 핸들러로 분기시켜야함)
세션이란?
사용자의 상태유지를 위한 방법중 하나
물론 쿠키로할수잇지만 쿠키는 사용자의 브라우저에 저장됨
그래서 로긴로긴아웃동안 사용자정보유지위해 세션사용
세션은 사용자가 요청하면 세션객체만들어짐
브라우저를 종료하거나 서버를 끌때까지 유지된다.
갱신은? 잇는거없애고 새로만드는것
세션은 항상있는데 인스턴스가바뀌는것. 언제? 갱신할때
각각의 세션을 따로따로보관해야하니까 각각에 아이디를 심어서 구분하는거임 그게 getId
setMacInacitvInterval : 암것도안하면 세션은 자리떠난줄알고 인위적으로 갱신시켜버림 그게 intervalinactive
기준? 6분임
예를 들어서, 로긴핸들러
로긴하고 새고해도 메인인데
10초 지나고 새고하면 로그아웃되서 로긴하라고 함
index jsp에서는 로긴상태면 메인으로, 아니면 loginform
근데 그전에 로긴체크필터에 닿는다
package com.jquery.handler;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class LogoutHandler implements CommandHandler {
@Override
public boolean isRedirect(HttpServletRequest request) {
return true;
}
@Override
public String process(HttpServletRequest request, HttpServletResponse response) throws Exception {
String url = "/"; // contextpath가 있다면 그걸 적어줘야함
HttpSession session = request.getSession();
session.invalidate();
return url;
}
}
로그아웃해보자
<a href="javascript:OpenWindow('<%=request.getContextPath()%>/member/detail.do?id=${loginUser.id}','상세보기','800','700');"class="d-block">${loginUser.name }</a><br>
<button class="btn btn-xs btn-primary col-xs-3" type="button" onclick="javascript:location.href='<%=request.getContextPath() %>/common/logout.do';" >LOGOUT</button><br>
하는김에 이름누르면 상세보기 되는것도.. 근데 오픈윈도우 안하면 전체창이 디테일로 바뀌어버리니까
오픈윈도우 꼭 써줘야함
유연하고 탄력적인 객체지향프로그램이 되려면
콘테이너 안의 인스턴스들이 콩깍지안의 콩과같다고 해서 이 인스턴스들을 bin이라고 한다.
xml먼저
xml에 필요한 인스턴스들을 막 규정할거임
맵안에 sql세션팩토리가 하나잇고 멤버dao가 하나잇고
이두개를 서비스에 넣어야함
어떻게?
셋메서드에 set뺴고 첫글자 소문자로 만든거임
서비스임플
파라미터에 sqlsessionfactory,와 memberDao 를 파라미터로 쥬ㅓ야하니까 ref-value에 그 이름을 준거임
이제 앞으로 우리는 멤버dao와 세션팩토리르,ㄹ 바꿀수가잇따. 어떻게? 셋메서드만 호출하면!
근데 이걸 자바코드로 짬? no
잠만 프로퍼티 왜만듬? 바꾸고싶을때 바꾸고싶으니까. . java는 못바꾸니까
결국 유지보수시 .java를 바꾸는건 최악임 왜? .java는 잇을수도없을수도있는데 없는경우가 더 많기떄문에
이렇게 다 지우면 저 인스턴스들 절대 못바꿈!
그나마 셋메서드가 잇으면 셋메서드를 호출해서 바꿀수는있는데 어짜피 얘 호출하는거 핸들러인데 핸들러도 .java이므로 쳇바퀴임
저것들을 바꾸려면 서비스 자체를 바꿔야함
그래서 저기에 인스턴스를 넣지않고 밖에서 넣어줄건데 어디서 읽어서? xml 에서 읽어서
xml을 읽는다면
시작은 빈즈부터
<?xml version="1.0" encoding="UTF-8"?>
<beans>
<!-- dataSource -->
<bean id="sqlSessionFactory" class="com.jsp.mybatis.OracleMyBatisSqlSessionFactory" />
<!-- Repository Layer -->
<bean id="memberDAO" class="com.jsp.dao.MemberDAOImpl" />
<bean id="memberDAO2" class="com.jsp.dao.MemberDAOImpl2" />
<bean id="boardDAO" class="com.jsp.dao.BoardDAOImpl" />
<bean id="attachDAO" class="com.jsp.dao.AttachDAOImpl" />
<bean id="replyDAO" class="com.jsp.dao.ReplyDAOImpl" />
<!-- Service layer -->
<bean id="memberService" class="com.jsp.service.MemberServiceImpl">
<property name="sqlSessionFactory" ref-value="sqlSessionFactory" />
<property name="memberDAO" ref-value="memberDAO2"/>
</bean>
<bean id="boardService" class="com.jsp.service.BoardServiceImpl" >
<property name="sqlSessionFactory" ref-value="sqlSessionFactory" />
<property name="boardDAO" ref-value="boardDAO" />
<property name="replyDAO" ref-value="replyDAO" />
<property name="attachDAO" ref-value="attachDAO" />
</bean>
</beans>
요청이 오기전에...
톰캣실행할때.....
미리만들어놔야한다
-> listener로 만든다
(*필터는 요청이올때! 뭔가를 매번해야할떄 필터로 만드는거고 이경우는 아니다)
톰캣이 해당 프로젝트를 배포하기시작하면
이름은 application 이지만 타입은 servlet context인게 만들어지고
이게 딱 만들어질떄 servletcontextlistener 가 흔들림 얘는 톰캣이 실행해줌
즉 톰캣배포시 리스너가 바로 발동된다
이 리스너를 이용할거임 얘는 요청에 의해서 실ㅎ행하지않으므로 . do가 아님
서블릿콘택스트가 ㅇ만들어질대 발동하는거임
do빠지면init과 destroyed만 남음
중요한건파라미터인자가 서블릿ㅋ컨텍스트이벤트이므로
서블릿컨텍스트안에 서블릿컨텍스트파라미터밖에 못쓴다 (?)
리스너를 이용해서 xml를 읽어야하니까 xml의 저장경로는 context param으로 줘야겠따는 결론이 나온다
web.xml를 먼저 건드려보자
리스너가 context param을 읽어온다
이제 initlistener을 만들어야함
package com.jqeury.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
@WebListener
public class InitListener implements ServletContextListener {
public void contextInitialized(ServletContextEvent ctxEvent) {
}
public void contextDestroyed(ServletContextEvent ctxEvent) {
}
}
일단 xml읽고
태그를 떙기니까
해당태그를 읽고 해당 속성을 읽을거임
해당 id는 키값으로 들어갈거임
맵은 41번쨰줄에잇다
내일이걸로 다시 핸들러를 만들거임
핸들러에서 new가 빠지고 리플렉션 이용해서 이걸사용해서 해당서비스를 주입받을수있게끔 만들거임
이렇게 다 하면
비로소
결합도를 낮춘 커맨드패턴을 만들어낼수있는거임
invoke 는 java reflection을 이용한거임 (이게힌트)
독해해오기
클래스하나더만들어야대
ㅁ
id : sqlSessionFactory, class : com.jquery.mybatis.OracleIBatisSqlSessionFactory
id : memberDAO, class : com.jquery.dao.MemberDAOImpl
id : boardDAO, class : com.jquery.dao.BoardDAOImpl
id : attachDAO, class : com.jquery.dao.AttachDAOImpl
id : replyDAO, class : com.jquery.dao.ReplyDAOImpl
id : memberService, class : com.jquery.service.MemberServiceImpl
id : boardService, class : com.jquery.service.BoardServiceImpl
[invoke]com.jquery.service.MemberServiceImpl@549b85b0:com.jquery.mybatis.OracleIBatisSqlSessionFactory@7dd9880a
[invoke]com.jquery.service.BoardServiceImpl@6c442fba:com.jquery.dao.BoardDAOImpl@5dec73e0
[invoke]com.jquery.service.BoardServiceImpl@6c442fba:com.jquery.dao.ReplyDAOImpl@31a576a0
[invoke]com.jquery.service.BoardServiceImpl@6c442fba:com.jquery.dao.AttachDAOImpl@16b9e04