[Mac] home, end key

Apple 2010. 11. 14. 10:54 Posted by galad
맥의 home, end키는 윈도우와 다르게 문서의 처음, 끝으로 보낸다.
윈도우 처럼 문장의 처음, 끝으로 보내는 형태로 변경하기는 다음을 참조

http://lasel.kr/blog/22?TSSESSIONlaselkrblog=587ffba228741c991e2968844444b324

근데 원래대로는 어떻게 되돌리지? ㅋ

'Apple' 카테고리의 다른 글

[iPhone] 테더링 사용하기  (0) 2010.12.30
[Mac] spotlight와 eclipse 자동완성 충돌  (0) 2010.11.14
[apple] iAd...  (0) 2010.04.13
[hackintosh] dell m1210 에 10.6.2 hazard 설치  (0) 2010.01.31
[Mac] 멀티부팅 - boot think  (0) 2010.01.29
http://kin.naver.com/knowhow/detail.nhn?docId=527939


현재 일하는 업무 상 String의 Code page를 변환해야 하는 작업이 많다.

 

하지만 이에 관한 자료들이 매우 미흡하며 잘못된 지식을 전달하는 블로그나 웹도 많이 보아왔다.

(처음에 그것이 잘못된 것인지도 몰랐지만)

 

그리고 믿고 사용했지만 여전히 깨져버리는 한글을 보며 고민하기도 했다.

 

사실 DB모니터링 툴 개발 업무를 하다보니 Character Set을 직접 변환해야 하는 작업들이 꽤 많았다.

 

Java에선 과연 어떤 형태로 변환작업을 수행할 수 있으면 읽을 수 있을까 고민도 했다.

 

이 글이 조금은 어려울 수도 있지만 천천히 읽어본다면 충분히 이해할 수 있고 명확하게 java의

 

캐릭터 셋에 대해 알 수 있을 것이다.

 

 영문은 대부분의 캐릭터셋이 1바이트기 때문에 변환작업에서 깨질일이 거의 없다고 할 수 있지만

 

한글은 utf-8의 경우 1에서 4바이트까지의 가변형으로 저장되기 때문에 1글자의 바이트 길이가 달라

 

명시적인 변환이 요구된다.

 

여기저기 자료도 많이 찾아봤지만 역시나 테스트 하는 것이 가장 빠르게 이해할 수 있었다.

 

결론 부터 언급하면 String 객체내 바이트 배열이 어떤 캐릭터셋으로 저장될 것이라는 생각이 오해를 불러왔고

 

잘못된 사고를 하게 했다. String이 실제 메모리 상에 어떠한 캐릭터셋의 바이트 배열로 저장되어 있는지

 

사용자들은 고민할 필요도 없이 자바는 잘 되어 있었다.

 

Jdk 1.4를 기준으로 내 머리의 이해를 도와봤다.

 

내 이름 한민호라는 세자를 utf-8로 byte 배열에 저장해보았다.

 

막무가내로 시작했지만 getBytes라는 함수가 어떻게 이용되는지 알 수 있었다.

 

byte [] bytes = new String("한민호").getBytes("utf-8");

 

처음 이 코드를 작성하고 "한민호"라는 객체는 어떤 캐릭터 셋의 바이트 배열로 저장되어 있을까 생각했지만

 

그것을 생각하면서 이미 정상적인 사고를 하기가 어려웠다. 자바에선 String 객체로 생성되었다면 어떠한 종류의

 

캐릭터 셋의 바이트 배열이든 리턴이 가능하기 때문이다.

 

단 한글로 생성했는데 한글을 지원하지 않는 캐릭터셋이라면 리턴한 바이트 배열의 값이 깨지게 된다.

 

 getBytes라는 메소드에 대해 전혀 알지 못했을 땐 String을 생성할 때 지정한 즉 메모리 상에 저장된

 

"한민호"라는 객체의 바이트 배열의 캐릭터 셋을 지정해줘야 되는 줄 알았다.

 

