이안의 평일코딩

MyBatis 1일차 - Config 본문

Back-end/MyBatis

MyBatis 1일차 - Config

이안92 2020. 9. 23. 09:52
반응형

2020.09.23~25,28,29(수~금,월화)

 

SQL 테이블 생성

-- 2020.09.23 자료실(마이바티스)
-- databoard
CREATE TABLE databoard7(
    no NUMBER,
    name VARCHAR2(34) CONSTRAINT db7_name_nn NOT NULL,
    subject VARCHAR2(1000) CONSTRAINT db7_sub_nn NOT NULL,
    content CLOB CONSTRAINT db7_cont_nn NOT NULL,
    pwd VARCHAR2(10) CONSTRAINT db7_pwd_nn NOT NULL,
    regdate DATE DEFAULT SYSDATE,
    hit NUMBER DEFAULT 0,
    filename VARCHAR2(260),
    filesize NUMBER DEFAULT 0,
    CONSTRAINT db7_no_pk PRIMARY KEY(no)
);
-- 댓글 : SESSION
INSERT INTO databoard7(no,name,subject,content,pwd,filename)
VALUES(1,'홍길동','마이바티스 CURD이용법','JSP include가 있는 경우 처리방법', '1234',' ');
INSERT INTO databoard7(no,name,subject,content,pwd,filename)
VALUES(2,'홍길동','마이바티스 CURD이용법','JSP include가 있는 경우 처리방법', '1234',' ');
INSERT INTO databoard7(no,name,subject,content,pwd,filename)
VALUES(3,'홍길동','마이바티스 CURD이용법','JSP include가 있는 경우 처리방법', '1234',' ');
INSERT INTO databoard7(no,name,subject,content,pwd,filename)
VALUES(4,'홍길동','마이바티스 CURD이용법','JSP include가 있는 경우 처리방법', '1234',' ');
INSERT INTO databoard7(no,name,subject,content,pwd,filename)
VALUES(5,'홍길동','마이바티스 CURD이용법','JSP include가 있는 경우 처리방법', '1234',' ');
COMMIT;

SELECT * FROM databoard7;
--자바에서 제어
DESC databoard7; -- VO => JSP (Bean)
-- JSO (자바 DB HTML) => 확장성, 재사용이 불가능 => 일반 기업, 간단한 쇼핑몰
-- 공기업, 금융권 ==> Model2 (MVC) : 자바하고 HTML분리 => 재사용, 확장성 (Spring:MVC)
-- 일차적으로 MVC 프로젝트 ==> 연장 (Spring)
/*
    MVC => page, taglib
            내장 객체 : request, response, session, cookie
            INCLUDE : 화면 
*/

 

mvnrepository.com/artifact/servlets.com/cos/05Nov2002

cos-05Nov2002.jar => 파일업로드 라이브러리


Spring => cos.jar

 

Java Resources/src

db.properties (파일)

driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@211.238.142.000:1521:XE
username=hr
password=pwdpwd

Config.xml

=> jsp/servlet 처음 실행시 기본 설정값을 저장하고 관리하는 역할 수행.

     web.xml 의 정보들을 가지고 있음

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
   PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
   "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
  <!-- 오라클을 연결하기 위한 환경설정 : 한개만 사용  -->
  <!-- properties 파일 읽기 -->
  <!-- MyBatis,Spring : 기본 디폴트 폴더가 src -->
  <properties resource="db.properties"/>
  <typeAliases>
    <!-- VO를 등록 -->
    <typeAlias type="com.sist.dao.DataBoardVO" alias="DataBoardVO"/>
    <!-- 
                      오라클에서 가지고 오는 데이터를 받아서 저장 
            while(rs.next())
            {
                DataBoardVO vo=new DataBoardVO(); // 셋팅
                vo.setNo(rs.getInt(1));
                ==
                ==
                ==
            }
     -->
  </typeAliases>
  <!-- 오라클 연결하는 부분 : getConnection() -->
  <environments default="development"><!-- 개발 환경을 만든다 -->
    <environment id="development">
      <!-- Commit,Rollback => Transection -->
      <!-- 
                    트랜잭션 처리 방법
                    자동처리 : 일반적으로 많이 사용 => JDBC
                    수동처리 : 프로그래머가 처리 => MANAGED
                    
           COMMIT : 정상처리 => 저장을 요청
           ROLLABCK : SQL문장이 틀렸다 => 실행하지 않는다 : UNDO (ctrl+z)
       -->
       <transactionManager type="JDBC"/>
      <!-- 오라클 정보를 모아서 MyBatis 라이브러리에 전송 : DataSource -->
       <dataSource type="POOLED">
          <!-- 
               UNPOOLED : 요청(SQL문장 실행)할때 오라클 연결 , 결과값을 가지고 오면 오라클 연결 해제
                          => 연결하는 시간이 많이 소모(연결이 지연될 수 도 있다)
               POOLED : DBCP (미리 Connection을 연결하고 요청시마다 연결된 Connection을 넘겨준다
                              사용후에는 반환=> 다시 재사용이 가능)
                          => 연결하는 소모되지 않는다 
                          => Connection의 생성 갯수를 제어 할 수 있다
                          => 일반적으로 웹프로그램에서는 기본으로 사용
           -->
           <!-- 오라클 연결을 위한 기본정보를 마이바티스로 전송 -->
           <!-- 
                    db.properties
                    driver=oracle.jdbc.driver.OracleDriver
					url=jdbc:oracle:thin:@211.238.142.000:1521:XE
					username=hr
					password=happy
            -->
           <property name="driver" value="${driver}"/>
           <property name="url" value="${url}"/>
           <property name="username" value="${username}"/>
           <property name="password" value="${password}"/>
           <!-- 
                 public class PooledDataSource
                 {
                     private String driver;
                     private String url;
                     private String username;
                     private String password;
                 }
                 
                 public class MyBatisDAO
                 {
                      private DataSource dataSource;
                      public MyBatisDAO()
                      {
                          Class.forName(dataSource.getDriver()); ==> 필요한 데이터 => XML로 설정 
                      }
                      public void getConnection()
                      {
                         conn=DriverManager.getConnection(dataSource.getUrl(),
                             dataSource.getUsername(),dataSource.getPassword())
                      }
                 }
            -->
       </dataSource>
    </environment>
  </environments>
  <!-- SQL문장을 전송 : SQL문장 어디 있는지 확인 : mapper를 등록  -->
  <!-- XML은 문서 저장 : 저장내용이 많아지면 파싱(XML저장되어 있는 데이터를 읽어 간다) 속도가 저하된다:분산  -->
  <!-- XML만 가지고 코딩하는 프레임워크 : XML이 길어진다=>속도의 문제 (스트럿츠) : 스프링 -->
  <!-- 
      MyBatis => XML없이도 사용이 가능 
                ===== Annotation  @
   -->
  <mappers>
    <mapper resource="com/sist/dao/databoard-mapper.xml"/><!-- 분산 여러개를 등록이 가능 -->
    <mapper resource="com/sist/dao/movie-mapper.xml"/>
    <mapper resource="com/sist/dao/board-mapper.xml"/>
    <mapper resource="com/sist/dao/member-mapper.xml"/>
    <!-- MovieVO , MovieDAO  -->
  </mappers>
</configuration>

 

com.sist.dao

DataBoardVO.java

package com.sist.dao;
import java.util.*;
// 한개의 게시물에 전체 대한 정보
/*
 *      오라클                자바 
 *    문자        =====> String
 *      CHAR
 *      VARCHAR2
 *      CLOB
 *    숫자        =====>  int , double
 *      NUMBER
 *      NUMBER(7,2)
 *    날짜        =====>  java.util.Date
 *      DATE
 *    기타        =====> InputStream (IO)
 *      BFILE 그림파일 ==> 권장(경로명만 주고 읽을 수 있게)
 *      BLOB
 *      
 *      
 *      NO       NOT NULL NUMBER         
		NAME     NOT NULL VARCHAR2(34)   
		SUBJECT  NOT NULL VARCHAR2(1000) 
		CONTENT  NOT NULL CLOB           
		PWD      NOT NULL VARCHAR2(10)   
		REGDATE           DATE           
		HIT               NUMBER         
		FILENAME          VARCHAR2(260)  
		FILESIZE          NUMBER         
 */
// 캡슐화 => 데이터를 은닉 => 외부연결시에 메소드(getter(읽기)/setter(쓰기) 이용하는 방식 
// 데이터 보호 목적 
/*
 *    상속/포함  => 재사용 
 *     상속 : 확장
 *     포함 : 있는 그대로 사용 
 *    추가,수정 (다형성)
 *     오버로딩 / 오버라이딩 
 *    ======================= 객체지향의 3대 특성 
 */
// ==> SQL문장을 저장한다 ==> mapper.xml
public class DataBoardVO {
    private int no;
    private String name;
    private String subject;
    private String content;
    private String pwd;
    private Date regdate;
    private int hit;
    private String filename;
    private int filesize;
    private String dbday;// 데이터베이스 컬럼이 없는 경우
    
	public String getDbday() {
		return dbday;
	}
	public void setDbday(String dbday) {
		this.dbday = dbday;
	}
	public int getNo() {
		return no;
	}
	public void setNo(int no) {
		this.no = no;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getSubject() {
		return subject;
	}
	public void setSubject(String subject) {
		this.subject = subject;
	}
	public String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
	}
	public String getPwd() {
		return pwd;
	}
	public void setPwd(String pwd) {
		this.pwd = pwd;
	}
	public Date getRegdate() {
		return regdate;
	}
	public void setRegdate(Date regdate) {
		this.regdate = regdate;
	}
	public int getHit() {
		return hit;
	}
	public void setHit(int hit) {
		this.hit = hit;
	}
	public String getFilename() {
		return filename;
	}
	public void setFilename(String filename) {
		this.filename = filename;
	}
	public int getFilesize() {
		return filesize;
	}
	public void setFilesize(int filesize) {
		this.filesize = filesize;
	}
	   
   
}

 

com.sist.dao/databoard-mapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- Mybatis plugin => 자동으로 기본 셋팅 -->
<!-- 
       mapper : SQL문장을 저장 
                PreparedStatement => 전송
                => 데이터 첨부 (?에 값을 채워주는 설정)
                   =================
                    parameterType
                ResultSet => 결과값을 받는다 
                => 어떤 클래스,변수로 받을지를 설정 
                   ============ resultType
                 
 -->
<mapper namespace="com.sist.dao.databoard-mapper">
  <!-- 값을 읽어오는 부분 : SELECT -->
  <!-- 삭제 : delete , 수정 : update , 추가 : insert : 태그는 반드시 한개의 SQL문장만 설정 :CURD(Create(Insert) Update Read(Select) Delete)  -->
  <!-- 데이터 읽기 : 페이지를 나눠서 처리 : 인라인뷰  -->
  <!-- 
         id => 식별자 (중복이 되면 안된다) => 문자를 앞에서 시작 (숫자는 뒤에 올 수 있다)
         
         ? ==> 일반 데이터형 
               WHERE empno=?  => int
               WHERE ename=?  => String
         ? ? ? ? ? 
         ========= => Map , DataBoardVO
         
         예)
          <select id="a" resultType="int">
            SELECT empno FROM emp ==> 정수한개 
          </select>
          
          <select id="b" resultType="String">
            SELECT ename FROM emp
          </select>
          
          <select id="c" resultType="EmpVO"> ==> java.util.Map(VO에 존재하지 않는 변수가 있는 경우)
             SELECT * FROM emp   ==> 데이터 8개
          </select>
          
          <select id="d" resultType="java.util.Map">
            SELECT SUM(sal),AVG(sal),COUNT(*),MAX(sal),MIN(sal)
            FROM emp
          </select>
   -->
   <!-- 
       hashmap => java.util.Map
    -->
  <select id="boardListData" resultType="DataBoardVO" parameterType="hashmap">
     SELECT no,subject,name,TO_CHAR(regdate,'YYYY-MM-DD') as dbday,hit,num 
     FROM (SELECT no,subject,name,regdate,hit,rownum as num 
     FROM (SELECT no,subject,name,regdate,hit 
     FROM databoard7 ORDER BY no DESC))
     WHERE num BETWEEN #{start} AND #{end}
     <!-- start , end => Map에 설정한 key이름 
          get("start")
         String sql= "SELECT no,subject,name,regdate,hit,num 
				     FROM (SELECT no,subject,name,regdate,hit,rownum as num 
				     FROM (SELECT no,subject,name,regdate,hit 
				     FROM databoard ORDER BY no DESC))
				     WHERE num BETWEEN ? AND ?"
	     
	     ps=conn.preparedStatement(sql);
	     // 실행하지 전에  ?에 값을 채운다 
	     ps.setInt(1,map.get("start")); ==> parameterType
	     ps.setInt(2,map.get("end"))
	     ==> Map
	     map.put("end",10);
	     map.put("start",1);
	     
	     ResultSet rs=ps.executeQuery();
	     while(rs.next())
	     {
	         DataBoardVO vo=new DataBoardVO(); => resultType
	     }
     -->
  </select>
  <select id="boardTotalPage" resultType="int">
    SELECT CEIL(COUNT(*)/10.0) FROM databoard7
  </select>
  <!-- 내용보기 : 다운로드 -->
  <!-- 중복된 문장이 있는 경우 처리:재사용 -->
  <sql id="where-no">
    WHERE no=#{no}
  </sql>
  <!-- 조회수 증가 -->
  <update id="hitIncrement" parameterType="int">
    UPDATE databoard7 SET
    hit=hit+1
    <include refid="where-no"/>
  </update>
  <!-- 실제 데이터 읽기 -->
  <select id="boardDetailData" resultType="DataBoardVO" parameterType="int">
    SELECT no,name,subject,content,TO_CHAR(regdate,'YYYY-MM-DD') as dbday,
           hit,filename,filesize 
    FROM databoard7
    <include refid="where-no"/>
  </select>
  <!-- 추가  -->
  <!-- DataBoardVO  #{name} vo.getName() , #{pwd} vo.getPwd()-->
  <!--  Map에 데이터를 묶어서 전송 , VO에 데이터를 묶어서 전송  
        VO에 소속된 변수 => VO
        VO에 없는 변수가 있는 경우 => Map
  -->
  <!-- <insert id="boardInsert" parameterType="DataBoardVO">
    INSERT INTO databoard VALUES(
      (SELECT NVL(MAX(no)+1,1) FROM databoard),#{name},#{subject},
      #{content},#{pwd},SYSDATE,0,#{filename},#{filesize}
    )
  </insert> -->
  <insert id="boardInsert" parameterType="DataBoardVO">
    <!-- Sequence 
         SELECT NVL(MAX(no)+1,1) FROM databoard을 먼저 수행한 후에
                 결과값을 no에 받아서 
         INSERT 문장에 추가
    -->
    <selectKey keyProperty="no" resultType="int" order="BEFORE">
      SELECT NVL(MAX(no)+1,1) FROM databoard7
    </selectKey>
    INSERT INTO databoard7 VALUES(
      #{no},
      #{name},
      #{subject},
      #{content},
      #{pwd},
      SYSDATE,
      0,
      #{filename},
      #{filesize}
    )
  </insert>
  <!-- 
        MyBatis => 실무에서도 사용 => DAO(X) => 프로젝트 
        1. 태그명 
           <sql> : 중복된 문장이 있는 경우에 저장한후 나중에 재사용
           <select> : SELECT
           <insert> : SELECT(자동 증가번호),INSERT => INSERT
                      <selectKey>
           <update> : UPDATE
           <delete> : DELETE
        2. 속성명 
           id  ===> 구분자 (중복이 없다)
           resultType => SQL문장을 실행후에 받는 변수 (여러개=> VO,Map,한개=>일반변수) 
           parameterType => ?에 값을 설정할 경우에 사용 
           ================
           resultMap  ====> JOIN,SUBQUERY
           parameterMap ==> PL/SQL (PROCEDURE) => 함수 호출 
                            C언어 => 함수
                                                    자바 => 메소드
                                                    오라클 => 프로시저
                                                    자바스크립트 => 함수
                                                    코틀린 => 함수/메소드 
                                                    
                            클래스안에 함수가 지정 => 메소드
                            클래스밖에서 지정 => 함수 
           ================
   -->
  <!-- 수정하기 -->
  <update id="boardUpdate" parameterType="dataBoardVO">
  	UPDATE databoard7 SET 
  	name=#{name}, 
  	subject=#{subject}, 
  	content=#{content}
  	<include refid="where-no"/><!-- WHERE no=#{no} -->
  </update>
  <!-- 삭제하기 -->
  <!-- 비밀번호 확인 -->
  <select id="boardGetPassword" resultType="String" parameterType="int">
  	SELECT pwd FROM databoard7
  	<include refid="where-no"/>
  </select>
  <!-- 게시물이 삭제가 되면 업로드된 파일을 삭제 -->
  <select id="boardGetInfoData" resultType="DataBoardVO" parameterType="int">
  	SELECT filename,filesize FROM databoard7
  	<include refid="where-no"/>
  </select>
  <!-- 본인일 경우에는 게시물을 삭제 -->
  <delete id="boardDelete" parameterType="int">
  	DELETE FROM databoard7
  	<include refid="where-no"/>
  </delete>
  <!-- 찾기 -->
  <!-- 
  		${fd} => 컬럼명, 테이블명 (name LIKE, subject LIKE, content LIKE)
  		#{ss} => 일반 데이터 
   -->
  <select id="boardFindData" resultType="DataBoardVO" parameterType="hashmap">
    SELECT no,subject,name,TO_CHAR(regdate,'YYYY-MM-DD') as dbday,hit
    FROM databoard7 
    WHERE ${fd} LIKE '%'||#{ss}||'%'
  </select>
  <select id="boardFindCount" resultType="int" parameterType="hashmap">
    SELECT COUNT(*)
    FROM databoard7 
    WHERE ${fd} LIKE '%'||#{ss}||'%'
  </select>
