SKILL/JSP

jsp - 강사님노트

Jedy_Kim 2018. 1. 8. 18:10
728x90


 - JSP준비하기

  1. JDK설치

  

  2. 웹서버(WAS) 설치(tomcat.apache.org사이트에서 다운로드)

    => tomcat 8.0 다운로드


   *설정하기

  1. jdk path 잡기 => C:\Program Files\Java\jdk1.6.0_21\bin

  2. JAVA_HOME  => C:\Program Files\Java\jdk1.6.0_21

  3  CATALINA_HOME  => C:\tomcat


  

  3. 이클립스 설치

     =>다이나믹웹프로젝트 생성함.

       src/java파일만들기

       webContent/ jsp, script, html, css문서 만들기


  4. 이클립스에 서버등록하기(server.xml문서에 가상폴더 생김)



 -----------------------------------------------------------

  - Web Server - 정적인 페이지들을 표혀하기 위한 서버

   => Web Client(웹 브라우저)에게 제공하는 컨텐츠를 제공하는 서버.

   =>정적인 HTML 혹은 jpeg나 gif같은 이미지를 HTTP프로토콜을 통해 웹 브라우저로 제공.

    

    * 정적인 데이터(image, CSS, javascript- 파일 등의 리소스)는 구조적으로 앞에 존재하는 

      웹 서버에서 처리하고 WAS로 서비스 요청이 넘어가지 않게 한다.

      동적인 데이터는 WAS가 처리한다. WAS는 웹 어플리케이션의 수행에 집중할 수 있다.




  - WAS(Web Application Server) - 동적인 페이지들(jsp,php, asp)등을 표혀하기 위한 서버

   => Server단에서 어플리케이션을 동작할 수 있도록 지원.

   => 일반적으로 컨테이너라는 용어로 사용됨.

   => Servlet, JSP, ASP, PHP 등의 프로그램으로 사용됨. 

   => Servlet 페이지를 html 형태로 변환함.

      예를 들어 jsp의 경우 jsp를 WAS에서 java class파일로 컴파일 후 

       html형태의 페이지를 사용자에게 전달하게 됨.


  => BEA의 Web Logic /  IBM의 Web Sphere  / TMax의 Jeus(제우스)

     아파치 그룹으로 잘 알려진 Apache S/W Foundation의 자바카르타 프로젝트에서

     발표한 Tocat


--------------------------------------------------------------------------------------------------

  - JSP특징

  => 서버측에서 실행되어 결과값을 클라이언트 쪽으로 전송되므로

     소스가 공개되지 않음.

 => DB연결기능

 => Form으로 넘어오는 데이터를 받아 처리능력이 있음.

 => JAVA문법으로 100% 적용함.

 => jsp문서안에서 html, css, javascript 그대로 사용함.

 => jps문서안에서 <% ~~~ %>를 이용해 JSP문법 코딩.


 

 -JSP실행순서 및 방법

 => URL주소창에

    http://웹서버주소:port번호/프로젝트명/폴더명/파일이름  요청.

   단,요청전에 웹서버 톰켓이 시작되어 있어야 함.


 => 실행순서

  1. ~.jsp문서를 파싱한다.(문법적오류 체크)

  2. 오류가 없으면 ~.java문서 생성(servlet문서)

  3. ~.java문서를 컴파일하여 ~.class생성

  4. 최종 ~.class화일을 해석하여 클라이언트쪽으로 응답함.


  * servlet문서 생성되는곳.

   D:\jspWorkspace\.metadata\.plugins\org.eclipse.wst.server.core\

   tmp0\work\Catalina\localhost\JspExam\org\apache\

--------------------------------------------------------------

 - JSP태그


 1. <%  JSP문법  %> - (스크립트 릿)


 2. <%!  전역변수 선언 및 메소드선언    %>


 3. <%= 출력문 %>


 4. <%@ page  문서전체에대한 설정부분  %> => 문서의 첫줄에 기술.


 5. <%--  JSP영역 전체 주석처리    --%>


------------------------------------------------------------

 - include 지시자

   <%@ page include file=""   %>

    => 메인페이지에 다른 페이지를 포함시킴

    => 소스전체가 메인페이지에 포함됨(서블릿문서 한개생김)



 -액션태그

  1. <jsp:include page=""  />

     => 메인페이지에 다른 페이지를 포함시킴 

     => 실행결과가 메인페이지에 포함됨(서블릿문서 각각생김)


  2. <jsp:forward  page="" />

     => forward에서 지정한 페이지로 이동시킴

     => 현재페이지에 다른 문서를 열어줌.



   *액션태그에서 param 지정하기

    => include 나 forward는 param태그를 이용하여 값을 넘길수 있음.

    => ex)<param name="id" value ="jang"  />


    => <jsp:include page=""  >

         <param name="id" value ="jang"  />

      </jsp:include>



      <jsp:forward page=""  >

         <param name="id" value ="jang"  />

      </jsp:forward>




  3. <jsp:useBean id="" class="" scope="" />

     <jsp:setProperty name="" property="" />

     <jsp:getProperty name="" property="" /> 

    => Beans를 이용할때 사용함.

      (java문서를 만들어 jsp문서에 java에 있는 메소드나,전역변수

       에 접근하는 방법)


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



  -form get 방식으로 넘어오는 한글 처리 인코딩 설정하기

   => server영역의 server.xml문서 수정

   <Connector connectionTimeout="20000" port="8000" 

    protocol="HTTP/1.1" redirectPort="8443"

      URIEncoding="euc-kr"

    />

     * URIEncoding="euc-kr"  추가한다.


---------------------------------------------------------

 -JSP내장객체

 1. request  => HttpServlerRequest 

    => 클라이언트의 요청정보를 서버측에서 사용할때 

    * String value = request.getParameter(String name) ; 

        => request로 넘어오는 name에 해당하는 value 값 받기

  

    * request.setCharacterEncoding("euc-kr");

        => request로 넘어오는 한글인코딩 변환

    

    * String str [] = request.getParameterValues("hobby"); 

      => name에 해당하는 value 여러개 일때 사용함.


    *  Enumeration<String> e = request.getParameterNames();

        => request로 넘오는 name에 대한 정보 가져오기

      

    * String ip = request.getRemoteAddr() ; 

       => 접속한 클라이언트 ip 가져오기


    * Cookie co [] = request.getCookies();

       => 접속한 클라이언트에 저장된 쿠키정보(클라이언트정보) 가져오기



 2. response => HttpServletResponse

    => 서버가 클라이언트쪽으로 응답처리 할때 사용함.

    

    * response.sendRedirect(String url);

       => 클라이언트의 요청페이지를 URL로 이동시킴.


    * response.addCookie(Cookie co);

      => 클라이언트쪽에 클라이언트의 정보를 저장함.



 3. session => HttpSession

    => 클라이언트의 정보를 서버측에 저장할때 사용함.

    => 저장된 정보는 브라우져 창이 시작 해서 종료 할때까지

       저장정보가 유지됨.

       (일반적으로 로그인 ~ 로그아웃 )

    => 접속된 각각의 클라이언트마다 생성됨.

    => 기본 세션의 시간은 30분(1800초)


    * session.setAttribute(String name, Object value);

      => 세션의 정보를 저장.


    * Object value = session.getAttribute(String name);

      => 세션의정보가져오기


   * session.setMaxInactiveInterval(int interval);

      => 세션의 유지되는 시간설정(초단위)

  

   * int interval = session.getMaxInactiveInterval(); 

     => 설정된 세션의 시간 가져옴(초단위)


   * String id = session.getId();

     => 세션이 생성되면 자동으로 만들어지는 세션아이디

 

   * Enumeration e =session.getAttributeNames();

     => 세션에저장된 name 가져오기


   * boolean b = session.isNew();

      => 현재 브라우져창의 세션이 새로운것인지 판별

         (true면 새로운페이지, false 기존페이지)


   * session.invalidate();

      => 세션의 모든정보를 지운다.


   * session.removeAttribute(java.lang.String name);

     => 저장된 세션의 정보중 name에 해당하는 정보 삭제


   *  long time = session.getLastAccessedTime();

     => 마지막 접속시간


   * long time = session.getCreationTime();

     => 세션이 시작된 시간.


--------------------------------------------------------

 

 * session을 이용하여 로그아웃기능 만들었을때

  => 익스플로우의 도구->옵션에 설정된 정보가

     페이지열때마다 or 자동 으로 설정되었을때

     페이지의 리플래쉬 기능이 다르다.

 => 브라우져의 옵션에 상관없이 jsp페이지에서 

    페이지를 열때마다 리플래쉬 기능을 만들어 주는 방법

   

   response.setHeader("Cache-Control","no-cache");

response.setHeader("Cache-Control","no-store");//크롬

 

   response.setHeader("Pragma","no-cache"); 

   response.setDateHeader("Expires",0);

    * 페이지의 page지시어 다음에 설정한다.



 4. application => ServletContext

     => 특정 정보를 서버가 시작해서 종료될때까지 유지 되도록 함.

        서버에 대한 정보를 추출과 웹 어플리케이션단위로 상태정보저장

     

     * application.setAttribute(String name, Object value);

         => 정보를 저장하는 기능


    * Object value = application.getAttribute(String name);

        => name에 해당하는 정보를 가져오는 기능


    * application.removeAttribute(String name);

       =>  name에 해당하는 정보를 삭제하는 기능


    * application.getRealPath(java.lang.String path);

       => 실행되는 문서의 경로 가져오는 기능

   

    * Enumeration e = application.getAttributeNames();

      => 저장된 정보의 name 가져오는 기능

  ----------------------------------------------------------

  - Cookie => javax.servlet.http.Cookie  

  => 클라이언트의 정보를 클라이언트 PC에 저장함.

  => 사용자 측에 대한 정보를 보관해 두었다가 웹서버의 요청에 의해

     그 정보를 원하는 순간에 사용할 수 있다.

  => 한번에 4KB 로 용량이 제한되고 300개까지저장가능함.

     (최대용량 : 4KB * 300 = 1.2MB)

  =>  작은정보의 형태로 저장되고 오래되면 자동삭제됨. 


    * response.addCookie(Cookie co);

      => 클라이언트쪽에 클라이언트 의 정보를 저장함.


   * Cookie co [] = request.getCookies();

       => 접속한 클라이언트에 저장된 쿠키정보(클라이언트정보) 가져오기


   * Cookie 관련 메소드 정리

     int getMaxAge() => 쿠키의 사용할수 있는 기간에 대한 정보

     setMaxAge(int max) => 쿠키가 저장되는 기간 설정

      ex) setMaxAge(0) ; => 쿠키삭제

          setMaxAge(-1) ; => 

          쿠키폴더에 파일이 만들어지지 않지만 브라우져가 종료될까지

          쿠키의 정보는 저장된 상태이고 브라우져를 닫으면 쿠키정보 사라짐.

          (setMaxAge를 생략하면 -1을 기본)

          setMaxAge(60*60*24*365)=> 1년


         setValue(Cookie c) => 쿠키정보 수정하기

          =>쿠키의 정보가 수정되면 setMaxAge도 수정해야만

            정보의 유효기간이 설정됨.

      

     String getName(); => 쿠키설정된 이름 가져오기

     String getValue();=> 쿠키에 설정된 값 가져오기 

     

     setPath(String path) => 쿠키의 유효한 디렉토리 설정

      ex)setPath("/") => 모든 문서(디렉토리)에서 쿠키사용가능함.


  * Cookie 생성자

   Cookie(String name, String value);

   ex)Cookie  cookie = new Cookie("id","8253jang");


 * win7의 쿠키 폴더 => C:\Users\"UserName"\AppData\Roaming\Microsoft\Windows\Cookies 

  

  --------------------------------------------------------------------------------------


   - IO를 이용한 counter만들기

    * 파일을 읽고/ 쓰기 기능 

      => 파일의경로를 상대경로 지정함.

         application.getRealPath("/")를 이용하여 실제 문서의

         경로를 기준으로 파일을 읽거나 쓴다.

  

      ex) 

       String path= application.getRealPath("/0415/IOCounter/counter.txt");

         => 프로젝트 Root를 기준으로 0415폴더 아래있는 파일 가져오기


      => 파일을 읽기

         InputStream 또는 Reader를 선택함.

 

      => 파일 쓰기

          OutputStream 또는 Writer를 선택함.


     => 문자를 숫자로 변환  - int i = Integer.parseInt(String s);

     => 숫자를 문자로 변환  - String s =Integer.toString(int i); 


  


