2010년 6월 28일 월요일

window.open() 속성

  • name = window.open( "창에 보여줄 파일/홈페이지의 이름/주소", "창의 이름", "옵션" )

window.open() 메소드에 전달할 수 있는 파라미터 중 첫 번째는 보여줄 내용이고, 두 번째는 target으로서의 창 이름이며 세 번째가 창의 위치와 크기 및 모양을 지정할 수 있는 옵션 그룹이다. 그리고 window.open() 메소드가 되돌리는 값을 name에 담았다면 그 name은 그 창(자식 창)을 연 opener(부모 창)에서 자식 창을 컨트롤할 수 있는 이름이 된다.

다음과 같이 창을 열어보자.

<input type=button value="창" onClick= "window.open( 'small.htm','new','left=300, top=300, width=400, height=300, toolbar=no, location=yes, directories=no, status=no, menubar=no, scrollbars=yes, copyhistory=yes, resizable=no')">

참고로 가끔 보면 옵션들 사이에 빈칸이 있으면 안 된다고 말하는데, 이것은 넷스케이프에 관한 설명인 듯하다. 익스플로러에서도 줄바꿈(리턴)이 있으면 안 된다. 하드 리턴(문단 바꿈, <p>)은 물론이고 소프르 리턴(줄만 바꿈, <br>)도 끼어들면 결코 안 될 것이다.

창 열기 옵션은 상당히 많은데, 알아 두면 좋지만 다 외우기는 쉽지 않다. 모든 옵션을 한 번 보되, 나름대로 그룹화하여 소개한다. 이 내용은 1차적으로 http://pl.changwon.ac.kr/~chowing/js/win_open.html을 참고한 것이다. 넷스케이프 전용인지 익스플로러 전용인지 등을 확인하는 데 도움이 될 참고 사이트는 http://www.kbtech777.co.kr/lecture/webprog/jscript/javalibrary.htm(JavaScript 속성 라이브러리) 등.

위치

screenX / left(ie전용) : 왼쪽 좌표, screenY / top(ie전용) : 위쪽 좌표

크기

width : 너비, height : 높이

resizable(크기변경 허용 여부)

innerWidth, innerHeight, outerWd\idth, outerHeight(넷스케이프 전용?)

다른 창과의 관계

dependent(opener가 닫히면 함께 닫힘)

alwaysLowered(항상 깔림), alwaysRaised(항상 드러남)

z-lock(yes로 설정하면, 활성화되어도/포커스가 주어져도 다른 창 위로 떠오르지는 못하게 막는다)

기타 옵션들

hotkeys( no로 지정하면 menubar 없이는 (security 및 quit) 핫키를 제외한 어떤 핫키도 사용할 수 없게 된다 )

directories(디렉터리 버튼들)

location(로케이션 엔트리)

menubar(File, Edit, View, 기타의 메뉴바)

scrollbars(필요할 때 나타날 스크롤바)

status(아래쪽 상태바)

titlebar(위쪽 타이틀바)

toolbar(Back, Forward, 기타의 툴바)

IE4(이상)에서만 사용 가능한 옵션들

channelmode(채널바가 있는 창)

fullscreen(전체 화면 차지)

left(screenX), top(screenY)

위와 같은 방식으로 정리하면 저절로 외워지게 하는 데 도움이 되지 않을까 생각한다. 정리한 직후에 남는 궁금증은 z-lock과 alwaysLowered는 동일한 옵션인가? 하는 점이다. 실습이 최상의 선택이라고 믿으므로 차근히 테스트해 보자.

먼저, 아무 옵션도  주지 말고 창을 열어 보자.

<input type=button value="창" onClick= "window.open( 'small.htm','new','')">


타이틀바, 메뉴바, 툴바, 로케이션 엔트리, 스크롤바, 상태바 등 아무튼 얼른 보아서 모든 옵션들이 다 yes로 설정되어 나타나는 것 같다. 이번에는 크기와 위치만을 지정하여 창을 열어 보자.

<input type=button value="창" onClick= "window.open( 'small.htm','new','left=300, top=300, width=400, height=300')">