</mapper>


 

DataBoardDAO.java

package com.sist.dao;
// XML파싱후에 => 실행된 결과를 받는 위치=>DAO에서 메소드 호출 
import java.io.*;//XML파일 읽기 => Reader (한글파일)
import java.util.*;//List => 구현 (ArrayList)
/*
 *    IO (Input,Output) : 데이터 입출력 
 *    ==============================
 *      1. 메모리 입출력 
 *      2. 파일 입출력 
 *      3. 네트워크 입출력 
 *    ==============================
 *    IO의 종류 (1byte,2byte)
 *    1byte=> 바이트 스트림(파일 업로드,다운로드) => ~InputStream,~OutputStream
 *    2byte=> 문자 스트림 (한글포함된 데이터 읽기) => ~Reader , ~Writer
 */

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class DataBoardDAO {
   // XML을 파싱(데이터 읽기) => 읽은 데이터 저장 ==> SqlSesionFactory
   private static SqlSessionFactory ssf;
   // 초기화 => XML을 읽기(자동으로 셋팅)
   static 
   {
	   try
	   {
		   // 1. XML파일 읽기
		   Reader reader=Resources.getResourceAsReader("Config.xml");
		   // Config에 등록되어 있는 모든 XML파일 읽는다 
		   // 파일명에 대소문자를 구분한다
		   // 2. XML을 파싱 : 필요한 데이터 읽어 간다 (마이바티스 라이브러리가 읽어 간다) => 저장을 하고 사용한다
		   ssf=new SqlSessionFactoryBuilder().build(reader);
		   // 파싱 => SAX(읽기전용) => 태그를 한개씩 읽어와서 필요데이터를 저장하는 방식
		   /*
		    *    JAXP 
		    *      DOM :수정,읽기,삭제,추가 (메모리에서 저장)
		    *           => 속도가 늦다 
		    *      SAX : 읽기 => 일반적으로 모든 라이브러리는 SAX방식을 사용한다
		    *                   MyBatis,Spring...
		    *           => 속도가 빠르다 
		    *    JAXB : 빅데이터 (데이터 자바에 값을 채워준다)
		    *      binding
		    */
	   }catch(Exception ex)
	   {
		   // 에러처리 
		   System.out.println(ex.getMessage());
	   }   
   }
   // 목록 출력 ==> id="boardListData"
   //            리턴형 : resultType            //매개변수 : parameterType
   // select ==> selectList() : row가 여러개 일때 ,  selectOne() : row가 한개일때 
   // 오라클==> 한줄 => row(record)
   // <select id="boardListData" resultType="DataBoardVO" parameterType="hashmap">
   public static List<DataBoardVO> boardListData(Map map)
   {
	   List<DataBoardVO> list=new ArrayList<DataBoardVO>();
	   // Connection을 사용한 다음에 반드시 반환 ==> SqlSession
	   SqlSession session=null;
	   // SqlSession => Connection과 동일한 역할 수행 
	   // 컴파일 예외처리는 없다 => 초반에 에러처리하기 위해서 => 예외처리를 하는 것이 좋다 => null
	   try
	   {
		   // 실행 : 정상수행 : try수행 => finally수행
		   //      비정상  : 중간에 catch수행 => finally수행
		   // 1. 미리 만든 Connection객체를 얻어 온다 
		   session=ssf.openSession();
		   // 2. XML에 있는 SQL문장을 실행후에 결과값을 달라
		   list=session.selectList("boardListData",map);
	   }catch(Exception ex)
	   {
		   ex.printStackTrace();//실행하는 과정을 보여준다 
	   }
	   finally
	   {
		   // 반환 => Connection=>close()
		   if(session!=null)
			   session.close(); 
		   /*
		    *   close()
		    *   {
		    *     if(ps!=null) ps.close();
		    *     if(conn!=null) conn.close(); ==> disConnection()
		    *   }
		    */
	   }
	   return list;
   }
   // 총페이지 ==> id="boardTotalPage"
   // <select id="boardTotalPage" resultType="int">
   public static int boardTotalPage()
   {
	   // 지역변수는 반드시 초기화 
	   /*
	    *    클래스 => null
	    *    String => null
	    */
	   int total=0;
	   SqlSession session=null;
	   try
	   {
		   // 1. connection 객체를 가지고 온다 
		   session=ssf.openSession();
		   total=session.selectOne("boardTotalPage");
	   }catch(Exception ex)
	   {
		    ex.printStackTrace();
	   }
	   finally
	   {
		   if(session!=null)//연결이 되어 있다면 
			   session.close(); // 연결을 종료 (자동으로 반환 => 반환 다시 사용이 가능)
	   }
	   return total;
   }
   // 데이터 추가 
   //          resultType        parameterType
   public static void boardInsert(DataBoardVO vo)
   {
	   SqlSession session=null;
	   try
	   {
		   // 미리 만들어 둔 Connection
		   /*
		    *   autoCommit설정 
		    *   ssf.openSession(); // commit이 없는 경우
		    *   ssf.openSession(true);..autoCommit설정 
		    */
		   session=ssf.openSession(true);// commit을 실행한다 
		   // INSERT,UPDATE,DELETE => 데이터베이스 변경 => 반드시 COMMIT
		   session.insert("boardInsert",vo);
		   // 여러개의 SQL문장을 실행하면 
		   //session.commit();
	   }catch(Exception ex)
	   {
		   // 에러 처리 
		   ex.printStackTrace();
	   }
	   finally
	   {
		   if(session!=null) // 오라클에 연결되어 있다면 
			   session.close();
	   }
   }
   // 상세보기
   /*
    * 	상세보기 => VO (VO:게시물 한개에 전체 정보)
    * 	목록, 찾기 => VO가 여러개 => ArrayList
    * 	no => Primary Key (중복이 없는 데이터)
    * 	==============================================================
    * 	오라클 : 데이터 저장 (영구적) => 모든 유저가 공통으로 볼 수 있는 내용 저장 => 저장용도
    * 			=> 필요한 데이터를 가지고 오려면 SQL문장
    * 	자바 : 오라클, 웹 연결해서 사용자가 요청한 데이터 가지고 오는 역할
    * 	JSP : 사용자 요청한 데이터를 출력
    * 	==============================================================
    * 	웹안에서 처리 (자바로 사용할 수 없다, 자바스크립트) : Modal(팝업창), 입력이 안된 경우 처리, 실시간
    */
   public static DataBoardVO boardDetailData(int no) {
	   // 데이터를 받을 변수 설정
	   DataBoardVO vo = new DataBoardVO();
	   // 오라클 연결
	   SqlSession session=null; // Connection => SqlSession안에 Connection기능을 가지고 있다
	   // 데이터를 가지고 오는 과정 에러가 발생할 수 있다 => 사전에 에러방지 프로그램 => 예외처리
	   /*
	    * 	예외처리
	    * 		= 직접 처리 (에러가 발생하면 바로 처리해서 사용) try~catch
	    * 		= 간접 처리 (시스템 에러발생여부만 확인하고 에러 회피) throws
	    */
	   try {
		   // 정상적으로 실행 => 에러 => catch를 수행하고 점프
		   // 연결
		   session=ssf.openSession(); // Commit을 퐇마하지 않는다
		   // 작업 수행
		   // 1. 조회수 증가
		   // <update id="hitIncrement" parameterType="int">
		   session.update("hitIncrement",no);
		   session.commit(); // 포함이 안되면 조회수가 증가를 하지 않는다
		   // 2. 증가된 조회수를 포함해서 데이터 가지고 오기
		   // <select id="boardDetailData" resultType="DataBoardVO" parameterType="int">
		   vo=session.selectOne("boardDetailData",no);
		   /*
		    * 	COMMIT => 저장된 데이터가 변경, 추가, 삭제 => 다시 저장
		    * 				SELECT : 검색
		    */
		   /*
		    * <select>
		    * 	= 목록(여러개) => selectList("id명")
		    * 	= 한개 => selectOne("id명")
		    * ====================================
		    * <insert>
		    * 	= insert("id명") 
		    * <update>
		    * 	= update("id명")
		    * <delete>
		    * 	= delete("id명")
		    * ==================================== 반드시 COMMIT처리 해야함
		    */
	   }catch(Exception ex) {
		   // 에러가 났을 경우에 처리 (복구)
		   ex.printStackTrace(); // 어떤 에러가 났는지 확인
	   }finally {
		   // 정상수행, 비정상 수행 상관없이 => 무조건 수행(서버연결 해제, 데이터베이스 연결해제)
		   if(session!=null) // 연결되어 있다면
			   session.close(); // ps.close(), conn.close() => disConnection()
	   }
	   
	   return vo; // 사용자가 요청한 데이터를 받아 볼 수 있다
   }
   
   // 찾기 관련 내용
   // 찾은 갯수
   // <select id="boardFIndCount" resultType="int" parameterType="hashmap">
   public static int boardFindCount(Map map) {
	   int count=0;
	   // 연결(오라클) => 객체
	   SqlSession session = null;
	   try {
		   // 연결 객체주소 가지고 오기 : DBCP (미리 오라클을 연결한 Connection을 생성 => 생성된 주소)
		   // default => connection (8개)
		   session=ssf.openSession(); // commit이 필요가 없다 (select)
		   // commit이 필요한 곳은 데이터베이스 변경 (insert, update, delete)
		   count=session.selectOne("boardFindCount",map);
	   }catch(Exception ex) {
		   // 에러 처리
		   ex.printStackTrace();
	   }finally {
		   if(session!=null)
			   session.close(); // conn.close() => DBCP (반환=>재사용)
	   }
	   return count;
   }
   // <select id="boardFindData" resultType="DataBoardVO" parameterType="hashmap">
   // 실제 찾은 데이터 읽기
   public static List<DataBoardVO> boardFindData(Map map){
	   List<DataBoardVO> list = new ArrayList<DataBoardVO>();
	   // 연결 객체
	   SqlSession session = null;
	   try {
		   // 객체주소 얻기
		   session=ssf.openSession(); // COMMIT(X)
		   list=session.selectList("boardFindData",map);
	   }catch(Exception ex) {
		   ex.printStackTrace();
	   }finally {
		   if(session!=null)
			   session.close();
	   }
	   return list;
   }
   // 삭제 하기
   // JSP(요청) ==> databoard-mapper.xml => DAO 처리 => JSP에서 받아서 화면 출력
   public static boolean boardDelete(int no, String pwd) {
	   boolean bCheck=false;
	   SqlSession session=null;
	   try {
		   // Connection
		   session=ssf.openSession();
		   // 비밀번호 가지고오기
		   // <select id="boardGetPassword" resultType="String" parameterType="int">
		   String db_pwd=session.selectOne("boardGetPassword",no);
		   if(pwd.equals(db_pwd)) {
			   bCheck=true;
			   // 실제 삭제
			   // <delete id="boardDelete" parameterType="int">
			   session.delete("boardDelete",no);
			   // 반드시 commit
			   session.commit();
		   }
		   else {
			   bCheck=false;
		   }
	   }catch(Exception ex) {
		   ex.printStackTrace();
	   }finally {
		   // session을 닫는다 (connection, preparedstatement 포함)
		   if(session!=null)
			   session.close();
	   }
	   
	   return bCheck;
   }
   // <select id="boardGetInfoData" resultType="DataBoardVO" parameterType="int">
   public static DataBoardVO boardGetInfoData(int no) {
	   DataBoardVO vo = new DataBoardVO();
	   SqlSession session=null;
	   try {
		   // 연결
		   session=ssf.openSession();
		   vo=session.selectOne("boardGetInfoData",no);
	   }catch(Exception ex) {
		   // 에러 처리
		   ex.printStackTrace();
	   }finally {
		   // 닫기
		   if(session!=null)
			   session.close();
	   }
	   return vo;
   }
   // 수정하기 위한 데이터 읽기 시작
   // <select id="boardDetailData" resultType="DataBoardVO" parameterType="int">
   // MyBatis ==> 저장되어 있는 SQL문장을 여러번 사용이 가능
   public static DataBoardVO boardUpdateData(int no) {
	   DataBoardVO vo = new DataBoardVO();
	   SqlSession session=null;
	   try {
		   // 연결
		   session=ssf.openSession(); // 연결
		   vo=session.selectOne("boardDetailData",no);
	   }catch(Exception ex) {
		   ex.printStackTrace(); // 오류 처리
	   }finally {
		   if(session!=null)
			   session.close(); // 반환(다음에 다시 사용이 가능하게)
	   }
	   return vo;
   }
   // 수정하기
   public static boolean boardUpdate(DataBoardVO vo) {
	   boolean bCheck=false;
	   SqlSession session=null;
	   try {
		   // 오라클 연결
		   session=ssf.openSession();
		   // 비밀번호 검색
		   // <select id="boardGetPassword" resultType="String" parameterType="int">
		   String db_pwd=session.selectOne("boardGetPassword",vo.getNo());
		   if(db_pwd.equals(vo.getPwd())){//본인이면
			  bCheck=true;
			  // 실제 수정한다
			  session.update("boardUpdate",vo);
			  // 저장한다
			  session.commit();
		   }
		   else { //본인이 아니면
			   bCheck=false;
		   }
	   }catch(Exception ex) {
		   ex.printStackTrace();
	   }finally {
		   if(session!=null)
			   session.close();
	   }
	   return bCheck;
   }
}

 