--------------------------------------------------------------------

  -Servlet문서 작성하기

  => 반드시 javax.servlet.http.HttpServlet를 상속받는다.(public class)

    ex) public class A extends HttpServlet{


           //필요한 메소드 재정의해서 기능 부여

        }


  => HttpServlet 에 있는 관련 메소드

    init() => 서블릿문서가 초기화 될때(최초에 처음 실행될때 호출됨)


    service(ServletRequest request, ServletResponse response) 

          => init이 실행된후 호출됨(서블릿문서 새로고침하면 service실행됨)

             사용자 요청이 get/post인지를 구분하여 doGet or doPost호출함.


    doGet(HttpServletRequest request , HttpServletResponse response) 

           => 사용자 요청 get방식일경우 실행됨


    doPost(HttpServletRequest request , HttpServletResponse response) 

       => 사용자 요청이 post방식일때 실행됨.


    destory() => 서블릿문서가 종료될때호출됨.



  => 서블릿문서를 실행하기 위한 준비작업(tomcat 6.0이전에서만)

   1. Tomcat영역의 web.xml문서 수정하기

     invoker 키워드로 검색해서 서블릿 주석처리 부분 해제한다.

     (servlet문서요청을 처리할수 있도록 설정하는 부분)

      -------------------------------------------

     <servlet>

        <servlet-name>invoker</servlet-name>

        <servlet-class>

          org.apache.catalina.servlets.InvokerServlet

        </servlet-class>

        <init-param>

            <param-name>debug</param-name>

            <param-value>0</param-value>

        </init-param>

        <load-on-startup>2</load-on-startup>

    </servlet>

     --------------------------------------


    <servlet-mapping>

        <servlet-name>invoker</servlet-name>

        <url-pattern>/servlet/*</url-pattern>

    </servlet-mapping>

    ----------------------------------------



   2. Tomcat영역의 context.xml문서 수정하기

    <Context 태그에 속성 2개 넣는다.

   ex)

     <Context reloadable="true" privileged="true">

   

   ---------------------------------------------------------------  

  3. WEB-INF/web.xml문서 수정하기

    작성된 servlet문서에 대한 <servlet>태그와 <mapping>태그 추가함.

    단, 이클립스에서 서블릿문서를 만들면 자동으로 추가되어짐.     


 

  4. 톰켓설치된 폴더 lib에 있는 servlet-api.jar 라이브러를 자바 영역의 넣기

     *이유 : java 문서에서 servlet 객체 사용할수 있도록하기위함.


     - C:\Program Files\Java\jdk1.6.0_21\jre\lib\ext폴더에 저장

     - C:\Program Files\Java\jre6\lib\ext 폴더에 저장




 => 사용자 폼에서 submit했을때 servlet문서로 action 연결방법

    <form name="f" action="/프로젝트명/서블릿클래스이름" method="post">


    </form>

    

----------------------------------------------------------------------



 -Beans

  => java 클래스들을 모아놓은 package 

  => Model, View, Controller(MVC패턴 구현)

     Model - 저장소역할( setXxx(), getXxx() 구현) - java코딩

     View - GUI역할(클라이언트엑 보여줄 화면구성 구현 ) - jsp코딩

     Controller - DAO(데이터처리 담당 -DB연동)역할

                  내부적으로 보이지 않게 처리해야하는 기능 구현 -java코딩


 => Beans를 이용하여 MVC패턴으로 구현함으로써 재사용성과 유지보수 용이

 => 이러한 MVC패턴을 기반으로 나오는 다양한 프레임웍이 있음.



 -Beans만들기

  1. Model의 역할 저장소(java문서)

   package gaon.bean;

   public class LoginBean{

     private Strig id;

     private int pwd;

 

   //전역변수 id, pwd에대한 setXxx()메소드와 getXxx()메소드 작성

     public void setId(String id){

this.id = id;

   }

   public String getId(){

return id;

   }


   public void setPwd(int pwd){

this.pwd = pwd;

  }

   public int getPwd(){

return pwd;

   }


  }


 

  2. jsp영역에서 Beans사용법


    -beans 사용 선언

    <jsp:useBean id="별칭" class="사용할클래스이름" scope="beans의범위" />

        

      * id="bean" => bean이라는 이름으로 클래스에 있는 메소드 접근

      *class="gaon.bean.LoginBean"  => bean 이름으로 사용한 클래스선언


      *scope ="request | session | application | page"

             request => 사용자요청이 들어오는 순간에만 bean사용함.

             sssion => 클라이언트의 세션이 살았는동안 bean사용함.

             application => 서버시작 ~ 종료될때가지 bean사용함.

             page => 현재 페이지내에서만 사용함(기본값)



  -선언된 Bean에 저장하기

  <jsp:setProperty name="bean" property="id" /> 

     => bean 클래스에 있는 setId()호출됨

  <jsp:setProperty name="bean" property="*" /> 

     =>bean 클래스에있는  set으로 시작하는 모든메소드 호출됨



  -선언된 Bean의 데이터 가져오기

    <jsp:getProperty name="bean" property="id" /> 

      => bean클래스에 있는 getId()호출됨.

  

-----------------------------------------------------------------


 - JDBC 연동하기

    => java와 DB연동

    => oracle 설치 폴더에 있는 오라클 드라이버 라이브러 필요함. 

    (C:\oracle\jdbc\lib 폴더의 ojdbc14.jar 이클립스

     WEB-INF/lib에 넣는다.)


   => import java.sql.*; 


   => DB연동 순서

    1. 로드(사용할 DB종류를 로드함-선택)

       Class.forName("연결하려는드라이브명");


       *연결하려는 드라이브명

       Oracle :  oracle.jdbc.driver.OracleDriver

       Ms_Sql :  sun.jdbc.odbc.JdbcOdbcDriver

       My_Sql :  org.git.mm.mysql.Driver


       * 일반적으로 로드 부분은 생성자에서 구현함.

         (객체가 생성되는 시점에 한번만 로드 함)

 

    2. 연결(db에 접속하는 부분)

     Connection con =

        DrvierManager.getConnection(String URL , String id ,String pwd);

   

       *URL부분

        Oracle :   jdbc:oracle:thin:@localhost:1521:ORCL

        Ms_Sql :   jdbc:odbc:odbc설정을통해만든db원본명

        My_Sql :   jdbc:mysql://localhost:3306/db명



    3. 실행 

        Statement st = con.createStatement();

         

        *insert/update/ delete/ create인경우는

        int result = st.executeUpdate(String sql);

         => result의 값이  0이면 실패 , 1이상이면 성공.

       

        ex)  int result = st.executeUpdate("delete test where no=1"); 


       * select문장인 경우는

          ResultSet rs = st.executeQuery(String sql);

        

         ex)  Resultset rs = st.executeQuery("select * from test");


         -ResultSet 메소드

          boolean b =rs.next(); //커서를 앞으로 이동

          String s =rs.getString(int 컬럼index); //컬럼에해당하는 문자열얻기

          int i =rs.getInt(int 컬럼index); //컬럼에해당하는 숫자값 얻기

        

           while(rs.next()){

               String id = rs.getString(1);//첫번째컬럼

               int age =rs.getInt(2);//두번째컬럼


           }


 

    4. 닫기(사용한 객체 닫기)

       주체.close();


-------------------------------------------------------------------



 - DB연동 부분의 3번 실행 단계 PreparedStatement 이용하기

  

  1. 로드

  2. 연결

  3. 실행

     PreparedStatement ps = con.prepareStatement(String sql);

       * sql인수는 insert/update/delete/select/create문장 모든문장가능함.

       ex) insert into test values(?,?);

           select * from test where id=?;


      * sql문장에 ? 가 있는경우 ?의 순서대로 값 넣는다.

       ps.setType(int index, Type value);

       ex) ps.setString(1, "장희정");

           ps.setInt(2, 20);

           ....


      * ?에 해당하는 값을 다 넣은 후에 최종적으로 실행함.

        int i = ps.executeUpdate(); => insert,update, delete, create인경우

        ResultSet rs = ps.executeQuery();=> select인경우


---------------------------------------------------------------------------

 -DBCP기술을 이용한 DB연동

  => 연결객체를 일정만큼 확보해 두고 필요시마다 Client에게 연결해줌.

     미리 Connection을 연결해 두어 바로바로 연결해줌으로써 속도를

     향상시킴.


  => 준비작업

     1. tomcat.apache.org 사이트에 접속하여 <Resource태그 복사한다.

      <Resource name="jdbc/myoracle" 

                auth="Container"

                type="javax.sql.DataSource" 

                driverClassName="oracle.jdbc.OracleDriver"

                url="jdbc:oracle:thin:@127.0.0.1:1521:ORCL"

                username="jang" 

                password="jang" 

                maxActive="20" 

                maxIdle="10"

               maxWait="-1"/>




     2. 복사한 태그를 서버부분의 server.xml문서의 <Context태그 사이에

        추가한다.

       <Context docBase="JspExam" path="/JspExam" 

      reloadable="true" source="org.eclipse.jst.jee.server:JspExam">

      

        <Resource name="jdbc/myoracle" 

                auth="Container"

                type="javax.sql.DataSource" 

                driverClassName="oracle.jdbc.OracleDriver"

                url="jdbc:oracle:thin:@127.0.0.1:1521:ORCL"

                username="jang" 

                password="jang" 

                maxActive="20" 

                maxIdle="10"

               maxWait="-1"/>

      

      </Context>



   tip : server.xml문서에 <Resource 태그를 추가하는 경우 만약, 서버에서 프로젝트를 제거한후 

         다시 추가하여 실행하려면 <Resource 태그를 또 입력해줘야 한다.

         이러한 번거로움을 피하기 위해서는

         server영역에 있는 context.xml문서를 복사하여 META-INF 폴더에 context.xml를 넣고

         context.xml문서안에 <Resource 태그를 추가한다.




    

    3. Java문서에서 DBCP연결하기

      => 로드와 연결부분이 DBCP로 변경됨

   


      *tomcat.apache.org 사이트에 접속 하여 복사함.

      Context initContext = new InitialContext();

      Context envContext  = (Context)initContext.lookup("java:/comp/env");

      DataSource ds = (DataSource)envContext.lookup("jdbc/myoracle");

      Connection conn = ds.getConnection();



     => 위 문장 변경소스

      Context ct= new InitialContext();

      DataSource ds = (DataSource)ct.lookup("java:/comp/env/Resource태그name");

      Connection conn = ds.getConnection();


-----------------------------------------------------------

 - 회원관리를 위한 준비사항

  1. 회원가입

     - ID중복체크기능

     - 우편번호검색기능

     - 가입


  2. 로그인

     -세션의 정보를 이용하여 로그인여부 판별


  3. 로그아웃

     - 세션의 정보 모두 삭제


  4. 회원정보수정

      -로그인 된 상태에서 로그인된 사용자의 정보를 수정.


  5. 회원탈퇴

     - 로그인된 상태에서 회원탈퇴가능.


----------------------------------------------------------------

  *DB설계

  -회원테이블생성

    create table userlist(

userid varchar2(20)  not null constraint pk_id primary key, --사용자아이디

userpass varchar2(20) not null,  --비밀번호

username varchar2(20) not null, --이름

socialid1 varchar2(6)  not null, --주민등록번호앞자리

socialid2 varchar2(7)  not null, --주민등록번호뒷자리

birth date  not null, --생년월일

address varchar2(50) not null, --주소

zip varchar2(7)  not null, --우편번호

email varchar2(50), --전자메일주소

job varchar2(50) --직업

   )


  -우편번호테이블생성

  create table zip_table(

     zipcode varchar2(50),

     sido varchar2(50),

     gu varchar2(50),

     dong varchar2(100),

    bunji varchar2(50)

)


  * 추가적으로 우편번호자료 엑설문서를 import하여 zip_table에 레코드추가한다.


---------------------------------------------------------------------------

  * Java문서 작성(MVC패턴구조)

    - gaon.user.UserList.java

        => form에 해당하는 setXxx(), getXxx()작성 


   - gaon.user.ZipCode.java

       => zip_table에 있는 컬럼에 해당하는 setXxx(), getXxx() 작성


   - gaon.user.UserListDAO.java

      1. 생성자작성 - DBCP로드하기


      2. DB 닫기기능 메소드

        public void dbClose(){   }


      3. ID중복체크기능 메소드

        public boolean userIdCheck(String userid ){

          Stirng sql="SELECT * FROM userlist WHERE userid=?";

            => ResultSet의 결과 레코드가 있다면 true,

               없다면 false 리턴함.

               (true는 사용안됨-중복/ false 사용가능함)


        }

         

     

      4. 우편번호검색기능메소드(동을 입력받아 동에 해당하는 레코드 리턴)

       public ArrayList<ZipCode> zipCheck(String dong){

String sql="SELECT * FROM zip_table WHERE dong LIKE '%화양동%'";

        *주의 : like 연산자를 이용할때 PreparedStatement사용안됨

                Statement를 이용함. 


      }


     5. 회원가입기능 메소드(userlist테이블에 insert기능)

     public int userInsert(UserList user){

       String sql="insert into userlist values(?,?,?,?,?,?,?,?,?,?)";

       *주의 : birth 컬럼 =>  year-month-day 로 만들어 저장하기

               zip 컬럼 =>  zip1-zip2 로 만들어 저장하기

               address컬럼 => address1 , address2 만들어 저장하기 

               email 컬럼  => 

                   email2의 값이 dir 이면  email1@email3 연결

                   아니면   email1@email2 연결


     }


    6. 로그인 기능 메소드

     public String userLoginCheck(String userid, String userpass){

      String sql="select * from userlist WHERE userid=?";

       만약, 위 실행문장의 결과의 레코드가 존재하지 않는다면 "0" 리턴

            존재한다면 인수로 받은 userpass와 DB에 있는 userpass를

            비교하여 같으면 username을 리턴, 다르면 "1" 리턴한다.

           

            "0" => ID존재안함.   "1" => 아이디 있으나 비번오류

            username => 로그인성공     

    }


    7. 특정 ID에 해당하는 회원정보 가져오기 기능 메소드

      public UserList getUserList(String userid){

       String sql="select * from userlist WHERE userid=?";


     }


   8. 특정 ID에 해당하는 회원정보 수정 기능 메소드

     public int userUpdate(UserList user){

       String sql="UPDATE USERlist 

                SET userpass=? , address=? , zip=?,email=?, job=?

                WHERE userid = ?"


        *주의 : zip 컬럼 =>  zip1-zip2 로 만들어 저장하기

                address컬럼 => address1 , address2 만들어 저장하기 

                email 컬럼  => 

                   email2의 값이 dir 이면  email1@email3 연결

                   아니면   email1@email2 연결


     }


  9. 회원탈퇴기능 메소드 

   public int userDelete(String userid, String userpass){

    String sql="DELETE userlist WHERE userid=? AND userpass=?";

  }



  10. 관리자모드로 접속했을때 관리자모드 메뉴를 클릭하면

      가입된 모든 회원정보 가져오기기능 메소드 작성

    public ArrayList<UserList> getAllUserList(){

      String sql="select * from userlist  order by userid";

    }    


 



-------------------------------------------------------------

  -JSP문서 준비

      index.jsp(메인화면)


      left.jsp(메인화면 왼쪽부분)

       => 세션의 정보가 있는 경우(로그인 된 경우)는 로그아웃/정보수정/ 회원탈퇴 버튼

          세션의 정보가 없는 경우(로그인 안된 경우)는 로그인/ 회원가입 버튼


      right.jsp (메인화면의 오른쪽 부분)

       => 세션의 정보가 있는 로그인된 상태의화면과

          세션의 정보가 없는 로그인되지 않은 상태의 화면을 구분한다.


      userinput.jsp(회원가입폼)

      confirmId.jsp (ID 중복체크 폼)

      zipcode_select.jsp(우편번호검색 폼)


      userPro.jsp(가입버튼클릭했을때 이동하여 가입처리 해주는 부분)

      userLogin.jsp(로그인 처리 페이지)

      userLogout.jsp(로그아웃 처리페이지)

      userInfo.jsp (정보수정 버튼을 클릭했을때 회원정보 폼에 출력)

      userUpdatePro.jsp(회원정보수정처리 부분)

      userDelete.jsp(회원탈퇴처리 부분)


  - 기타문서(css/ javascript)


 ------------------------------------------------------------



 * 게시판만들기위한 준비사항

  

   -기능부분

   1. 게시물 등록

      

   2. 게시물 리스트 뿌리기

      (페이지분할 / 검색기능 추가)


  3. 제목을 클릭했을때 글번호에 해당하는 게시물 상세보기


  4. 상세보기 페이지에서  수정 / 삭제/ 답글 기능



 - 테이블설계

  1. 게시판 테이블

 create table board(

b_id number(5) primary key, -- 글번호 

b_name varchar2(20),-- 글쓴이 

b_email varchar2(50),-- 글쓴이 메일 주소 

b_title varchar2(80),-- 글 제목 

b_content varchar2(3000),-- 글 내용 

b_pwd varchar2(12),-- 비밀번호 

b_date date,-- 글쓴날짜 

b_count number(5) default 0,-- 조회횟수 

b_ip varchar2(15),-- 글쓴이 아이피주소 

b_depth number(5),-- 답글깊이

b_pos number(5)-- 화면에 출력되는 글의 위치

)


 2. 글번호 자동증가컬럼을 위한 시퀀스 

  create sequence seq_id nocache

    


 - java문서 준비(MVC구조)


  1. gaon.board.BoardBean.java(저장소)

      board 테이블 컬럼에 해당하는 setXxx(), getXxx() 준비


  2.gaon.board.BoardDAO.java (DB연동에 해당하는 문서)

    - 생성자 (DBCP준비)


    - dbClose() => DB닫기 기능 작성


   - 게시물 등록하는 메소드 작성

     public int insertBoard(BoardBean bean){

       String sql="INSERT INTO board 

          VALUEs(SEQ_ID.NEXTVAL,?,?,?,?,?,SYSDATE ,0,?,0,0 )";


       *주의 : insert하기 전에 b_pos의 값을 증가하는 메소드 호출한다.

     }

   

   - 게시물등록 전에 b_pos의 값을 증가하는 메소드 작성

     public void upPos(){

      String sql="update board set b_pos=b_pos+1 "

     }

      

   -모든게시물 목록리스트 가져오는 메소드 작성

    public ArrayList<BoardBean> getBoardList(){

      String sql="select * from board order by b_pos";

    }

     중요 : 페이지분할을 할때 현재 페이지번호 인수로 들어옴

            검색기능을 추가하면 검색필드와 검색단어 인수로 들어옴.



 - 글번호에 해당하는 게시물 가져오는 메소드 작성.

   public BoardBean getBoard(int b_id){

     String slq="select * from board where b_id=?"

   }



 - 상세보기 했을때 조회수 증가하는 메소드 작성

   public void upCount(int b_id){

     String sql="update board set b_count = b_count+1 where b_id =? "

   }



 - 글번호에 해당하는 게시물 수정하는 메소드 작성

  public int updateBoard(BoardBean bean){

    String sql="UPDATE board SET b_name=?, b_email=? , 

b_title=?, b_content =?

      WHERE b_id= ?"

  }


 - 글번호에 해당하는 게시물 삭제하는 메소드 작성

  public int deleteBoard(int b_id){ 

    String sql="delete board where b_id=?";


  }   


 - 답글 등록하는 메소드 작성

  public int replyInsertBoard(BoardBean bean){

    String sql="INSERT INTO board 

          VALUEs(SEQ_ID.NEXTVAL,?,?,?,?,?,SYSDATE ,0,?,

          부모b_depth+1, 부모b_pos+1 )"


  }


 - 답변게시물일 경우에 답변할 게시물의 b_pos 값보다 큰값들의

   b_pos를 1씩 증가시키는 메소드 작성.

 public void replyupPos(int b_pos){//b_pos 부모글의 b_pos 값.

   String sql="update board set b_pos=b_pos+1 where b_pos > ? "


 }




 3. gaon.board.PageAction.java 

   => 페이지분할 역할을 담당할 문서.



-------------------------------------------------------

 - Jsp문서 

  1. write.jsp => 게시물등록폼 / 답변등록 폼 

 

  2. write_ok.jsp => 게시물 등록/답변 처리를 담당할 문서

 

  3. list.jsp => 모든 게시물을 보여주기 위한 페이지

                 (페이지분할 / 검색 기능 추가)


  4. show.jsp => 글 제목을 클릭하여 글번호에 해당하는 게시물을 폼에

                 보여주는 문서 ( 이때  조회수 증가 함)

                 ( 수정 / 삭제 / 답변 / 목록 )


  5. edit.jsp => 게시물 수정버튼을 클릭했을때 게시물 수정할수 있도록

                  폼에 게시물 뿌리기


  6. edit_ok.jsp => 게시물 수정 처리 를 담당하는 문서


  7. delete.jsp => 게시물 삭제버튼 클릭했을때 삭제 폼.

  

  8. delete_ok.jsp= > 게시물 삭제처리를 담당할 문서.


  

- CSS와 javaScript 필요.  


--------------------------------------------------------------

 * Page분할 준비하기

 1. 전체레코드수를 구한다.

    (select count(*) from board) => totalCount 변수에 저장


 2. 한 페이에 뿌려질 게시물의 수를 정한다.

     => pageSize 변수에 저장


 3. 한 블록당 뿌려질 [페이지번호][페이지번호]의 개수를 정한다.

     => blockCount 변수에 저장


 4. 총 페이지수를 구한다.

    => (int)Meth.ceil( ((double)totalCount / pageSize));  

        pageCount 변수에 저장한다.


 5. 페이지번호에 해당하는 게시물의 시작점 구한다.

    (현재페이지번호-1) * pageSize+1 ; 

      => absoule 변수에 저장한다.

    

    중요 :  ResultSet의 결과물의 커서를 특정 위치로 이동하기 위해서는

            con.createStatement 나 con.PrepareStatement 를 사용할때

            Resultset 타입와 권한 속성을 지정해야한다.


    ex)

       con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE , 

           ResultSet.CONCUR_UPDATABLE);


----------------------------------------------------------------------

 6. 화면에 출력 준비사항

   

   - 화면의 시작페이지를 구한다(몇번부터 출력 할지를 정함 [번호] ) 

    =>

     int temp =  (현재페이지번호-1) % 블록당뿌려질 []의개수; 

     int startPage = 현재페이지번호 - temp; => []의 시작번호임.



  - [이전] 만들기

    

    if(시작페이지번호 - 한블록당뿌러질 []개수 >  0){

       [이전] 출력한다.

    }


    ex) if((startPage - blockCount) > 0 ){


        }

    


 - 페이지번호 나열하기 

  

    for(int i = 시작페이지번호 ; i < (시작페이지번호+블록당[]개수) ; i++){

        페이지번호 출력

        if(i> 총페이지수) break;

    }


   ex)

     for(int i=startPage ; i< (startPage+blockCount) ; i++){

          페이지번호 출력

          if(i >= pageCount) break;


     }



  - [다음]  만들기


    if( (시작페이지 + 블록당뿌러질[]개수) <= 총페이지수 ){

        [다음] 출력

    }    


    ex) 

      if((startPage + blockCount) <= pageCount){

         [다음] 출력

      }

   

     

  * 변수 정리

   int totalCount ; => 총레코드수

   int pageSize ; => 한페이지에 보여질 게시물 수

   int blockCount ; => 한 블록당 뿌려질 []의 개수

   int pageCount ; => 전체페이지 수

   int startPage ; => 한블록에서 보여질 []의 시작번호

   int absoulte ; => DB결과의 ResultSet에 있는 전체레코드 중

                     시작부분을 가져올 변수


   int pageNum ; => 현재 페이지 번호      

------------------------------------------------------------------

  * 검색 기능 추가

   1. 검색기능에 해당하는 form을 작성


 <!-- 검색 부분 -->

<form action="list.jsp" name="search" method="post">

<table border=0 width=527 align=center cellpadding=4 cellspacing=0 >

 <tr>

  <td align=center valign=bottom>

   <select name="keyField" size=1 >

    <option value="b_name"> 이 름

    <option value="b_title"> 제 목

    <option value="b_content"> 내 용

   </select>

   <input type="text" size=16 name="keyWord"  value="">

   <input type="button"  value="찾기" onClick="check()">

   <input type="hidden" name="pageNum" value="<%=pageNum%>">

  </td>

 </tr>

</table>

</form>



<script>

function check(){

     if (document.search.keyWord.value == ""){

alert("검색어를 입력하세요.");

document.search.keyWord.focus();

return;

    }

document.search.submit();

 }


</script>



 * 검색 기능 추가할때  쿼리문 작성


--이름 으로 검색

SELECT * FROM BOARD WHERE b_name LIKE '%검색단어%'


--제목 으로 검색

SELECT * FROM BOARD WHERE b_title LIKE '%검색단어%'


--내용 으로 검색

SELECT * FROM BOARD WHERE b_content LIKE '%검색단어%'



*get방식


list.jsp?pageNum=값&keyField=값&keyWord=값


------------------------------------------------------------

 * 파일업로드 하기

  

   - 파일업로드에 필요한 컴포넌트(라이브러리) 다운로드

     http://www.servlets.com/cos/

     

   -다운로드한 라이브러리를 압축을 풀어 lib폴더에 있는

    cos.jar를 파일을 이클립스 lib폴더에 넣는다.



  - 파일업로드 폼.

  <form name="f" action="upLoadPro.jsp" method="post" 

 enctype="multipart/form-data">

   이름 : <input type="text"  name="name"><br>

    제목 : <input type="text"  name="subject"><br>

    파일첨부 : <input type="file"  name="file"><br>

     <input type="submit"  value="전송">

    <input type="reset"  value="취소">

</form>


   *주의 : method는 반드시 post 방식

           enctype="multipart/form-data"  필수


 

  - 폼으로 넘어온 값 받기(파일업로드)

    

   MultipartRequest m = new MultipartRequest(request , 저장폴더 , 최대용량 ,

             한글인코딩 , 같은이름파일처리방법 );


   m.getParameter("name") ;//text박스의 값 가져오기

   m.getFilesystemName("file"); //file 박스의 첨부파일가져오기


   File f = m.getFile("file") ;//첨부된 파일의 정보 


-------------------------------------------------------------

 -파일다운로드 기능(Servlet문서 작성)

 

  1. HttpServlet 상속받는다.


  2. 기능 

  

   - 업로드된 파일의 경로 알아오기

   - 한글파일 인코딩 설정(8859_1  -> euc-kr 변환)

   - 요청된 파일이름을 File객체 변환

   - ContentType설정

       => 서버가 클라이언트쪽으로 보낼때 인코딩 설정 , MIMEType설정

      * 브라우져가 해석가능한 파일을 열지못하도록 설정

         - 한글인코딩( euc-kr  -> 8859_1 변환)

         - 헤더설정(헤더란 http에게 자신의 파일의 정체를 알리는것)


   -실제파일을 클라이언트쪽으로 다운로드 한다.

    (InputStream / OutputStream) 


 

*다운로드기능 servlet 링크걸기

 <a href="/프로젝트명/서블릿클리스이름?fileName=파일이름">

    파일이름

 </a>


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

servlet을 이용한 업로드 게시판 만들기


 1. 테이블 설계

create table upLoad(

b_id number(5) primary key, -- 글번호 

b_name varchar2(20),-- 글쓴이 

b_email varchar2(50),-- 글쓴이 메일 주소 

b_title varchar2(80),-- 글 제목 

b_content varchar2(3000),-- 글 내용 

b_pwd varchar2(12),-- 비밀번호 

b_date date,-- 글쓴날짜 

b_count number(5) default 0,-- 조회횟수 

b_ip varchar2(15),-- 글쓴이 아이피주소 

b_depth number(5),-- 답글깊이

b_pos number(5),-- 화면에 출력되는 글의 위치 

         b_fname varchar2(100), --파일이름

         b_fsize number  --파일용량

)


2. 시퀀스 생성

 create sequence upload_seq  NOCACHE;


3. 자바문서

  - gaon.upload.UpLoadBean.java

     => setXxx(), getXxx() 저장소


  - gaon.upload.UpLoadDAO.java

     => upload에 관한 DB처리 부분


 - gaon.board.PageAction.java

     => 페이지 분할에 관련된 부분

        (게시판에서 사용한 페이지분할 그대로 사용함)



4. jsp문서 

  - 등록 / 답변

    write.jsp ->  Write_OK.java  -> list.jsp

 

 - list.jsp문서에서 제목클릭(읽기) show.jsp  이동

   show.jsp 

    수정 -> edit.jsp -> Edit_OK.java -> show.jsp

    삭제 -> delete.jsp -> Delete_OK.java -> list.jsp

    답글 -> write.jsp -> Write_OK.java -> list.jsp

    목록 -> list.jsp


  *주의 : 각 페이지로 이동할때 pageNum, keyField, keyWord

          폼으로 가지고 이동.



 5. css 나 javascript 필요

    

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

  

  - 표현언어(EL - Expression Language)

    => jsp 2.0 새롭게 추가된 스크립요소

    => 자바 빈즈 속성값을 보다 쉽고 제약을 덜 받는 방법으로

       사용하기 위해 나옴.

    => 기본문법

      - 표현언어는 $시작한다.

      - 모든 내용은 {표현식} 으로 구성된다.

      - 표현식에는 기본적으로 변수명 혹은 속성명.메소드 구조로

        이루어짐.

      - 표현식에는 정수형, 실수형, 문자열형, 논리형, null 올수있음.

      - 표현식 연산가능함.


   => 표현언어 연산자

     - 산술연산자

         + ,- , *, /(div) , %(mod)

        ex) ${10 div 2}


    -관계연산자

      ==(eq) , !=(ne) , >(gt) , <(lt) , >=(ge) , <=(le)

       ex) ${5 gt 2}

   

    - 조건연산자

      조건식 ? 참 : 거짓

     

   - 논리연산자

      &&(and),  ||(or) , !(not)


  => 표현언어 내장객체

    -pageScope  => page기본객체에 저장된 속성

    -reqeustScope =>reqeust기본객체에 저장된 속성

    -sessionScope => session기본객체에 저장된 속성

    -applicationScope => application기본객체에 저장된 속성



     ex) <%=session.getAttriubte("id")%>님

          ${sessionScope.id}님


    -param  => 요청 prameter의 name에 해당하는 값 가져옴

              ex) ${param.name}  = (request.getParameter("name"); ) 


    -pageContext => JSP page 기본객체


  * <jsp:useBean id="bean" class="gaon.EL.ProductBean" />

    ex) ${bean.num1}  => bean객체의 getNum1()호출됨.

 

-------------------------------------------------------------

   -TLD(Tag Library Descriptor)

   => 커스텀태그로 사용자가 필요에 의해 직접 만들어 사용하는 것.

   => 방법

      - TagSupport 또는 SimpleTagSupport상속받아 만드는 경우

      

      - jsp2.0에서 추가된 태그파일 이용방법

         => jsp문서에서 태그파일을 이용하기 위해서는

            <%@ taglib tagdir="/WEB-INF/tags" prefix="접두어" %>


            <접두어:태그파일이름/>

            <접두어:태그파일이름>doBody 내용 </접두어:태그파일이름>

         

        => tags폴더에 tag파일 만들기

          -첫줄에 기술한다.

          <%@ tag body-content="empty" pageEncoding="euc-kr" %>

          body-content에 들어가는 값

             empty => 태그body가 없다는 것

             scriptless => 기본이며 커스텀태그 와 html로만 이루어진

                           경우

     

  --------------------------------------------------------------     

  - JSTL(Jsp Standard Tag Library)

   => jsp에서 표준으로 자주사용하는 부분을 미리 태그로 만들어

      놓은것.

  

   => 종류

      코어(core), XML, I18N(국제화) , 데이터베이스(sql), 

      함수(function)


   => http://jakarta.apache.org 사이트에서 관련 라이브러 다운.

      다운받은 파일을 압축을 풀면 두개의 라이브러를 

      lib폴더에 넣는다.

      ( 사이트에서 왼쪽 메뉴 아래쪽에 /taglibs/ 를 클릭 - http://tomcat.apache.org/taglibs/)


   => jsp문서에서 JSTL을 사용하기 위한 선언방법

   <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

   <%@ taglib uri="http://java.sun.com/jsp/jstl/xml" prefix="x"%>

   <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>

   <%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%>

   <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>

   

   

  => 자주사용하는 코어 JSTL 태그

  <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>


  1. <c:out value="값 | 변수명" escapeXml="true|false" />

       escapeXml="true" 는 값에 태그 있으면 문자로 출력됨.


  2. <c:set var="이름" value="값" />

     주의 : value의 값은 무조건 String

            만약 value="${20}" 이면 숫자 20

                 value="${'20'}" 이면 문자 20 

                 value="20"  이면 문자 20 




  3. <c:remove var="이름" />


  4. <c:catch var="이름">

        예외발생 가능성 코드

     </c:catch>

  

  5. <c:if test="조건식" var="결과저장할이름" >

        결과가 true일때 실행문장.

    </c:if>  


 6. <c:choose>

      <c:when test="조건식"> 실행문장 </c:when>

      <c:when test="조건식"> 실행문장 </c:when>

      <c:when test="조건식"> 실행문장 </c:when>

      ....

      <c:otherwise> 위조건이외의 경우 실행문장 </c:otherwise>

   </c:choose>



 7. <c:forEach var="이름" begin="시작" end="끝" step="단계"

     item="항목" varStatus="현재상태에대한값" >

     

     ${상태나타내는변수.index}

     ${상태나타내는변수.count}

     ${이름}

  

   </c:forEach>





 8. <c:forTokens item="데이터" delims="구분자" var="이름">

        ${이름}

    </c:forTokens>



 9. <c:import uri="파일명" var="이름" />



 10. <c:url value="URL주소" var="이름" />


     <c:url value="URL주소" var="이름" >

         <c:param name="이름"> 값 </c:param>

     </c:url>


    ex) <a href="${이름}" >클릭</a>


 - JSP준비하기

  1. JDK설치

  

  2. 웹서버(WAS) 설치(tomcat.apache.org사이트에서 다운로드)

    => tomcat 8.0 다운로드


   *설정하기

  1. jdk path 잡기 => C:\Program Files\Java\jdk1.6.0_21\bin

  2. JAVA_HOME  => C:\Program Files\Java\jdk1.6.0_21

  3  CATALINA_HOME  => C:\tomcat


  

  3. 이클립스 설치

     =>다이나믹웹프로젝트 생성함.

       src/java파일만들기

       webContent/ jsp, script, html, css문서 만들기


  4. 이클립스에 서버등록하기(server.xml문서에 가상폴더 생김)



 -----------------------------------------------------------

  - Web Server - 정적인 페이지들을 표혀하기 위한 서버

   => Web Client(웹 브라우저)에게 제공하는 컨텐츠를 제공하는 서버.

   =>정적인 HTML 혹은 jpeg나 gif같은 이미지를 HTTP프로토콜을 통해 웹 브라우저로 제공.

    

    * 정적인 데이터(image, CSS, javascript- 파일 등의 리소스)는 구조적으로 앞에 존재하는 

      웹 서버에서 처리하고 WAS로 서비스 요청이 넘어가지 않게 한다.

      동적인 데이터는 WAS가 처리한다. WAS는 웹 어플리케이션의 수행에 집중할 수 있다.




  - WAS(Web Application Server) - 동적인 페이지들(jsp,php, asp)등을 표혀하기 위한 서버

   => Server단에서 어플리케이션을 동작할 수 있도록 지원.

   => 일반적으로 컨테이너라는 용어로 사용됨.

   => Servlet, JSP, ASP, PHP 등의 프로그램으로 사용됨. 

   => Servlet 페이지를 html 형태로 변환함.

      예를 들어 jsp의 경우 jsp를 WAS에서 java class파일로 컴파일 후 

       html형태의 페이지를 사용자에게 전달하게 됨.


  => BEA의 Web Logic /  IBM의 Web Sphere  / TMax의 Jeus(제우스)

     아파치 그룹으로 잘 알려진 Apache S/W Foundation의 자바카르타 프로젝트에서

     발표한 Tocat


--------------------------------------------------------------------------------------------------

  - JSP특징

  => 서버측에서 실행되어 결과값을 클라이언트 쪽으로 전송되므로

     소스가 공개되지 않음.

 => DB연결기능

 => Form으로 넘어오는 데이터를 받아 처리능력이 있음.

 => JAVA문법으로 100% 적용함.

 => jsp문서안에서 html, css, javascript 그대로 사용함.

 => jps문서안에서 <% ~~~ %>를 이용해 JSP문법 코딩.


 

 -JSP실행순서 및 방법

 => URL주소창에

    http://웹서버주소:port번호/프로젝트명/폴더명/파일이름  요청.

   단,요청전에 웹서버 톰켓이 시작되어 있어야 함.


 => 실행순서

  1. ~.jsp문서를 파싱한다.(문법적오류 체크)

  2. 오류가 없으면 ~.java문서 생성(servlet문서)

  3. ~.java문서를 컴파일하여 ~.class생성

  4. 최종 ~.class화일을 해석하여 클라이언트쪽으로 응답함.


  * servlet문서 생성되는곳.

   D:\jspWorkspace\.metadata\.plugins\org.eclipse.wst.server.core\

   tmp0\work\Catalina\localhost\JspExam\org\apache\

--------------------------------------------------------------

 - JSP태그


 1. <%  JSP문법  %> - (스크립트 릿)


 2. <%!  전역변수 선언 및 메소드선언    %>


 3. <%= 출력문 %>


 4. <%@ page  문서전체에대한 설정부분  %> => 문서의 첫줄에 기술.


 5. <%--  JSP영역 전체 주석처리    --%>


------------------------------------------------------------

 - include 지시자

   <%@ page include file=""   %>

    => 메인페이지에 다른 페이지를 포함시킴

    => 소스전체가 메인페이지에 포함됨(서블릿문서 한개생김)



 -액션태그

  1. <jsp:include page=""  />

     => 메인페이지에 다른 페이지를 포함시킴 

     => 실행결과가 메인페이지에 포함됨(서블릿문서 각각생김)


  2. <jsp:forward  page="" />

     => forward에서 지정한 페이지로 이동시킴

     => 현재페이지에 다른 문서를 열어줌.



   *액션태그에서 param 지정하기

    => include 나 forward는 param태그를 이용하여 값을 넘길수 있음.

    => ex)<param name="id" value ="jang"  />


    => <jsp:include page=""  >

         <param name="id" value ="jang"  />

      </jsp:include>



      <jsp:forward page=""  >

         <param name="id" value ="jang"  />

      </jsp:forward>




  3. <jsp:useBean id="" class="" scope="" />

     <jsp:setProperty name="" property="" />

     <jsp:getProperty name="" property="" /> 

    => Beans를 이용할때 사용함.

      (java문서를 만들어 jsp문서에 java에 있는 메소드나,전역변수

       에 접근하는 방법)


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



  -form get 방식으로 넘어오는 한글 처리 인코딩 설정하기

   => server영역의 server.xml문서 수정

   <Connector connectionTimeout="20000" port="8000" 

    protocol="HTTP/1.1" redirectPort="8443"

      URIEncoding="euc-kr"

    />

     * URIEncoding="euc-kr"  추가한다.


---------------------------------------------------------

 -JSP내장객체

 1. request  => HttpServlerRequest 

    => 클라이언트의 요청정보를 서버측에서 사용할때 

    * String value = request.getParameter(String name) ; 

        => request로 넘어오는 name에 해당하는 value 값 받기

  

    * request.setCharacterEncoding("euc-kr");

        => request로 넘어오는 한글인코딩 변환

    

    * String str [] = request.getParameterValues("hobby"); 

      => name에 해당하는 value 여러개 일때 사용함.


    *  Enumeration<String> e = request.getParameterNames();

        => request로 넘오는 name에 대한 정보 가져오기

      

    * String ip = request.getRemoteAddr() ; 

       => 접속한 클라이언트 ip 가져오기


    * Cookie co [] = request.getCookies();

       => 접속한 클라이언트에 저장된 쿠키정보(클라이언트정보) 가져오기



 2. response => HttpServletResponse

    => 서버가 클라이언트쪽으로 응답처리 할때 사용함.

    

    * response.sendRedirect(String url);

       => 클라이언트의 요청페이지를 URL로 이동시킴.


    * response.addCookie(Cookie co);

      => 클라이언트쪽에 클라이언트의 정보를 저장함.



 3. session => HttpSession

    => 클라이언트의 정보를 서버측에 저장할때 사용함.

    => 저장된 정보는 브라우져 창이 시작 해서 종료 할때까지

       저장정보가 유지됨.

       (일반적으로 로그인 ~ 로그아웃 )

    => 접속된 각각의 클라이언트마다 생성됨.

    => 기본 세션의 시간은 30분(1800초)


    * session.setAttribute(String name, Object value);

      => 세션의 정보를 저장.


    * Object value = session.getAttribute(String name);

      => 세션의정보가져오기


   * session.setMaxInactiveInterval(int interval);

      => 세션의 유지되는 시간설정(초단위)

  

   * int interval = session.getMaxInactiveInterval(); 

     => 설정된 세션의 시간 가져옴(초단위)


   * String id = session.getId();

     => 세션이 생성되면 자동으로 만들어지는 세션아이디

 

   * Enumeration e =session.getAttributeNames();

     => 세션에저장된 name 가져오기


   * boolean b = session.isNew();

      => 현재 브라우져창의 세션이 새로운것인지 판별

         (true면 새로운페이지, false 기존페이지)


   * session.invalidate();

      => 세션의 모든정보를 지운다.


   * session.removeAttribute(java.lang.String name);

     => 저장된 세션의 정보중 name에 해당하는 정보 삭제


   *  long time = session.getLastAccessedTime();

     => 마지막 접속시간


   * long time = session.getCreationTime();

     => 세션이 시작된 시간.


--------------------------------------------------------

 

 * session을 이용하여 로그아웃기능 만들었을때

  => 익스플로우의 도구->옵션에 설정된 정보가

     페이지열때마다 or 자동 으로 설정되었을때

     페이지의 리플래쉬 기능이 다르다.

 => 브라우져의 옵션에 상관없이 jsp페이지에서 

    페이지를 열때마다 리플래쉬 기능을 만들어 주는 방법

   

   response.setHeader("Cache-Control","no-cache");

response.setHeader("Cache-Control","no-store");//크롬

 

   response.setHeader("Pragma","no-cache"); 

   response.setDateHeader("Expires",0);

    * 페이지의 page지시어 다음에 설정한다.



 4. application => ServletContext

     => 특정 정보를 서버가 시작해서 종료될때까지 유지 되도록 함.

        서버에 대한 정보를 추출과 웹 어플리케이션단위로 상태정보저장

     

     * application.setAttribute(String name, Object value);

         => 정보를 저장하는 기능


    * Object value = application.getAttribute(String name);

        => name에 해당하는 정보를 가져오는 기능


    * application.removeAttribute(String name);

       =>  name에 해당하는 정보를 삭제하는 기능


    * application.getRealPath(java.lang.String path);

       => 실행되는 문서의 경로 가져오는 기능

   

    * Enumeration e = application.getAttributeNames();

      => 저장된 정보의 name 가져오는 기능

  ----------------------------------------------------------

  - Cookie => javax.servlet.http.Cookie  

  => 클라이언트의 정보를 클라이언트 PC에 저장함.

  => 사용자 측에 대한 정보를 보관해 두었다가 웹서버의 요청에 의해

     그 정보를 원하는 순간에 사용할 수 있다.

  => 한번에 4KB 로 용량이 제한되고 300개까지저장가능함.

     (최대용량 : 4KB * 300 = 1.2MB)

  =>  작은정보의 형태로 저장되고 오래되면 자동삭제됨. 


    * response.addCookie(Cookie co);

      => 클라이언트쪽에 클라이언트 의 정보를 저장함.


   * Cookie co [] = request.getCookies();

       => 접속한 클라이언트에 저장된 쿠키정보(클라이언트정보) 가져오기


   * Cookie 관련 메소드 정리

     int getMaxAge() => 쿠키의 사용할수 있는 기간에 대한 정보

     setMaxAge(int max) => 쿠키가 저장되는 기간 설정

      ex) setMaxAge(0) ; => 쿠키삭제

          setMaxAge(-1) ; => 

          쿠키폴더에 파일이 만들어지지 않지만 브라우져가 종료될까지

          쿠키의 정보는 저장된 상태이고 브라우져를 닫으면 쿠키정보 사라짐.

          (setMaxAge를 생략하면 -1을 기본)

          setMaxAge(60*60*24*365)=> 1년


         setValue(Cookie c) => 쿠키정보 수정하기

          =>쿠키의 정보가 수정되면 setMaxAge도 수정해야만

            정보의 유효기간이 설정됨.

      

     String getName(); => 쿠키설정된 이름 가져오기

     String getValue();=> 쿠키에 설정된 값 가져오기 

     

     setPath(String path) => 쿠키의 유효한 디렉토리 설정

      ex)setPath("/") => 모든 문서(디렉토리)에서 쿠키사용가능함.


  * Cookie 생성자

   Cookie(String name, String value);

   ex)Cookie  cookie = new Cookie("id","8253jang");


 * win7의 쿠키 폴더 => C:\Users\"UserName"\AppData\Roaming\Microsoft\Windows\Cookies 

  

  --------------------------------------------------------------------------------------


   - IO를 이용한 counter만들기

    * 파일을 읽고/ 쓰기 기능 

      => 파일의경로를 상대경로 지정함.

         application.getRealPath("/")를 이용하여 실제 문서의

         경로를 기준으로 파일을 읽거나 쓴다.

  

      ex) 

       String path= application.getRealPath("/0415/IOCounter/counter.txt");

         => 프로젝트 Root를 기준으로 0415폴더 아래있는 파일 가져오기


      => 파일을 읽기

         InputStream 또는 Reader를 선택함.

 

      => 파일 쓰기

          OutputStream 또는 Writer를 선택함.


     => 문자를 숫자로 변환  - int i = Integer.parseInt(String s);

     => 숫자를 문자로 변환  - String s =Integer.toString(int i); 


  


--------------------------------------------------------------------

  -Servlet문서 작성하기

  => 반드시 javax.servlet.http.HttpServlet를 상속받는다.(public class)

    ex) public class A extends HttpServlet{


           //필요한 메소드 재정의해서 기능 부여

        }


  => HttpServlet 에 있는 관련 메소드

    init() => 서블릿문서가 초기화 될때(최초에 처음 실행될때 호출됨)


    service(ServletRequest request, ServletResponse response) 

          => init이 실행된후 호출됨(서블릿문서 새로고침하면 service실행됨)

             사용자 요청이 get/post인지를 구분하여 doGet or doPost호출함.


    doGet(HttpServletRequest request , HttpServletResponse response) 

           => 사용자 요청 get방식일경우 실행됨


    doPost(HttpServletRequest request , HttpServletResponse response) 

       => 사용자 요청이 post방식일때 실행됨.


    destory() => 서블릿문서가 종료될때호출됨.



  => 서블릿문서를 실행하기 위한 준비작업(tomcat 6.0이전에서만)

   1. Tomcat영역의 web.xml문서 수정하기

     invoker 키워드로 검색해서 서블릿 주석처리 부분 해제한다.

     (servlet문서요청을 처리할수 있도록 설정하는 부분)

      -------------------------------------------

     <servlet>

        <servlet-name>invoker</servlet-name>

        <servlet-class>

          org.apache.catalina.servlets.InvokerServlet

        </servlet-class>

        <init-param>

            <param-name>debug</param-name>

            <param-value>0</param-value>

        </init-param>

        <load-on-startup>2</load-on-startup>

    </servlet>

     --------------------------------------


    <servlet-mapping>

        <servlet-name>invoker</servlet-name>

        <url-pattern>/servlet/*</url-pattern>

    </servlet-mapping>

    ----------------------------------------



   2. Tomcat영역의 context.xml문서 수정하기

    <Context 태그에 속성 2개 넣는다.

   ex)

     <Context reloadable="true" privileged="true">

   

   ---------------------------------------------------------------  

  3. WEB-INF/web.xml문서 수정하기

    작성된 servlet문서에 대한 <servlet>태그와 <mapping>태그 추가함.

    단, 이클립스에서 서블릿문서를 만들면 자동으로 추가되어짐.     


 

  4. 톰켓설치된 폴더 lib에 있는 servlet-api.jar 라이브러를 자바 영역의 넣기

     *이유 : java 문서에서 servlet 객체 사용할수 있도록하기위함.


     - C:\Program Files\Java\jdk1.6.0_21\jre\lib\ext폴더에 저장

     - C:\Program Files\Java\jre6\lib\ext 폴더에 저장




 => 사용자 폼에서 submit했을때 servlet문서로 action 연결방법

    <form name="f" action="/프로젝트명/서블릿클래스이름" method="post">


    </form>

    

----------------------------------------------------------------------



 -Beans

  => java 클래스들을 모아놓은 package 

  => Model, View, Controller(MVC패턴 구현)

     Model - 저장소역할( setXxx(), getXxx() 구현) - java코딩

     View - GUI역할(클라이언트엑 보여줄 화면구성 구현 ) - jsp코딩

     Controller - DAO(데이터처리 담당 -DB연동)역할

                  내부적으로 보이지 않게 처리해야하는 기능 구현 -java코딩


 => Beans를 이용하여 MVC패턴으로 구현함으로써 재사용성과 유지보수 용이

 => 이러한 MVC패턴을 기반으로 나오는 다양한 프레임웍이 있음.



 -Beans만들기

  1. Model의 역할 저장소(java문서)

   package gaon.bean;

   public class LoginBean{

     private Strig id;

     private int pwd;

 

   //전역변수 id, pwd에대한 setXxx()메소드와 getXxx()메소드 작성

     public void setId(String id){

this.id = id;

   }

   public String getId(){

return id;

   }


   public void setPwd(int pwd){

this.pwd = pwd;

  }

   public int getPwd(){

return pwd;

   }


  }


 

  2. jsp영역에서 Beans사용법


    -beans 사용 선언

    <jsp:useBean id="별칭" class="사용할클래스이름" scope="beans의범위" />

        

      * id="bean" => bean이라는 이름으로 클래스에 있는 메소드 접근

      *class="gaon.bean.LoginBean"  => bean 이름으로 사용한 클래스선언


      *scope ="request | session | application | page"

             request => 사용자요청이 들어오는 순간에만 bean사용함.

             sssion => 클라이언트의 세션이 살았는동안 bean사용함.

             application => 서버시작 ~ 종료될때가지 bean사용함.

             page => 현재 페이지내에서만 사용함(기본값)



  -선언된 Bean에 저장하기

  <jsp:setProperty name="bean" property="id" /> 

     => bean 클래스에 있는 setId()호출됨

  <jsp:setProperty name="bean" property="*" /> 

     =>bean 클래스에있는  set으로 시작하는 모든메소드 호출됨



  -선언된 Bean의 데이터 가져오기

    <jsp:getProperty name="bean" property="id" /> 

      => bean클래스에 있는 getId()호출됨.

  

-----------------------------------------------------------------


 - JDBC 연동하기

    => java와 DB연동

    => oracle 설치 폴더에 있는 오라클 드라이버 라이브러 필요함. 

    (C:\oracle\jdbc\lib 폴더의 ojdbc14.jar 이클립스

     WEB-INF/lib에 넣는다.)


   => import java.sql.*; 


   => DB연동 순서

    1. 로드(사용할 DB종류를 로드함-선택)

       Class.forName("연결하려는드라이브명");


       *연결하려는 드라이브명

       Oracle :  oracle.jdbc.driver.OracleDriver

       Ms_Sql :  sun.jdbc.odbc.JdbcOdbcDriver

       My_Sql :  org.git.mm.mysql.Driver


       * 일반적으로 로드 부분은 생성자에서 구현함.

         (객체가 생성되는 시점에 한번만 로드 함)

 

    2. 연결(db에 접속하는 부분)

     Connection con =

        DrvierManager.getConnection(String URL , String id ,String pwd);

   

       *URL부분

        Oracle :   jdbc:oracle:thin:@localhost:1521:ORCL

        Ms_Sql :   jdbc:odbc:odbc설정을통해만든db원본명

        My_Sql :   jdbc:mysql://localhost:3306/db명



    3. 실행 

        Statement st = con.createStatement();

         

        *insert/update/ delete/ create인경우는

        int result = st.executeUpdate(String sql);

         => result의 값이  0이면 실패 , 1이상이면 성공.

       

        ex)  int result = st.executeUpdate("delete test where no=1"); 


       * select문장인 경우는

          ResultSet rs = st.executeQuery(String sql);

        

         ex)  Resultset rs = st.executeQuery("select * from test");


         -ResultSet 메소드

          boolean b =rs.next(); //커서를 앞으로 이동

          String s =rs.getString(int 컬럼index); //컬럼에해당하는 문자열얻기

          int i =rs.getInt(int 컬럼index); //컬럼에해당하는 숫자값 얻기

        

           while(rs.next()){

               String id = rs.getString(1);//첫번째컬럼

               int age =rs.getInt(2);//두번째컬럼


           }


 

    4. 닫기(사용한 객체 닫기)

       주체.close();


-------------------------------------------------------------------



 - DB연동 부분의 3번 실행 단계 PreparedStatement 이용하기

  

  1. 로드

  2. 연결

  3. 실행

     PreparedStatement ps = con.prepareStatement(String sql);

       * sql인수는 insert/update/delete/select/create문장 모든문장가능함.

       ex) insert into test values(?,?);

           select * from test where id=?;


      * sql문장에 ? 가 있는경우 ?의 순서대로 값 넣는다.

       ps.setType(int index, Type value);

       ex) ps.setString(1, "장희정");

           ps.setInt(2, 20);

           ....


      * ?에 해당하는 값을 다 넣은 후에 최종적으로 실행함.

        int i = ps.executeUpdate(); => insert,update, delete, create인경우

        ResultSet rs = ps.executeQuery();=> select인경우


---------------------------------------------------------------------------

 -DBCP기술을 이용한 DB연동

  => 연결객체를 일정만큼 확보해 두고 필요시마다 Client에게 연결해줌.

     미리 Connection을 연결해 두어 바로바로 연결해줌으로써 속도를

     향상시킴.


  => 준비작업

     1. tomcat.apache.org 사이트에 접속하여 <Resource태그 복사한다.

      <Resource name="jdbc/myoracle" 

                auth="Container"

                type="javax.sql.DataSource" 

                driverClassName="oracle.jdbc.OracleDriver"

                url="jdbc:oracle:thin:@127.0.0.1:1521:ORCL"

                username="jang" 

                password="jang" 

                maxActive="20" 

                maxIdle="10"

               maxWait="-1"/>




     2. 복사한 태그를 서버부분의 server.xml문서의 <Context태그 사이에

        추가한다.

       <Context docBase="JspExam" path="/JspExam" 

      reloadable="true" source="org.eclipse.jst.jee.server:JspExam">

      

        <Resource name="jdbc/myoracle" 

                auth="Container"

                type="javax.sql.DataSource" 

                driverClassName="oracle.jdbc.OracleDriver"

                url="jdbc:oracle:thin:@127.0.0.1:1521:ORCL"

                username="jang" 

                password="jang" 

                maxActive="20" 

                maxIdle="10"

               maxWait="-1"/>

      

      </Context>



   tip : server.xml문서에 <Resource 태그를 추가하는 경우 만약, 서버에서 프로젝트를 제거한후 

         다시 추가하여 실행하려면 <Resource 태그를 또 입력해줘야 한다.

         이러한 번거로움을 피하기 위해서는

         server영역에 있는 context.xml문서를 복사하여 META-INF 폴더에 context.xml를 넣고

         context.xml문서안에 <Resource 태그를 추가한다.




    

    3. Java문서에서 DBCP연결하기

      => 로드와 연결부분이 DBCP로 변경됨

   


      *tomcat.apache.org 사이트에 접속 하여 복사함.

      Context initContext = new InitialContext();

      Context envContext  = (Context)initContext.lookup("java:/comp/env");

      DataSource ds = (DataSource)envContext.lookup("jdbc/myoracle");

      Connection conn = ds.getConnection();



     => 위 문장 변경소스

      Context ct= new InitialContext();

      DataSource ds = (DataSource)ct.lookup("java:/comp/env/Resource태그name");

      Connection conn = ds.getConnection();


-----------------------------------------------------------

 - 회원관리를 위한 준비사항

  1. 회원가입

     - ID중복체크기능

     - 우편번호검색기능

     - 가입


  2. 로그인

     -세션의 정보를 이용하여 로그인여부 판별


  3. 로그아웃

     - 세션의 정보 모두 삭제


  4. 회원정보수정

      -로그인 된 상태에서 로그인된 사용자의 정보를 수정.


  5. 회원탈퇴

     - 로그인된 상태에서 회원탈퇴가능.


----------------------------------------------------------------

  *DB설계

  -회원테이블생성

    create table userlist(

userid varchar2(20)  not null constraint pk_id primary key, --사용자아이디

userpass varchar2(20) not null,  --비밀번호

username varchar2(20) not null, --이름

socialid1 varchar2(6)  not null, --주민등록번호앞자리

socialid2 varchar2(7)  not null, --주민등록번호뒷자리

birth date  not null, --생년월일

address varchar2(50) not null, --주소

zip varchar2(7)  not null, --우편번호

email varchar2(50), --전자메일주소

job varchar2(50) --직업

   )


  -우편번호테이블생성

  create table zip_table(

     zipcode varchar2(50),

     sido varchar2(50),

     gu varchar2(50),

     dong varchar2(100),

    bunji varchar2(50)

)


  * 추가적으로 우편번호자료 엑설문서를 import하여 zip_table에 레코드추가한다.


---------------------------------------------------------------------------

  * Java문서 작성(MVC패턴구조)

    - gaon.user.UserList.java

        => form에 해당하는 setXxx(), getXxx()작성 


   - gaon.user.ZipCode.java

       => zip_table에 있는 컬럼에 해당하는 setXxx(), getXxx() 작성


   - gaon.user.UserListDAO.java

      1. 생성자작성 - DBCP로드하기


      2. DB 닫기기능 메소드

        public void dbClose(){   }


      3. ID중복체크기능 메소드

        public boolean userIdCheck(String userid ){

          Stirng sql="SELECT * FROM userlist WHERE userid=?";

            => ResultSet의 결과 레코드가 있다면 true,

               없다면 false 리턴함.

               (true는 사용안됨-중복/ false 사용가능함)


        }

         

     

      4. 우편번호검색기능메소드(동을 입력받아 동에 해당하는 레코드 리턴)

       public ArrayList<ZipCode> zipCheck(String dong){

String sql="SELECT * FROM zip_table WHERE dong LIKE '%화양동%'";

        *주의 : like 연산자를 이용할때 PreparedStatement사용안됨

                Statement를 이용함. 


      }


     5. 회원가입기능 메소드(userlist테이블에 insert기능)

     public int userInsert(UserList user){

       String sql="insert into userlist values(?,?,?,?,?,?,?,?,?,?)";

       *주의 : birth 컬럼 =>  year-month-day 로 만들어 저장하기

               zip 컬럼 =>  zip1-zip2 로 만들어 저장하기

               address컬럼 => address1 , address2 만들어 저장하기 

               email 컬럼  => 

                   email2의 값이 dir 이면  email1@email3 연결

                   아니면   email1@email2 연결


     }


    6. 로그인 기능 메소드

     public String userLoginCheck(String userid, String userpass){

      String sql="select * from userlist WHERE userid=?";

       만약, 위 실행문장의 결과의 레코드가 존재하지 않는다면 "0" 리턴

            존재한다면 인수로 받은 userpass와 DB에 있는 userpass를

            비교하여 같으면 username을 리턴, 다르면 "1" 리턴한다.

           

            "0" => ID존재안함.   "1" => 아이디 있으나 비번오류

            username => 로그인성공     

    }


    7. 특정 ID에 해당하는 회원정보 가져오기 기능 메소드

      public UserList getUserList(String userid){

       String sql="select * from userlist WHERE userid=?";


     }


   8. 특정 ID에 해당하는 회원정보 수정 기능 메소드

     public int userUpdate(UserList user){

       String sql="UPDATE USERlist 

                SET userpass=? , address=? , zip=?,email=?, job=?

                WHERE userid = ?"


        *주의 : zip 컬럼 =>  zip1-zip2 로 만들어 저장하기

                address컬럼 => address1 , address2 만들어 저장하기 

                email 컬럼  => 

                   email2의 값이 dir 이면  email1@email3 연결

                   아니면   email1@email2 연결


     }


  9. 회원탈퇴기능 메소드 

   public int userDelete(String userid, String userpass){

    String sql="DELETE userlist WHERE userid=? AND userpass=?";

  }



  10. 관리자모드로 접속했을때 관리자모드 메뉴를 클릭하면

      가입된 모든 회원정보 가져오기기능 메소드 작성

    public ArrayList<UserList> getAllUserList(){

      String sql="select * from userlist  order by userid";

    }    


 



-------------------------------------------------------------

  -JSP문서 준비

      index.jsp(메인화면)


      left.jsp(메인화면 왼쪽부분)

       => 세션의 정보가 있는 경우(로그인 된 경우)는 로그아웃/정보수정/ 회원탈퇴 버튼

          세션의 정보가 없는 경우(로그인 안된 경우)는 로그인/ 회원가입 버튼


      right.jsp (메인화면의 오른쪽 부분)

       => 세션의 정보가 있는 로그인된 상태의화면과

          세션의 정보가 없는 로그인되지 않은 상태의 화면을 구분한다.


      userinput.jsp(회원가입폼)

      confirmId.jsp (ID 중복체크 폼)

      zipcode_select.jsp(우편번호검색 폼)


      userPro.jsp(가입버튼클릭했을때 이동하여 가입처리 해주는 부분)

      userLogin.jsp(로그인 처리 페이지)

      userLogout.jsp(로그아웃 처리페이지)

      userInfo.jsp (정보수정 버튼을 클릭했을때 회원정보 폼에 출력)

      userUpdatePro.jsp(회원정보수정처리 부분)

      userDelete.jsp(회원탈퇴처리 부분)


  - 기타문서(css/ javascript)


 ------------------------------------------------------------



 * 게시판만들기위한 준비사항

  

   -기능부분

   1. 게시물 등록

      

   2. 게시물 리스트 뿌리기

      (페이지분할 / 검색기능 추가)


  3. 제목을 클릭했을때 글번호에 해당하는 게시물 상세보기


  4. 상세보기 페이지에서  수정 / 삭제/ 답글 기능



 - 테이블설계

  1. 게시판 테이블

 create table board(

b_id number(5) primary key, -- 글번호 

b_name varchar2(20),-- 글쓴이 

b_email varchar2(50),-- 글쓴이 메일 주소 

b_title varchar2(80),-- 글 제목 

b_content varchar2(3000),-- 글 내용 

b_pwd varchar2(12),-- 비밀번호 

b_date date,-- 글쓴날짜 

b_count number(5) default 0,-- 조회횟수 

b_ip varchar2(15),-- 글쓴이 아이피주소 

b_depth number(5),-- 답글깊이

b_pos number(5)-- 화면에 출력되는 글의 위치

)


 2. 글번호 자동증가컬럼을 위한 시퀀스 

  create sequence seq_id nocache

    


 - java문서 준비(MVC구조)


  1. gaon.board.BoardBean.java(저장소)

      board 테이블 컬럼에 해당하는 setXxx(), getXxx() 준비


  2.gaon.board.BoardDAO.java (DB연동에 해당하는 문서)

    - 생성자 (DBCP준비)


    - dbClose() => DB닫기 기능 작성


   - 게시물 등록하는 메소드 작성

     public int insertBoard(BoardBean bean){

       String sql="INSERT INTO board 

          VALUEs(SEQ_ID.NEXTVAL,?,?,?,?,?,SYSDATE ,0,?,0,0 )";


       *주의 : insert하기 전에 b_pos의 값을 증가하는 메소드 호출한다.

     }

   

   - 게시물등록 전에 b_pos의 값을 증가하는 메소드 작성

     public void upPos(){

      String sql="update board set b_pos=b_pos+1 "

     }

      

   -모든게시물 목록리스트 가져오는 메소드 작성

    public ArrayList<BoardBean> getBoardList(){

      String sql="select * from board order by b_pos";

    }

     중요 : 페이지분할을 할때 현재 페이지번호 인수로 들어옴

            검색기능을 추가하면 검색필드와 검색단어 인수로 들어옴.



 - 글번호에 해당하는 게시물 가져오는 메소드 작성.

   public BoardBean getBoard(int b_id){

     String slq="select * from board where b_id=?"

   }



 - 상세보기 했을때 조회수 증가하는 메소드 작성

   public void upCount(int b_id){

     String sql="update board set b_count = b_count+1 where b_id =? "

   }



 - 글번호에 해당하는 게시물 수정하는 메소드 작성

  public int updateBoard(BoardBean bean){

    String sql="UPDATE board SET b_name=?, b_email=? , 

b_title=?, b_content =?

      WHERE b_id= ?"

  }


 - 글번호에 해당하는 게시물 삭제하는 메소드 작성

  public int deleteBoard(int b_id){ 

    String sql="delete board where b_id=?";


  }   


 - 답글 등록하는 메소드 작성

  public int replyInsertBoard(BoardBean bean){

    String sql="INSERT INTO board 

          VALUEs(SEQ_ID.NEXTVAL,?,?,?,?,?,SYSDATE ,0,?,

          부모b_depth+1, 부모b_pos+1 )"


  }


 - 답변게시물일 경우에 답변할 게시물의 b_pos 값보다 큰값들의

   b_pos를 1씩 증가시키는 메소드 작성.

 public void replyupPos(int b_pos){//b_pos 부모글의 b_pos 값.

   String sql="update board set b_pos=b_pos+1 where b_pos > ? "


 }




 3. gaon.board.PageAction.java 

   => 페이지분할 역할을 담당할 문서.



-------------------------------------------------------

 - Jsp문서 

  1. write.jsp => 게시물등록폼 / 답변등록 폼 

 

  2. write_ok.jsp => 게시물 등록/답변 처리를 담당할 문서

 

  3. list.jsp => 모든 게시물을 보여주기 위한 페이지

                 (페이지분할 / 검색 기능 추가)


  4. show.jsp => 글 제목을 클릭하여 글번호에 해당하는 게시물을 폼에

                 보여주는 문서 ( 이때  조회수 증가 함)

                 ( 수정 / 삭제 / 답변 / 목록 )


  5. edit.jsp => 게시물 수정버튼을 클릭했을때 게시물 수정할수 있도록

                  폼에 게시물 뿌리기


  6. edit_ok.jsp => 게시물 수정 처리 를 담당하는 문서


  7. delete.jsp => 게시물 삭제버튼 클릭했을때 삭제 폼.

  

  8. delete_ok.jsp= > 게시물 삭제처리를 담당할 문서.


  

- CSS와 javaScript 필요.  


--------------------------------------------------------------

 * Page분할 준비하기

 1. 전체레코드수를 구한다.

    (select count(*) from board) => totalCount 변수에 저장


 2. 한 페이에 뿌려질 게시물의 수를 정한다.

     => pageSize 변수에 저장


 3. 한 블록당 뿌려질 [페이지번호][페이지번호]의 개수를 정한다.

     => blockCount 변수에 저장


 4. 총 페이지수를 구한다.

    => (int)Meth.ceil( ((double)totalCount / pageSize));  

        pageCount 변수에 저장한다.


 5. 페이지번호에 해당하는 게시물의 시작점 구한다.

    (현재페이지번호-1) * pageSize+1 ; 

      => absoule 변수에 저장한다.

    

    중요 :  ResultSet의 결과물의 커서를 특정 위치로 이동하기 위해서는

            con.createStatement 나 con.PrepareStatement 를 사용할때

            Resultset 타입와 권한 속성을 지정해야한다.


    ex)

       con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE , 

           ResultSet.CONCUR_UPDATABLE);


----------------------------------------------------------------------

 6. 화면에 출력 준비사항

   

   - 화면의 시작페이지를 구한다(몇번부터 출력 할지를 정함 [번호] ) 

    =>

     int temp =  (현재페이지번호-1) % 블록당뿌려질 []의개수; 

     int startPage = 현재페이지번호 - temp; => []의 시작번호임.



  - [이전] 만들기

    

    if(시작페이지번호 - 한블록당뿌러질 []개수 >  0){

       [이전] 출력한다.

    }


    ex) if((startPage - blockCount) > 0 ){


        }

    


 - 페이지번호 나열하기 

  

    for(int i = 시작페이지번호 ; i < (시작페이지번호+블록당[]개수) ; i++){

        페이지번호 출력

        if(i> 총페이지수) break;

    }


   ex)

     for(int i=startPage ; i< (startPage+blockCount) ; i++){

          페이지번호 출력

          if(i >= pageCount) break;


     }



  - [다음]  만들기


    if( (시작페이지 + 블록당뿌러질[]개수) <= 총페이지수 ){

        [다음] 출력

    }    


    ex) 

      if((startPage + blockCount) <= pageCount){

         [다음] 출력

      }

   

     

  * 변수 정리

   int totalCount ; => 총레코드수

   int pageSize ; => 한페이지에 보여질 게시물 수

   int blockCount ; => 한 블록당 뿌려질 []의 개수

   int pageCount ; => 전체페이지 수

   int startPage ; => 한블록에서 보여질 []의 시작번호

   int absoulte ; => DB결과의 ResultSet에 있는 전체레코드 중

                     시작부분을 가져올 변수


   int pageNum ; => 현재 페이지 번호      

------------------------------------------------------------------

  * 검색 기능 추가

   1. 검색기능에 해당하는 form을 작성


 <!-- 검색 부분 -->

<form action="list.jsp" name="search" method="post">

<table border=0 width=527 align=center cellpadding=4 cellspacing=0 >

 <tr>

  <td align=center valign=bottom>

   <select name="keyField" size=1 >

    <option value="b_name"> 이 름

    <option value="b_title"> 제 목

    <option value="b_content"> 내 용

   </select>

   <input type="text" size=16 name="keyWord"  value="">

   <input type="button"  value="찾기" onClick="check()">

   <input type="hidden" name="pageNum" value="<%=pageNum%>">

  </td>

 </tr>

</table>

</form>



<script>

function check(){

     if (document.search.keyWord.value == ""){

alert("검색어를 입력하세요.");

document.search.keyWord.focus();

return;

    }

document.search.submit();

 }


</script>



 * 검색 기능 추가할때  쿼리문 작성


--이름 으로 검색

SELECT * FROM BOARD WHERE b_name LIKE '%검색단어%'


--제목 으로 검색

SELECT * FROM BOARD WHERE b_title LIKE '%검색단어%'


--내용 으로 검색

SELECT * FROM BOARD WHERE b_content LIKE '%검색단어%'



*get방식


list.jsp?pageNum=값&keyField=값&keyWord=값


------------------------------------------------------------

 * 파일업로드 하기

  

   - 파일업로드에 필요한 컴포넌트(라이브러리) 다운로드

     http://www.servlets.com/cos/

     

   -다운로드한 라이브러리를 압축을 풀어 lib폴더에 있는

    cos.jar를 파일을 이클립스 lib폴더에 넣는다.



  - 파일업로드 폼.

  <form name="f" action="upLoadPro.jsp" method="post" 

 enctype="multipart/form-data">

   이름 : <input type="text"  name="name"><br>

    제목 : <input type="text"  name="subject"><br>

    파일첨부 : <input type="file"  name="file"><br>

     <input type="submit"  value="전송">

    <input type="reset"  value="취소">

</form>


   *주의 : method는 반드시 post 방식

           enctype="multipart/form-data"  필수


 

  - 폼으로 넘어온 값 받기(파일업로드)

    

   MultipartRequest m = new MultipartRequest(request , 저장폴더 , 최대용량 ,

             한글인코딩 , 같은이름파일처리방법 );


   m.getParameter("name") ;//text박스의 값 가져오기

   m.getFilesystemName("file"); //file 박스의 첨부파일가져오기


   File f = m.getFile("file") ;//첨부된 파일의 정보 


-------------------------------------------------------------

 -파일다운로드 기능(Servlet문서 작성)

 

  1. HttpServlet 상속받는다.


  2. 기능 

  

   - 업로드된 파일의 경로 알아오기

   - 한글파일 인코딩 설정(8859_1  -> euc-kr 변환)

   - 요청된 파일이름을 File객체 변환

   - ContentType설정

       => 서버가 클라이언트쪽으로 보낼때 인코딩 설정 , MIMEType설정

      * 브라우져가 해석가능한 파일을 열지못하도록 설정

         - 한글인코딩( euc-kr  -> 8859_1 변환)

         - 헤더설정(헤더란 http에게 자신의 파일의 정체를 알리는것)


   -실제파일을 클라이언트쪽으로 다운로드 한다.

    (InputStream / OutputStream) 


 

*다운로드기능 servlet 링크걸기

 <a href="/프로젝트명/서블릿클리스이름?fileName=파일이름">

    파일이름

 </a>


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

servlet을 이용한 업로드 게시판 만들기


 1. 테이블 설계

create table upLoad(

b_id number(5) primary key, -- 글번호 

b_name varchar2(20),-- 글쓴이 

b_email varchar2(50),-- 글쓴이 메일 주소 

b_title varchar2(80),-- 글 제목 

b_content varchar2(3000),-- 글 내용 

b_pwd varchar2(12),-- 비밀번호 

b_date date,-- 글쓴날짜 

b_count number(5) default 0,-- 조회횟수 

b_ip varchar2(15),-- 글쓴이 아이피주소 

b_depth number(5),-- 답글깊이

b_pos number(5),-- 화면에 출력되는 글의 위치 

         b_fname varchar2(100), --파일이름

         b_fsize number  --파일용량

)


2. 시퀀스 생성

 create sequence upload_seq  NOCACHE;


3. 자바문서

  - gaon.upload.UpLoadBean.java

     => setXxx(), getXxx() 저장소


  - gaon.upload.UpLoadDAO.java

     => upload에 관한 DB처리 부분


 - gaon.board.PageAction.java

     => 페이지 분할에 관련된 부분

        (게시판에서 사용한 페이지분할 그대로 사용함)



4. jsp문서 

  - 등록 / 답변

    write.jsp ->  Write_OK.java  -> list.jsp

 

 - list.jsp문서에서 제목클릭(읽기) show.jsp  이동

   show.jsp 

    수정 -> edit.jsp -> Edit_OK.java -> show.jsp

    삭제 -> delete.jsp -> Delete_OK.java -> list.jsp

    답글 -> write.jsp -> Write_OK.java -> list.jsp

    목록 -> list.jsp


  *주의 : 각 페이지로 이동할때 pageNum, keyField, keyWord

          폼으로 가지고 이동.



 5. css 나 javascript 필요

    

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

  

  - 표현언어(EL - Expression Language)

    => jsp 2.0 새롭게 추가된 스크립요소

    => 자바 빈즈 속성값을 보다 쉽고 제약을 덜 받는 방법으로

       사용하기 위해 나옴.

    => 기본문법

      - 표현언어는 $시작한다.

      - 모든 내용은 {표현식} 으로 구성된다.

      - 표현식에는 기본적으로 변수명 혹은 속성명.메소드 구조로

        이루어짐.

      - 표현식에는 정수형, 실수형, 문자열형, 논리형, null 올수있음.

      - 표현식 연산가능함.


   => 표현언어 연산자

     - 산술연산자

         + ,- , *, /(div) , %(mod)

        ex) ${10 div 2}


    -관계연산자

      ==(eq) , !=(ne) , >(gt) , <(lt) , >=(ge) , <=(le)

       ex) ${5 gt 2}

   

    - 조건연산자

      조건식 ? 참 : 거짓

     

   - 논리연산자

      &&(and),  ||(or) , !(not)


  => 표현언어 내장객체

    -pageScope  => page기본객체에 저장된 속성

    -reqeustScope =>reqeust기본객체에 저장된 속성

    -sessionScope => session기본객체에 저장된 속성

    -applicationScope => application기본객체에 저장된 속성



     ex) <%=session.getAttriubte("id")%>님

          ${sessionScope.id}님


    -param  => 요청 prameter의 name에 해당하는 값 가져옴

              ex) ${param.name}  = (request.getParameter("name"); ) 


    -pageContext => JSP page 기본객체


  * <jsp:useBean id="bean" class="gaon.EL.ProductBean" />

    ex) ${bean.num1}  => bean객체의 getNum1()호출됨.

 

-------------------------------------------------------------

   -TLD(Tag Library Descriptor)

   => 커스텀태그로 사용자가 필요에 의해 직접 만들어 사용하는 것.

   => 방법

      - TagSupport 또는 SimpleTagSupport상속받아 만드는 경우

      

      - jsp2.0에서 추가된 태그파일 이용방법

         => jsp문서에서 태그파일을 이용하기 위해서는

            <%@ taglib tagdir="/WEB-INF/tags" prefix="접두어" %>


            <접두어:태그파일이름/>

            <접두어:태그파일이름>doBody 내용 </접두어:태그파일이름>

         

        => tags폴더에 tag파일 만들기

          -첫줄에 기술한다.

          <%@ tag body-content="empty" pageEncoding="euc-kr" %>

          body-content에 들어가는 값

             empty => 태그body가 없다는 것

             scriptless => 기본이며 커스텀태그 와 html로만 이루어진

                           경우

     

  --------------------------------------------------------------     

  - JSTL(Jsp Standard Tag Library)

   => jsp에서 표준으로 자주사용하는 부분을 미리 태그로 만들어

      놓은것.

  

   => 종류

      코어(core), XML, I18N(국제화) , 데이터베이스(sql), 

      함수(function)


   => http://jakarta.apache.org 사이트에서 관련 라이브러 다운.

      다운받은 파일을 압축을 풀면 두개의 라이브러를 

      lib폴더에 넣는다.

      ( 사이트에서 왼쪽 메뉴 아래쪽에 /taglibs/ 를 클릭 - http://tomcat.apache.org/taglibs/)


   => jsp문서에서 JSTL을 사용하기 위한 선언방법

   <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

   <%@ taglib uri="http://java.sun.com/jsp/jstl/xml" prefix="x"%>

   <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>

   <%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%>

   <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>

   

   

  => 자주사용하는 코어 JSTL 태그

  <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>


  1. <c:out value="값 | 변수명" escapeXml="true|false" />

       escapeXml="true" 는 값에 태그 있으면 문자로 출력됨.


  2. <c:set var="이름" value="값" />

     주의 : value의 값은 무조건 String

            만약 value="${20}" 이면 숫자 20

                 value="${'20'}" 이면 문자 20 

                 value="20"  이면 문자 20 




  3. <c:remove var="이름" />


  4. <c:catch var="이름">

        예외발생 가능성 코드

     </c:catch>

  

  5. <c:if test="조건식" var="결과저장할이름" >

        결과가 true일때 실행문장.

    </c:if>  


 6. <c:choose>

      <c:when test="조건식"> 실행문장 </c:when>

      <c:when test="조건식"> 실행문장 </c:when>

      <c:when test="조건식"> 실행문장 </c:when>

      ....

      <c:otherwise> 위조건이외의 경우 실행문장 </c:otherwise>

   </c:choose>



 7. <c:forEach var="이름" begin="시작" end="끝" step="단계"

     item="항목" varStatus="현재상태에대한값" >

     

     ${상태나타내는변수.index}

     ${상태나타내는변수.count}

     ${이름}

  

   </c:forEach>





 8. <c:forTokens item="데이터" delims="구분자" var="이름">

        ${이름}

    </c:forTokens>



 9. <c:import uri="파일명" var="이름" />



 10. <c:url value="URL주소" var="이름" />


     <c:url value="URL주소" var="이름" >

         <c:param name="이름"> 값 </c:param>

     </c:url>


    ex) <a href="${이름}" >클릭</a>

   


 11. <c:redirect uri="" >

         <c:param name="이름"> 값 </c:param>

     </c:redirect>


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














   


 11. <c:redirect uri="" >

         <c:param name="이름"> 값 </c:param>

     </c:redirect>


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














반응형

'SKILL > JSP' 카테고리의 다른 글

JSP include(지시자/액션태그)  (0) 2018.01.08
jsp_ 1일차  (0) 2018.01.08