* 이미지에요.(화면단에서 OptGroup Label 명은 선택되지 않는다)

'공부 > JSP' 카테고리의 다른 글

JSP_[ <init-param> & <context-param> ]  (0) 2015.02.12
JSP_[ forward 와 sendRedirect ]  (0) 2015.02.11
JSP_[ 첨부파일 유무확인 ]  (0) 2014.06.03
JSP_[ ServletConfig 와 ServletContext 차이점 ]  (0) 2014.06.02
JSP_[ EL 비교연산자 ]  (0) 2014.03.11

▶ <init-param>

jsp 파일은 web.xml 파일에 등록하지 않아도, 웹 브라우저에서 호출할 수 있지만, 

초기화 파라미터를 기재하기 위해서는 web.xml 파일에 등록해야 한다.


- 등록

<webapp>

<servelt>

<servlet-name>DBName-jsp</servlet-name>

<jsp-file>/DBName.jsp</jsp-file>

<init-param>

<param-name>DB_NAME</param-name>

<param-value>Oracle</param-value>

</init-param>

</servlet>

<servlet-mapping>

<servlet-name>DBName-jsp</servlet-name>

<url-pattern>/DBName</url-pattenr>

</servlet-mapping>

</webapp>


- 호출

<url-pattern> 의 값으로 호출 (http://localhost:8080/DBName) 하고,

실제 jsp 파일은 <jsp-file> 에 입력한 /DBName.jsp 가 호출되며, 해당 jsp 내에서 <init-param>에 입력한

초기화 파라미터를 사용할 수 있다.


- 사용(/DBName.jsp 안에서 사용한다고 가정)

<%

String dbName = config.getInitParameter("DB_NAME");

%>



▶ <context-param>

웹 어플리케이션 전체에서 호출가능한 초기화 파라미터


- 등록

<webapp>

<context-param>

<param-name>DB_NAME</param-name>

<param-value>Oracle</param-value>

</context-param>

</webapp>


- 호출

<init-param> 와 같이 특정 서블릿(& JSP)에 속하는 초기화 파라미터뿐 아니라 웹 어플리케이션 전체에서 호출 및 사용가능


- 사용

<%

    String dbName = application.getInitParameter("DB_NAME");

%>

※ JSP 내 에서 익스프레션 'EL' 문으로도 사용가능하다

1. ${initParam["DB_NAME"]}

2. ${initParam.DB_NAME}

'공부 > JSP' 카테고리의 다른 글

JSP_[ SelectBox 그룹묶기(HTML) ]  (0) 2015.03.20
JSP_[ forward 와 sendRedirect ]  (0) 2015.02.11
JSP_[ 첨부파일 유무확인 ]  (0) 2014.06.03
JSP_[ ServletConfig 와 ServletContext 차이점 ]  (0) 2014.06.02
JSP_[ EL 비교연산자 ]  (0) 2014.03.11

▶ sendRedirect 는 URL 을 웹 브라우저로 보내서 간접적으로 웹 자원을 호출하지만, forward 메서드는 웹 서버쪽에서 호출

▶ sendRedirect 메서드를 이용하면 다른 웹 서버에 있는 웹 자원도 호출 가능 하지만, forward 메서드는 같은 웹 서버,

    같은 웹 어플리케이션 디렉터리 내에 있는 웹 자원만 호출 가능하다.

▶ sendRedirect 는 텍스트 데이터만 전달할 수 있지만, forward 메서드는 객체 형태의 모든 데이터를 전달할 수 있다.

▶ sendRedirect 는 한글 데이터를 전달하기 위해서는 URL 인코딩을 해야 하지만, forward 메서드는 그런 작업이 필요치 않다.

 

- ex)

- forward

RequestDispatcher dispatcher = request.getRequestDispatcher(url);
dispatcher.forward(request, response);

 

- sendRedirect

response.sendRedirect(url);

'공부 > JSP' 카테고리의 다른 글