movie-mapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sist.dao.movie-mapper">
  <!-- SQL문장 -->
  <!-- Config.xml에 VO를 등록 -->
  <select id="movieListData" resultType="com.sist.dao.MovieVO" parameterType="hashmap">
    SELECT no,poster,title,num
    FROM (SELECT no,poster,title,rownum as num 
    FROM (SELECT no,poster,title 
    FROM daum_movie ORDER BY no ASC))
    WHERE num BETWEEN #{start} AND #{end}
  </select>
  <select id="movieTotalPage" resultType="int">
    SELECT CEIL(COUNT(*)/12.0) FROM daum_movie
  </select>
  <!-- Category별 영화 목록 출력  -->
  <select id="movieCategoryData" resultType="com.sist.dao.MovieVO" parameterType="int">
    SELECT no,poster,title
    FROM daum_movie
    WHERE cateno=#{cateno}
  </select>
  <!-- 영화 상세보기  : SQL문장만 저장 = 처리는 MovieDAO에 처리-->
  <select id="movieDetailData" resultType="com.sist.dao.MovieVO" parameterType="int">
    SELECT no,title,poster,grade,genre,director,actor,score,story,NVL(regdate,' ') as regdate 
    FROM daum_movie 
    WHERE no=#{no}
  </select>
</mapper>

 

SQL로 DB 확인

SELECT * FROM daum_movie;
DESC daum_movie;

 

MovieVO.java

package com.sist.dao;
/*
 * 이름       널?       유형            
-------- -------- ------------- 
NO       NOT NULL NUMBER        
CATENO            NUMBER        
TITLE    NOT NULL VARCHAR2(200) 
POSTER   NOT NULL VARCHAR2(300) 
REGDATE           VARCHAR2(200) 
GENRE    NOT NULL VARCHAR2(100) 
GRADE    NOT NULL VARCHAR2(100) 
ACTOR             VARCHAR2(100) 
SCORE             VARCHAR2(20)  
DIRECTOR NOT NULL VARCHAR2(100) 
STORY             CLOB          
KEY               VARCHAR2(50) 
 */
// JSP ==> Bean => 8장
public class MovieVO {
	private int no;
	private int cateno;
	private String title;
	private String poster;
	private String regdate;
	private String genre;
	private String grade;
	private String actor;
	private String score;
	private String director;
	private String story;
	private String key;
	public int getNo() {
		return no;
	}
	public void setNo(int no) {
		this.no = no;
	}
	public int getCateno() {
		return cateno;
	}
	public void setCateno(int cateno) {
		this.cateno = cateno;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getPoster() {
		return poster;
	}
	public void setPoster(String poster) {
		this.poster = poster;
	}
	public String getRegdate() {
		return regdate;
	}
	public void setRegdate(String regdate) {
		this.regdate = regdate;
	}
	public String getGenre() {
		return genre;
	}
	public void setGenre(String genre) {
		this.genre = genre;
	}
	public String getGrade() {
		return grade;
	}
	public void setGrade(String grade) {
		this.grade = grade;
	}
	public String getActor() {
		return actor;
	}
	public void setActor(String actor) {
		this.actor = actor;
	}
	public String getScore() {
		return score;
	}
	public void setScore(String score) {
		this.score = score;
	}
	public String getDirector() {
		return director;
	}
	public void setDirector(String director) {
		this.director = director;
	}
	public String getStory() {
		return story;
	}
	public void setStory(String story) {
		this.story = story;
	}
	public String getKey() {
		return key;
	}
	public void setKey(String key) {
		this.key = key;
	}
	
}

 

MovieDAO.java

package com.sist.dao;
import java.io.*;
import java.util.*;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class MovieDAO {
    private static SqlSessionFactory ssf; // XML을 읽기
    // 자동 초기화 ==> 클래스를 읽을때 자동으로 처리 
    static 
    {
    	try
    	{
    		// XML읽기 => 주석 => 한글을 읽기 (한글:2byte => Reader)
    		Reader reader=Resources.getResourceAsReader("Config.xml");
    		// Config => movie-mapper.xml,databoard-mapper.xml을 포함 
    		// Config.xml에 ~mapper.xml을 반드시 등록
    		// 파싱 : XML에 등록되어 있는 데이터중에 필요한 데이터를 읽어가는 과정 ==>SqlSessionFactory
    		ssf=new SqlSessionFactoryBuilder().build(reader);
    		// 프로그래머가 XML파싱을 하지 않고 => 라이브러리에 파싱 메소드가 있다 
    		// build ==> 파싱하는 메소드 (SAX) => 태그를 한개씩 읽어서 데이터만 추출 
    		// mybatis가 제공해준 태그,속성를 반드시 사용 ==> dtd (태그,속성 정의)
    		// Spring => XML에 필요한 데이터 저장 => Spring 라이브러리가 읽어가서 웹을 동작
    		/*
    		 *   XML을 이용하는 목적 
    		 *   => 자바 소스를 제공하지 않는다 => 동작에 필요한 데이터를 XML에 올려주면 읽어간다
    		 *   => 모든 라이브러리는 소스를 공개하지 않는다 (실행할수 있는 파일만 제공 .class)
    		 *   => 실무에도 배포할때 자바소스는 제공하지 않는다 (컴파일 .class만 제공)
    		 *   => 배포 (war) => jar(.class)
    		 */
    	}catch(Exception ex)
    	{
    		// XML에 에러를 처리
    		ex.printStackTrace();
    	}
    }
    // SQL문장을 읽어서 실행 => 요청한 데이터를 넘겨준다 (SQL => movie-mapper.xml)
    // <select id="movieListData" resultType="com.sist.dao.MovieVO" parameterType="hashmap">
    // sql문장 돌려서 출력된 결과랑 vo에 담긴 변수들이 어떻게 연결돼요
    /*
     *   SELECT no,poster,title
     *   FROM daum_movie;
     *   
     *   ==> no,poster,title ==> StringTokenizer => no,poster,title
     */
    public static List<MovieVO> movieListData(Map map)
    {
    	// map => start번호 , end번호
    	List<MovieVO> list=new ArrayList<MovieVO>();
    	// list에 값을 채운다 ==> home.jsp에 채워진 list값을 출력 
    	// 오라클 연결 
    	SqlSession session=null;
        // 실행 => 결과값 모아서 처리
    	try
    	{
    		// 연결
    		session=ssf.openSession(); // COMMIT을 사용여부 
    		/*
    		 *   INSERT,UPDATE,DELETE :오라클 저장된 데이터가 변경 => 다시 저장 요청 : COMMIT
    		 *   ssf.openSession() => COMMIT(X)
    		 *   ssf.openSession(true) => COMMIT(O)
    		 */
    		// SQL문장을 실행후에 데이터를 읽어서 list에 저장 
    		list=session.selectList("movieListData",map);
    	}catch(Exception ex)
    	{
    		// XML => 에러가 났을 경우에 어디서 발생했는지 확인
    		ex.printStackTrace();
    	}
    	finally
    	{
    		// 미리 생성된 Connection을 다시 사용하지 위해 반환 => DBCP
    		// DataBase Connection Pool(Connection을 관리하는 영역)
    		if(session!=null)
    			session.close();
    	}
    	return list;
    }
    // 총페이지 
    // <select id="movieTotalPage" resultType="int">
    public static int movieTotalPage()
    {
    	int total=0;
    	// 연결 
    	SqlSession session=null;
    	try
    	{
    		// 연결
    		session=ssf.openSession();
    		// SQL문장 실행한 결과값 받기
    		total=session.selectOne("movieTotalPage");
    	}catch(Exception ex)
    	{
    		// 에러 처리
    		ex.printStackTrace();
    	}
    	finally
    	{
    		// 닫기 => 자동으로 반환 
    		if(session!=null)
    			session.close();
    	}
    	return total;
    }
    // <select id="movieCategoryData" resultType="com.sist.dao.MovieVO" parameterType="int">
    public static List<MovieVO> movieCategoryData(int cateno)
    {
    	List<MovieVO> list=new ArrayList<MovieVO>();
    	// 연결
    	SqlSession session=null;
    	try
    	{
    		// 연결할 객체 얻기 
    		session=ssf.openSession();
    		// SQL문장 실행한후에 결과값을 받는다 
    		list=session.selectList("movieCategoryData",cateno);
    	}catch(Exception ex)
    	{
    		// 에러 처리
    		ex.printStackTrace();
    	}
    	finally
    	{
    		// 닫기
    		if(session!=null)
    			session.close();
    	}
    	return list;
    }
    // 상세보기 : XML에 코딩 => Mybatis에 처리 요청
    // <select id="movieDetailData" resultType="com.sist.dao.MovieVO" parameterType="int">
    // 처리는 DAO(자바) ==> 처리된 결과 브라우저에 전송 ==> JSP가 받아서 화면에 출력
    // JSP(링크) ==> movie-mapper.xml(SQL) ==> MovieDAO에서 SQL문장 실행 결과 ==> JSP
    // home                                                                detail
    public static MovieVO movieDetailData(int no)
    {
    	MovieVO vo=new MovieVO();
    	// 연결
    	SqlSession session=null;
    	try
    	{
    		// 연결 시도
    		session=ssf.openSession();
    		// SQL문장을 실행 => 결과값을 저장 
    		vo=session.selectOne("movieDetailData", no);
    	}catch(Exception ex)
    	{
    		// 에러 처리
    		ex.printStackTrace();
    	}
    	finally
    	{
    		// 닫기 ==> 재사용이 가능하게 반환
    		if(session!=null)
    			session.close();
    	}
    	return vo;
    }
}

 

BoardVO.java

package com.sist.dao;
/*
 *  NO      NOT NULL NUMBER         
	NAME    NOT NULL VARCHAR2(34)   
	SUBJECT NOT NULL VARCHAR2(1000) 
	CONTENT NOT NULL CLOB           
	PWD     NOT NULL VARCHAR2(10)   
	REGDATE          DATE           
	HIT              NUMBER  
	
	VO => 변수만 설정    (~Bean , ~DTO , ~VO) : 거의 같은 개념 
	      ===
	       = 읽기 (변수값 읽어 오기)  ======> 메소드  (getter)
	       = 쓰기 (변수값을 메모리에 저장) ===> 메소드 (setter) 
	================================================== JavaBean
	목적이 필요한 데이터를 여러개 모아서 브라우저에 볼 목적을 직접 제작 
 */
import java.util.*;//Date
// 게시물 한개에 대한 전체 정보 ==> 읽기/쓰기 
public class BoardVO {
    private int no;
    private String name;
    private String subject;
    private String content;
    private String pwd;
    private Date regdate;// 오라클에 저장 
    private int hit;
    // 오라클에서 날자를 변경해서 가지고 온다 (TO_CHAR())
    private String dbday; // 출력 
    // new SimpleDateFormat("yyyy-MM-dd").format(vo.getRegdate())
    
