JSP And Servlet

카테고리 없음 2012. 2. 5. 14:47 Posted by js™


관련서적: 뇌를 자극하는 JSP&Servlet

1. JSP & Servlet
1) about Servlet, JSP
웹서버(Tomcat) <- Request, Response -> 웹브라우저(IE, FF)

Servlet: 자바를 기반으로 하는 웹 애플리케이션 프로그래밍 기술(Servlet Specification)
- 플랫폼 독립성, 네트워크 보안이 용이, 멀티스레드 기능 지원, 자바의 풍부한 라이브러리

JSP(Java Server Page): HTML 문서에 자바 코드가 삽입되는 구조

2) JDK Install
Site: http://java.sun.com

3) Tomcat Install
Site: http://tomcat.apache.org

4) HTML, JSP Test
HTML Test
http://localhost:8080/hello.htm

brain - Web Application Directory
http://localhost:8080/brain/hello.htm

JSP Test
http://localhost:8080/brain/first.jsp

2. Servlet
1) Servlet Class
Servlet Class --Instantiation--> Servlet Object --Initialization--> Servlet
Multi Thread Model, Single Thread Model

서블릿 클래스를 작성할때 지켜야 할 규칙 세가지
- 서블릿 클래스는 javax.servlet.http.HttpServlet 클래스를 상속하도록 만들어야 한다.
- doGet 또는 doPost 메서드 안에 웹 브라우저로부터 요청이 왔을 때 해야 할 일을 기술해야 한다.
- HTML 문서는 doGet, doPost 메서드의 두번째 파라미터를 이용해서 출력해야 한다.

J2EE(Java Platform Enterprise Edition) - API

Compile
javac -cp "d:\tomcat\lib\servlet-api.jar" HundredServlet.java

Copy
java/jer/lib/ext - servlet-api.jar
javac HundredServlet.java

Hudred Servlet Class Setup
brain/WEB-INF/classes/
brain/WEB-INF/web.xml

Adder Servlet
http://localhost:8080/brain/adder.htm

Memo Servlet
http://localhost:8080/brain/memo.htm

3. Basic of JSP
1) JSP Process
JSP --(Converting)-->
   Servlet Class Source Code --(Compile)-->
      Servlet Class File --(Instantiation)-->
         Servlet Object --(Initialization)--> Servlet

2) JSP Scripting Elements
선언부(Declaration)

스크립틀릿(Scriptlet)
<%로 시작해서 %>로 끝나고, 그 사이에 자바 명령문(들)이 들어간다.

익스프레션 언어(Expression Language)
<%=로 시작해서 %>로 끝나고, 그 사이에 자바 식이 들어갈 수 있다.

* 액션(Action)
int arr[] = new int[5];
Random random = new Random();
for (int i=0; i<arr.length; i++)
   arr[i] = random.nextInt(100000000);
request.setAttribute("ARR", arr);
RequestDispatcher rd = request.getRequestDispatcher("Winners.jsp");
rd.forward(request, response);

<c:forEach var="num" items="${ARR}">
 ${num} <br>
</c:forEach>

3) Directive
page directive: 페이지 정보의 기술
http://localhost:8080/brain/page.jsp

attribute list
- contentType, import, buffer, autoFlush, isThreadSafe, session, errorPage
- isErrorPage, isElignored, pageEncoding, info, extends, language
- deferredSyntaxAllowedAsLiteral, trimDirectiveWhitespaces

include directive: 페이지 삽입
http://localhost:8080/brain/include.jsp

taglib directive: 액션을 사용할 떄 필요
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

Comment
<!-- HTML의 주석 -->
/* Java의 주석 */
// Java의 주석
<%-- JSP의 주석 --%>

4) implicit variable(내장변수)
내장변수: JSP 페이지에서 선언하지 않고도 사용할 수 있는 변수
- request, response, out, application, config, pageContext, session, page, exception