JSP_[ SelectBox 그룹묶기(HTML) ]  (0) 2015.03.20
JSP_[ <init-param> & <context-param> ]  (0) 2015.02.12
JSP_[ 첨부파일 유무확인 ]  (0) 2014.06.03
JSP_[ ServletConfig 와 ServletContext 차이점 ]  (0) 2014.06.02
JSP_[ EL 비교연산자 ]  (0) 2014.03.11

- 첨부파일 유무확인


* JSP 에서 첨부파일 하려면 <form> 태그에서 type = "multipart/form-data" 주어야한다.

* 그럼... Controller 단에서 HttpServletRequest 받아서 체크하면 되겟다.


* EX)

  1. Controller 단에서 HttpServletReqeust request 로 받았다고 가정하고...

  2. 

      String type = request.getHeader("Content-Type");

      ( (type != null) && (type.startWith("multipart/form-data")) ) 이렇게 해서 boolean 값을 return 받아서 체크 하면

      되지 않을까 싶어서 남긴다...

- ServletConfig : 

* 하나의 Servlet 에서 사용한다.(Config 객체 라고도 한다.)

* getXXX() 메서드만 지원이 되므로 ReadOnly


- ServletContext :

* 하나의 Context 에서 여러 파인갈 자원을 공유해서 사용한다.(Application 객체 라고도 한다.)

* 즉 공유자원이다.

* getXXX(), setXXX() 메서드가 지원이 되므로 ReadWirte


- web.xml :

* Deployment Descriptor File(배치기술자 D.D File 이라고도 한다.)

* 위의 ServletConfig 와 ServletCotext 의 키,값을 web.xml 에 배치한다.


* EL 비교연산자

연산자

설명

 eq

 ==

 ne

 !=

 lt

 <

 gt

 >

 le

 <=

 ge

 >=

- JSP 에서 <c:if ~> 로 무언가를 할때 eq , ne 마니쓰는데 밑에 꺼는 좌/우를 자꾸 헷갈려서 다시 보는김에 정리

현재 FORM 인코딩은 'UTF-8' 이로 Submit 으로 외부로 파라미터를 전송하는데(서울시통합검색)

인코딩이 'EUC-KR' 이다.

Submit() 전송되는걸 보면 서울시 통합검색창에 한글이 깨져서 보인다..


구글링해서 <Form> 태그에 accept-charset="euc-kr" 속성을 넣어주면 된다고 해서 테스트를 해보니 

정상적으로 파라미터가 넘어갔다.(테스트는 거의 항상 크롬에서 했다.)


한참있다가 IE 에서 하니 안먹는다.. 'IE' 가 규약을 잘 안지켜서 그렇다는데..

혹시몰라서, IE, 크롬, 파이어폭스, 오페라 다해봤는데.. IE만 한글이 깨진다..


또, 욜 - 구글링... 찾았다! 인터넷에 나온거 해보면 안되서, 조금 이리저리 수정해서 지금 적용된 <Script> 소스다.


<script type="text/javascript">


   //IE 에서 accept-charset="euc-kr" 안먹음 해결

   var eucKrEncodng = function() {

       

       if( /MSIE/.test(navigator.userAgent) ) {

           

           document.charset = 'euc-kr';

           return true;

           document.charset = 'utf-8';

       } 

   };

</script>


위와같이 적용을 하면 한글이 모든 브라우저에서 깨지지는 않는다. 근데, 문제발생

IE에서 현재페이지 -> 서울시 통합검색을 하면 현재페이지에서 <Form action> 설정한 페이지로 이동을 해서 다시 현재페이지로 돌아오기 위해서 브라우저의 '뒤로가기'를 누르면 메뉴의 Text 부분이 모두 깨짐.

(해결방안 : 현재페이지에서 통합검색시 <Form Target="_blank"> 줘서 새창띄우기로 뒤로가기 방지)


<!-- 서울시 통합검색 -->

<form name="seoulSearch" action="http://search.seoul.go.kr/newsearch/newTotalSearch.jsp" method="post"                accept-charset="euc-kr" onsubmit="eucKrEncodng();" target="_blank">

     <input type="hidden" name="alias" value="arisu" />

         <fieldset>

                <legend>통합검색</legend>

                <label for="text" class="skip"><img src="<c:url value="/resources/images/cyber/common/skip.gif"/>"                    alt="서울시 통합검색"/></label>

                <input type="text" name="query" id="text" value="" />

                <input type="image" src="<c:url value="/resources/images/cyber/common/search.gif"/>" alt="검색" />

        </fieldset>

