본문 바로가기

programming/Gukbi

국비 교육 62일차 - session, include 활용

728x90
반응형

계속해서 jsp를 배우면서 실습하고 있다. 어제는 클라이언트에 저장되는 cookie를 배웠다면 오늘은 서버에 저장되는 session을 배웠다. session은 로그인 같은 기능에서 필수적으로 사용되어야 하기 때문에 잘 알아둬야 프로젝트 할때도 적용해서 사용할 수가 있다. 

 

 

 

- 클래스

        javax.servlet.http.HttpSession  

 

- 주요 기능

        1) 클라이언트와의 지속적인 연결 유지를 위한

           세션 처리

        2) 세션은 하나의 애플리케이션 내에서만 유효함.

           두 개의 서로 다른 애플리케이션에서는 쿠키를

           사용해야 함.

 

 

 

 

아래는 세션에서 사용하는 메소드들 이다. 

 

일단 로그인을 어떻게 처리하는지 부터 보도록 하겠다. 

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
 <form method=post action="../member/login_ok.jsp">
  <table class="table">
    <tr>
     <td width="10%" class="text-center">ID</td>
     <td width=90%>
       <input type=text name=id class="input-sm">
     </td>
    </tr>
    <tr>
     <td width="10%" class="text-center">PW</td>
     <td width=90%>
       <input type=password name=pwd class="input-sm">
     </td>
    </tr>
    <tr>
      <td colspan="2" class="text-right">
       <button class="btn btn-sm btn-danger">로그인</button>
      </td>
    </tr>
  </table>
  </form>
</body>
</html>

 로그인창은 위와 같이 생성해준다. 로그인 정보는 외부에 공개되면 안되기 때문에 꼭 post방식으로 차리해준다. 그리고 action에 들어갈 path가 중요한데.. 일단 이건 아래 다시 포스팅하겠다.

 

 

이렇게 로그인 창을 완성해 줬으면 login_ok로 값을 전달해준다. 

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="com.sist.dao.*"%>
<jsp:useBean id="dao" class="com.sist.dao.MemberDAO"></jsp:useBean>
<%
    // id,pwd 받는다
    String id=request.getParameter("id");
    String pwd=request.getParameter("pwd");
    // DAO연결
    String result=dao.isLogin(id, pwd);
    // 결과출력 
    if(result.equals("NOID"))
    {
%>
         <script>
         alert("ID가 존재하지 않습니다!!");
         history.back();
         </script>
<%
    }
    else if(result.equals("NOPWD"))
    {
%>
        <script>
        alert("비밀번호가 틀립니다!!");
        history.back();
        </script>
<%    	
    }
    else
    {
    	// 로그인 상태 => session에 ID,Name저장
        /*
            1. 서버에 정보 저장 : setAttribute(키,값) 
            2. 저장된 데이터 읽기 : getAttribute(키)
            3. 일부정보를 지운다 : removeAttribute(키) => 장바구니,찜
            4. 전체 정보 지울 때 : invalidate() => 브라우저 종료 , 로그아웃 
            5. 기간(저장) : setMaxinactiveInterval(30분)
            6. 서버컴퓨터에 저장 , 모든 JSP에서 사용이 가능 (공유)
            =====> 로그인 처리 , 장바구니, 예매,댓글 (로그인 상태 확인)
            내장 객체 => 미리 생성이 되어 있다 
            request를 이용해서 생성이 가능 : request.getSession()
            => HttpSession 
            ** session: 실행중인 프로세스 
        */
        session.setAttribute("id", id);
        session.setAttribute("name", result);
        // 이동 => main.jsp
        response.sendRedirect("../main/main.jsp");
    }
%>

 로그인 기능을 처리해주려면 오라클과 연동을 꼭 해줘야 하기 때문에 여기서는 useBean을 이용해서 메모리를 할당하고 클래스를 생성해 줬다. 

 

request.getParameter를 통해 id,pwd값을 받아서 저장해 줬다. 이 받아온 값을 처리해주기 위해 dao에 로그인 메소드를 생성해주러 간다. 

 