이번에는 타이틀바만 나타나고, 다른 모든 것이 no로 설정된 모양이다(최대화 버튼이 죽어 있다). resizable로 no인 것이 분명하다. 옵션 중에 하나라도 설정하면 타이틀바와 hotkeys만 yes로 되고 나머지는 모든 no로 디폴트 설정되는 것이라고 이해하면 될 것 같다.

다음으로, resizable, resizable=yes 또는 resizable=1을 크기, 위치 지정과 함께 주어 보자.

<input type=button value="창" onClick= "window.open( 'small.htm','new','left=300, top=300, width=400, height=300, resizable=1')">

최대화 버튼이 살아나고, 가장자리에 마우스를 대면 리사이즈 화살표 모양으로 변한다. 이번에는 디렉터리 버튼들을 나타내어 보자.

<input type=button value="창" onClick= "window.open( 'small.htm','new','left=300, top=300, width=400, height=300, resizable, directories')">

타이틀바 아래에 '연결, 링크 사용자 정의, 인터넷 시작' 등 줄이 나타나고 그 줄 오른쪽의 >> 표시를 클릭하면 채널 가이든 등 리스트가 드롭다운된다. 이번에는 로케이션 엔트리를 나타내어 보자.

<input type=button value="창" onClick= "window.open( 'small.htm','new','left=300, top=300, width=400, height=300, resizable, directories, location')">

이번에는 디렉터리 버튼들이 오른쪽으로 밀려 나가고, 같은 줄 왼쪽에 '주소'라는 표시와 로케이션 드롭다운이 심어져 있다.

<input type=button value="창" onClick= "window.open( 'small.htm','new','left=300, top=300, width=400, height=300, resizable, directories, location, menubar')">

타이틀바와 로케이션/디렉터리 중간에 메뉴바 줄이 삽입된다.

<input type=button value="창" onClick= "window.open( 'small.htm','new','left=300, top=300, width=400, height=300, resizable, directories, location, menubar, scrollbars')">

스크롤바를 지정하면, 스크롤할 필요가 없는 경우에도 오른쪽의 스크롤바는 여전히 나타난다.

<input type=button value="창" onClick= "window.open( 'small.htm','new','left=300, top=300, width=400, height=300, resizable, directories, location, menubar, scrollbars, toolbar')">

타이틀바, 메뉴바 아래에 뒤로/앞으로/중지/새로고침 등의 툴바가 삽입된다.

<input type=button value="창" onClick= "window.open( 'small.htm','new','left=300, top=300, width=400, height=300, resizable, directories, location, menubar, scrollbars, toolbar, status')">

아래쪽 상태바까지 모든 것이 다 나타난다.

앞에서 z-lock과 alwaysLowered는 동일한 옵션인가? 하는 의문을 제기한 일이 있다. 그런데 현재 익스플로러 5.5에서 테스트해 본 결과 그 두 옵션과 alwaysRaised 봅션은 먹히지 않는 것 같다. dependent 옵션도 사용해 보았으나, 효과를 알 수 없다. 내가 정확한 사용법을 몰라서 그런가? 무언가 새로운 것을 알게 되면 추가 정리하기로 하겠다.

2010년 6월 1일 화요일

FCKeditor java 버전 설치 하기