request, response, application
http://localhost:8080/brain/name.jsp
http://localhost:8080/brain/hi.jsp

5) File I/O
File Write
http://localhost:8080/brain/txt_form.jsp
http://localhost:8080/brain/txt_proc.jsp

File Read
http://localhost:8080/brain/txt_list.jsp
http://localhost:8080/brain/txt_view.jsp

6) forward, include Method
request.setAttribute("SUM", new Integer(num1+num2));
RequestDispatcher dispatcher = request.getRequestDispatcher("FourRulesResult.jsp");
dispatcher.forward(request, response);
request.getAttribute("SUM");

dispatcher.include(request, response);

4. Cookie, Session
1) Cookie
http://localhost:8080/brain/cookie.jsp

- 쿠키 데이터의 저장
Cookie cookie = new Cookie("name", "son");
response.addCookie(cookie);

- 쿠키 데이터의 조회
Cookie cookies[] = request.getCookies();
String name = cookie.getName();
String value = cookie.getValue();

- 쿠키 데이터의 삭제
Cookie cookie = new Cookie("name", "");

- 쿠키의 수명
cookie.setMaxAge(3600); // 초단위, 0: 바로삭제, -1: 웹브라우저 끝날때

- 특정 경로명에 전송
cookie.setPath("/brain/");
cookie.setDomain(".data.pe.kr");

2) Session
http://localhost:8080/brain/session.jsp

- 세션 데이터의 저장
HttpSession session = request.getSession();
session.setAttribute("id", "js5017");

- 세션 데이터의 조회
HttpSession session = request.getSession();
String str = (String) session.getAttribute("id");

- 세션 데이터의 삭제
session.removeAttribute("id");
session.invalidate();

- 세션 데이터의 수명
session.setMaxInactiveInterval(300); // 초단위

5. Exception
try { }
catch (NumberFormatException e) {
 RequestDispather dispatcher = request.getRequestDispatcher("DataError.jsp");
 dispatcher.forward(request, response);
}

- page 지시자의 사용
<%@page errorPage="DataError.jsp"%>

- exception 내장변수의 사용
<%@page isErrorPage="true"%>
response.setStatus(200);
String message = exception.getMessage();

- Erroe Page 등록(Sub Element)
<error-page>
 <exception-type>java.lang.NumberFormatException</exception-type>
 <location>/NumberFormatError.jsp</location>
</error-page>

- 상태코드에 따른 에러 페이지
<error-page>
 <error-code>404</error-code>
 <location>/NotFoundPage.jsp</location>
</error-page>

6. Life Cycle of Servlet
Servlet Class Load --> Servlet Class --(Instantiation)-->
 Servlet Object --(Initialization)--> Servlet --(Finish)--> Destroy Servlet
 
- 서블릿의 초기화 파라미터 등록
<init-param>
 <param-name>FILE_NAME</param-name>
 <param-value>agreement.txt</param-value>
</init-param>

jspInit Method, jspDestroy Method


config 내장변수
String filename - config.getInitParameter("FILE_NAME");

서블릿의 환경정보
ServletContext context = getServletContext();
String str = context.getServerInfo();
int ver = context.getMajorVersion();

7. Expression Language
EL식: 연산자와 피연산자의 조합을 다음과 같이 ${와 }로 둘러싸서 표현한다.

- setAttribute
request.setAttribute("result", sum);
${result}

- Expression Object
pageScope, requestScope, sessionScope, applicationScope
param, paramValues, header, headerValues, cookie, initParam, pageContext

- ArrayList
ArrayList<String> items = new ArrayList<String>();
items.add("first"); // ${fruit[0]}
items.add("second"); // ${fruit[1]}
items.add("third"); // ${fruit[2]}
request.setAttribute("fruit", items);

- HashMap
HashMap<String, String> map = new HashMap<String, String>();
map.put("Edgar", "Boston");
map.put("Thomas", "Ohaio");
map.put("John", "Washington");
request.setAttribute("addr", map);