그러나 이 메소드가 내가 상상했던거 보다 훨씬 대단하다는 것을 알게 되었다.

 

 이 메소드는 현재 저장된 String값이 어떠한 캐릭터 셋으로 저장되든 상관없이

 

바이트 배열과 바이트 배열에 맞는 캐릭터 셋으로 생성만 했다면

 

java에서 한글을 지원(영문만 지원하는 캐릭터 셋은 깨지게 된다.) 하는

 

어떠한 캐릭터 셋으로든 변환하여 변환된 바이트 배열로 리턴한다.

 

 여기서 핵심은 정상적인 String 객체의 생성이라는 것이다. 아래서 정상적인 String 객체의 생성에 대해 알아보겠다.

 

 위에서 생성한 바이트 배열을 다시 String 객체로 변환해 보겠다.

 

String name = new String(bytes, "utf-8");

 

이런 식으로 변환이 가능하다. 간혹 String의 두 번째 파라메터로 넣는 캐릭터 셋을 바이트 배열의 캐릭터 셋이 아닌 다른

 

캐릭터셋을 넣어 변환하겠다는 코드를 많이 봤다. 이건 잘못된 것이다. 이 자린 바이트 배열에 저장된 바이트들의 캐릭터 셋을

 

설정하는 곳이다.

 

잘못된 변환의 사용예를 한가지 들어보겠다.

 

잘못된 변환

String convert = new String(message.getBytes("euc-kr"), "utf-8");

 

소스를 보면 message String에 저장된 문자를 getBytes를 이용하여 euc-kr라는 캐릭터셋 바이트 배열로 얻고있다.

 

분명 이것을 작성한 사람은 위 코드에서 new String(스트링배열, "euc-kr")라고 String 개체를 생성했을 것이다.

 

간단히 설명하면 euck-kr라는 캐릭터 셋으로 바이트 배열을 읽어들인 

 

다음 utf-8이라는 새로운 캐릭터셋으로 변환(?)을 시도하겠다는 것이다.

 

이것은 두 번째 파라메터에 대해 잘못된 이해를 하고 있기에 이런 코드가 가능한 것이다.

 

때문에 이렇게 변환을 하게 되면 한글이 저장된 경우 같은 계열(변환가능한)의 캐릭터 셋이 아니라면 100프로 깨지게 된다.

 

이러한 변환은 자바에서 지원을 안하는 사항이다.

 

또 문제는 다시 String 객체로 생성을 한다는 것이다. 이 때 String생성 시 잘못된 캐릭터 셋을 주었기 때문에 깨진

 

바이트 배열로 저장이 되게 된다. 때문에 이러한 경우 getBytes() 메소드를 통해 어떠한 캐릭터 셋으로 읽든

 

읽을 수가 없게 된다.

 

 그렇다면 이제까지의 사항들에 대해 테스트를 통해 명확히 알아보겠다.

 

아래는 테스트에 자주 사용될 byte 배열을 16진수로 보여주는 함수다.

 

public static String BinToHex(byte [] buf) {
  String res = "";
  String token = "";
  for (int ix=0; ix<buf.length; ix++) {
   token = Integer.toHexString(buf[ix]);
//   CommonUtil.println("[" + ix + "] token value : " + token + " len : " + token.length());
   if (token.length() >= 2)
    token = token.substring(token.length()-2);
   else {
    for(int jx=0; jx<2-token.length();jx++)
     token = "0" + token;
   }     
   res += " " + token;
  }
  
  return res.toUpperCase();
 }

 

< 테스트 소스 >