	public String getDbday() {
		return dbday;
	}
	public void setDbday(String dbday) {
		this.dbday = dbday;
	}
	public int getNo() {
		return no;
	}
	public void setNo(int no) {
		this.no = no;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getSubject() {
		return subject;
	}
	public void setSubject(String subject) {
		this.subject = subject;
	}
	public String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
	}
	public String getPwd() {
		return pwd;
	}
	public void setPwd(String pwd) {
		this.pwd = pwd;
	}
	public Date getRegdate() {
		return regdate;
	}
	public void setRegdate(Date regdate) {
		this.regdate = regdate;
	}
	public int getHit() {
		return hit;
	}
	public void setHit(int hit) {
		this.hit = hit;
	}
	   
}

 

BoardDAO.java

package com.sist.dao;
import java.util.*;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.*;
/*
 *    public class CreateSqlSessionFactory
 *    {
 *          private static SqlSessionFactory ssf;
			static 
			{
				try
				{
					Reader reader=Resources.getResourceAsReader("Config.xml");
					ssf=new SqlSessionFactoryBuilder().build(reader);
				}catch(Exception ex)
				{
					ex.printStackTrace();
				}
			} 
			public static SqlSessionFactory getSsf()
			{
			    return ssf;
			}
 *    }
 *    
 *    
 *    오늘 ==> 액션 태그 : 자바문법을 태그형으로 제작 
 *    3가지 기억
 *    1) <jsp:include page="첨부할 JSP파일명">
 *    2) <jsp:useBean id="dao" class="MemberDAO">
 *       ============================ 메모리 할당
 *         => 자바코드 
 *            MemberDAO dao=new MemberDAO()
 *                     ====
 *                       id  ==> id가 객체명이 된다
 *    3) <jsp:setProperty name="객체명" property="">
 *                        =========== ============
 *                        name: => id명칭 
 *                        property : 변수명  ==> setXxx()에 값을 채워준다
 *        예)
 *           JSP => Bean , MyBatis => DTO , Spring => VO
 *           Bean = DTO = VO는 동일한 개념 
 *             => 영화 한개의 전체정보 => 브라우저에 넘겨줄 목적 
 *             => 기능이 두가지 
 *                읽기 / 쓰기 
 *                getter / setter
 *           public class MemberVO
 *           {
 *               private int no;
 *               private String name;
 *               // 쓰기 => 메모리에 저장
 *               public void setNo(int no)
 *               {
 *                  this.no=no;
 *               }
 *               // 읽기 => 저장된 값 읽기
 *               public int getNo()
 *               {
 *                   return no;
 *               }
 *               public void setName(String name)
 *               {
 *                   this.name=name;
 *               }
 *               public void getName()
 *               {
 *                  return name;
 *               }
 *           }
 *           
 *           VO => 메모리에 클래스를 저장 
 *           MemberVO vo=new MemberVO();
 *           => <jsp:useBean id="vo" class="MemberVO">
 *              useBean : 메모리 할당 
 *           => 싱클턴 
 *           => HTML과 자바코딩을 분리 
 *              <c:forEach> <c:if> <c:forTokenes> : JSTL
 *              <% %> => 제거 
 *           vo.setName("홍길동"),vo.setNo(1)
 *           => <jsp:setProperty name="vo" property="no" value="1">
 *              vo.setNo(1)
 *                             ==========
 *              <jsp:setProperty name="vo" property="name" value="홍길동">
 *              vo.setName("홍길동")
 *              
 *              setProperty => setXxx()에 값을 채워준다
 *              
 *           => <jsp:setProperty name="vo" property="*">
 *              모든 setXxx()에 전송된 값을 채워라
 */
public class BoardDAO{
	private static SqlSessionFactory ssf;
	/*
	 *   마이바티스 , 스프링 : 먼저 XML을 읽기 때문에 XML이 틀릴경우에는 
	 *   구동이 안된다
	 *   => id가 같은 경우에는 오류가 없게 
	 *   => id => 앞에 테이블명 
	 *   databoardTotalPage
	 *   freeboardTotalPage
	 */
	static 
	{
		try
		{
			Reader reader=Resources.getResourceAsReader("Config.xml");
			ssf=new SqlSessionFactoryBuilder().build(reader);
		}catch(Exception ex)
		{
			ex.printStackTrace();
		}
	}
	// <select id="freeBoardListData" resultType="com.sist.dao.BoardVO" parameterType="hashmap">
	public static List<BoardVO> freeBoardListData(Map map)
	{
		List<BoardVO> list=new ArrayList<BoardVO>();
		SqlSession session=null;
		try
		{
			session=ssf.openSession();
			list=session.selectList("freeBoardListData",map);
		}catch(Exception ex)
		{
			ex.printStackTrace();
		}
		finally
		{
			if(session!=null)
				session.close();
		}
		return list;
	}
	// <insert id="freeBoardInsert" parameterType="com.sist.dao.BoardVO">
	public static void freeBoardInsert(BoardVO vo)
	{
		SqlSession session=null;
		try
		{
			// 연결 객체 (Connection)=> SqlSession => getConnection
			// 스프링 => 분리 , 중복없이 => annotation
			session=ssf.openSession(true);//insert => commit (autoCommit)
			session.insert("freeBoardInsert", vo);
		}catch(Exception ex)
		{
			 ex.printStackTrace();
		}
		finally
		{
			if(session!=null)
				session.close(); //connection닫기(반환)
		}
	}
	// 상세보기 
		// <update id="freeBoardHitIncrement" parameterType="int">
		// <select id="freeBoardDetailData" resultType="com.sist.dao.BoardVO" parameterType="int">
		public static BoardVO freeBoardDetailData(int no)
		{
			BoardVO vo=new BoardVO();
			SqlSession session=null;
			// 연결 => 처리 
			try
			{
				// 연결 객체 얻기 (session=>Connection,PreparedStatement)
				session=ssf.openSession();
				session.update("freeBoardHitIncrement", no);
				// commit을 전송
				session.commit();
				/*
				 *   단위 줄수 
				 *     여러줄 => selectList
				 *     한줄 => selectOne
				 */
				vo=session.selectOne("freeBoardDetailData", no);
				// 화면 출력 
			}catch(Exception ex)
			{
				ex.printStackTrace();
			}
			finally
			{
				// 닫기
				if(session!=null)
					session.close();
			}
			
			return vo;
		}
		// 수정할 데이터를 읽어 온다 : board-mapper.xml에 이미 만들어진 SQL문장이 있는 경우 = 재사용이 가능
		// // <select id="freeBoardDetailData" resultType="com.sist.dao.BoardVO" parameterType="int">
		public static BoardVO freeBoardUpdateData(int no) {
			BoardVO vo = new BoardVO();
			SqlSession session=null;
			
			try
			{
				// 연결
				session=ssf.openSession(); // commit(X)
				vo=session.selectOne("freeBoardDetailData", no);
			}catch(Exception ex)
			{
				// 에러 처리
				ex.printStackTrace();
			}
			finally
			{
				// 닫기
				if(session!=null) // connection이 연결되었다면
					session.close();
			}
			return vo;
		}
		// <select id="freeBoardGetPassword" resultType="String" parameterType="int">
		// <update id="freeBoardUpdate" parameterType="com.sist.dao.BoardVO">
		public static boolean freeBoardUpdate(BoardVO vo)
		{
			boolean bCheck=false;
			// 비밀번호 (O) : true , (X):false
			// => detail.jsp  => update.jsp
			SqlSession session=null;
			try
			{
				// 연결할 Connection객체를 얻어 온다 
				session=ssf.openSession();
				// SQL문장 실행 요청 
				// 1. 비밀번호를 가지고 온다 
				String db_pwd=session.selectOne("freeBoardGetPassword", vo.getNo());// no => <input type=hidden no>
			    if(db_pwd.equals(vo.getPwd()))
			    {
			    	// 비밀번호가 일치
			    	bCheck=true;
			    	// 실제 수정 
			    	session.update("freeBoardUpdate", vo);
			    	// commit
			    	session.commit();
			    }
			    else
			    {
			    	// 비밀번호 불일치
			    	bCheck=false;
			    }
			}catch(Exception ex)
			{
				ex.printStackTrace();
			}
			finally
			{
				if(session!=null)
					session.close(); // Connection이 연결되어 있다면 
			}
			return bCheck;
		}
	}

 

board-mapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 
    main.jsp ==> case등록 ==> 화면 변경 (번호설정)
    DB관련 
      => Config.xml
         <mappers>
           <mapper resource="">
         </mappers>
      => board-mapper.xml
         <select> </select>
      => BoardDAO 
         SQL 읽고 출력 
         
      => JSP에서 화면 
 -->
<mapper namespace="com.sist.dao.board-mapper">
  <select id="freeBoardListData" resultType="com.sist.dao.BoardVO" parameterType="hashmap">
    <!-- 
        hashmap => java.util.Map
     -->
     SELECT no,subject,name,TO_CHAR(regdate,'YYYY/MM/DD') as dbday,hit,num
     FROM (SELECT no,subject,name,regdate,hit,rownum as num 
     FROM (SELECT no,subject,name,regdate,hit 
     FROM movie_board7 ORDER BY no DESC))
     WHERE num BETWEEN #{start} AND #{end}
  </select>
  <insert id="freeBoardInsert" parameterType="com.sist.dao.BoardVO">
    INSERT INTO movie_board7 VALUES(
      mb_no_seq.nextval,
      #{name},
      #{subject},
      #{content},
      #{pwd},
      SYSDATE,0
    )
  </insert>
  <!-- 상세보기 -->
  <!-- 조회수 증가 -->
  	<update id="freeBoardHitIncrement" parameterType="int">
  		<!-- parameterType="int" : 게시물의 번호를 대입 -->
  		UPDATE movie_board7 SET
  		hit=hit+1
  		WHERE no=#{no}
  	</update>
  	<!-- 
         JSP => <a> button ==> 요청 
         board-mapper.xml파일에 SQL문장 
         BoardDAO => SQL문장을 읽어서 처리
         JSP에 읽어온 데이터 출력 
   -->
  	<!-- 실제 데이터 읽기 (내용보기) => 처리는 BoardDAO -->
	<select id="freeBoardDetailData" resultType="com.sist.dao.BoardVO" parameterType="int">
		SELECT no,name,subject,content,TO_CHAR(regdate,'YYYY-MM-DD') as dbday,hit 
		FROM movie_board7 
		WHERE no=#{no}
	</select>
	<!-- 수정 -->
	<select id="freeBoardGetPassword" resultType="String" parameterType="int">
		<!-- 
			resultType="String"
			parameterType="int" ==> 변수명 (데이터형)
		 -->
		 SELECT pwd FROM movie_board7 
		 WHERE no=#{no}
		 <!-- 본인 여부 확인 -->
	</select>
	<!-- 
		<insert>
		<update>
		<delete>
		================ resultType은 없다 (결과값)
	  <select> == resultType
   -->
  <update id="freeBoardUpdate" parameterType="com.sist.dao.BoardVO">
     UPDATE movie_board7 SET
     name=#{name},
     subject=#{subject},
     content=#{content}
     WHERE no=#{no}
  </update>
</mapper>

 

member-mapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sist.dao.member-mapper">
   <!-- Login -->
   <!-- 
        1. id가 존재 확인
        2. password 확인 
    -->
    <!--  id 체크 -->
    <select id="memberIdCheck" resultType="int" parameterType="String">
      SELECT COUNT(*) FROM member
      WHERE id=#{id}
      <!-- 
             0 => id가 없다
             1 => id 존재 
       -->
    </select>
    <!-- 비밀번호 확인 -->
    <select id="memberGetInfoData" resultType="com.sist.dao.MemberVO" parameterType="String">
      SELECT pwd,id,name,admin FROM member
      WHERE id=#{id}
    </select>
   <!-- 회원가입 , 아이디중복체크 , 우편번호-->
   <!-- 회원수정 -->
   <!-- 회원탈퇴 -->
   <!-- 아이디찾기 -->
   <!-- 비밀번호찾기 -->
   <!-- 비밀번호 변경 -->
   <!-- Admin 회원관리 -->
</mapper>

 

MemberVO.java

package com.sist.dao;

public class MemberVO {
    private String id;
    private String pwd;
    private String name;
    private String admin;
    private String msg;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getPwd() {
		return pwd;
	}
	public void setPwd(String pwd) {
		this.pwd = pwd;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getAdmin() {
		return admin;
	}
	public void setAdmin(String admin) {
		this.admin = admin;
	}
	public String getMsg() {
		return msg;
	}
	public void setMsg(String msg) {
		this.msg = msg;
	}
	   
}

 

MemberDAO.java

package com.sist.dao;
import java.io.*;
import java.util.*;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class MemberDAO {
   // XML을 읽어서 데이터를 저장하는 객체
   private static SqlSessionFactory ssf;
   static 
   {
	   try
	   {
		   Reader reader=Resources.getResourceAsReader("Config.xml");
		   ssf=new SqlSessionFactoryBuilder().build(reader);
		   // getConnection,disConnection
	   }catch(Exception ex)
	   {
		   ex.printStackTrace();
	   }
   }
   
   // 기능 처리
   // 1. login처리 => session => 1.id,2.name,3.admin
   // <select id="memberIdCheck" resultType="int" parameterType="String">
   // <select id="memberGetInfoData" resultType="com.sist.dao.MemberVO" parameterType="String">
   /*
    *     게시판 / 댓글  => PL/SQL
    *     Spring으로 프로젝트 
    *     JSP : Spring을 제작 
    */
   public static MemberVO memberLogin(String id,String pwd)
   {
	   MemberVO vo=new MemberVO();
	   // 연결 
	   SqlSession session=null;
	   try
	   {
		   // 연결
		   session=ssf.openSession();
		   // 오라클에 SQL문장 전송 
		   int count=session.selectOne("memberIdCheck",id);
		   if(count==0) // ID가 없는 상태
		   {
			   vo.setMsg("NOID");
		   }
		   else // ID가 존재하는 상태
		   {
			   // 비밀번호 검사
			   vo=session.selectOne("memberGetInfoData", id);
			   if(pwd.equals(vo.getPwd()))// 로그인
			   {
				   vo.setMsg("OK");
			   }
			   else // 비밀번호가 틀린 상태
			   {
				   vo.setMsg("NOPWD");
			   }
		   }
	   }catch(Exception ex)
	   {
		   ex.printStackTrace();
	   }
	   finally
	   {
		   if(session!=null)
			   session.close(); // 재사용 => 반환 (POOL) => false(다시 사용)
		   /*
		    *   jdbc/oracle
		    *   ==========================
		    *    new Connection() false ==> true (close=> false)
		    *   ==========================
		    *    new Connection() false
		    *   ==========================
		    *    new Connection() false
		    *   ==========================
		    *   
		    *   _jspInit() : 환경 설정 (web.xml)
		    *   _jspService() : 사용자 요청한 파일 실행
		    *   _jspDestory() : 메모리 해제 => GC()
		    */
	   }
	   return vo;
   }
   
}

 

 

WebContent/

main/nav.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%-- 메뉴가 올라가는 자리 --%>
<%--
     링크 : 이동 (메뉴클릭,버튼 클릭) = 페이지 흐름 => 사이트 주소를 주는 방법 
     한글 변환 => 반드시 링크가 걸린 jsp에서 한글 변환  
   1. 자바 코딩 
      <%
                 일반 자바 코딩
      %>
      <%= 화면 출력 부분 %> => out.println()
   2. page 지시자 : contentType="실행할때 어떤 코드를 만들것인지 확인"
                  text/html , text/xml  ==> 브라우저가 메모리에 데이터 읽을 경우에 html,xml
                  import ==> 라이브러리 읽기 
   3. 내장 객체 (기본 객체)
        request , response , out , application , pageContext 
        config, page, exception , session 
        
        request : 사용자 보내준 데이터를 받는 경우 
        response : 서버에서 화면 이동 
        application : getRealPath()
        pageContext : include(),forward()
                      <jsp:include> , <jsp:forward>
        ===========================================
        *** session vs cookie  : 로그인 , 장바구니 , 예매하기 
        ===========================================
   4. include => JSP안에 특정부분에 다른 JSP를 첨부 (붙여쓰기)
      ========
            전송은 전체를 가지고 있는 JSP(main.jsp)로 전송=>include된 파일(jsp) 데이터를 받아 볼 수 있다 
   =============================================================================
      항상 (오라클을 연결해서 데이터를 읽어 온다) : 외부에서 가지고 올 수 있다(JSoup,XML)
                                     ==============================
   1. JDBC , DBCP , ORM(MyBatis)
                    ============
                    1. Connection  ===> Config.xml
                                        getConnection(),disConnection()
                    2. PreparedStatement,ResultSet ==> table명-mapper.xml  
                                        PreparedStatement,ResultSet => SQL
 --%>
<%
   // 메뉴 조절 
   // 회원 , 마이페이지 
   // 로그인 => 회원 => 회원수정 회원탈퇴
   String id=(String)session.getAttribute("id");
   // id=null => 로그인 (X)
   String admin=(String)session.getAttribute("admin");// y/n
%>
<!DOCTYPE html>
<html>
<head>
  <title>Bootstrap Example</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  
</head>
<body>
<nav class="navbar navbar-inverse">
  <div class="container-fluid">
    <div class="navbar-header">
      <a class="navbar-brand" href="../main/main.jsp">SIST Movie</a>
    </div>
    <ul class="nav navbar-nav">
      <li class="active"><a href="../main/main.jsp">Home</a></li>
      <li class="dropdown"><a class="dropdown-toggle" data-toggle="dropdown" href="#">회원<span class="caret"></span></a>
        <ul class="dropdown-menu">
         <%
            if(id==null) // 로그인이 안된 상태
            {
         %>
		          <li><a href="#">회원가입</a></li>
		          <li><a href="#">아이디찾기</a></li>
		          <li><a href="#">비밀번호찾기</a></li>
          <%
            }
            else   // 로그인이 된 상태
            {
          %>
                  <li><a href="#">회원수정</a></li>
		          <li><a href="#">회원탈퇴</a></li>
          <%
            }
          %>
        </ul>
      </li>
      <li class="dropdown"><a class="dropdown-toggle" data-toggle="dropdown" href="#">커뮤니티<span class="caret"></span></a>
        <ul class="dropdown-menu">
          <li><a href="../main/main.jsp?mode=9">자유게시판</a></li>
          <li><a href="../main/main.jsp?mode=1">자료실</a></li>
        </ul>
      </li>
      <%
       if(id!=null)
        {
      %>
         <li><a href="#">영화예매</a></li>
         <li><a href="#">영화추천</a></li>
         <%
           if(admin.equals("n"))
           {
         %>
              <li><a href="#">마이페이지</a></li>
          <%
           }
           else
           {
          %>
               <li><a href="#">예매 현황</a></li>
          <%
           }
          %>
      <%
        }
      %>
    </ul>
  </div>
</nav>
</body>
</html>

 

main.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%--
     템플릿 : 메뉴..footer..
 --%>
<%-- 화면 변경 
     1. 사용자가 화면 변경 요청 (숫자)
     
--%>
<%--
      사용자가 요청시마다 jsp파일을 변경해주는 역할 수행   => Controller (M(Java)V(HTML)C)
      소스 코딩은 동일 
 --%>
<%
     request.setCharacterEncoding("UTF-8");
     String mode=request.getParameter("mode"); // mode => 화면 변경 => 번호 보내준다 
     if(mode==null)
    	 mode="7"; // home에 출력 
     int index=Integer.parseInt(mode);
     String jsp=""; // 1=>a.jsp , 2.b.jsp...
    		 
    		 
    /*
          main  ===> board에 접근  ../board/jsp파일명
            main.jsp
            login.jsp  
          board
            list.jsp
            
            
          ==> 경로 (폴더가 다르다) 
              .. 상위 디렉토리 
    */
     switch(index)
     {
     // 화면에 출력하는 JSP만 설정 
     // insert_ok.jsp,download.jsp => 화면 출력하는 JSP아니라  처리만 담당 
     /*
          JSP 
           => 데이터 읽어와서 화면 출력 
           => 데이터 읽어와서 처리 담당 
              ==================    _ok.jsp => 다른 화면으로 이동 
     */
     case 1:
    	 jsp="../board/list.jsp"; // list.jsp => main
    	 break;
     case 2:
    	 jsp="../board/insert.jsp";// insert_ok.jsp
    	 break;
     case 3:
    	 jsp="../board/detail.jsp";// download.jsp
    	 break;
     case 4:
    	 jsp="../board/find.jsp";
    	 break;
     case 5:
    	 jsp="../board/delete.jsp"; // delete_ok.jsp
    	 break;
     case 6:
    	 jsp="../board/update.jsp"; // update_ok.jsp
    	 break;
     case 7:
    	 jsp="../movie/home.jsp";
    	 break;
     case 8:
    	 jsp="../movie/detail.jsp";
    	 break;
     case 9:
    	 jsp="../freeboard/list.jsp";
    	 break;
     case 10:
    	 jsp="../freeboard/insert.jsp";
    	 break;
     case 11:
    	 jsp="../freeboard/detail.jsp";
    	 break;
     case 12:
    	 jsp="../freeboard/update.jsp";
    	 break;
     case 13:
    	 jsp="../freeboard/delete.jsp";
    	 break;
     }
          // 새로운 화면을 만들때 반드시 등록 => 링크가 걸리면 해당 화면을 보여 주는 역할 
          // 화면 변경 ==> Controller => java
          // include => 기존파일에 다른 파일의 내용을 붙여놓기 하는 것이다 
          // 덮어쓰기 
    /*
          session vs cookie 
          =================
          session : 서버측에 저장 (일부 정보를 저장) => 각 접속마다 session공간이 한개만 생성 
                     => 로그인 처리(서버에 ID,이름,어드민,주소)
                     => 임시 저장 (장바구니,예매정보)
                     => 장점
                        request : 각 JSP마다 다른 request가 있다 (화면 변경(JSP변경)=> request가 초기화)
                        session : 서버에 존재하는 모든 JSP에 사용이 가능 
                                  => 지우기전까지는 데이터가 존재
            1) 주요메소드 
               = 서버에 저장  => setAttribute("키",값)
                             setAttribute("id","hong") => Map방식
                             setAttribute("name","홍길동") => 게시판,댓글 
               = 서버에 저장 데이터를 가지고 오는 방법
                          => getAttribute("키") => Object => ArrayList , ~VO
                    ====== 키 => 중복할 수 없다
               = 삭제
                    = 일부 삭제 : removeAttribute("키")
                    = 전체 삭제 : 로그아웃 : invalidate
               = 저장기간 설정 
            	  setMaxInactiveInterval(초) => 1800초 : 30분 유지
            	  session은 내장 객체 
            	  ================ > session (request)
            	      ==> request.getSession()
          ============================================ cookie는 내장 객체 (new 생성한다)
          cookie : 클라이언트에 저장 (보안문제)
                     => 찜하기 , 최근 상세보기 
    */
    