</form>





- Filter 란?

필터란, 서블릿 2.3버전에 추가된 것으로, 클라이언트의 요청을 서블릿이 받기 전에 

가로채어 필터에 작성된 내용을 수행하는 것을 말한다.

따라서, 필터를 사용하면 클라이언트의 요청을 가로채서 서버 컴포넌트의 추가기능 수행


- Filter 기능

      1. 인증(사용자 인증)

2. 로깅 및 감사필터

3. 이미지 변환

4. 데이터압축

5. 암호화 필터

6. 토크나이징(Toknizing) 필터

7. XML 컨텐츠를 변경하는 XSLT 필터

8. Mime-Type 체인필터

9. URL 및 기타정보들을 캐시하는 필터


- 필터 적용 순서

1. 필터인터페이스 구현하는 자바 클래스 생성

2. /WEB-INF/web.xml 에 FIlter 엘리먼트를 사용해서 필터 클래스 등록


- 필터의 라이프 사이클

필터는, 서블릿과 비슷한 라이프 사이클을 가지며 생성, 초기화, 필터, 종료 4단계로 이루어진다.

또한, 서블릿 컨테이너 필터 객체가 초기화 파라미터에 접근하는데 사용하는 환결설정 객체

(FilterCOnfig) 의 레퍼런스를 제공한다.


서블릿 컨테이너가 필터의 init() 메서드를 호출하면 필터 인스턴스는 바로 요청을 처리할수 있는

상태가 된다.

service() 메서드를 이용해서 요청을 처리한 것처럼 필터는 doFilter() 메서드를 통해서 요청을

처리한다.

모든 요청에 대한 처리가 끝나면 destory() 메서드가 호출되면서 필터는 피활성 상태로 변경된다.


- 필터 클래스

필터 클래스는 javax.servlet.Filter 인터페이스를 구현해야 한다.

Filter 인터페이스는 init(), doFilter(), destory() 메서드를 정의 되어 있다


- init(FIlterConfig config) : void throws ServletException

서블릿 컨테이너가 필터 인스턴스를 초기화 하기 위해서 호출하는 메서드

- doFilter(ServletRequest req, ServletResponse res, FilterChain chain)

: viod throws IOException, ServletException

필터의 조직을 작성하는 메서드

- destory() : void

필터 인스턴스를 종료시키기 전에 호출하는 메서드

<%@ page contentType="application;" %>

<%@ page import="java.util.*,java.io.*,java.sql.*,java.text.*"%>

    <%

        String strFilename=java.net.URLDecoder.decode(request.getParameter("filePath")); // filePath : 파일의 풀경로명

        String strFilenameOutput=new String(strFilename.getBytes("UTF-8"),"8859_1");

        

        File file=new File(strFilename);

        byte b[]=new byte[(int)file.length()];

        

        response.setHeader("Content-Disposition","attachment;filename="+strFilenameOutput);

        response.setHeader("Content-Length",String.valueOf(file.length()));

        

        if(file.isFile()){

            BufferedInputStream fin=new BufferedInputStream(new FileInputStream(file));

            BufferedOutputStream outs=new BufferedOutputStream(response.getOutputStream());

            

            int read=0;

                

            while((read=fin.read(b))!=-1){outs.write(b,0,read);}

                    outs.close();

                    fin.close();

        }

    %> 

- JAVA 스터디 중 스터디장이 댓글 게시판 숙제로 구글 중 내가 적용한 알고리즘(까먹을까봐-_-)


계층형 게시판을 위한 테이블의 구성 및 알고리즘은 워낙 다양하기 때문에 특별히 정해진 솔류션은 존재하지 않습니다.
여기서는 많은 책자에서 소개되어 있는 간단한 계층형 게시판의 구조와 알고리즘에 대해서 알아봅니다.

 