package com.sist.dao;
import java.sql.*;
import javax.sql.*;
import javax.naming.*;
public class MemberDAO {
	private Connection conn;
	private PreparedStatement ps;
	// 미리 만들어진 객체주소를 얻어온다 (Connection)
	public void getConnection()
	{
		try
		{
			Context init=new InitialContext();
			Context c=(Context)init.lookup("java://comp/env");
			DataSource ds=(DataSource)c.lookup("jdbc/oracle");
			conn=ds.getConnection();
		}catch(Exception ex) {}
	} 
	// 반환 (풀(POOL)로 반환) => 재사용
	public void disConnection()
	{
		try
		{
			if(ps!=null) ps.close();
			if(conn!=null) conn.close();
		} catch (Exception ex) {}
	}
	// 기능
	public String isLogin(String id, String pwd)
	{
		String result="";
		try
		{
			getConnection();
			String sql="SELECT COUNT(*) FROM webMember "
					+"WHERE id=?";
			ps=conn.prepareStatement(sql);
			ps.setString(1, id);
			ResultSet rs=ps.executeQuery();
			rs.next();
			int count=rs.getInt(1);
			rs.close();
			//////////// ID가 존재여부
			if(count==0) // ID가 없는 상태
			{
				result="NOID";
			}
			else
			{
				sql="SELECT pwd, name FROM webMember "
						+"WHERE id=?";
				ps=conn.prepareStatement(sql);
				ps.setString(1, id);
				rs=ps.executeQuery();
				
				rs.next();
				String db_pwd=rs.getString(1);
				String name=rs.getString(2);
				rs.close();
				
				if(db_pwd.equals(pwd))
				{
					result=name;
				}
				else
				{
					result="NOPWD";
				}
			}
		}catch (Exception ex)
		{
			
		}
		finally
		{
			
		}
		return result;
	}
}

  당연히 매개변수로는 id, pwd를 받아온다. 결과값으로는 아이디가 있는지, 비밀번호가 맞았는지 틀렸는지를 반환해주기 위해서 String으로 잡아 줬다. 

 

우선 id가 있는지 확인해주기 위해서는, 

String sql="SELECT COUNT(*) FROM webMember "
					+"WHERE id=?";

 위와 같은 sql문장을 사용해줘야 한다. 숫자값으로 1혹은 0을 반환해줘야 하기 때문이다. 

여기서 결과값이 0이라면 아이디가 없는것이기 때문에 "NOID" 문자열을 반환한다. 

 

1이라면 아이디가 존재하기 때문에, 비밀번호가 맞는지 확인해주고 로그인 처리를 완료해주기 위해 pwd, name값을 가져온다. 

				sql="SELECT pwd, name FROM webMember "
						+"WHERE id=?";

 

오라클에서 받아온 db_pwd와 사용자가 입력해줘서 매개변수로 받아온 pwd가 일치하면 사용자 이름, name을 반환하고, 

아니면 NOPWD를 반환한다. 

최종적으로 name을 반환해야 로그인이 완료된것이다. 

 

    // DAO연결
    String result=dao.isLogin(id, pwd);
    // 결과출력 
    if(result.equals("NOID"))
    {
%>
         <script>
         alert("ID가 존재하지 않습니다!!");
         history.back();
         </script>
<%
    }
    else if(result.equals("NOPWD"))
    {
%>
        <script>
        alert("비밀번호가 틀립니다!!");
        history.back();
        </script>
 <%    	
    }
    else
    {
    	// 로그인 상태 => session에 ID,Name저장
        session.setAttribute("id", id);
        session.setAttribute("name", result);
        // 이동 => main.jsp
        response.sendRedirect("../main/main.jsp");
    }
%>

 isLogin메소드에 사용자가 입력해준 id, pwd를 넣어주면 세 문자열 중 한가지를 반환하게 된다. 

아이디와 비번이 틀리면 alert창을 위와 같이 띄워준다. 

 