1   String name = new String("한민호");   
2   strs = name.getBytes();   
3   System.out.println("Length : " + strs.length);
4   System.out.println("Hex    : " + BinToHex(strs));
5   System.out.println("Value  : " + new String(strs));
6   System.out.println();   
7   strs = name.getBytes("utf-8");
8   System.out.println("Length : " + strs.length);
9   System.out.println("Hex    : " + BinToHex(strs));
10   System.out.println("Value  : " + new String(strs, "utf-8") );
11   System.out.println();   
12  name = new String(strs, "utf-8");
13   strs = name.getBytes();
14   System.out.println("Length : " + strs.length);
15   System.out.println("Hex    : " + BinToHex(strs));
16   System.out.println("Value  : " + name);   
17   System.out.println();   
18   String convert = new String(name.getBytes("euc-kr"), "utf-8");
19   System.out.println(convert);
20   strs = convert.getBytes();
21   System.out.println("Length : " + strs.length);
22   System.out.println("euc-kr Hex    : " + BinToHex(strs));
23   strs = convert.getBytes("utf-8");
24   System.out.println("Length : " + strs.length);
25   System.out.println("utf-8 Hex    : " + BinToHex(strs)); 
26   System.out.println();
27   System.out.println();

 

테스트 코드를 보며 이 결과들이 어떻게 나올것이라고 예측했는데 그것이 맞아떨어지지 않는다면

 

다시 글을 보면서 이해하면된다.

 

결과는 아래와 같다.

 

< 결과 >

Length : 6
Hex    :  C7 D1 B9 CE C8 A3
Value  : 한민호

Length : 9
Hex    :  ED 95 9C EB AF BC ED 98 B8
Value  : 한민호

Length : 6
Hex    :  C7 D1 B9 CE C8 A3
Value  : 한민호

????
Length : 4
euc-kr Hex    :  3F 3F 3F 3F
Length : 10
utf-8 Hex    :  EF BF BD D1 B9 EF BF BD C8 A3

 

1번 라인을 보면 한민호라는 String객체를 생성하고 있다

 

이 객체를 strs라는 바이트 배열에 getBytes()를 이용해서 받는다. getBytes에 아무 파라메터도 주지 않는다면

 

이것은 디폴트 캐릭터셋으로 바이트 배열이 리턴된다.

 

디폴트 캐릭터셋은 System.getProperty("file.encoding") 메소드를 통해 알수 있다.

 

이것을 utf-8로 저장하는 로직이 7번 라인이다. 단지 getBytes에 utf-8이란 파라메터를 주고 utf-8 캐릭터 셋의

 

바이트 배열을 받아 올 수 있다.

 

그리고 12번 라인은 이 utf-8로 저장된 바이트 배열을 다시 String객체로 파라메터 값으로 "utf-8"을 주고 생성한 것이다.

 

이때 파라메터를 주지 않거나(디폴트 파라메터가 지정됨) 다른 캐릭터셋을 준다면 깨지게 된다.

 

마지막으로 18번 라인은 잘못된 컨버팅 예이다. euc-kr을 utf-8로 변환하겠다는 건데

 

위에서 설명했듯 이러한 변환 때문에 바이트 배열이 깨져서 euc-kr이든 utf-8이든 어떠한 바이트 배열로 읽어오든

 

깨져있는 것을 확인할 수 있다. 이미 깨져서 생성된 String 객체의 바이트 배열은 어떻게든 복구가 불가능 하다.

 

<결론>

 이야기를 종합해보면 String 객체로 생성된 것을 다른 캐릭터 셋의 String 객체로 변환한다는 것은

 

어불성설인 것이다. 이러한 변환은 무지에서 나오는 것이며 String 객체에 이미 깨진 내용은 어떠한 변환이 있더라도

 

정상적인 출력이 불가능하다는 것이다. 캐릭터셋을 포함하여 관리하겠다면 철저하게 바이트 배열을 이용해야 한다.

 

그리고 String에 어떤 캐릭터 셋으로 저장되어 있는지에 대해 논하는 것은 애초부터 잘못된 것이다.

http://nicho.tistory.com/131
http://www.terms.co.kr/servlet.htm