    // 로그인 처리 
    String id=(String)session.getAttribute("id");
    // session에 저장이 되면 => 데이터값이 존재 , 저장이 없는 경우 => null
    // Object getAttribute("id") => 반드시 형변환
    String log_jsp="";
    if(id==null) // 로그인이 안된 상태
      log_jsp="../member/login.jsp";
    else // 로그인이 된 상태
      log_jsp="../member/logout.jsp";
    	
    
%>
<!DOCTYPE html>
<html>
<head>
  <title>Bootstrap Example</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body>
<jsp:include page="nav.jsp"></jsp:include>
<div class="container-fluid"><!-- full 화면 -->
  <div class="row">
    <div class="col-sm-3">
      <!-- 로그인 -->
      <jsp:include page="<%=log_jsp %>"></jsp:include>
    </div>
    <div class="col-sm-9">
      <!-- 레시피 : 메뉴를 클릭시마다 변경 : 변수를 잡아서 => jsp파일명을 변경 -->
      <jsp:include page="<%=jsp %>"></jsp:include>
    </div>
  </div>
</div>

</body>
</html>

 

============================================================================================

 

WebContent/board/list.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.*,com.sist.dao.*"%>
<%-- 목록 출력 : list.jsp : board폴더 --%>
<!-- 데이터를 읽어 온다 (1page)있는 게시물  -->
<%
     // DAO를 생성 => DAO를 통해서 데이터를 얻어온다 
     // static으로 메소드=> 이미 메모리에 저장 
     // 사용자로부터 페이지를 받아 본다 
     String strPage=request.getParameter("page");
     if(strPage==null) // 페이지를 보내지 않을 경우 (맨처음에는 페이지를 보낼 수 없다)
    	 strPage="1";// 시작페이지를 설정해 준다 
     int curpage=Integer.parseInt(strPage);
     // start:1 , end:10
     Map map=new HashMap();
     int rowSize=10;
     int start=(curpage*rowSize)-(rowSize-1);
     int end=curpage*rowSize;
     // map에 저장 => map 저장하는 공간 => 키,값을 설정 할 수 있다 
     map.put("start",start);
     map.put("end",end);
     List<DataBoardVO> list=DataBoardDAO.boardListData(map);// 1page 1~10
     // 총페이지읽기
     int totalpage=DataBoardDAO.boardTotalPage();
     // 화면에 출력 
     // 데이터 읽기 : 파일,XML,JSON,database(오라클),웹크롤링(날씨,인기검색어)
     // database(오라클):일반 JDBC,DBCP,***ORM(Mybatis:실무)
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
function send(){
	// 자바스크립트는 변수 종류가 없다 (var:자동 지정 변수)
	/*
		var a=10 ; var=int
		var b=10.0; var=double
		var c='a'; char
		var d="aaa"; String
		var e=[]; Array
		var k={}; Object
	*/
	var f= document.frm;
		// 반드시 입력을 할 수 있게 만든다
	if(f.ss.value==""){ //입력이 안되었으면 focus만 줌
		f.ss.focus();
		return;
	}
	f.submit(); // submit버튼과 동일한 역할 ==> Jquery => NodeJS => reactjs => vuejs => typescript
}
</script>
</head>
<body>
   <div class="row">
     <h1 class="text-center">자료실</h1>
     <table class="table">
       <tr>
         <td>
           <a href="main.jsp?mode=2" class="btn btn-sm btn-success">새글</a>
           <%-- 메뉴 , 로그인 , footer 고정 => main.jsp --%>
         </td>
       </tr>
     </table>
     <table class="table table-striped">
       <tr class="warning">
         <th class="text-center" width=10%>번호</th>
         <th class="text-center" width=45%>제목</th>
         <th class="text-center" width=15%>이름</th>
         <th class="text-center" width=20%>작성일</th>
         <th class="text-center" width=10%>조회수</th>
       </tr>
       <%
           /*
                           컬럼이 없는 값을 받는 경우 => VO에서 변수 설정 
               private String dbday; =>dbday값을 채운다 
               name,TO_CHAR(regdate,'YYYY-MM-DD') as dbday => mapper 
           */
           for(DataBoardVO vo:list)
           {
        	   /*
        	   		../main/main.jsp?mode=3&no=1
        	   						====== / === detail.jsp에서 사용
        	   		   화면변경시 사용 (main.jsp)
        	   		   include가 되면 => 모든 JSP에서 사용자가 보내준 데이터를 사용할 수 있다
        	   		   ============
        	   		   	request가 공유
        	   */
       %>
               <tr>
		         <td class="text-center" width=10%><%=vo.getNo() %></td>
		         <td width=45%>
		          <a href="../main/main.jsp?mode=3&no=<%=vo.getNo()%>"><%=vo.getSubject() %></a>
		          <%-- include된 모든 JSP는 main.jsp로 보낸 모든 데이터값을 사용할 수 있다
		          		main.jsp => mode=3 => 화면 변경
		          		detail.jsp => no=1 => 해당되는 데이터를 받아서 출력
		          --%>
		         </td>
		         <td class="text-center" width=15%><%=vo.getName() %></td>
		         <td class="text-center" width=20%><%=vo.getDbday() %></td>
		         <td class="text-center" width=10%><%=vo.getHit() %></td>
		       </tr>
       <%
           }
       %>
     </table>
     <table class="table">
       <tr>
         <td class="text-left">
         <!-- 
         	데이터 전송하는 방식
         		= GET => URL 뒤에 노출
         		데이터를 받을 파일명?변수명=값
         		변수명=값&변수명=값&변수명=값
         		구부문자는 &
         		= POST => 내부 네트워크를 이용한 전송 (보안, URL주소 길어지면 숨겨서 전송)
         				 변수명=값&변수명=값&변수명=값
          -->
          <form method="post" action="../main/main.jsp" name=frm>
          Search:
          <select name="fd" class="input-sm">
            <option value="name">이름</option>
            <option value="subject">제목</option>
            <option value="content">내용</option>
          </select>
          <%-- 검색어 입력 --%>
          <input type=text name=ss class="input-sm">
          <input type=hidden name=mode value=4>
          <%-- 검색버튼 --%>
          <input type=button value=검색 class="btn btn-sm btn-danger"
          	onclick="send()"
          >
          </form>
         </td>
         <td class="text-right">
          <a href="#" class="btn btn-sm btn-primary">이전</a>
           <%=curpage %> page / <%=totalpage %> pages
          <a href="#" class="btn btn-sm btn-primary">다음</a>
         </td>
       </tr>
     </table>
   </div>
</body>
</html>

insert.jsp

<%@ 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>
  <div class="row">
   <h1 class="text-center">글쓰기</h1>
   <%-- 파일 업로드 : 프로토콜 (post)
        enctype="multipart/form-data" => 업로드시만 사용 
               프로토콜
          http : 80
          ftp  : 21
          smtp : 25
          multipart/form-data : 파일을 업로드 
                  범용적으로 사용되는 약속 
    --%>
   <form method="post" action="../board/insert_ok.jsp" enctype="multipart/form-data">
   <table class="table table-hover">
     <tr>
       <th class="danger text-right" width=15%>이름</th>
       <td width=85%>
         <input type=text name=name size=15 class="input-sm">
       </td>
     </tr>
     <tr>
       <th class="danger text-right" width=15%>제목</th>
       <td width=85%>
         <input type=text name=subject size=45 class="input-sm">
       </td>
     </tr>
     <tr>
       <th class="danger text-right" width=15%>내용</th>
       <td width=85%>
         <textarea rows="10" cols="50" name=content></textarea>
       </td>
     </tr>
     <tr>
       <th class="danger text-right" width=15%>첨부파일</th>
       <td width=85%>
         <input type=file name=upload size=20 class="input-sm">
       </td>
     </tr>
     <tr>
       <th class="danger text-right" width=15%>비밀번호</th>
       <td width=85%>
         <input type=password name=pwd size=10 class="input-sm">
       </td>
     </tr>
     <tr>
       <td colspan="2" class="text-center">
         <input type=submit value=글쓰기 class="btn btn-sm btn-primary">
         <input type=button value=취소 class="btn btn-sm btn-primary"
           onclick="javascript:history.back()"
         >
       </td>
     </tr>
   </table>
   </form>
  </div>
</body>
</html>

 

insert_ok.jsp

<%@ page import="com.sist.dao.*, java.io.*" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="com.oreilly.servlet.*, com.oreilly.servlet.multipart.*"%>
<%--
   화면 출력은 하지 않는다 (html을 필요로 하지 않는다)
   사용자가 보내준 글쓰기 데이터를 받아서 오라클에 전송 
   마지막에 => list.jsp로 이동 종료 
  사용자 보내준 => 데이터 받아서 처리를 하고 다른 파일  == insert_ok.jsp : list.jsp
                                           update_ok.jsp : detail.jsp
                                           delete_ok.jsp : list.jsp
 --%>
 <%
 	request.setCharacterEncoding("UTF-8"); //한글 디코딩
 	String path="/Users/yongpro/download"; // 파일이 업로드가 되면 어디에 저장 폴더
 	String enctype="UTF-8"; // 한글파일명을 사용 여부
 	int size=1024*1024*100; // 파일의 최대크기 100mb까지
 	// 사용자가 보내준 데이터를 받는다 (request=>파일을 받을 수 없다, 일반 데이터만 받을 수 있음)
 	MultipartRequest mr = 									//같은 파일명일때 이름자동으로 바꿔서 업로드
 		new MultipartRequest(request,path,size,enctype,new DefaultFileRenamePolicy());
 	String name = mr.getParameter("name"); // 업로드시에만 사용
 	String subject=mr.getParameter("subject");
 	String content=mr.getParameter("content");
 	String pwd=mr.getParameter("pwd");
 	// 받은 데이터들을 DAO => DAO에서 오라클에 INSERT
 	DataBoardVO vo = new DataBoardVO();
 	vo.setName(name);
 	vo.setSubject(subject);
 	vo.setContent(content);
 	vo.setPwd(pwd);
 	
 	// filename, filesize => 없는 경우 (파일을 올리지 않을 경우, 파일 올릴 경우)
 	String filename = mr.getOriginalFileName("upload");
 	// 사용자가 보낸 파일명을 읽어 온다
 	// <input type=file name=upload size=20 class="input-sm">
 	if(filename==null){ // 파일을 올리지 않을 경우
 		vo.setFilename("");
 		vo.setFilesize(0);
 	}
 	else{ // 파일 올릴 경우
 		File file = new File("/Users/yongpro/download/"+filename);
 	// 업로드된 파일의 정보를 얻어온다(파일 크기를 확인) => 다운로드 (프로그램)
 		vo.setFilename(filename);
 		vo.setFilesize((int)file.length()); // length() => long
 	}
 	
