include 지시어는 JSP 파일 또는 HTML 파일을 해당 JSP  페이지에 삽입 할 수 있는 기능을 제공하는 지시어이다. 공통된 부분을 다른 폴더에 모아서 만들어 놓고 include 지시어로 포함시켜서 매번 같은 내용을 편리하게 입력할 수 있도록 도와 준다.

그리고 include 지시어는 하나의 파일에 중첩되어 사용가능하기 때문에 여러 파일들을 include 할 수 있다.

<%@ include file="header.jsp"%>

include 액션은 임시로 제어권을 include 되는 페이지로 넘겼다가 그 페이지의 처리가 끝나면 다시 원래의 페이지로 제어권을 반환한다. include 지시어 처럼 여러 페이지를 한 페이지 않에 담는 기능을 갖고 있지만 둘의 차이점은

<jsp:forward page="이동할 페이지"/> <jsp:param name="파라미터 이름1" value="파라미터 값1"/>
<jsp:forward page="포함될 페이지" flush="false"/> 파라미터 동일.

include 지시어는 include 되는 파일들을 포함시켜서 컴파일을 시키는 방법이고, include 액션은 따로 컴파일 되어 제어권 자체가 include액션으로 지정된 페이지로 넘어갔다가 다시 원래 페이지로 돌아온다는 점이다.

include 지시어는 주로 정적인 페이지를 포함시킬 때 주로 사용하고, include 액션은 JSP 페이지처럼 동적인 페이지를 포함시킬 때 사용한다.

1. viewCookies.jsp

쿠키에 들어있는 값들을 보여준다. 여기에 같은 조회번호가 있다면 더이상 카운트를 올려 주지 않으면 된다.


<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR" session="true"%>

<%
 Cookie[] cookies = request.getCookies();

 if(cookies == null || cookies.length == 0){
  
  out.println("쿠키없음");
  return; //return 실행의 제어권을 반환해준다.
  
 }

 for(Cookie ck:cookies){
  
  out.println(ck.getName() + ":" + ck.getValue());
  out.println("<hr>");
  
 }
%>


2. viewBbs.jsp

이 부분에서 bbsno 페이지 번호를 받고, 쿠키를 받아와서 쿠키의 name에 VIEWCOOKIE가 있는지 검색하고 없으면 VIEWCOOKIE 를 만들어 주고 있으면 bbsno를 추가한다. '|' 는 번호를 구분하기 위해 같이 입력한다.


<%@ page contentType="text/html; charset=EUC-KR"
    session="true"%>

<%
 String bbsno = request.getParameter("bbsno");

 Cookie[] cookies = request.getCookies();
 Cookie viewCookie = null;
 
 if(cookies != null && cookies.length > 0){
  
  for(int i = 0; i< cookies.length; i++){
   if(cookies[i].getName().equals("VIEWCOOKIE")){ //Cookie의 name이 VIEWCOOKIE와 일치하는 쿠키를 viewCookie에 넣어준다.
    viewCookie = cookies[i];
   }
  }  
 }
 
 //만일 viewCookie없다면
 if(viewCookie == null){
  System.out.println("VIEWCOOKIE 없음");
  Cookie newCookie = new Cookie("VIEWCOOKIE","|"+bbsno+"|"); //("VIEWCOOKIE"는 name, "|"+bbsno+"|" 는 value 다. 
  response.addCookie(newCookie);
 }else{
  System.out.println("VIEWCOOKIE 있음");
  String value = viewCookie.getValue();
  
  if(value.indexOf("|"+bbsno+"|") <  0){ // 입력한 번화와 일치하는 번호가 없으면 추가한다.
   value = value+"|"+bbsno+"|";
   viewCookie.setValue(value);
   response.addCookie(viewCookie);
  }
 }
 
%>

- 실행 화면

주소창에 처음으로

http://127.0.0.1:8081/web01_10/viewBbs.jsp?bbsno=100 bbsno를 100으로 주고 들어가면 "VIEWCOOKIE 없음" 이라고 나온다.



그리고

http://127.0.0.1:8081/web01_10/viewCookies.jsp 들어가보면 100 이 추가 된 모습을 볼 수 있다.

다시

http://127.0.0.1:8081/web01_10/viewBbs.jsp?bbsno=100 창에서 새로고침을 누르면 위에 사진 처럼
"VIEWCOOKIE 있음" 이라는 메시지가 뜨는 것을 확인 할 수 있다.



http://127.0.0.1:8081/web01_10/viewBbs.jsp?bbsno=101 번 추가 했을 경우 


http://127.0.0.1:8081/web01_10/viewBbs.jsp?bbsno=102 번 추가 했을 경우


이렇게 새로운 bbsno 를 입력할 때 마다 쿠키에 저장되고 다시 새로 고침을 해도 같은 번호는 들어가지 않는다. 이 방법을 이용해서 게시물 조회수 관리라든지 쇼핑몰에서 한번 클릭한 상품을 옆에 보여주는 기능도 구현 할 수 있다.