설명을 위해 테이블에는 다음과 같은 컬럼들만 있다고 가정합니다. 실제로는 더 많겠죠.

No : 글번호(Primary Key)
Title : 글제목
Grp : 같은 주제를 갖는 게시물의 고유번호. 부모글과 부모글로부터 파생된 모든 자식글은 같은 번호를 갖습니다.
Seg : 같은 그룹내 게시물의 순서
Lvl : 같은 그룹내 계층

 

게시판에 첫번째 글이 올라오면, 테이블에는 다음과 같은 정보가 저장됩니다.

====================================
No, Title            , Grp, Seq, Lvl
====================================
 1, '안녕하세요'     ,   1,   1,   0

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

새 글에서 No는 시퀀스로부터 받아온 값, Grp는 No와 동일한 값, Seq는 1, Lvl은 0입니다.

 

두번째 글과 세번째 글이 올라옵니다.

====================================
No, Title            , Grp, Seq, Lvl
====================================
 3, '모임이 있습니다',   3,   1,   0
 2, '날씨가 맑습니다',   2,   1,   0
 1, '안녕하세요     ',   1,   1,   0

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

 

첫번째 글에 답글이 올라옵니다.

====================================
No, Title            , Grp, Seq, Lvl
====================================
 3, '모임이 있습니다',   3,   1,   0
 2, '날씨가 맑습니다',   2,   1,   0
 1, '안녕하세요     ',   1,   1,   0
 4, '  반가워요     ',   1,   2,   1 

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

답글의 경우, Grp는 부모글의 Grp 값, Seq는 부모글의 Seq+1, Lvl은 부모글의 Lvl+1이 됩니다.

 

첫번째 글의 답글에 답글이 올라옵니다. 즉, 네번째 글의 답글이 올라옵니다.

====================================
No, Title            , Grp, Seq, Lvl
====================================
 3, '모임이 있습니다',   3,   1,   0
 2, '날씨가 맑습니다',   2,   1,   0
 1, '안녕하세요     ',   1,   1,   0
 4, '  반가워요     ',   1,   2,   1 
 5, '    감사합니다 ',   1,   3,   2

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

 

첫번째 글의 두번째 답글이 올라옵니다.

====================================
No, Title            , Grp, Seq, Lvl
====================================
 3, '모임이 있습니다',   3,   1,   0
 2, '날씨가 맑습니다',   2,   1,   0
 1, '안녕하세요     ',   1,   1,   0
 6, '  환영합니다   ',   1,   2,   1 
 4, '  반가워요     ',   1,   2,   1 
 5, '    감사합니다 ',   1,   3,   2

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

 

여기서, 두번째 답글이 첫번째 답글보다 먼저 표시되려면, 동일한 그룹 번호에 있으면서 부모의 Seq 번호보다 큰 게시물의 Seq 번호를 모두 1만큼 증가시킵니다.

====================================
No, Title            , Grp, Seq, Lvl
====================================
 3, '모임이 있습니다',   3,   1,   0
 2, '날씨가 맑습니다',   2,   1,   0
 1, '안녕하세요     ',   1,   1,   0
 6, '  환영합니다   ',   1,   2,   1
 4, '  반가워요     ',   1,   3,   1
 5, '    감사합니다 ',   1,   4,   2

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

 

여섯번째 게시물에 답글이 올라옵니다.

====================================
No, Title            , Grp, Seq, Lvl
====================================
 3, '모임이 있습니다',   3,   1,   0
 2, '날씨가 맑습니다',   2,   1,   0
 1, '안녕하세요     ',   1,   1,   0
 6, '  환영합니다   ',   1,   2,   1
 7, '    감사합니다 ',   1,   3,   2
 4, '  반가워요     ',   1,   3,   1
 5, '    감사합니다 ',   1,   4,   2

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

 

마찬가지로 동일한 그룹 번호에 있으면서 부모의 Seq 번호보다 큰 게시물의 Seq 번호를 모두 1만큼 증가시킵니다.