FCKeditor java 버전 설치
- 환경
O/S : Window XP Professional
Servlet Engine : Tomcat 5.0.28
Character Set : UTF-8
IDE Tool : Eclipse 3.2
FCKEditor Version : 2.3.1( http://prdownloads.sourceforge.net/fckeditor/FCKeditor_2.3.1.zip?download )FCKEditor.Java Version 2.3
( http://sourceforge.net/project/showfiles.php?group_id=75348&package_id=129511 )
1. editor 폴더를 생성하고 톰캣 컨텍스트의 루트를 editor 폴더 경로로 지정
2. fckeditor 다운로드
2-1. http://www.fckeditor.net/download/ 에서 다운로드
2-2. editor 폴더에 다운로드 된 압축 파일의 압축을 풉니다.
2-3. 압축을 풀면 나오는 디렉토리인 FCKeditor 폴더를 editor 하위 폴더로 되게끔 이동합니다.


3. 톰캣을 가동한 후 FCKeditor\_samples\default.html 을 실행하여 fckeditor 를 실행


4. 그러나 이미지 업로드를 할려고 서버 보기를 할 경우 에러가 발생합니다.


5. java 버전용 fckeditor 를 editor 폴더로 다운로드(FCKeditor-2.3.zip)
5-1. http://sourceforge.net/project/showfiles.php?group_id=75348&package_id=129511 에서 다운로드
5-2. editor 폴더에 다운로드 된 압축 파일의 압축을 풉니다.


6. 지정폴더\editor\FCKeditor-2.3\web 하위에 있는
_samples 폴더와 WEB-INF 폴더를 각각 이동.
6-1. 2번에서 만들어진 \editor\FCKeditor\_samples 폴더에
\editor\FCKeditor-2.3\web\_samples 폴더를 붙여넣기 합니다.
6-2.  \editor\WEB-INF 폴더에 \editor\FCKeditor-2.3\web\WEB-INF 폴더를 붙여넣기 합니다.


* 새로운 컨텍스트라면 web.xml 을 그대로 덮어씌운 후 복사하고,
기존에 컨텍스트에 다른 체계가 돌아가 있다면 web.xml 내용 중 <web-app> 부분을
기존 사용중인 컨텍스트에 web.xml 에 붙여넣기 합니다.
( load-on-startup 이 이미 있다면 숫자를 변경함 )

완료하면 폴더 구조는 다음과 같습니다.
( UserFiles 디렉토리는 사용자가 업로드한 이미지 저장 디렉토리입니다. )


* 톰캣 리스타트시에 콘솔 창에 다음과 같이 업로드 제한 파일 확장자 리스트가 나옵니다.
( web.xml 파일에 DeniedExtensionsFile 이란 param-name 으로 지정되어 있습니다. )


7. jsp 샘플을 실행
그러나 다음과 같이 fckeditor.html 파일을 찾을수 없다는 메시지가 뜹니다.


\editor\FCKeditor\_samples\jsp\sample01.jsp 내용을 보면
oFCKeditor.setBasePath( "/FCKeditor/" ) ;
위와 같은 부분이 있습니다.


컨텍스트의 루트 폴더가 FCKeditor 이라면 에러 없이 수행되었겠지만
루트가 editor 폴더로 지정되어 있으므로
oFCKeditor.setBasePath( "/editor/FCKeditor/" ) ;
위처럼 수정해주면 제대로 수행되는 것을 확인할수 있습니다.


7-3. 이미지 버튼을 눌러서 서버보기를 눌러보지만 4. 처럼 스크립트 오류가 발생합니다.


8. sample02.jsp 의 태그 라이브러리를 이용한 파일 브라우저 경로 수정
8-1. \editor\FCKeditor\_samples\jsp\sample02.jsp 를 보면 7. 처럼 fckeditor.html 을 찾을수 없다는 메시지가 뜹니다.
<FCK:editor id="EditorDefault" basePath="/FCKeditor/"
위 부분에서 basePath 를 현재 테스트 경로에 맞게끔
<FCK:editor id="EditorDefault" basePath="/editor/FCKeditor/" 로 수정 후 sample02.jsp 를 수정하면
에디터는 잘 나오나 역시 이미지 뷰어나 업로드 부분은 작동하지 않습니다.

sample02.jsp 에선 다음과 같이 브라우저 URL 과 업로드 URL 을 정의한 부분을 볼수 있습니다.
imageBrowserURL="/FCKeditor/editor/filemanager/browser/default/browser.html?Type=Image&Connector=connectors/jsp/connector"
linkBrowserURL="/FCKeditor/editor/filemanager/browser/default/browser.html?Connector=connectors/jsp/connector"
flashBrowserURL="/FCKeditor/editor/filemanager/browser/default/browser.html?Type=Flash&Connector=connectors/jsp/connector"
imageUploadURL="/FCKeditor/editor/filemanager/upload/simpleuploader?Type=Image"
linkUploadURL="/FCKeditor/editor/filemanager/upload/simpleuploader?Type=File"
flashUploadURL="/FCKeditor/editor/filemanager/upload/simpleuploader?Type=Flash"


editor 폴더 하위에 FCKeditor 폴더가 위치한 구조이니 /FCKeditor/editor... 부분 앞에
/editor/FCKeditor/editor... 형식으로 수정하고,


web.xml 의
<servlet-mapping>
 <servlet-name>Connector</servlet-name>
 <url-pattern>/editor/filemanager/browser/default/connectors/jsp/connector</url-pattern>
</servlet-mapping>
<servlet-mapping>
 <servlet-name>SimpleUploader</servlet-name>
 <url-pattern>/editor/filemanager/upload/simpleuploader</url-pattern>
</servlet-mapping> 


위 url-pattern 경로대로 Connector 부분과 UploadURL 을 현재 경로를 예를 들어 재구성하자면
다음과 같이 수정하여 sample02.jsp 을 작성하면 됩니다.
imageBrowserURL="/editor/FCKeditor/editor/filemanager/browser/default/browser.html?Type=Image&Connector=/editor/editor/filemanager/browser/default/connectors/jsp/connector"
linkBrowserURL="/editor/FCKeditor/editor/filemanager/browser/default/browser.html?Connector=/editor/editor/filemanager/browser/default/connectors/jsp/connector"
flashBrowserURL="/editor/FCKeditor/editor/filemanager/browser/default/browser.html?Type=Flash&Connector=/editor/editor/filemanager/browser/default/connectors/jsp/connector"
imageUploadURL="/editor/editor/filemanager/upload/simpleuploader?Type=Image"
linkUploadURL="/editor/editor/filemanager/upload/simpleuploader?Type=File"
flashUploadURL="/editor/editor/filemanager/upload/simpleuploader?Type=Flash"


위 URL은 web.xml 의 url-pattern 과 매핑된다는 점을 이해하셔야 합니다.
이런 특징을 통하여 경로를 판별할수 있습니다.


8-2. 이미지링크,플래쉬 브라우저 및 업로드가 제대로 동작하지 않을 경우...

8-2-1. browser.html 파일의 경로가 틀렸을 경우
basePath 만 수정한 후 위 8-1. 에서처럼 경로를 수정하지 않을 경우
다음과 같은 화면을 볼수 있습니다.


8-2-2. Connector 부분의 경로가 틀릴 경우
Connector 의 경로는 수정하지 않은채 browser.html 의 경로만 옳바르게 설정할 경우
다음과 같은 화면을 볼수 있습니다.


* Connector 의 경로는 web.xml 의 Connector 의 url-pattern 과 관련이 되어있습니다.
8-1. 에서 보신 web.xml 처럼 /editor/filemanager/browser/default/connectors/jsp/connector 으로
지정되어 있따면 Connector 의 주소는
http://서버url/컨텍스트명/editor/filemanager/browser/default/connectors/jsp/connector 이 됩니다.



위 화면처럼 파일을 찾을수 없다는 화면이 아닌 다른 화면이 나오게 되면 맞는 경로이므로
Connector 부분은 http://서버url/ 을 제외한 나머지 주소를 기술하면 됩니다.
( 8-1. 의 Connector 주소 설정 참조 )


* 옳바른 주소 설정에도 불구하고 위 화면에서처럼 Connector 을 브라우저에서 실행했을 때
다른 에러가 발생한다면 XML 을 생성하는 xalan 콤포넌트가 존재하는지 의심해봐야 합니다.


왜 에러가 발생하는지 보기 위한 테스트URL)
http://서버url/컨텍스트명/editor/filemanager/browser/default/connectors/jsp/connector?Command=GetFoldersAndFiles&Type=Image&CurrentPath=/


위 화면에서처럼
javax.xml.transform.TransformerFactoryConfigurationError: Provider org.apache.xalan.processor.TransformerFactoryImpl not found
에러가 발생한다면 Xerces-J-tools의 xalan.jar 를(http://www.apache.org/dist/xml/xerces-j/)

찾아 다운로드 하여 \WEB-INF\lib 폴더에 넣은 후 톰캣 재가동후 새로운 브라우저에서
테스트 URL 을 확인해보면 다음과 같이 에러 없이 XML 화면이 나오는 것을 확인할수 있습니다.


8-2-3. 업로드 URL 의 확인
Connector 와 마찬가지로 web.xml 의 SimpleUploader 의 url-pattern 의 영향을 받습니다.
위 web.xml 에선 url-pattern 이 /editor/filemanager/upload/simpleuploader 이므로
테스트 URL)
http://서버url/컨텍스트명/editor/filemanager/upload/simpleuploader 을 쳤을 경우 다음과 같은 화면이 나와야 정상입니다.


위 결과대로 나온다면 image,link,flash UploadUrl 을 설정하면 됩니다.( 8-1. 의 각 UploadUrl 확인 )


9. 테스트
이미지를 업로드하고, 목록에 정상적으로 출력된다면 모든 설치가 성공적으로 완료된 것입니다.


10. 샘플이 아닌 기존 체계에 fckeditor 를 적용할 경우.
태그 라이브러리 사용을 위한
<%@ taglib uri="http://fckeditor.net/tags-fckeditor" prefix="FCK" %> 를 페이지 상단에 삽입 하고,
<TEXTAREA></TEXTAREA> 부분에 sample02.jsp 의 <FCK:editor ~ </FCK:editor> 부분을 복사하여 붙여넣기 합니다.
기본 sample02.jsp 에는 <FCK:editor id="EditorDefault" 처럼 id 가 EditorDefault 로 되어있는데
만약 <TEXTAREA name = "contents" 와 같이 name 이 contents 였다면
<FCK:editor id="contents" 로 지정하면 받는 부분에서 contents 로 받을 수 있습니다.


예)
- \editor\board\create_form.jsp(UTF-8 로 작성)