Session을 좀더 효과적을 사용하기 위해서 세션을 사용하여 로그인을 할 때, 데이타베이스에서 로그인한 사용자와 관련된 정보를 가져와서 세션에 저장 시켜 놓는 것이다. 그러면 사용자 정보가 필요할 때, 다시 데이타베이스를 접속하지 않아도 된다.

로그인을 통한 Session을 사용하는 방법과 사용자 정보를 가지고 와서 어떻게 유용하게 사용하는지 본다.

1. UserVO class를 만든다.


package org.web.member;

public class UserVO {

 private String id;
 private String pw;
 private String name;
 private String email;
 public String getId() {
  return id;
 }
 public void setId(String id) {
  this.id = id;
 }
 public String getPw() {
  return pw;
 }
 public void setPw(String pw) {
  this.pw = pw;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public String getEmail() {
  return email;
 }
 public void setEmail(String email) {
  this.email = email;
 }

 public String toString(){
  return id + ":" + pw + ":" + name + ":" + email;
 }
}

2. login.jsp 작성 - 아이디와 패스워드를 입력하고 loginAction.jsp로 전송한다.


<%@ page contentType="text/html; charset=EUC-KR"
    session="true"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<FORM METHOD=POST ACTION="loginAction.jsp">
 <TABLE>
 <TR>
  <TD>아이디</TD>
  <TD><INPUT TYPE="text" NAME="id"></TD>
  
 </TR>
 <TR>
  <TD>패스워드</TD>
  <TD><INPUT TYPE="password" NAME="pw"></TD>
  
 </TR>
 <TR>
  <TD>로그인</TD>
  <TD><INPUT TYPE="submit" value="전송"></TD>
 
 </TR>
 </TABLE>
</FORM>
</body>
</html>

3. loginAction.jsp - 원래는 여기서 데이타베이스에서 로그인한 사용자의 정보를 가지고 와서 VO 객체에 저장시켜준다.


<%@ page contentType="text/html; charset=EUC-KR" session="true"%>
<%@ page import = "org.web.member.*" %>   
   
<%
 String id = request.getParameter("id");
 String pw = request.getParameter("pw");
 
 //데이타베이스를 통해서 데이타를 가지고 온다. 여기서는 그냥 임의로 입력한다.
 UserVO vo = new UserVO();
 vo.setId(id);
 vo.setPw(pw);
 vo.setName(id + "님");
 vo.setEmail("think@korea.kr");
 
 session.setAttribute("LOGIN", vo); //LOGIN이라는 이름으로 vo 객체를 담아 준다.
%>

<%= id %><br/>
<%= pw%>

4. insertBbs.jsp - 세션에서 정보를 받아와서 입력할 창에 넣어준다. 이러면 사용자가 다시 자기 이름과 이메일 주소를 입력하지 않아도 된다.


<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
   
<%@ page import = "org.web.member.*" %>   
 
<%
 //Object obj = session.getAttribute("LOGIN");
 UserVO vo = (UserVO)session.getAttribute("LOGIN"); //session에 있는 정보를 받아온다.
 