TLD(Tag Library Descriptor)

12. Use Database
- MySql
http://dev.mysql.com

- use MySql
mysqladmin -u root -p

- Connector/J Setup
http://dev.mysql.com -> MySql Connector/J
Copy files to /lib
http://localhost:8080/brain/dbconn.jsp

- Database Board
Schema: t_board.sql
List: http://localhost:8080/brain/db_list.jsp
Form: http://localhost:8080/brain/db_form.jsp
Proc: http://localhost:8080/brain/db_proc.jsp
View: http://localhost:8080/brain/db_view.jsp
Del: http://localhost:8080/brain/db_del.jsp

- DB Connection Pool
http://apache.org -> Commons Project -> DBCP, Pool, Collections Module
Copy files to /lib
http://localhost:8080/brain/connPool.jsp

- DB Connection Pool(JOCL)
http://localhost:8080/brain/pool.jsp


Oracle Memo

카테고리 없음 2011. 12. 4. 11:08 Posted by js™
-- 타입
NUMBER
BINARY_INTEGER
PLS_INTEGER
VARCHAR2
CHAR
LONG
NCHAR, NVARCHAR2
RAW, LONG RAW
DATE
TIMESTAMP
INTERVAL
ROWID
UROWID
BOOLEAN

-- 변환 함수
TO_CHAR
TO_DATE
TO_TIMESTAMP
TO_TIMESTAMP_TZ
TO_DSINTERVAL
TO_YMINTERVAL
TO_NUMBER
RAWTOHEX
HEXTORAW
CHARTOROWID
ROWIDTOCHAR

-- 문자열 함수
CONCAT(STR1, STR2)
INITCAP(STR)
LOWER(STR)
LPAD(STR1, X[,STR2])
LTRIM(STR1, STR2)
REPLACE(STR, SEARCH_STR, [,REPLACE_STR])
RPAD(STR1, X[STR2])
RTRIM(STR1 [,STR2])
SOUNDEX(STR)
SUBSTR(STR, A[,B])
SUBSTRB(STR, A[,B])
SUBSTRC(STR, A[,B])
SUBSTR2(STR, A[,B])
SUBSTR4(STR, A[,B])
TRANSLATE(STR, FROM_STR, TO_STR)
TRIM(STR)
UPPER(STR)

-- 숫자값 문자 함수
ASCII(STR)
INSTR(STR1, STR2[,A][,B])
INSTRB(STR1, STR2[,A][,B])
INSTRC(STR1, STR2[,A][,B])
INSTR2(STR1, STR2[,A][,B])
INSTR4(STR1, STR2[,A][,B])
LENGTH(STR)
LENGTHB(STR)
LENGTHC(STR)
LENGTH2(STR)
LENGTH4(STR)

-- NLS 함수
CONVERT(STR, DESC_CHARSET[,SOURCE_CHARSET])
NCHAR(X)
NLS_CHARSET_DECL_LEN(BYTE_WIDTH, CHARSET)
NLS_CHARSET_DECL_ID(CHARSET_NAME)
NLS_CHARSET_NAME(CHARSET_ID)
NLS_INITCAP(STR[,NLSPARAMS])
NLS_LOWER(STR[,NLSPARAMS])
NLS_UPPER(STR[,NLSPARAMS])
NLSSORT(STR[,NLSPARAMS])
TRANSLATE(STR USING {CHAR_CS|NCHAR_CS})
UNISTR(S)

-- 숫자 함수 
ABS(X)
ACOS(X)
ASIN(X)
ATAN(X)
ATAN2(X, Y)
BITAND(X, Y)
CEIL(X)
COS(X)
COSH(X)
EXP(X)
FLOOR(X)
LN(X)
LOG(X, Y)
MOD(X, Y)
POWER(X, Y)
ROUND(X[,Y])
SIGN(X)
SIN(X)
SINH(X)
SORT(X)
TAN(X)
TANH(X)
TRUNC(X[,Y])
WIDTH_BUCKET(X, MIN, MAX, NUM_BUCKETS)

