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