<%@ taglib uri="http://fckeditor.net/tags-fckeditor" prefix="FCK" %>

<%@ page contentType = "text/html;charset=utf-8" %>
<HTML>
<HEAD>
<TITLE>글 입력 폼</TITLE>
<META http-equiv = "Content-Type" content = "text/html;charset=utf-8" />
<SCRIPT>
 function send()
 {
  create_form.submit();
 }
</SCRIPT>
</HEAD>
<BODY>
<FORM name = "create_form" method = "post" action = "./create.jsp">
 <FCK:editor id="contents" basePath="/editor/FCKeditor/"
  imageBrowserURL="/editor/FCKeditor/editor/filemanager/browser/default/browser.html?Type=Image&Connector=/editor/editor/filemanager/browser/default/connectors/jsp/connector"
  linkBrowserURL="/editor/FCKeditor/editor/filemanager/browser/default/browser.html?Connector=/editor/editor/filemanager/browser/default/connectors/jsp/connector"
  flashBrowserURL="/editor/FCKeditor/editor/filemanager/browser/default/browser.html?Type=Flash&Connector=/editor/editor/filemanager/browser/default/connectors/jsp/connector"
  imageUploadURL="/editor/editor/filemanager/upload/simpleuploader?Type=Image"
  linkUploadURL="/editor/editor/filemanager/upload/simpleuploader?Type=File"
  flashUploadURL="/editor/editor/filemanager/upload/simpleuploader?Type=Flash">
  This is some <strong>sample text</strong>. You are using <a href="http://www.fredck.com/fckeditor/">FCKeditor</a>.
 </FCK:editor>