-- 데이트 함수 
ADD_MONTHS(D, X)
CURRENT_DATE
CURRENT_TIMESTAMP[(PRECISION)]
DBTIMEZONE
EXTRACT({YEAR, MONTH, DAY, HOUR, MINUTE, SECOND, TIMEZONE_HOUR, TIMEZONE_MINUTE, TIMEZONE_REGION, TIMEZONE_ABBR} FROM DATETIME OR INTERVAL)
LAST_DAY(D)
LOCALTIMESTAMP[(PRECISION)]
MONTH_BETWEEN(DATE1, DATE2)
NEW_TIME(D, ZONE1, ZONE2)
NEXT_DAY(D, STR)
ROUND(D, [,FORMAT])
SESSIONTIMEZONE
SYS_EXTRACT_UTC(DATETIME)
SYSDATE
SYSTIMESTAMP
TRUNC(D[,FORMAT])
TZ_OFFSET(TIMEZONE)

-- 변환 함수 
ASCIISTR(STR)
BIN TO NUM(NUM[,NUM]...)
CHARTOROWID(STR)
COMPOSE(STR)
DECOMPOSE(STR)
FROM_TZ(TIMESTAMP, TIMEZONE)
HEXTORAW(STR)
NUMTODSINTERVAL(X, UNIT)
NUMTOYMINTERVAL(X, UNIT)
REFTOHEX(REFVALUE)
RAWTOHEX(RAWVALUE)
RAWTONHEX(RAWVALUE)
ROWIDTOCHAR(ROWID)
ROWIDTONCHAR(ROWID)
TO_CHAR
TO_CLOB(STR)
TO_DATE
TO_DSINTERVAL(STR[,NSLPARAMS])
TO_LOB(LONG COLUMN)
TO_NCHAR
TO_MULTI_BYTES(STR)
TO_NCLOB(STR)
TO_NUMBER
TO_SINGLE_BYTE(STR)
TO_TIMESTAMP
TO_TIMESTAMP_TZ
TO_YMINTERVAL(STR)

-- 집계 함수와 해석 함수 
AVG([DISTINCT|ALL] COL)
CORR(X1, X2)
COUNT(*|[DISTINCT|ALL] COL)
COVAR_POP(X1, X2)
COVAR_SAMP(X1, X2)
CUME_DIST
DENSE_RANK
GROUP_ID()
GROUPING
GROUPING_ID
MAX([DISTINCT|ALL] COL)
MIN([DISTINCT|ALL] COL)
PERCENTILE_CONT
PERCENTILE_DISC
PERCENT_RANK
RANK
REGR 함수 
STDDEV([DISTINCT|ALL] COL)
STDDEV_POP(COL)
STDDEV_SAMP(COL)
SUM([DISTINCT|ALL] COL)
VAR_POP(X)
VAR_SAMP(X)
VARIANCE([DISTINCT|ALL] COL)

-- 기타 함수 
BFILENAME(DIRECTORY, FILE_NAME)
COALESCE(EXPR1, ...,[EXPRN])
DECODE(BASE_EXPR, COMP1, VAL1, COMP2, VAL2, ... DEFAULT)
DUMP
EMPTY_BLOB/EMPTY_CLOB
EXISTNODE(XMLTYPE_INSTANCE, XPATH_STRING)
EXTRACT(XMLTYPE_INSTANCE, XPATH_STRING)
GREATEST(EXPR1[,EXPR2] ...)
LEAST(EXPR1[,EXPR2] ...)
NULLIF(A, B)
NVL(EXPR1, EXPR2)
NVL2(EXPR1, EXPR2, EXPR3)
SYS_CONNECT_BY_PATH
SYS_CONTEXT(NAMESPACE, PARAM[,LENGTH])
SYS_DBURIGEN
SYS_GUID
SYS_TYPEID(OBJECT_TYPE)
SYS_XMLAGG
SYS_XMLGEN
TREAT(EXPR AS [REF][SCHEMA.]TYPE)
UID
USER
USERNV
VSIZE(X)