 if(vo == null){
  System.out.println("로그인 안한 사용자");
 }else{
  System.out.println("로그인한 사용자");
 }
%>   
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<FORM METHOD=POST ACTION="insertBbsAction.jsp">
 <TABLE border="1">
 <TR>
  <TD>제목</TD>
  <TD><INPUT TYPE="text" NAME="title"></TD>
 </TR>
 <TR>
  <TD>내용</TD>
  <TD><INPUT TYPE="text" NAME="content"></TD>
 </TR>
 <TR>
  <TD>작성자</TD>
  <TD><INPUT TYPE="text" NAME="writer" value="<%=vo.getName()%>"></TD>
 </TR>
 <TR>
  <TD>작성자 e-mail</TD>
  <TD><INPUT TYPE="text" NAME="email" value="<%=vo.getEmail()%>"></TD>
 </TR>
 <TR>
  <TD>전송</TD>
  <TD><INPUT TYPE="submit" value="전송"></TD>
 </TR>
 </TABLE>
</FORM>
</body>
</html>
- 결과 화면 보기

1. login.jsp


2. loginAction.jsp


3. insertBbs.jsp



Cookie : 클라이언트 측에서 관리되는 정보로 쿠키는 하드디스크에 저장되어 있기 때문에 브라우저를 종료해도 사라지지 않는다. 그래서 보안의 문제를 가지고 있다. 따라서 보안에 관련된 정보는 세션으로 처리하고, 보안과 관련 없는 정보는 쿠키로 처리한다.

사용자를 식별하기 위한 쿠키 (자동으로 생성되는)를 보통 세션 쿠키라고 한다.

자동으로 발행되는 쿠키가 세션 쿠키이다. - 이건 was 마다 다르다.

수동으로 발행하는 쿠키를 수동쿠키 또는 사용자 정의 쿠키라고 부른다.

Session : 세션은 서버 측의 컨테이너에서 관리되는 정보로, 컨테이너에 접속해서 종료되기까지 유지된다. 서버측에서 관리되기 때문에 보안에 안전하다고 볼 수 있다. 세션은 세션의 유지 시간을 설정 할 수 있다.

HTTP를 사용한 웹 서버 통신은 기본적으로 Request/Response를 이용하여 한번 전송하고, 한번 응답하는 서비스를 종료한다. 그래서 사용자의 정보를 유지하기 위해 Session Tracking을 사용한다. (
추가!!!!)

Cookie와 Session을 사용하는데 있어서 반드시 알아야 하는 것은 동시에 많은 사용자가 페이지에 접속하게 된다면 session이 발생하여 메모리를 차지하게 된다는 것이다. 그래서 서버가 죽는 경우가 발생 할 수 있다.
일예로 아마존에서 이벤트를 했는데 동시에 접속자가 몰려서 session이 많이 발생하여 메모리를 잡아먹게 되어 서버가 다운 되는 경우가 발생했다고 한다.;;;

그래서 개발자가 개발시에 주의해야 할 점은 jsp페이지에서

<%@ page language="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR" session="true"%>

page 지시어에 보면 session="true" 항목이 있다. 기본값은 true이고 HttpSession의 사용여부를 결정한다.

이 부분을 false로 놓고 개발을 해야 한다. 그리고 로그인 같은 세션이 필요한 곳에서는 세션을 살려 놓고 작업을 한다.

이클립스에서 이부분을 설정하는 부분을 보면

Windows - Preferences - Web - JSP Files - Editor - Templates 로 이동해 보면 아래와 같은 그림을 볼 수 있다.


여기서 New JSP File(html)을 클릭하고 Edit를 누르면 아래와 같은 그림이 나온다.

<%@ page language="java" contentType="text/html; charset=${encoding}"
    pageEncoding="${encoding}"%>


이 부분을 아래 그림과 같이 변경한다.


이 부분에서 page 지시어 부분을 그림에서와 같이 변경하고 JSP 페이지를 만들면 기본적으로 변경한 내용으로 만들어 진다.

이렇게 설정을 하고 작업을 하며, 세션이 필요한 경우에는 session="true" 로 변경하고 작업을 하면 된다.

만약 false로 놓고 cookie나 session 작업을 한다면 cookie와 session은 실행되지 않는다.

반드시 구현해야할 계약서를 만드는 작업이 인터페이스다.

BbsDAO에서 반드시 해야 할 작업들을 작성해 놓는다.

Interface BbsDAO 를 작성한다.


package org.sdq.bbs;

public interface BbsDAO {

 public void create(BbsVO vo) throws Exception; //데이타를 집어넣을 작업을 구현하게 한다.
 
}


이제 인터페이스를 구현할 BbsDAOImpl Class를 만든다.

그리고 이전에 오라클과 연결하기 위한 작업을 수행하던 클래스를 상속 받아서 사용한다.


package org.sdq.bbs;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class BasicDAO {

 private static final String DRIVER = "oracle.jdbc.driver.OracleDriver";
 private static final String URL="jdbc:oracle:thin:@127.0.0.1:1521:XE";
 private static final String USER = "USER01";
 private static final String PW = "USER01";
 
 static{ //실행될 때 메모리 상에 올린다. 한번만
  try {
   Class.forName(DRIVER); //import 하는 거와 동일하다. 왜 이렇게 하냐 면 다른 DB를 사용 때 체크한다.
  } catch (ClassNotFoundException e) {
   e.printStackTrace();
  }
 }
 
 public Connection getConnection() throws SQLException{
  
  Connection con = null;
  
  //서브잡일때 잡고, 메인잡일때 던져(일부분일 때는 잡아야되고, 전체일 때는 던진다
  
  con = DriverManager.getConnection(URL, USER, PW);
  
  return con;
 }
}

그리하여 완성된 BbsDAOImpl Class!


package org.sdq.bbs;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class BbsDAOImpl extends BasicDAO implements BbsDAO {

 @Override
 public void create(BbsVO vo) throws Exception {
 
    Connection con = null;
    PreparedStatement pstmt = null;
   
    StringBuffer buffer = new StringBuffer();
    //buffer.append(" INSERT into TBL_BBS (bbsno, title, content, writer)\n");
    //buffer.append(" values(SEQ_BBS.NEXTVAL, 'AAAAAAAAA', 'BBBBBBBB', 'YNK')\n");
    buffer.append("  INSERT into TBL_BBS (bbsno, title, content, writer) \n");
    buffer.append("  values(SEQ_BBS.NEXTVAL, ?, ?, ?)  \n");
  
    try{
    
     con =
getConnection();
     pstmt = con.prepareStatement(buffer.toString());
     pstmt.setString(1, vo.getTitle());
     pstmt.setString(2, vo.getContent());
     pstmt.setString(3, vo.getWriter());
    
     int result = pstmt.executeUpdate();
     System.out.println(result);
    
     //작업
     pstmt.close();
     pstmt = null;
     con.close();
     con = null;
    }catch(Exception e){
     e.printStackTrace();
    }finally{
     if(pstmt != null){try{ pstmt.close(); }catch(Exception e){} }
     if(con != null){try{con.close();}catch(Exception e){}}
    } 
 }
}

+ Recent posts