서블릿은 멀티쓰레딩에 의해 사용자 요구를 처리하고 가공해서 이에 대한 결과를 내보내게 된다. CGI가 클라이언트 프로세스로 처리하는데 반해 서블릿은 클라이언트를 쓰레드로 처리한다. 그래서 많은 클라이언트의 요구를 효과적으로 처리할 수 있다. 서블릿 객체는 쓰레드가 여러 개 돌아가면서 처리하기 때문에 서블릿 메소드들은 반드시 멀티쓰레드에 대한 고려를 해야한다.

 JSP와 서블릿은 자바 기반으로 만들어진 웹 프로그래밍 언어이다. 서블릿이 자바 코드에 의존적이라면 JSP는 덜 의존적이라 프로그래밍하기가 더 쉽고 편하다. JSP와 서블릿은 같은 처리 구조를 가진다. 엄밀히 말하면, JSP는 페이지 요청이 있을 시에는 최초에 한 번 자바 코드로 변환된 후 서블릿 클래스로 컴파일된다. 결론적으로 JSP는 실행시 서블릿으로 변환된다. 단 한번만 서블릿으로 변경되며 코드를 수정하기 전까지 재 변환 작업이 일어나지 않기 때문에 수행 속도는 JSP나 서블릿간에 별차이가 없다.
 
 서블릿과 JSP는 상호 연계되어 JSP에서 정적인 부분을 담당하고, 서블릿은 보다 동적인 처리를 위한 부분으로 사용되어 보다 효율적인 웹사이트를 구성할수 있다. JSP는 주로 사용자용 뷰(view)의 구현에 사용되고 서블릿은 사용자의 뷰와 프로그램 로저 사이를 제어해주는 역활을 주로 사용한다.

서블릿은 서버에서 실행되는 작은 프로그램이다. 이 용어는 웹 페이지와 함께 별도의 파일로 보내지는 작은 프로그램인 자바 애플릿의 맥락에서 만들어진 신조어이다. 자바 애플릿들은 사용자를 위해 간단한 계산업무를 수행하거나 사용자의 반응에 기반하여 이미지를 위치시키는 등과 같은 서비스를 위해 대개 클라이언트에서 실행되도록 만들어진다.

그러나, 사용자의 입력에 따라 데이터베이스와 연계되는 프로그램들은 서버에서 실행될 필요가 있다. 보통, 이러한 것들은 CGI를 이용하여 구현된다. 그러나, 서버에서 실행되는 자바 가상머신을 이용하면, 그러한 프로그램들을 자바 언어로 구현할 수 있다. 서버에 있는 자바 서블릿의 장점은 CGI 응용프로그램보다 더 빠르게 실행될 수 있다는 것이다. 서블릿은 각 사용자의 요청마다 별도의 프로세스가 생기는 대신, 단 하나의 데몬 프로세스 내에서 스레드로 호출되는데, 이는 각 요구에 따른 시스템 오버헤드가 적다는 것을 의미한다.


결국,
jsp 나 servlet 이나 결론적으로는 같음.
단, jsp는 서버에서 서블릿으로 변환되어 - 처음 한번만 - 실행됨
jsp 가 view단을 처리하기에 편리함. 서블릿의 경우엔 모두 프로그램적으로 처리해야함(out.println("<html>"); 이런 식으로)

MVC는 각각의 효율성을 봐서 V를 jsp, C를 서블릿에 맡긴 것.

다 배웠던 건데 왜 싹 다 까먹었나 ㅡ.ㅡ;;

'프로그래밍 > Web' 카테고리의 다른 글

[jsp] include  (0) 2011.05.25
[jQuery] form validation  (0) 2011.03.02
[펌] jQuery Fundamentals  (1) 2010.10.07
[html] 웹페이지에서 마우스 툴팁(Tooltip; 말풍선) 태그(Tag)  (0) 2010.05.31
[script] 정규식  (0) 2010.05.20
http://www.okjsp.pe.kr/seq/136284

struts 2는 콘트롤러, 디스패쳐, 발리데이션용으로 사용하시고, 
spring은 DI콘테이너, AOP로 사용하시고, 
iBatis는 ORM프레임워크로 사용하시면 되겠네요. 