 	// DAO를 호출한 다음에 insert요청 => 저장하는 SQL(databoard-mapper.xml)
	DataBoardDAO.boardInsert(vo); // 추가
	/*
	사용자 요청 ==> databoard-mapper.xml에 있는 SQL문장을 읽어 온다 (DAO => 읽어온 SQL문장을 실행 => JSP에 실행 결과)
	insert.jsp		SQL		DAO => 실행 boardInsert() 		insert_ok.jsp 호출 처리
	*/
 	response.sendRedirect("../main/main.jsp?mode=1"); // list.jsp로 이동을 한다
 	
%>

detail.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="com.sist.dao.*"%>
<%
    // 사용자 요청한 영화번호 받는다 
    String no=request.getParameter("no");
    // 영화번호(no)에 해당되는 영화정보 가지고 와서 출력
    // DAO를 이용해서 처리 
    MovieVO vo=MovieDAO.movieDetailData(Integer.parseInt(no));
    // response => HTML만 전송받는 역할 
    
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
  <div class="row">
    <h1 class="text-center">&lt;<%=vo.getTitle() %>&gt;상세보기</h1>
    <%-- 영화 상세보기 출력 --%>
    <table class="table">
      <tr>
        <td>
          <%-- <embed> <iframe> : youtube보안 --%>
          <iframe src="http://youtube.com/embed/<%=vo.getKey()%>" width=850 height=450></iframe>
        </td>
      </tr>
    </table>
    <table class="table">
      <tr>
        <td width=30% class="text-center" rowspan="7">
          <img src="<%=vo.getPoster() %>" width=100%>
        </td>
        <td colspan="2"><font color=orange><%=vo.getTitle() %></font></td>
      </tr>
      <tr>
        <td width=10%>감독</td>
        <td width=60%><%=vo.getDirector() %></td>
      </tr>
      <tr>
        <td width=10%>출연</td>
        <td width=60%><%=vo.getActor() %></td>
      </tr>
      <tr>
        <td width=10%>장르</td>
        <td width=60%><%=vo.getGenre() %></td>
      </tr>
      <tr>
        <td width=10%>등급</td>
        <td width=60%><%=vo.getGrade() %></td>
      </tr>
      <tr>
        <td width=10%>개봉일</td>
        <td width=60%><%=vo.getRegdate() %></td>
      </tr>
      <tr>
        <td width=10%>평점</td>
        <td width=60%><%=vo.getScore() %></td>
      </tr>
      <tr>
        <td colspan="3">
          <pre style="white-space: pre-wrap;background-color:white;border:none"><%=vo.getStory() %></pre>
        </td>
      </tr>
    </table>
  </div>
  <div class="row">
    <div class="text-right">
      <a href="#" class="btn btn-lg btn-primary">예매하기</a>
      <a href="#" class="btn btn-lg btn-danger">찜하기</a>
      <a href="../main/main.jsp" class="btn btn-lg btn-warning">목록</a>
    </div>
  </div>
</body>
</html>

 

download.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.io.*,java.net.*"%>
<%
    request.setCharacterEncoding("UTF-8");
    // 한글 파일 
    /*
       ../board/download.jsp?fn=a.jpg
    */
    String fn=request.getParameter("fn");
    
    // 다운로드 => 서버 (설정) : 1. 파일명 , 2. 파일크기  ==> 실제데이터 보내기전에 필요한 데이터 보내준다(header)
    try
    {
    	response.setHeader("Content-Disposition", "attachment;filename="
    			                        +URLEncoder.encode(fn,"UTF-8"));
    	File file=new File("/Users/yongpro/download/"+fn);
    	// 파일 크기
    	response.setContentLength((int)file.length());
    	
    	// 다운로드 창을 보내주는 방법
    	// 실제 데이터를 복사 
    	BufferedInputStream bis=new BufferedInputStream(new FileInputStream(file));
    	BufferedOutputStream bos=new BufferedOutputStream(response.getOutputStream());
    	// response.getOutputStream() : 다운로드를 하는 사람의 저장공간 
    	byte[] buffer=new byte[1024];
    	int i=0;// 몇바이트 읽었는지 확인 
    	while((i=bis.read(buffer, 0, 1024))!=-1)
    	{
    		// -1 EOF (End Of File)
    		bos.write(buffer, 0, i);//실제 사용자의 파일에 복사 
    	}
    	out.clear(); // out=>파일 쓰기 => 파일을 다 쓴 경우에 메모리를 지운다 
    	// out => 원래 기능 => html을 출력 (임시로 파일 출력)
    	out=pageContext.pushBody();// 원래 out의 기능으로 돌려주는 상태 
    	bis.close();// 서버의 파일 닫기
    	bos.close(); // 사용자의 파일 닫기
    }catch(Exception ex){}
    
%>

 

find.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="com.sist.dao.*,java.util.*"%>
<%
     request.setCharacterEncoding("UTF-8");//utf-8
     String fd=request.getParameter("fd");
     String ss=request.getParameter("ss");
     // DAO로 전송 결과값을 받아 온다  ==> 검색한 내용 가지고 오기 위해서 SQL => databoard-mapper.xml => DAO처리
     // DAO로부터 처리된 결과를 받아 온다 
	 Map map = new HashMap();
     map.put("fd",fd);
     map.put("ss",ss);
     
     int count=DataBoardDAO.boardFindCount(map);
     List<DataBoardVO> list = null;
     if(count>0){
    	 list=DataBoardDAO.boardFindData(map);
     }
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<div class="row">
	   <h1 class="text-center">검색결과</h1>
	   <%
	   	  if(count==0){ // 검색 결과가 없는 경우
	   %>
	   		<table class="table">
	   		 <tr>
	   		 	<td class="text-center">검색결과가 없습니다</td>
	   		 </tr>
	   		</table>
	   <%
	   	  }
	   	  else{ // 검색결과 존재
	   %>
	   		<table class="table table-striped">
	   			<tr class="warning">
	   				<th class="text-center" width=10%>번호</th>
	   				<th class="text-center" width=45%>제목</th>
	   				<th class="text-center" width=15%>이름</th>
	   				<th class="text-center" width=20%>작성일</th>
	   				<th class="text-center" width=10%>조회수</th>
	   			</tr>
	   			<%
	   				for(DataBoardVO vo:list){
	   			%>
	   			<tr>
	   				<td class="text-center" width=10%><%=vo.getNo() %></td>
	   				<td class="text-center" width=45%><%=vo.getSubject() %></td>
	   				<td class="text-center" width=15%><%=vo.getName() %></td>
	   				<td class="text-center" width=20%><%=vo.getDbday() %></td>
	   				<td class="text-center" width=10%><%=vo.getHit() %></td>
	   			</tr>
	   			<%
	   				}
	   			%>
	   		</table>
	   <%
	   	  }
	   %>
   	</div>
</body>
</html>

 

delete.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	// main.jsp => mode => 화면 변경
	// ?mode=1&no=10
	//		   ===== > 해당 jsp에서 받아서 처리한다
	
	String no=request.getParameter("no");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style type="text/css">
.row1 {
	margin: 0px auto;
	width: 300px;
}
</style>
</head>
<body>
	<div class="row row1">
		<h1 class="text-center">삭제하기</h1>
		<form method=post action="../board/delete_ok.jsp">
		<table class="table table-striped">
		<tr>
			<td>
		비밀번호:<input type=password name=pwd size=15 class="input-sm">
			<%-- 출력은 하지 않고 데이터만 전송 : type=hidden --%>
			<input type=hidden name=no value=<%=no %>>
			</td>
		</tr>
		<tr>
			<td class="text-center">
				<input type=submit value="삭제" class="btn btn-sm btn-danger">
				<input type=button value="취소" class="btn btn-sm btn-info"
					onclick="javascript:history.back()"
				>
			</td>
		</tr>
		</table>
		</form>
	</div>
</body>
</html>

 

delete_ok.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.io.*, com.sist.dao.*"%>
<%-- delete_ok.jsp : 데이터받아서 처리만 하고 다른 jsp로 이동 (HTML을 사용 할 필요가 없다) --%>
<%
	// detail.jsp에서 데이터를 두개 보냄 (게시물 번호, 비밀번호)
	// 한글이 없다 ==> request.setCharacterEncoding()
	
	String no=request.getParameter("no");
	String pwd=request.getParameter("pwd");
	
	// DAO 연결 => 비밀번호가 같으면 (삭제), 비밀번호가 틀리면 삭제하지 않는다
	// DAO를 연결 => SQL문장 (databoard-mapper.xml)
	// java.io ==> File클래스 => 업로드된 파일 삭제한다
	DataBoardVO vo=DataBoardDAO.boardGetInfoData(Integer.parseInt(no));
	// 비밀번호 확인 => 삭제
	boolean bCheck = DataBoardDAO.boardDelete(Integer.parseInt(no), pwd);
	if(bCheck==true){ // 비밀번호 같다 => 게시물을 삭제 => 이동 => list.jsp
		// 처리 => 업로드된 파일을 삭제
		if(vo.getFilesize()>0) { //filesize=0 (업로드가 없는 게시물)
								//filesize>0 (업로드된 파일)
			File dir=new File("/Users/yongpro/download");
			// File => 실제 file, 폴더 directory
			File[] files=dir.listFiles(); // download안에 있는 모든 파일정보 가지고 옴
			for(File f:files){
				if(f.getName().equals(vo.getFilename())){
					f.delete();
					break;
				}
			}
			
		}
		response.sendRedirect("../main/main.jsp?mode=1");
	}
	else{ // 비밀번호가 다르다(본인이 아니다) => 다시 삭제창으로 이동
%>
		<script>
		alert("비밀번호가 틀립니다.\n다시 입력하세요.");
		history.back();
		</script>
<%
	}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

</body>
</html>

 

update.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="com.sist.dao.*" %>
<%
	// detail.jsp ==> 번호(게시물)
	String no=request.getParameter("no");
	// 다른 jsp에서 => 데이터값을 보내면 ==> request를 통해서 값을 받아온다
	// 오라클에서 게시물 번호에 해당되는 데이터를 읽어 온다
	// 화면 출력
	DataBoardVO vo = DataBoardDAO.boardUpdateData(Integer.parseInt(no));
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
  <div class="row">
   <h1 class="text-center">수정하기</h1>
   <form method="post" action="../board/update_ok.jsp">
   <table class="table table-hover">
     <tr>
       <th class="danger text-right" width=15%>이름</th>
       <td width=85%>
         <input type=text name=name size=15 class="input-sm" value="<%=vo.getName() %>">
       <%-- 게시물 번호를 첨부해 보내준다 --%>
       <input type=hidden name=no value="<%=no%>">
       </td>
     </tr>
     <tr>
       <th class="danger text-right" width=15%>제목</th>
       <td width=85%>
         <input type=text name=subject size=45 class="input-sm" value="<%=vo.getSubject() %>">
       </td>
     </tr>
     <tr>
       <th class="danger text-right" width=15%>내용</th>
       <td width=85%>
         <textarea rows="10" cols="50" name=content><%=vo.getContent() %></textarea>
       </td>
     </tr>
    <!--  <tr>
       <th class="danger text-right" width=15%>첨부파일</th>
       <td width=85%>
         <input type=file name=upload size=20 class="input-sm">
       </td>
     </tr> -->
     <tr>
       <th class="danger text-right" width=15%>비밀번호</th>
       <td width=85%>
         <input type=password name=pwd size=10 class="input-sm">
       </td>
     </tr>
     <tr>
       <td colspan="2" class="text-center">
         <input type=submit value=수정 class="btn btn-sm btn-primary">
         <input type=button value=취소 class="btn btn-sm btn-primary"
           onclick="javascript:history.back()"
         >
       </td>
     </tr>
   </table>
   </form>
  </div>
</body>
</html>

 

update_ok.jsp

<%@page import="com.sist.dao.DataBoardDAO"%>
<%@page import="com.sist.dao.DataBoardVO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%-- 기능만 처리 (화면 출력은 아니다) => 이동 --%>
<%
     request.setCharacterEncoding("utf-8");//디코딩
     // 한글 변환 (전송:인코딩 => 수신:디코딩)
     String name=request.getParameter("name");
     String no=request.getParameter("no");
     String subject=request.getParameter("subject");
     String content=request.getParameter("content");
     String pwd=request.getParameter("pwd");
     
     // DAO => VO에 모아서 전송해 달라
     DataBoardVO vo=new DataBoardVO();
     vo.setName(name);
     vo.setNo(Integer.parseInt(no));
     vo.setSubject(subject);
     vo.setContent(content);
     vo.setPwd(pwd);
     
     // DAO로 전송해서 처리 : 비밀번호 처리 => 본인이면 => 실제 수정 
     boolean bCheck=DataBoardDAO.boardUpdate(vo);
     /*
          1 = list.jsp
          2 = insert.jsp
          3 = detail.jsp
          4 = find.jsp
          5 = delete.jsp
          6 = update.jsp
     */
     if(bCheck==true)
     {
    	 response.sendRedirect("../main/main.jsp?mode=3&no="+no);// detail로 이동 
     }
     else
     {
%>
         <script>
         alert("비밀번호가 틀립니다");
         history.back();
         </script>
<%
     }
%>

 

movie/home.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.*,com.sist.dao.*"%>
<%
    // 사용자의 요청 값을 받는다
    // String page(X) ==> page는 내장 객체 ==> (page=this)
    String strPage=request.getParameter("page");
    // Default Page => page값를 지정
    if(strPage==null) // page번호가 지정이 없는 경우 (맨처음 실행)
    {
    	strPage="1";
    }
    
    String mno=request.getParameter("mno");
    if(mno==null)
    	mno="0";
    int index=Integer.parseInt(mno);
    // 현재 페이지 지정 
    int curpage=Integer.parseInt(strPage);
    // 현재 페이지에 해당되는 데이터를 DAO요청 
    Map map=new HashMap(); //map => 저장 공간 => key,실제값
    int rowSize=12;
    int start=(rowSize*curpage)-(rowSize-1); // 12-11 ==> 1 (오라클 => rownum : 시작번호가 1)
    int end=rowSize*curpage; // curpage=1 => 1~12
    // WHERE num BETWEEN #{start} AND #{end}
    // map에 저장 
    map.put("start",start);
    map.put("end",end);
    List<MovieVO> list=new ArrayList<MovieVO>();
    if(index==0)
    {
    		list=MovieDAO.movieListData(map);// 전체 영화 => 페이지 
    }
    else
    {
    	    list=MovieDAO.movieCategoryData(index);// 전체 출력 
    }
    // 총페이지 읽기 
    int totalpage=MovieDAO.movieTotalPage();
    