</FORM>
<INPUT type = "button" onClick = "return send()" value = "전송">
</BODY>
</HTML>


- \editor\board\create.jsp(UTF-8 로 작성)

<%@ page contentType = "text/html;charset=utf-8" %>
<%
 String contents = request.getParameter("contents");

 contents = new String(contents.getBytes("8859_1"), "UTF-8");
%>
<HTML>
<HEAD>
<TITLE></TITLE>
<META http-equiv = "Content-Type" content = "text/html;charset=utf-8" />
</HEAD>
<BODY>
<%= contents %>
</BODY>
</HTML>


11. 몇가지 Tip.
11-1. 공백 값 입력을 방지하기 위해선 스크립트를 다음과 같이 수정합니다.

/**
 * 데이터 전송전 체크
 */
function send()
{
 var oEditor = FCKeditorAPI.GetInstance('contents') ;

 var div = document.createElement("DIV");
 
 div.innerHTML = oEditor.GetXHTML();

 if( isNull( div.innerText ) )
 {
  alert("내용을 입력하세요."); 
  oEditor.Focus();
  return false; 
 }

 create_form.submit();
}

/**
 * 정규표현식을 이용한 공백 체크
 */
function isNull( text ) 

 if( text == null ) return true; 

 var result = text.replace(/(^\s*)|(\s*$)/g, ""); 

 if( result ) 
  return false; 
 else 
  return true; 
}