====================================
No, Title            , Grp, Seq, Lvl
====================================
 3, '모임이 있습니다',   3,   1,   0
 2, '날씨가 맑습니다',   2,   1,   0
 1, '안녕하세요     ',   1,   1,   0
 6, '  환영합니다   ',   1,   2,   1
 7, '    감사합니다 ',   1,   3,   2
 4, '  반가워요     ',   1,   4,   1
 5, '    감사합니다 ',   1,   5,   2

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

 

검색 할 때는 Grp를 내림차순으로 Seq를 오름차 순으로 정렬하면 됩니다. 인덱스는 기본키와 Grp+Seq의 복합 인덱스를 설정하면 됩니다.

 

실제 오라클에서 테이블을 구성하고 검색해봅니다.

 

drop table qnaboard;

 

create table qnaboard
(no number,
 title varchar2(100),
 contents varchar2(4000),
 writer varchar2(20),
 wdate date,
 grp number,
 seq number,
 lvl number);

 

drop sequence qnaboard_no_seq;

 

create sequence qnaboard_no_seq
start with 1
increment by 1;

 

create index qnaboard_no_idx on qnaboard(no) reverse;

 

alter table qnaboard
add constraint qnaboard_no_pk primary key (no);

 

create index qnaboard_grp_seq on qnaboard(grp desc, seq asc);

alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';

 

첫번째 게시물 입력 - 새 글 입력
insert into qnaboard
values(qnaboard_no_seq.nextval, '안녕하세요', null, '길동', sysdate, qnaboard_no_seq.currval, 1, 0);

 

두번째 게시물 입력 - 새 글 입력
insert into qnaboard
values(qnaboard_no_seq.nextval, '날씨가 맑습니다', null, '철수', sysdate, qnaboard_no_seq.currval, 1, 0);

 

세번째 게시물 입력 - 새 글 입력
insert into qnaboard
values(qnaboard_no_seq.nextval, '모임이 있습니다', null, '영희', sysdate, qnaboard_no_seq.currval, 1, 0);

 

네번째 게시물 입력 - 첫번째 게시물의 답글

답글이 올라오는 경우에는 답글에 부여 할 seq를 먼저 확보해줍니다.
update qnaboard
set seq=seq+1
where grp=1 and seq>1;

 

insert into qnaboard
values(qnaboard_no_seq.nextval, '반가워요', null, '만수', sysdate, 1, 2, 1);

 

다섯번째 게시물 입력 - 네번째 게시물의 답글
update qnaboard
set seq=seq+1
where grp=1 and seq>2;

 

insert into qnaboard
values(qnaboard_no_seq.nextval, '감사합니다', null, '길동', sysdate, 1, 3, 2);

 

여섯번째 게시물 입력 - 첫번째 게시물의 두번째 답글
update qnaboard
set seq=seq+1
where grp=1 and seq>1;

 

insert into qnaboard
values(qnaboard_no_seq.nextval, '환영합니다', null, '찬호', sysdate, 1, 2, 1);
 
일곱번째 게시물 입력 - 여섯번째 게시물의 답글
update qnaboard
set seq=seq+1
where grp=1 and seq>2;

 

insert into qnaboard
values(qnaboard_no_seq.nextval, '감사합니다', null, '길동', sysdate, 1, 3, 2);

 

게시판을 검색하는 경우, grp로 내림차순, seq로 오름차순으로 정렬하면 됩니다.
select case when lvl=0 then no
            when lvl>0 then null end no
, rpad('+', lvl, '-')||title title
, writer
, wdate
from qnaboard
order by grp desc, seq;


   NO TITLE                WRITER     WDATE
----- -------------------- ---------- -------------------
    3 모임이 있습니다      영희       2007-09-15 19:54:00
    2 날씨가 맑습니다      철수       2007-09-15 19:53:55
    1 안녕하세요           길동       2007-09-15 19:53:50
      +환영합니다          찬호       2007-09-15 19:54:21
      +-감사합니다         길동       2007-09-15 19:54:26
      +반가워요            만수       2007-09-15 19:54:08
      +-감사합니다         길동       2007-09-15 19:54:15

+ Recent posts