    // Cookie 읽기
    List<String> cList=new ArrayList<String>();
    Cookie[] cookies=request.getCookies();
    /*
       new Cookie(키,값)
             m1 m2.....
             ==> 키를 읽어 올때 => cookie.getName()
             ==> 값을 읽어 올때 => cookie.getValue()
    */
    for(int i=0;i<cookies.length;i++)
    {
    	System.out.println(cookies[i].getName()+":"+cookies[i].getValue());
    	if(cookies[i].getName().startsWith("m"))
    	{
    		System.out.println(cookies[i].getValue());
    		cList.add(cookies[i].getValue());
    	}
    }
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
   <%--
         btn-sm  : 중간
         btn-lg  : 큰버튼
         btn-xs  : 작은 버튼
    --%>
   <div class="row">
     <a href="../main/main.jsp" class="btn btn-lg btn-active">전체 영화</a>
     <a href="../main/main.jsp?mno=1" class="btn btn-lg btn-primary">현재 상영 영화</a>
     <a href="../main/main.jsp?mno=2" class="btn btn-lg btn-success">개봉 예정 영화</a>
     <a href="../main/main.jsp?mno=3" class="btn btn-lg btn-info">박스오피스(주간)</a>
     <a href="../main/main.jsp?mno=4" class="btn btn-lg btn-danger">박스오피스(월간)</a>
     <a href="../main/main.jsp?mno=5" class="btn btn-lg btn-warning">박스오피스(연간)</a>
   </div>
   <div class="row">
     <%
        for(MovieVO vo:list)
        {
     %>
             <div class="col-md-4">
			    <div class="thumbnail">
			      <a href="../movie/cookie.jsp?no=<%=vo.getNo()%>">
			        <img src="<%=vo.getPoster() %>" alt="Lights" style="width:100%">
			        <div class="caption">
			          <p style="font-size:8pt"><%=vo.getTitle() %></p>
			        </div>
			      </a>
			    </div>
			  </div>
     <%
        }
     %>
   </div>
   <%
       // index ==> cateno (1,2,3,4,5) 0=전체 출력 
       if(index==0) // 영화 전체 페이지인 경우
       {
   %>
		   <div class="row">
		     <%-- 페이지 이동 --%>
		     <div class="text-center">
		       <a href="../main/main.jsp?mode=7&page=<%=curpage>1?curpage-1:curpage %>" class="btn btn-sm btn-success">이전</a>
		       <%= curpage %> page / <%=totalpage %> pages
		       <a href="../main/main.jsp?mode=7&page=<%=curpage<totalpage?curpage+1:curpage %>" class="btn btn-sm btn-info">다음</a>
		     </div>
		   </div>
   <%
       }
   %>
   <%-- 205~206page참조 --%>
   <div class="row">
    <h3>최근 방문한 영화 &nbsp;<a href="../movie/delete.jsp" class="btn btn-sm btn-primary">쿠키삭제</a></h3>
     <%
         if(cList==null || cList.size()<1)
         {
     %>
             <font color=red><h1 class="text-center">방문 기록이 없습니다</h1></font>
     <%
         }
         else
         {
	         for(String s:cList)
	         {
	 %>
	           <div class="col-md-2">
			    <div class="thumbnail">
			        <img src="<%=s %>" alt="Lights" style="width:100%">
			    </div>
			  </div>
	 <% 
	         }
         }
     %>
   </div>
</body>
</html>

 

movie/detail.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="com.sist.dao.*"%>
<%
    // 사용자 요청한 영화번호 받는다 
    String no=request.getParameter("no");
    // 영화번호(no)에 해당되는 영화정보 가지고 와서 출력
    // DAO를 이용해서 처리 
    MovieVO vo=MovieDAO.movieDetailData(Integer.parseInt(no));
    
    
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
  <div class="row">
    <h1 class="text-center">&lt;<%=vo.getTitle() %>&gt;상세보기</h1>
    <%-- 영화 상세보기 출력 --%>
    <table class="table">
      <tr>
        <td>
          <%-- <embed> <iframe> : youtube보안 --%>
          <iframe src="http://youtube.com/embed/<%=vo.getKey()%>" width=850 height=450></iframe>
        </td>
      </tr>
    </table>
    <table class="table">
      <tr>
        <td width=30% class="text-center" rowspan="7">
          <img src="<%=vo.getPoster() %>" width=100%>
        </td>
        <td colspan="2"><font color=orange><%=vo.getTitle() %></font></td>
      </tr>
      <tr>
        <td width=10%>감독</td>
        <td width=60%><%=vo.getDirector() %></td>
      </tr>
      <tr>
        <td width=10%>출연</td>
        <td width=60%><%=vo.getActor() %></td>
      </tr>
      <tr>
        <td width=10%>장르</td>
        <td width=60%><%=vo.getGenre() %></td>
      </tr>
      <tr>
        <td width=10%>등급</td>
        <td width=60%><%=vo.getGrade() %></td>
      </tr>
      <tr>
        <td width=10%>개봉일</td>
        <td width=60%><%=vo.getRegdate() %></td>
      </tr>
      <tr>
        <td width=10%>평점</td>
        <td width=60%><%=vo.getScore() %></td>
      </tr>
      <tr>
        <td colspan="3">
          <pre style="white-space: pre-wrap;background-color:white;border:none"><%=vo.getStory() %></pre>
        </td>
      </tr>
    </table>
  </div>
  <div class="row">
    <div class="text-right">
      <a href="#" class="btn btn-lg btn-primary">예매하기</a>
      <a href="#" class="btn btn-lg btn-danger">찜하기</a>
      <a href="../main/main.jsp" class="btn btn-lg btn-warning">목록</a>
    </div>
  </div>
</body>
</html>

 

cookie.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="com.sist.dao.*" %>
<%
	String no=request.getParameter("no");
	MovieVO vo=MovieDAO.movieDetailData(Integer.parseInt(no));
	Cookie cookie=new Cookie("m"+no,vo.getPoster());
	cookie.setPath("/");
	// cookie.setDomain("211.238.142.000");
	// 저장 
	// 기간 
	cookie.setMaxAge(60*60); // 하루 저장  (초단위)
	// 클라이언트 컴퓨터로 전송 
	// http://211.238.142.000
	response.addCookie(cookie);
	response.sendRedirect("../main/main.jsp?mode=8&no="+no);
	// 한 파일안에서 ==> 응답을 두번 받을 수 없다
	/*
		1. cookie.jsp => cookie를 받아서 저장
		2. 이동 => 상세보기 화면을 다시 받는다 detail.jsp
		=> 쿠키 단계
		    1) 생성단계
				Cookie cookie = new Cookie(키, 값);
			2) 저장단계
				cookie.setAge(60*60*24);
			3) 전송단계 ==> 클라이언트로 전송시에 response (클라이언트 요청 한번만 수행)
						  쿠키전송, HTML전송, 헤더전송
				response.addCookie(cookie); ==> 클라이언트에 전송
				
		=> 쿠키를 가지고 오는 방법
			=> 쿠키가 여러개 생성
			Cookie[] cookies = request.getCookies();
			// 본인 컴퓨터에서 저장된 Cookie를 가지고 온다
			for(Cookie c:cookies){
				=> c.getName(); => 키읽을 경우
				=> c.getValue(); => 키에 해당되는 값을 읽을 경우
				=> Cookie 삭제
					c.setAge(0);
					=> 삭제하고 클라이언트에 전송 => response.addCookie();
					확인 => getName()
				
			}
	*/
%>

 

delete.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	Cookie[] cookies=request.getCookies();
	for(Cookie c:cookies){
		if(c.getName().startsWith("m")){
			c.setPath("/");
			c.setMaxAge(0); // 삭제
			response.addCookie(c);
			}
	}
	response.sendRedirect("../main/main.jsp");
%>

 

SQL 게시판 테이블 제작

-- <jsp:~> 액션 , 자바빈 => 8장 (9장:cookie, 10장:session)
-- <jsp:include> <jsp:useBean> <jsp:setProperty>
CREATE TABLE movie_board7(
    no NUMBER,
    name VARCHAR2(34) CONSTRAINT mb7_name_nn NOT NULL,
    subject VARCHAR2(1000) CONSTRAINT mb7_subject_nn NOT NULL,
    content CLOB CONSTRAINT mb7_cont_nn NOT NULL,
    pwd VARCHAR2(10) CONSTRAINT mb7_pwd_nn NOT NULL,
    regdate DATE DEFAULT SYSDATE,
    hit NUMBER DEFAULT 0,
    CONSTRAINT mb7_no_pk PRIMARY KEY (no)
);
CREATE SEQUENCE mb7_no_seq 
        START WITH 1 
        INCREMENT BY 1 
        NOCYCLE
        NOCACHE;
INSERT INTO movie_board7 VALUES(
    mb7_no_seq.nextval, 
    '홍길동','JSP Action 태그 배우기(8장)','JSP Action 태그 배우기(8장)JSP Action 태그 배우기(8장)',
    '1234',SYSDATE,0
);
INSERT INTO movie_board7 VALUES(
    mb7_no_seq.nextval, 
    '홍길동','JSP Action 태그 배우기(8장)','JSP Action 태그 배우기(8장)JSP Action 태그 배우기(8장)',
    '1234',SYSDATE,0
);
INSERT INTO movie_board7 VALUES(
    mb7_no_seq.nextval, 
    '홍길동','JSP Action 태그 배우기(8장)','JSP Action 태그 배우기(8장)JSP Action 태그 배우기(8장)',
    '1234',SYSDATE,0
);
COMMIT;
DESC movie_board7;

 

temp/input.jsp

<%@ 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>
<%--
    http://localhost/OnLineStudy11/temp/output2.jsp?name=&sex=%EB%82%A8%EC%9E%90&age=&addr=&tel=
--%>
</head>
<body>
  <h1>회원정보</h1>
  <form method=get action="output2.jsp">
    이름:<input type=text name=name size=15><br>
    성별:<input type=radio name=sex value="남자" checked>남자
      <input type=radio name=sex value="여자">여자<br>
   나이:<input type=text name=age size=15><br>
   주소 :<input type=text name=addr size=30><br>
   전화 :<input type=text name=tel size=30><br>
   <input type=submit value=전송>
   </form>
</body>
</html>

 

output.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="com.sist.temp.*"%>
<%
	// 사용자 보내준 데이터 받기
	// 한글 => 변환
	request.setCharacterEncoding("UTF-8");
	String name=request.getParameter("name");
	String sex=request.getParameter("sex");
	String age=request.getParameter("age");
	String addr=request.getParameter("addr");
	String tel=request.getParameter("tel");
	
	// 한개의 클래스 묶어서 관리
	MemberBean bean=new MemberBean();
	bean.setName(name);
	bean.setSex(sex);
	bean.setAge(Integer.parseInt(age));
	bean.setAddr(addr);
	bean.setTel(tel);
	// DAO => 묶은 값을 전송
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- 묶여 있는 데이터 출력 -->
	이름:<%=bean.getName() %><br>
	성별:<%=bean.getSex() %><br>
	나이:<%=bean.getAge() %><br>
	주소:<%=bean.getAddr() %><br>
	전화:<%=bean.getTel() %>
</body>
</html>

 

output2.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="com.sist.temp.*"%>
<%
     // 한글 변환
     request.setCharacterEncoding("UTF-8");
%>
<%--
     // 사용자 보내준 데이터 받기
    // 한글 => 변환
    request.setCharacterEncoding("UTF-8");
    String name=request.getParameter("name");
    String sex=request.getParameter("sex");
    String age=request.getParameter("age");
    String addr=request.getParameter("addr");
    String tel=request.getParameter("tel");
    
    // 한개의 클래스 묶어서 관리 
    MemberBean bean=new MemberBean();
    bean.setName(name);
    bean.setSex(sex);
    bean.setAge(Integer.parseInt(age));
    bean.setAddr(addr);
    bean.setTel(tel);
    // DAO => 묶은 값을 전송 
 --%>
<jsp:useBean id="bean" class="com.sist.temp.MemberBean">
  <%-- MemberBean bean=new MemberBean() 
       <jsp:useBean> => 메모리 할당 (new)
       
       setProperty ==> setter => 값을 채워주는 태그 (JSP)
             자동으로 setter => 태그(라이브러리)
  --%>
  <jsp:setProperty name="bean" property="*"/>
  <%--
       <jsp:setProperty name="bean">
       bean.setName(request.getParameter("name"));
       bean.setSex(request.getParameter("sex"));
       bean.setAge(Integer.parseInt(request.getParameter("age")));
       bean.setAddr(request.getParameter("addr"));
       bean.setTel(request.getParameter("tel"));
          정수가 있는 경우 자동으로 Integer.parseInt(age)
          
          ==> 한개값을 받는 경우 
              ============= page,no => request를 이용해서 받는 것이 좋다
                           사용자가 보내주는 데이터가 많은 경우에 사용 
                            글쓰기 , 회원가입 , 공지사항 
   --%>
</jsp:useBean>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- 묶여 있는 데이터 출력  -->
<h1>jsp action태그로 받기</h1>
   이름:<%= bean.getName() %><br>
  성별:<%=bean.getSex() %><br>
  나이:<%=bean.getAge() %><br>
  주소:<%=bean.getAddr() %><br>
  전화:<%=bean.getTel() %>
</body>
</html>

 

freeboard/list.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.*,com.sist.dao.*"%>
<%--
      자바 : 데이터를 가지고 온다 
      데이터 => 출력 (JSP)
 --%>
<%--
     게시판 목록 출력 
     영화 (home.jsp) : cookie
     로그인 (login.jsp) : session
     freeboard : <jsp:~>
     databoard : 다운로드 , 업로드
     예매 : javascript => Ajax
 --%>
<%
     String strPage=request.getParameter("page");
     // 사용자가 전송(요청) => 요청한 데이터를 톰캣이 모든 데이터를 묶어서 request에 첨부)
     // 모든 데이터는 request를 통해서 들어온다 
     /*
           list.jsp?page=1  =>  request.getParameter("page");  => 1
           list.jsp         =>  request.getParameter("page");  => null
                            if(strPage==null)
           list.jsp?page=   =>  request.getParameter("page");  => ""
                            if(strPage.equals(""))
          ===========================================================
            <input type=text name=name> : 입력값이 없는 경우 (null이 아니고 "")
     */
     if(strPage==null) // 처음에 한번은 사용자가 페이지번호를 보낼 수 없다 (list.jsp)
     {
    	 strPage="1"; // default => 반드시 첨부한다
    			 // 페이지나누기 => 모든 JSP에 적용
    			 // 게시물  ==> 15개 ~ 20개
    			 // 그림출력 ==> 12개~15개 
     }
           
     int curpage=Integer.parseInt(strPage);// 현재 보고 있는 페이지
     // 현재 출력할 내용 가지고 오기 ==> 마이바이티에서 start , end 요청 
     // 데이터를 보내줄 때 여러개를 설정 (여러개의 값이 있는 경우 : Map,~VO) => 값을 모아서 마이바티스로 전송 
     /*
         ~VO => VO에 존재하는 변수가 있는 경우 
         start,end => name,subject
         Map => VO에 없는 변수가 있는 경우
     */
     Map map=new HashMap(); // 키,값을 동시에 저장하는 공간 
     // HashMap map=new HashMap();
     // Map map=new HashMap();
     // Map ==> interface => Map 인터페이스를 구현한 클래스 => HashMap()
     // Map ==> HashMap() , Hashtable()
     // List => ArrayList,Vector,LinkedList
     /*
         List => 인터페이스 
         List list=new ArrayList() => 비동기화 (이미 저장되어 있는 데이터:오라클)
         List list=new Vector() => 동기화 (내트워크)
         List list=new LinkedList() => C언어 호환 
     */
     int rowSize=10;
     int start=(rowSize*curpage)-(rowSize-1);// rownum (오라클에서 지원하는 데이터컬럼 => 1)
     int end=rowSize*curpage;
     