11-2. 페이지 로딩시 바로 포커스를 주고 싶다면
\editor\FCKeditor\fckconfig.js 의 FCKConfig.StartupFocus 의 값을 true 로 변경하거나

태그라이브러리 옵션으로 startupFocus="true" 를 설정합니다.


11-3. 읽기 전용으로 변환하고 싶다면

var oEditor = FCKeditorAPI.GetInstance('contents') ;
oEditor.EditorDocument.body.contentEditable = false;
oEditor.EditorDocument.body.unselectable = true;


11-4. 기타 환경 설정은 fckconfig.js 파일을 참조하고 아래 사이트를 참조하시기 바랍니다.
http://sourceforge.net/forum/forum.php?forum_id=257180 ( fckeditor help 포럼 )
http://java.lin4u.com/my/index.php?category=&keyfield=title&keyword=fck&favorite ( 폰트 관련 참조 )
http://wiki.fckeditor.net/ ( fckeditor 위키 사이트 )

http://www.ghlab.com/blog/fckeditor/editor.zip ( 위 샘플들을 테스트한 컨텍스트 모든 파일들 )

FCKeditor

 

Styles

http://docs.fckeditor.net/FCKeditor_2.x/Developers_Guide/Configuration/Styles

Templates

http://docs.fckeditor.net/FCKeditor_2.x/Developers_Guide/Configuration/Templates

참고

  • Form이 submit되어 서블릿쪽으로 값을 넘길 때는 등록하거나 수정한 내용이 적용 되지만, validatorUtil.js를 이용해서 입력폼을 검증시에 직접 에디터의 내용을 가져오지는 못하는 것 같다. 이때는 에디터를 페이지에 삽입했을 때 다음과 같이 들어가는 것을 이용해서 직접 히든 필드에 에디터의 값을 할당하고 검증한다.

 

  1. <td>코드명 </td><td>$editor.get("cd_nm", "$!cd_nm")</td>

이 VTL 코드는 다음과 같은 HTML로 파싱된다.

  1. <td>코드명 </td><td><div><input value="" type="hidden" name="cd_nm" id="cd_nm" /><input value="CustomConfigurationsPath=%2Feditor%2Fconfig.js" type="hidden" id="cd_nm___Config" /><iframe frameborder="0" width="780" height="200" scrolling="no" src="/editor/editor/fckeditor.html?InstanceName=cd_nm&amp;Toolbar=Custom" id="cd_nm___Frame"> </iframe></div></td>

 

검증 시는 다음과 같이 직접 히든 필드에 값을 입력하고 검증한다.

 

  1. function fn_update(){
  2. $("cd_nm").value = FCKeditorAPI.GetInstance ('cd_nm').GetXHTML(true);

  3. var val = new Validator($("formDetl"));

  4. if(!cfn_isEmpty("$!codeMgr.badWord")) {

  5. val.setBadWord("$!codeMgr.badWord");

  6. }

  7. ...

  8. val.addItem("cd_nm", "Y:maxByteLength=75:Y:코드명:");

  9. val.addItem("cd_nm", "Y:badword:Y:코드명:");

  10. ...

  • 에디터 밖에서 편집 모드 변경
  1. var oEditor = FCKeditorAPI.GetInstance('cd_nm') ;
  2. oEditor.SwitchEditMode(true) ;
  • 자바와 연동시 한글 파일 업로드 파일명 깨짐 방지

http://nextframe.jp/flash/matsnp/matsnp.html
fckeditor-java-core-2.4.1.jar
FCKeditor업로더창은 utf-8