팁으로, 
Tiles 2.0 는 레이아웃템플레이트 
Acegi는 표준세큐리티프레임워크 
Google Web Toolkit는 리치클라이언트 
JUnit4는 테스트프레임워크 
JMockit는 단위테스트용 Mock프레임워크로 하시면, 

'오픈소스 full stack frame work', 즉 UI,DB, 세큐리티등의 기본적인 문제영역에 대한 
All in one환경을 구축하게 되어, 프레임워크간의 상성에 대해 걱정할 필요없이, 
비지니스로직에 집중가능합니다. 

사용하시면 기존 개발방식보다 훨 쉽게 프로그래밍이 되지 않을까 싶네요.


http://struts.apache.org/2.0.11/index.html 
http://www.springframework.org/ 
http://tiles.apache.org/ 
http://www.acegisecurity.org/ 
http://ibatis.apache.org/ 
http://code.google.com/intl/kr/webtoolkit/ 
http://www.junit.org/ 
https://jmockit.dev.java.net/


 (펌)

 

http://struts.apache.org/2.x/docs/comparing-struts-1-and-2.html (원본)

 

 

Expression Language

Struts 1은 JSTL을 통합한다. 따라서 JSTL EL을 사용한다. EL은 기본 객체 graph traversal을 가지고 있다.그러나, 상대적으로 약한 집합 그리고 index화된 property를 제공한다. 

Struts 2는 JSTL과 사용 할수있다.그러나, Framework은 또한 더 막강하고 유연한 표현 언어인 Object Graph Notation Language(OGNL)이라 불리는 언어를 제공한다.

Binding values into views

Struts 1 접근을 위해 page context안에 객체를 bing하기 위해 표준 JSP 메커니즘을 사용한다.

Struts 2는 ValueStack 기술이 사용된다. 그래서 , taglib은 객체 type을 rendering하기 위해 view에 coupling 없이 접근한다. ValueStack 정책은 같은 이름의 property 이름 이면서 다른 property type들에 대해서 type들의 범위에 교차하여 view의 재사용을 허용한다.

Type Conversion

Struts 1 ActionForm property는 일반적으로 모두 String이다. Struts 1 은 형변환을 위해서 Common-Beanutil들을 사용한다. 변환기는 클래스 마다 하지 instance마다 설정하는 것은 아니다.

 

Struts 2는 형변환을 위해서 OGNL 을 사용한다. Framework은  지초적이고 일반적인 객체 타입와 원시적인 객체타입을 위해 변환기를 포함한다.

Validation

Struts 1은 manual validation을  ActionForm의 validate 함수 또는 Commons Validator를 확장을 통하여  통해  제공한다. Class들은 동일한 class내에서  다른 validation context를 가지고 있다. 그러나, sub-object들 상에서 validation을  chain할 수는 없다.

 

Struts 2 는 validation method와 XWork Validation Framework을 통하여 manual validation을 제공한다. XWork Validation Framework은 sub-property에 property Class type과 validation context를 위한 validation정의된 chaining validation을 제공한다.

Control Of Action Execution

Struts 1 은 각각의 모듈을 위해  분할된 Request Processor( 생명주기 )을  제공하나, 모듈 안의 모든 Action 들은 반드시 같은 생명주기를 공유해야 한다.

Struts 2 는 기본적인interceptor Stack을 통해 Action마다 다른 생명주기를 생성할 수 있도록 제공한다. stack은 필요한 곳에 생성하거나 다른 action들과 사용되도록 Custom할 수 있다.

 

 

http://raberto.tistory.com/entry/Struts1-and-2 (번역)

 

출처 : http://jedison.tistory.com/69

 

본 튜토리얼은 제가 Struts 2를 공부할 목적으로 아래의 원문에 링크된 문서를 번역하여 정리한 것입니다.
원문: http://www.roseindia.net/struts/struts2/Struts2vsStruts1.shtml