     map.put("start",start);
     map.put("end",end);
     List<BoardVO> list=BoardDAO.freeBoardListData(map);
     // 저장되어 있는 list의 값을 출력 => JSP가 하는 역할 (JSP:View) => 실무는 90%=> MVC(Spring:MVC외에는 없다)
    		 
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
   <div class="row">
     <h1 class="text-center">자유게시판</h1>
     <table class="table">
       <tr>
         <td>
           <a href="../main/main.jsp?mode=10" class="btn btn-sm btn-primary">새글</a>
           <%-- mode=10 이면 어떤 화면을 출력 할지 결정 : main.jsp --%>
         </td>
       </tr>
     </table>
     <table class="table table-striped">
       <%--
              danger : 빨간색
              success :  녹색
              info : 하늘색
              warning :주황색
              active : 회색
       --%>
       <tr class="danger">
         <%--
                     정렬 : text-left(default)
                 text-center,text-right
          --%>
         <th class="text-center" width=10%>번호</th>
         <th class="text-center" width=45%>제목</th>
         <th class="text-center" width=15%>이름</th>
         <th class="text-center" width=20%>작성일</th>
         <th class="text-center" width=10%>조회수</th>
       </tr>
       <%-- 데이터 출력 --%>
       <%
           for(BoardVO vo:list)
           {
       %>
               <tr>
                 <th class="text-center" width=10%><%=vo.getNo() %></th>
		         <th class="text-left" width=45%>
		          <a href="../main/main.jsp?mode=11&no=<%=vo.getNo()%>"><%=vo.getSubject() %></a>
		          <%-- ? 앞에 있는 파일 처리  --%>
		         </th>
		         <th class="text-center" width=15%><%=vo.getName() %></th>
		         <th class="text-center" width=20%><%=vo.getDbday() %></th>
		         <th class="text-center" width=10%><%=vo.getHit() %></th>
               </tr>
       <%
           }
       %>
     </table>
   </div>
</body>
</html>

 

insert.jsp

<%@ 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>
  <div class="row">
   <h1 class="text-center">글쓰기</h1>
   <%-- 파일 업로드 : 프로토콜 (post)
        enctype="multipart/form-data" => 업로드시만 사용 
               프로토콜
          http : 80
          ftp  : 21
          smtp : 25
          multipart/form-data : 파일을 업로드 
                  범용적으로 사용되는 약속 
    --%>
   <form method="post" action="../freeboard/insert_ok.jsp">
   <table class="table table-hover">
     <tr>
       <th class="danger text-right" width=15%>이름</th>
       <td width=85%>
         <input type=text name=name size=15 class="input-sm">
       </td>
     </tr>
     <tr>
       <th class="danger text-right" width=15%>제목</th>
       <td width=85%>
         <input type=text name=subject size=45 class="input-sm">
       </td>
     </tr>
     <tr>
       <th class="danger text-right" width=15%>내용</th>
       <td width=85%>
         <textarea rows="10" cols="50" name=content></textarea>
       </td>
     </tr>
     <tr>
       <th class="danger text-right" width=15%>비밀번호</th>
       <td width=85%>
         <input type=password name=pwd size=10 class="input-sm">
       </td>
     </tr>
     <tr>
       <td colspan="2" class="text-center">
         <input type=submit value=글쓰기 class="btn btn-sm btn-primary">
         <input type=button value=취소 class="btn btn-sm btn-primary"
           onclick="javascript:history.back()"
         >
       </td>
     </tr>
   </table>
   </form>
  </div>
</body>
</html>

 

insert_ok.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="com.sist.dao.*"%>
<%-- 사용자가 보네준 데이터(게시물)를 받아서 DAO와 연결 => list.jsp로 이동  --%>
<%
    // 한글 => 한글 변환 코드 
    request.setCharacterEncoding("UTF-8");
%>
<jsp:useBean id="vo" class="com.sist.dao.BoardVO">
  <%-- BoardVO vo=new BoardVO() : 메모리 할당 --%>
  <%-- vo에 사용자가 보내준 값을 채운다--%>
  <jsp:setProperty name="vo" property="*"/>
  <%--
      vo.setName(request.getParameter("name"))
      vo.setSubject(request.getParameter("subject"))
      vo.setContent(request.getParameter("content"))
      vo.setPwd(request.getParameter("pwd"))
   --%>
</jsp:useBean>
<%
     //BoardDAO.freeboardInsert(vo); mapper.xml(SQL) => DAO(처리)
     BoardDAO.freeBoardInsert(vo);
     // 화면 이동 
     response.sendRedirect("../main/main.jsp?mode=9");// freeboard/list.jsp
%>

 

detail.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="com.sist.dao.*"%>
<%
    String no=request.getParameter("no");
    BoardVO vo=BoardDAO.freeBoardDetailData(Integer.parseInt(no));
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<!-- JQUERY : 라이브러리  (라이브러리 로드 :import)-->
<script type="text/javascript" src="http://code.jquery.com/jquery.js"></script>
<script type="text/javascript">
var i=0;
$(function(){ // main
	$('#delBtn').click(function(){
		if(i==0)
		{
			$('#del').show();
			$('#delBtn').val("취소");
			i=1;
		}
		else
		{
			$('#del').hide();
			$('#delBtn').val("삭제");
			i=0;
		}
	});
});
</script>
</head>
<body>
   <%-- DAO에서 값을 가지고 온다 : board-mapper.xml에서 SQL문장을 작성  --%>
   <div class="row">
     <h1 class="text-center">내용보기</h1>
     <table class="table table-striped">
       <tr>
         <th class="text-center danger" width=20%>번호</th>
         <td class="text-center" width=30%><%=vo.getNo() %></td>
         <th class="text-center danger" width=20%>작성일</th>
         <td class="text-center" width=30%><%=vo.getDbday() %></td>
       </tr>
       <tr>
         <th class="text-center danger" width=20%>이름</th>
         <td class="text-center" width=30%><%=vo.getName() %></td>
         <th class="text-center danger" width=20%>조회수</th>
         <td class="text-center" width=30%><%=vo.getHit() %></td>
       </tr>
       <tr>
         <th class="text-center danger" width=20%>제목</th>
         <td colspan="3"><%=vo.getSubject() %></td>
       </tr>
       <tr>
         <td colspan="4" class="text-left" valign="top" height=200>
          <%-- 한줄 문자열 --%>
          <pre style="white-space: pre-wrap;background-color:white;border:none"><%=vo.getContent() %></pre>
         </td>
       </tr>
       <tr>
         <td colspan="4" class="text-right">
           <%-- ../main/main.jsp?mode=6 --%>
           <%-- ../board/update.jsp --%>
           <a href="../main/main.jsp?mode=12&no=<%=vo.getNo() %>" class="btn btn-xs btn-primary">수정</a>
           <%-- ../board/delete.jsp --%>
           <input type="button" class="btn btn-xs btn-success" id="delBtn" value="삭제">
           <%-- ../board/list.jsp --%>
           <a href="../main/main.jsp?mode=9" class="btn btn-xs btn-danger">목록</a>
         </td>
       </tr>
       <tr id="del" style="display:none">
          <td colspan="4" class="text-right">
                    비밀번호:<input type=password class="input-sm" size=10 id="pwd">
                  <input type=submit value="삭제하기" class="btn btn-sm btn-danger">
          </td>
       </tr>
     </table>
   </div>
</body>
</html>

 

update.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="com.sist.dao.*"%>
<%
     String no=request.getParameter("no");// submit버튼 클릭시에 전송되지 않는다 
     /*
         ../main/main.jsp?mode=12&no=3
                         ======== ====
                         mode => main.jsp => 화면 변경 요청 
                         no => 수정할 데이터의 게시물 번호 
     */
     BoardVO vo=BoardDAO.freeBoardUpdateData(Integer.parseInt(no));
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
  <div class="row">
   <h1 class="text-center">수정하기</h1>
   <%-- 파일 업로드 : 프로토콜 (post)
        enctype="multipart/form-data" => 업로드시만 사용 
               프로토콜
          http : 80
          ftp  : 21
          smtp : 25
          multipart/form-data : 파일을 업로드 
                  범용적으로 사용되는 약속 
    --%>
   <form method="post" action="../freeboard/update_ok.jsp">
   <table class="table table-hover">
     <tr>
       <th class="danger text-right" width=15%>이름</th>
       <td width=85%>
         <input type=text name=name size=15 class="input-sm" value="<%=vo.getName()%>">
         <%--게시물 번호를 첨부해 보내준다 --%>
         <input type=hidden name=no value="<%=no%>">
         <%-- 사용자에게는 보여주지 않는다 , 데이터 전송에 포함해서 전송 가능 --%>
       </td>
     </tr>
     <tr>
       <th class="danger text-right" width=15%>제목</th>
       <td width=85%>
         <input type=text name=subject size=45 class="input-sm" value="<%=vo.getSubject()%>">
       </td>
     </tr>
     <tr>
       <th class="danger text-right" width=15%>내용</th>
       <td width=85%>
         <textarea rows="10" cols="50" name=content><%=vo.getContent() %></textarea>
       </td>
     </tr>
     <tr>
       <th class="danger text-right" width=15%>비밀번호</th>
       <td width=85%>
         <input type=password name=pwd size=10 class="input-sm">
       </td>
     </tr>
     <tr>
       <td colspan="2" class="text-center">
         <input type=submit value=수정 class="btn btn-sm btn-primary">
         <input type=button value=취소 class="btn btn-sm btn-primary"
           onclick="javascript:history.back()"
         >
       </td>
     </tr>
   </table>
   </form>
  </div>
</body>
</html>

 

update_ok.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="com.sist.dao.*"%>
<%
    // 한글 변환 
    request.setCharacterEncoding("UTF-8");
%>
<%-- 메모리 할당 (BoardVO) --%>
<%--
      BoardVO vo=new BoardVO();
 --%>
<!-- HTML 사용금지  -->
<jsp:useBean id="vo" class="com.sist.dao.BoardVO">
  <%-- vo가 가지고 있는 setXxx()에 모든 값을 채운다  --%>
  <jsp:setProperty name="vo" property="*"/>
  <%--
        vo.setName(request.getParameter("name"))
        vo.setSubject(request.getParameter("subject"))
        vo.setContent(request.getParameter("content"))
        vo.setPwd(request.getParameter("pwd"))
        vo.setNo(Integer.parseInt(request.getParameter("no")))
   --%>
</jsp:useBean>
<%
     // BoardDAO ==> vo를 전송하면 ==> 수정  ==> 수정 (SQL:board-mapper.xml)
     boolean bCheck=BoardDAO.freeBoardUpdate(vo);
     // 이동 ==> detail.jsp  ===> 이동 : response.sendRedirect()
     if(bCheck==true)
     {
    	 response.sendRedirect("../main/main.jsp?mode=11&no="+vo.getNo());
     }
     else
     {
%>
         <script>
          alert("비밀번호가 틀립니다!!");
          history.back(); // 원래 상태로 복귀 (update.jsp로 다시 이동)
          // Ajax를 이용해서 처리 
         </script>
<%
     }
%>

 

com.sist.temp/MemberBean.java

package com.sist.temp;
// 읽기/쓰기 => 변수는 은닉화(private)
/*
 *   irum=홍길동&sex=남자&
 */
public class MemberBean {
    private String name;
    private String sex;
    private int age;
    private String addr;
    private String tel;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getAddr() {
		return addr;
	}
	public void setAddr(String addr) {
		this.addr = addr;
	}
	public String getTel() {
		return tel;
	}
	public void setTel(String tel) {
		this.tel = tel;
	}
	   
   
}

 

1. JSP

 구동 방식

 => JSP => 톰캣 => .java변환 => 컴파일(.class) => 한줄씩 읽어서 출력

                      한줄 번역 => 메모리 내용 (html) => 브라우저에서 읽어서 출력

2. JSP안에서 자바 출력 => HTML / JAVA 구분

   <% 일반 자바 %> <%= 출력 (변수, 데이터 출력)%> => $()

3. 기본객체 (내장객체) : request, response, session, application

4. jsp 액션태그 : <jsp:include>(Spring), <jsp:useBean> <jsp:setProperty>

5. page 지시자

 

 

=== SQL

CREATE TABLE member7(
    id VARCHAR2(20),
    pwd VARCHAR2(10) CONSTRAINT mem7_pwd_nn NOT NULL,
    name VARCHAR2(34) CONSTRAINT mem7_name_nn NOT NULL,
    email VARCHAR2(1000),
    birthday VARCHAR2(20) CONSTRAINT mem7_bd_nn NOT NULL,
    post VARCHAR2(10) CONSTRAINT mem7_post_nn NOT NULL,
    addr1 VARCHAR2(200) CONSTRAINT mem7_addr1_nn NOT NULL,
    addr2 VARCHAR2(100),
    tel VARCHAR2(20),
    content CLOB CONSTRAINT mem7_cont_nn NOT NULL,
    CONSTRAINT mem7_id_pk PRIMARY KEY(id),
    CONSTRAINT mem7_email_uk UNIQUE(email),
    CONSTRAINT mem7_tel_uk UNIQUE(tel)
);

-- y면 admin, n이면 일반유저

ALTER TABLE member7 ADD admin CHAR(1) CHECK(admin IN('y', 'n'));

INSERT INTO member7 VALUES('hong', '1234', '홍길동', 'hong@sist.co.kr',
'2000-01-01','000-000','서울시 강남구 역삼동', ' ', '000-000-0000',
'나는 admin입니다','y');
INSERT INTO member7 VALUES('shim', '1234', '심청이', 'shim@sist.co.kr',
'2010-01-01','000-000','서울시 강남구 역삼동', ' ', '000-111-1111',
'나는 일반유저 입니다','n');
COMMIT;

 

 

Webcontent/member/login.jsp

<%@ 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">
   <%--
       method => get/post
       action => 데이터를 받을 파일명
    --%>
   <table class="table">
     <tr>
       <td class="text-right">ID</td>
       <td>
         <input type=text class="input-sm" name=id>
       </td>
     </tr>
     <tr>
       <td class="text-right">PW</td>
       <td>
         <input type=password class="input-sm" name=pwd>
       </td>
     </tr>
     <tr>
       <td class="text-right" colspan="2">
         <input type=submit value="로그인" class="btn btn-sm btn-success">
       </td>
     </tr>
   </table>
   </form>
</body>
</html>

 

login_ok.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="com.sist.dao.*"%>
<%
    // 1. 사용자가 보낸 id,pwd
    String id=request.getParameter("id");
    //<input type=text class="input-sm" name=id> => hong
    //
    String pwd=request.getParameter("pwd");
    //<input type=password class="input-sm" name=pwd>
    // pwd=1234
    // login_ok.jsp?id=hong&pwd=1234
    // 2. DAO에서 => 로그인 
    // mapper.xml ==> SQL => DAO에 처리 
    MemberVO vo=MemberDAO.memberLogin(id, pwd);
    // 3. 로그인이 되면 => main.jsp
    		
    if(vo.getMsg().equals("NOID")) // id가 틀린경우 => 로그인 창으로 이동
    {
%>
        <!-- Ajax -->
        <script>
        alert("ID가 존재하지 않습니다!!");
        history.back();
        </script>
<%
    }
    else if(vo.getMsg().equals("NOPWD")) // id가 존재 => 비밀번호가 틀린 경우  => 로그인 창으로 이동
    {
%>
        <script>
        alert("비밀번호가 틀립니다!!");
        history.back();
        </script>
<%
    }
    else // OK ==> 로그인 ==> main.jsp
    {
    	// id,name,admin=> 서버에 저장을 하고 => main.jsp로 이동 (session)
        session.setAttribute("id", vo.getId());
    	session.setAttribute("name", vo.getName());
    	session.setAttribute("admin", vo.getAdmin());
    	// 사용하고 있는(프로젝트 안에 있는 모든 JSP에서 세션에 등록된 모든 데이터 사용이 가능)
    	response.sendRedirect("../main/main.jsp");
    }
%>

 

logout.jsp

<%@ 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>
   <table class="table">
     <tr>
       <td>
         <%= session.getAttribute("name") %>님 로그인 되었습니다!!
       </td>
     </tr>
     <tr>
       <td>
         <%
            String admin=(String)session.getAttribute("admin");
            if(admin.equals("y"))
            {
         %>
                 <b><font color=blue>관리자</font></b>
         <%
            }
            else
            {
         %>
                <b><font color=blue>일반유저</font></b>
         <%	
            }
         %>
       </td>
     </tr>
     <tr>
       <td class="text-right">
         <form method=post action="../member/logout_ok.jsp">
           <input type=submit value="로그아웃" class="btn btn-sm btn-success">
         </form>
       </td>
     </tr>
   </table>
</body>
</html>

 

logout_ok.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
    // session에 등록된 데이터 전체 삭제
    session.invalidate();
    // main.jsp로 이동 
    response.sendRedirect("../main/main.jsp"); // id=null (login.jsp)
%>

 

 

반응형
Comments