-- 커서 속성 
%FOUND
%NOTFOUND
%ISOPEN
%ROWCOUNT
NO_DATA_FOUND

-- 오라클 예외 
DUP_VAL_ON_INDEX
TIMEOUT_ON_RESOURCE
TRANSCATION_BACKED_OUT
INVALID_CURSOR
NOT_LOGGED_ON
LOGIN_DENIED
NO_DATA_FOUND
SYS_INVALID_ROWID
TOO_MANY_ROWS
ZERO_DIVIDE
INVALID_NUMBER
STORAGE_ERROR
PROGRAM_ERROR
VALUE_ERROR
ROWTYPE_MISMATCH
CURSOR_ALREADY_OPEN
ACCESS_INTO_NULL
COLLECTION_IS_NULL
SUBSCRIP_OUTSIDE_LIMIT
SUBSCRIPT_BEYOND_COUNT
CASE_NOT_FOUND
SELF_IS_NULL

-- 컬렉션 메소드 
EXISTS
COUNT
LIMIT
FIRST&LAST
NEXT&PRIOR
EXTEND
TRIM
DELETE

-- EXECUTE IMMEDIATE로 쿼리하기 
V_SQL VARCHAR2(200);
V_CLASS CLASSES%ROWTYPE;
V_SQL := ' SELECT * FROM TBL_STUDENT' || ' WHERE DESC = :desc';
EXECUTE IMMEDIATE V_SQL INTO V_CLASS;

-- 프로시저 파라미터 
CREATE OR REPLACE PROCEDURE MODETEST
(
P_INPARAM IN NUMBER,
P_OUTPARAM OUT NUMBER,
P_IOPARAM IN OUT NUMBER
) IS
V_LOCALVAR NUMBER := 0;
BEGIN

IF (P_INPARAM IS NULL) THEN
DBMS_OUTPUT.PUT('NULL');
ELSE
DBMS_OUTPUT.PUT('P_INPARAM' || P_INPARAM);
END IF;

END;

-- 모의칼럼
CURRVAL, NEXTVAL
LEVEL
ROWID
ROWNUM

-- 일반구조
DECLARE
-- 선언절
BEGIN
-- 실행절
EXCEPTION
-- 예외 처리절
WHEN OTHERS THEN
END;

-- RETURNNING
V_NEWROWID ROWID;
INSERT INTO TBL_STUDENT (FIRST_NAME, LAST_NAME) VALUES ('Son','JungSeung');
RETURNING ROWID INTO V_NEWROWID;
DBMS_OUTPUT.PUT_LINE(V_NEWROWID);

-- 조건문
DECLARE
V_TOTALSTUDENTS NUMBER;
V_CNT BINARY_INTEGER := 1;

BEGIN
SELECT COUNT(*) INTO V_TOTALSTUDENTS FROM TBL_STUDENT;
IF V_TOTALSTUDENTS = 0 THEN
-- 쿼리
ELSEIF V_TOTALSTUDENTS < 5 THEN
-- 쿼리
ELSE
-- 쿼리
END IF;
LOOP
-- 쿼리
V_CNT := V_CNT + 1;
EXIT THEN V_CNT > 50;
END LOOP;
FOR V_CNT IN 1..50 LOOP
-- 쿼리
END LOOP;
CASE V_TOTALSTUDENTS
WHEN 0 THEN
-- 쿼리
WHEN 5 THEN
-- 쿼리
ELSE 
-- 쿼리
END CASE
END