이섹션에서 두개의 프레임워크 사이의 다양한 특징을 비교할 예정이다. 스트럿츠 2.x는 스트럿츠 1.x와 비교하여 매우 단순하다. 스트럿츠 2.x의 엑설런트한 특징 몇가지가 아래와 같다.

1. 서블릿 의존
스트럿츠 1의 액션은 하나의 액션이 invoked될 때 HttpServletRequest과 HttpServletResponse 객체가 execute 메서드를 통과하기 때문에 서블릿 API에 의존성을 가지고 있다. 그러나 스트럿츠 2의 경우에 액션은 컨테이너에 의존적이지 않다. 왜냐하면 액션이 단순한 POJO이기 때문이다. 스트럿츠 2에서 서블릿 컨텍스트는 고립되어 테스트된 액션을 허락하는 단순한 맵으로서 표현됩니다. 필요하다면 스트럿츠 2 액션은 진짜 request와 response에 접근할 수 있습니다. 그러나 다른 아키텍쳐 요소들이 HttpServletRequest나 HttpServletResponse에 직접적으로 접근할 필요를 줄어거나 제거했습니다.

2. Action 클래스들
인 터페이스 기반이 아닌 추상클래스 기반으로 개발된 스트럿츠1의 디자인 관련 이슈들은 스트럿츠2에서 해결이 되었습니다. 스트럿츠1의 Action 클래스들은 프레임웍에 의존적인 기반 추상클래스를 상속받도록 되어 있었지만 스트럿츠2의 Action클래스들은 옵셔널하고 커스텀한 서비스를 적용하기 위해 인터페이스를 구현할 수도 있고 아예 하지 않을 수도 있습니다. 스트럿츠2의 경우 Action 클래스들은 단순 POJO들로 개발되기 때문에 컨테이너에 대한 종속관계가 없습니다. 스트럿츠2는 ActionSupport 클래스를 제공하여 공통적으로 사용되는 인터이스들을 구현할 수 있도록 지원합니다.  그럼에도 불구하고 Action 클래스가 어떤 인터페이스를 구현하도록 요구되지는 않습니다. 어떤 POJO 오브젝트라도 execute 메소드만 존재한다면 스트럿츠2에서 Action 오브젝트로 사용이 가능합니다.

3. 검증
스트럿츠 1과 스트럿츠 2 모두 검증 메서드를 통한 수동 검증을 지원합니다.
스트럿츠 1은 검증 메서드를 액션 폼에서 사용하거나 확장시킨 Commons Validator를 통하여 검증합니다.
그러나, 스트럿츠2 는 검증메서드와 XWork 검증 프레임워크를 통하여 수동 검증을 지원한다. XWork Validation 프레임워크는 프라퍼티 클래스 타입과 validation 컨텍스트를 위해 정의된 valadations를 사용하여 서브 프라퍼티까지 연결된 검증을 지원한다.

4.쓰레딩 모델
스트럿츠1에서, 액션 리소스들은 thread-safe하거나 synchronized 되어야만 한다. 그래서 액션들은 singletons이고 thread-safe 이다. 그 액션을 위한 모든 리퀘스트를 처리하기 위한 단 하나의 인스턴스만 존재해야 한다.
싱글톤 전략은 스트럿츠 1 액션에서 할 수 있는 것에 대한 제한을 두게 되었고 개발을 하기 위해 주의가 요구된다. 그러나스트럿츠 2에서, 액션 객체는 각각의 리퀘스트에 대해 초기화된다, 그래서 thread-safety 이슈가 없다. (사실, 서블릿 컨테이너들은 각각의 리퀘스트에 대해 버리는 객체를 많이 생성한다, 그리고 하나 이상의 객체는 실행 패널티를 부과하지 않거나 garbage collection에 영향을 주지 않는다.)