둘다 아니라면 로그인에 성공한 경우이기 때문에, 세션에 아이디와 이름을 저장해준다. 여기서는 result가 오라클에 저장된 사용자 이름이기 때문에 setAttribute로 key, value값을 설정해서 저장해준다. 그리고 main페이지로 이동해준다. 

 

 

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
  <form method=post action="../member/logout_ok.jsp">
  <table class="table">
    <tr>
     <td>
       <%= session.getAttribute("name") %>님
     </td>
    </tr>
    <tr>
     <td width=90%>
      쪽지(10) &nbsp; 메일(1) 
     </td>
    </tr>
    <tr>
      <td class="text-right">
       <button class="btn btn-sm btn-danger">로그아웃</button>
      </td>
    </tr>
  </table>
  </form>
</body>
</html>

로그인을 이미 했으면 로그아웃이 가능하도록 화면을 바꿔줘야 한다. 

 

일단 로그인이 완료되었으면 세션으로 부터 받아온 이름을 가지고 ooo님 이라고 설정해준다. 그리고 로그인 창은 로그아웃 창으로 바꿔준다. 

 

 

아래는 logout_ok.jsp 파일

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
    // 전체 정보를 삭제한다
    session.invalidate();
    // main으로 이동 
    response.sendRedirect("../main/main.jsp");
%>

세션에 담긴 전체 정보를 삭제해주면 로그인 정보가 사라지고 main페이지로 이동할 수 있다. 

 

main.jsp가 사실상 제일 중요하다. 여기서 모든 페이지 정보를 받아와서 뿌려주고 있기 때문이다. 일단 지금은 로그인 정보만 먼저 따져보겠다.

//세션에 저장되어 있는 데이터 읽기
    String id=(String)session.getAttribute("id"); // 없는 경우:null 
    String log_jsp="";
    if(id==null)
    	log_jsp="../member/login.jsp";
    else
    	log_jsp="../member/logout.jsp";

 로그인이 되어 있는 상태라면 세션에 저장된 id값이 존재할 것이고, 이걸 string으로 받아와서 변수에 따로 저장을 해준다. 만약 로그인이 되어 있지 않다면 id에는 아무 값도 저장이 되어있지 않아 null일 것이다. 

 

아이디가 null이면 로그인을 할 수 있도록 login.jsp 페이지를 띄워주면 되고, 로그인이 되어 있으면 logout을 진행할 수 있도록 logout.jsp 페이지를 띄워주면 된다.

 

<div class="col-sm-3">
   <jsp:include page="<%=log_jsp %>"></jsp:include>
 </div>
 <div class="col-sm-9">
   <jsp:include page="<%=main_jsp %>"></jsp:include>
 </div>

 

 

그리고 로그인 되어 있을때의 메뉴바와 되어있지 않았을때의 메뉴바가 다르기 때문에 여기도 마저 처리를 해줘야 한다. 

로그인이되어 있지 않으면 회원가입, 맛집추천에 해당하는 메뉴바만 띄워준다. 

그리고 로그인이 되어 있다면 회원수정, 마이페이지가 보이도록 메뉴바를 띄워준다. 

 

<ul class="nav navbar-nav">
      <li class="active"><a href="#">Home</a></li>
      <%
         if(id==null)
         {
      %>
      <li><a href="#">회원가입</a></li>
      <%
         }
         else
         {
      %>
      <li><a href="#">회원수정</a></li> 
      <%  	 
         }
      %>
      <li><a href="#">맛집추천</a></li>
      <%
        if(id!=null)
        {
      %>
      <li><a href="#">마이페이지</a></li>
      <%
        }
      %>
    </ul>
  </div>
</nav>

 

로그인 했을때
로그인 인했을때

로그아웃 버튼을 누르면 logout_ok.jsp에서 세션에 담긴 값을 삭제하고 main으로 이동시켜 준다 

 

