카테고리 없음

0222 오후수업

logloglog 2021. 2. 22. 13:57

저 세줄을 없앨거임. 이런걸 없애려고 foreach쓰게되는거임

 <!-- 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로 열림

 

로그인핸들러 수정

 

commonㄴ지우기

 

 


로그인하면 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에 필요한 인스턴스들을 막 규정할거임

저 클래스로 인스턴스를 만들어서 그 이름을 sqlSEssionfactory로 하겠따는 말임

맵안에 sql세션팩토리가 하나잇고 멤버dao가 하나잇고
이두개를 서비스에 넣어야함

어떻게?

이런식으로

셋메서드에 set뺴고 첫글자 소문자로 만든거임

 

서비스임플

외부에서 dao주면 그걸로 갖겟다는 얘기가 setmethod 인거임

파라미터에 sqlsessionfactory,와 memberDao 를 파라미터로 쥬ㅓ야하니까 ref-value에 그 이름을 준거임

 

 

쟤들 지우면 바로 오류뜬다

이제 앞으로 우리는 멤버dao와 세션팩토리르,ㄹ 바꿀수가잇따. 어떻게? 셋메서드만 호출하면!

근데 이걸 자바코드로 짬? no

 

잠만 프로퍼티 왜만듬? 바꾸고싶을때 바꾸고싶으니까. . java는 못바꾸니까

결국 유지보수시 .java를 바꾸는건 최악임 왜? .java는 잇을수도없을수도있는데 없는경우가 더 많기떄문에

 

이렇게 다 지우면 저 인스턴스들 절대 못바꿈!

그나마 셋메서드가 잇으면 셋메서드를 호출해서 바꿀수는있는데 어짜피 얘 호출하는거 핸들러인데 핸들러도 .java이므로 쳇바퀴임

저것들을 바꾸려면 서비스 자체를 바꿔야함

 

그래서 저기에 인스턴스를 넣지않고 밖에서 넣어줄건데 어디서 읽어서? xml 에서 읽어서

여기서 읽어서!

 

 


보드서비스임플도

 

 

 

xml을 읽는다면

시작은 빈즈부터

 

 

 

 

이렇게 2를 주고싶으면
이게 가능해진다 멤버서비스에 들어있는 멤버dao는 2 가되는것. .java 건들 필요도 없이

 

 

 

<?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