5.테스트용이
스트럿츠 1 어플리케이션의 테스트는 조금 복잡하다. 스트럿츠1 액션들을 테스트하기 위한 주요 장애물은 실행 메소드이다. 왜나하면 그것은 서블릿 API를 나타내기 때문이다. 써드파티 확장인 Struts TestCase는 스트럿츠 1을 위한 mock object 집합을 제공한다. 그러나 스트럿츠 2 액션들은 액션을 초기화하고, 프라퍼티를 세팅하고 메소드들을 invoke 함으로써 테스트될 수 있다. Dependency Injection 지원은 또한 테스팅을 보다 쉽게 만든다. 스트럿츠 2의 액션은 간단한 POJO들이고 프레임웍에 독립적이다. 그러므로 스트럿츠2에서의 테스트는 매우 쉽다.

6.입력값 수집
스트럿츠 1은 입력값을 받기 위해서 ActionForm 객체를 사용합니다. 그리고 모든 ActionForm들은 프레임워크에 종속적인 기본 클래스를 확장하는 것이 필요하다. 자바빈즈는 ActionForm으로 사용될 수 없다. 그래서 개발자들은 입력값을 받기 위해 불필요한 클래스들을 생성해야만 한다.
그러나 스트럿츠 2는 Action 프라퍼티(근원적인 프레임워크에 독립적인 입력 프라퍼티)를 사용은 추가적인 입력 객체의 필요성을 제거했다. 그러므로 불필요성을 감소시켰다. 스트럿츠 2에서는 추가적으로, Action 프라퍼티들은 tag라이브러리들을 통해서 웹 페이지로부터 엑세스될 수있다. 스트럿츠 2는 또한 POJO 폼 뿐만아니라 POJO Action 을 지원하며 ActionForm 패턴도 지원한다. 심지어는 비즈니스나 도메인 객체를 포함한 풍부한 객체 타입을 입/출력 객체로서 사용할 수 있다.

7.표현언어
스트러츠1은 JSTL과 통합되어 있습니다. 그리고 JSTL-EL을 사용한다. 스트럿츠 1 EL은 기본 객체를 가집니다. 그러나 상대적으로 컬렉션과 인덱스된 프라퍼티의 지원은 약하다. 스트럿츠 2도 또한 JSTL을 사용한다. 그러나 Object Graphic Notation Language(OGNL)라고 불리우는 보다 강력하고 유연한 표현언어를 지원한다.

8.뷰와 값의 연결
뷰의 영역에서, 스트럿츠 1은 접근하기 위한 페이지 컨텍스트에서 객체(모델 영역에서 진행된) 를 바인드하기 위해 표준 JSP 메카니즘을 사용한다. 그러나 스트럿츠 2는 "ValueStack"이라는 기술을 사용한다. 태그라이브러리는 view와 그것을 렌더링할 객체 타입을 연결해 놓지 않고서 값에 접근할 수 있습니다. ValueStack 전략은 같은 프라퍼티 이름을 가졌지만 타입은 다른 타입의 범위를 넘나들며 view의 재사용을 허가합니다.

9.형변환
보통, 스트럿츠 1 Actionform 프라퍼티는 모두 String입니다. 스트럿츠1은 형변환시에 Commons-Beanutils를 사용한다.  이 타입 변환기들은 클래스당이며 인스턴스 당으로 설정되지 않는다. 그러나 스트럿츠 2는 형변환시에 OGNL을 사용한다. 프레임워크는 기본적이고 공통적인 객체타입과 프리머티브의 변환기를 포함한다.

10.Action 실행제어
스트럿츠1은 각각의 모듈에 대한 Request Processr를 분리합니다. 그러나 한개의 모듈안에서 모든 액션은 같은 라이프 사이클을 공유해야합니다. 그러나 스트럿츠 2는 Interceptor Stacks을 통해 생성된 각각의 액션에 대해 다른 라이프 사이클의 생성을 지원합니다. 사용자 스택이 생성될 수 있으며 필요하다면 다른 액션을 사용할 있습니다.

'프로그래밍 > Framework' 카테고리의 다른 글