home.jsp 파일에서는 로그인 정보가 아니라 맛집 정보를 출력해주고 있다. 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="com.sist.dao.*,java.util.*"%>
<%
	String index=request.getParameter("index");
	if(index==null)
	{
		index="1";
	}
	FoodDAO dao=new FoodDAO();
	List<FoodCategoryVO> list=dao.foodCategoryData(Integer.parseInt(index));
	
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<div class="row">
	 <a href="main.jsp?index=1" class="btn btn-sm btn-danger">믿고 보는 맛집 리스트</a>
	 <a href="main.jsp?index=2" class="btn btn-sm btn-success">지역별 인기 맛집</a>
	 <a href="main.jsp?index=3" class="btn btn-sm btn-primary">메뉴별 인기 맛집</a>
	</div>
	
	 <div class="row">
	 <%
	 	for(FoodCategoryVO vo: list)
	 	{
	 %>
	 		<div class="col-md-4">
	 	    <div class="thumbnail">
	 	      <a href="../main/main.jsp?mode=1&cno=<%=vo.getNo()%>">
	 	        <img src="<%=vo.getPoster() %>>" alt="Lights" style="width:100%">
	 	        <div class="caption">
	 	          <p><%=vo.getTitle() %></p>
	 	        </div>
	 	      </a>
	 	    </div>
	 	  </div>
	 	  
	 <% 
	 	}
	 
	 
	 %>
	
  </div>
</body>
</html>

 

 

 

 우선 카테고리 정보를 출력해주는 메소드를 dao에서 만들어 준다. 여러개를 출력해줘야 하기 때문에 List값을 반환해야 한다. 그리고 index값을 매개변수로 받아와서 해당하는 카테고리의 값을 보여줄 수 있도록 한다. 

 public List<FoodCategoryVO> foodCategoryData(int index)
	 {
		 List<FoodCategoryVO> list=new ArrayList<FoodCategoryVO>();
		 try
		 {
			getConnection();
			int start =0;
			int end=0;
			if(index==1)
			{
				start=1;
				end=12;
			}
			else if(index==2)
			{
				start=13;
				end=18;
			}
			else
			{
				start=19;
				end=30;
			}
			String sql="SELECT * FROM food_category "
					+ "WHERE no BETWEEN ? AND ?";
			ps=conn.prepareStatement(sql);
			ps.setInt(1, start);
			ps.setInt(2, end);
			
			ResultSet rs=ps.executeQuery();
			while(rs.next())
			{
				FoodCategoryVO vo=new FoodCategoryVO();
				vo.setNo(rs.getInt(1));
				vo.setTitle(rs.getString(2));
				vo.setSubject(rs.getString(3));
				vo.setPoster(rs.getString(4));
				vo.setLink(rs.getString(5));
				
				list.add(vo);
			}
			rs.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		 finally
		 {
			disConnection();
		 }
		 return list;
	 }

 데이터를 저장했을때 1~12까지는 첫번째 카테고리에, 13~18까지는 두번째 카테고리에, 19~30까지는 세번째 카테고리에 저장을 해줬다. 그리고 필요한 정보들만 담아서 list에 담아준다. 

그리고 home.jsp에 출력해주면 된다. 

 

인덱스를 다르게 해서 변수로 받아주면 출력이 완료된다. 

 

그리고 오늘의 마지막 정리...!!!!

 

package com.sist.dao;

public class JSPChange {
	private static String[] jsp= {
		"../food/home.jsp",
		"../food/catrgory.jsp",
		"../food/detail.jsp"
	};
	public static String change(int no)
	{
		return jsp[no];
	}
}

 저 홈에서 카테고리를 누르면 그 안에 카테고리 목록을 볼 수 있는 category.jsp 파일, 세부정보를 볼 수 있는 detail.jsp 파일을 만들어주고, 링크를 타고가면 화면이 바뀌도록 해줄 수 있는 JSPChange 클래스를 만들어 준다. 

 

문자열 배열로 만들어서 경로를 하나씩 저장을 해주고, 번호가 들어오면 하나씩 출력해줄 수 있는 메소드를 만들어 둔다. 

 

아직 완성이 되지는 않았는데, 내일 완성이 되면 다시 이어서 포스팅을 하겠다. 

사실 JSON 파싱도 배웠는데 그것까지 한번에 포스팅 하면 너무 많고 복잡해 질 것 같아서 내일 다시 해야지

 

새삼 복습하다보니 진도가 빠른게 느껴진다...

화이팅...

728x90
반응형