-- 커서
DECLARE
V_FIRSTNAME VARCHAR2(20);
V_LASTNAME VARCHAR2(20);
CURSOR C_STUDENTS IS 
SELECT FIRST_NAME, LAST_NAME FROM TBL_STUDENT;
BEGIN
OPEN C_STUDENTS;
LOOP
FETCH C_STUDENTS INTO V_FIRSTNAME, V_LASTNAME;
EXIT WHEN C_STUDENTS%NOTFOUND;
END LOOP;
CLOSE C_STUDENTS;
END;

-- 프로시저
CREATE OR REPLACE PROCEDURE SERVICEPROCEDURE AS
BEGIN
NULL;
END SERVICEPROCEDURE;

-- 라벨, 프로시저 쿼리
<<L_TEMP_TABLE>>, CREATE OR REPLACE PROCEDURE P_TEMP_TABLE AS
DECLARE 

V_NUM1 NUMBER := 1;
V_NUM2 NUMBER := 2;
V_STRING1 VARCHAR2(50) = 'Hello World!';
V_STRING2 VARCHAR2(50) = 'Hi, Oracle!';
V_OUTPUTSTR VARCHAR2(50);
BEGIN
INSERT INTO TEMP_TABLE(NUM_COL, CHAR_COL) VALUES (V_NUM1, V_STRING1);
INSERT INTO TEMP_TABLE(NUM_COL, CHAR_COL) VALUES (V_NUM2, V_STRING2);
SELECT CHAR_COL INTO V_OUTPUTSTR FROM TEMP_TABLE WHERE NUM_COL = V_NUM1;
DBMS_OUTPUT.PUT_LINE(V_OUTPUTSTR);
SELECT CHAR_COL INTO V_OUTPUTSTR FROM TEMP_TABLE WHERE NUM_COL = V_NUM2;
DBMS_OUTPUT.PUT_LINE(V_OUTPUTSTR);
ROLLBACK;

END L_TEMP_TABLE;, END P_TEMP_TABLE;

-- 트리거
CREATE OR REPLACE TRIGGER ONLYPOSITIVE

BEFORE INSERT OR UPDATE OF NUM_COL ON TEMP_TABLE 
FOR EACH ROW
BEGIN

IF :NEW.NUM_COL < 0 THEN
RAISE_APPLICATION_ERROR(-20100, 'Please insert a positive value');
END IF;

END ONLYPOSITIVE;

-- 트랜잭션
DECLARE

PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
COMMIT;

END;

-- 디비 링크
CREATE DATABASE LINK EXAMPLE_BACKUP
CONNECT TO EXAMPLE IDENTIFIED BY EXAMPLE
USING 'BACKUP_DATABASE';
UPDATE TBL_STUDENT@EXAMPLE_BACKUP SET FIRST_NAME = 'SON' WHERE ID=10005;

-- 페이징 쿼리
select * from 
(
         select rownum as rnum, name, address from members
) where rnum between (:PageNo * (:PageNo-1)) and ((:PageNo * (:PageNo-1)) + :PageSize )

SELECT * FROM (
     SELECT ROWNUM AS RNUM, A.* FROM (
          {검색쿼리 - 정렬이 필요할 경우 정렬조건 포함}
    ) A WHERE ROWNUM <= {범위까지}
) WHERE RNUM > {범위부터};

SELECT * FROM (
     SELECT /*+ INDEX_ASC or INDEX_DESC(A {정렬조건 인덱스명}) */
                 ROWNUM AS RNUM, A.*  FROM (
          {검색쿼리 - 정렬이 필요한 경우 정렬조건을 포함하지 않고 ORACLE 힌트사용}
     ) A WHERE ROWNUM <= {범위까지}
) WHERE RNUM > {범위부터};

select * from members where age>20 and CEIL(rownum/:PageSize) = :PageNo

커스텀 모달 정보창

카테고리 없음 2011. 10. 9. 01:49 Posted by js™

ModalController *mc = [[[ModalController alloc] init] autorelease];
mc.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentModalViewController:mc animated:YES];
 
[[self parentViewController] dismissModalViewControllerAnimated:YES];