[strust2] Chain Result  (0) 2010.12.14
[spring] struts 2 와 spring 과의 비교  (0) 2010.10.27
[struts2] <s:if> 사용법2  (0) 2010.08.04
[struts2] Workflow interceptor  (0) 2010.03.02
[Strust2] 가이드 문서, 레퍼런스 문서  (0) 2009.07.30
java에서 replaceAll 함수를 이용하여 문자열 내의 태그 제거하기

    /**
     * 주어진 문자열에서 태그를 모두 제거한다.
     * @param str 원본 문자열
     * @param replacement 대체할 문자열
     * @return
     */
    public static String replaceTag(String str, String replacement) {

        // <로 시작. /가 0번 또는 1번 나옴. (a-zA-Z문자가 0번 이상)이 한 묶음.
        // (\s 공백문자. a-Z문자가 0번 이상. = 나옴. > 제외한 문자 0번 이상.)이 한 묶음으로 0번 또는 1번 나옴. <- 태그 다음 공백부터 > 전까지. ==> 속성
        // 공백 0번 이상. /가 0번 또는 1번. >로 끝.
        // ex) <a href="www.naver.com" title="title" >NAVER</a>
        return str.replaceAll("<(/)?([a-zA-Z]*)(\\s[a-zA-Z]*=[^>]*)?(\\s)*(/)?>", replacement);
    }

    /**
     * 주어진 문자열에서 a 태그를 제외한 태그를 모두 제거한다.
     * @param str 원본 문자열
     * @param replacement 대체할 문자열
     * @return
     */
    public static String replaceTagExceptA(String str, String replacement) {

        // /aA 또는 aA가 아닌 것으로 시작하는 모든 태그
        return str.replaceAll("<(?!(/[aA])|([aA])).([a-zA-Z]*)(\\s[a-zA-Z]*=[^>]*)?(\\s)*(/)?>", replacement);
    }

?! 사용해야 하는 걸 알아내느라 애먹었다.
참고: http://nosyu.pe.kr/1139

(?<=.....) : 긍정형 룩비하인드 - 하위 표현식(..... 부분)이 왼쪽에 매치될 때
(?<!.....) : 부정형 룩비하인드 - 하위 표현식(..... 부분)이 왼쪽에 매치되지 않을 때
(?=.....) : 긍정형 룩어헤드 - 하위 표현식(..... 부분)이 오른쪽에 매치될 때
(?!.....) : 부정형 룩어헤드 - 하위 표현식(..... 부분)이 오른쪽에 매치되지 않을 때

(?!(/[aA])|([aA])). 에서와 같이 /a /A 또는 a A 와 매치하지 않는 것을 찾아내는 정규표현식임.

[ftp] FTP/SFTP/FTPS 의 차이점

프로그래밍/Library 2010. 10. 18. 17:27 Posted by galad
셋 다 다르다!!!

FTP – should be only used for the plain old FTP protocol.

      - 일반적으로 우리가 아는 FTP


SFTP – should be only used for SFTP, the SSH file transfer protocol. However, people often shorten Secure FTP into SFTP - this is not correct, because the S in SFTP does not stand for Secure, but for SSH.

      FTP 프로토콜이 아님!!! 정식명칭은 SSH File Transfer Protocol. 약자로 SFTP로 불림.


Secure FTP – this name is the most confusing, because it is used to refer to either of the two different protocols. Whenever this name is used, it is necessary to specify whether the SSH-based or SSL-based file transfer protocol is meant.

      - FTPS, FTP-Secure 등으로 불림. Plain FTP over TLS/SSL channel. FTP 인데 TLS/SSL 을 거쳐서 안전하게 된 것. 


참고: http://www.zehon.com/index.html

http://en.wikipedia.org/wiki/FTPS

'프로그래밍 > Library' 카테고리의 다른 글

[ETC] 네이버에서 오른쪽 클릭 방지 풀기  (0) 2010.11.29
[정규표현식] 태그 제거하기  (0) 2010.10.19
[eclipse] plug-ins  (0) 2010.08.17
[browser] MS Expension Web SuperView  (0) 2010.04.08
[program] 프로파일러  (0) 2009.12.03