http://localhost:8080/NecstMarketPlace/product-descriptions-detail.action?serviceId=S0000000002
@Results({
	@Result(name="reload",   type="redirect", location="index.action"),
	@Result(name="productDetail",   type="redirect", params ={"serviceId","${serviceOptionId}"} , location="product-descriptions-detail.action"),
	@Result(name="product",   type="redirect", params ={"categoryId","${categoryId}"},location="product-descriptions.action"),
	@Result(name="success",  type="tiles", location="shoppingcart-purchase.page"),
	@Result(name="input",    type="tiles", location="shoppingcart-purchase.page"),
	@Result(name="review",   type="tiles", location="shoppingcart-purchase.page"),
	@Result(name="complete", type="redirect", location="shoppingcart-purchase!showComplete.action"),
	@Result(name="showcomplete", type="tiles", location="shoppingcart-purchase-complete.page"),
	@Result(name="print",                  location="/WEB-INF/pages/shoppingcart-purchase-print.jsp"),
	@Result(name="download", type="stream",
			params = {
				"inputName", "inputStream",
				"contentType", "${mediaType}",
				"bufferSize", "1024"
			}
		)
})



JSP에서 Param으로 받을경우
"${serviceOptionId}"는 클래스안에서 get/set선언...
클래스 내부에서 사용할경우
get/set으로 선언할 필요까지는 없다.

'Struts2' 카테고리의 다른 글

struts.properties , 사용방법  (0) 2010.08.16
현재 URL 가져오기  (0) 2010.08.14
Validator 날짜 체크 Action  (0) 2010.08.11
validate money check struts2  (0) 2010.08.10
Struts2 exceptionStack logfile  (0) 2010.08.06
 
  /**
     * 
     * Method name:checkDate
     * 
     * description: データFormatをチェック、必須チェック含む
     * 
     * @param strDate チェックしたい項目名
     * @param filedName エラーが発生し、表示する項目名(getText("項目名"))
     * @param action this
     * 
     * Created at:2010/08/11
     *
     */
    public void checkDate(String strDate , String filedName ,BaseAction action){
        // 日付の入力チェックがXMLでは難しいため、javaでチェックする
        // ここで追加したエラーメッセージはJSPので表示される
        String dateName = getText(filedName);
        if (strDate==null || strDate.isEmpty()) {
            // 必須入力チェック
            action.addActionError(getText("errors.required", new String[]{ dateName }));
        }else {
            // 日付フォーマットチェック
            SimpleDateFormat formater = new SimpleDateFormat(getText("java.date.format"));
            formater.setLenient(false); //日付を厳密にチェックするように設定
            Date parsed = null;
            try {
                parsed = formater.parse(strDate);
            } catch(Exception e) {
            }
            if (parsed == null) {
                action.addActionError(getText("errors.invalid.date.format", new String[]{ dateName }));
            }
        }
    }

'Struts2' 카테고리의 다른 글

현재 URL 가져오기  (0) 2010.08.14
Struts2 @Results 에서 params이용 방법  (0) 2010.08.12
validate money check struts2  (0) 2010.08.10
Struts2 exceptionStack logfile  (0) 2010.08.06
Struts2 validation Byte Check  (0) 2010.08.06

        </field-validator>
        <field-validator type="regex">
          <param name="expression">
            ^(\$|\-\$|\$\-)?([1-9]{1}[0-9]{0,2}(\,[0-9]{3})*(\.[0-9]{0,2})?|[1-9]{1}[0-9]{0,}(\.[0-9]{0,2})?|0(\.[0-9]{0,2})?|(\.[0-9]{1,2})?)$
 </param>
            <message>${getText("errors.upto",{getText("category.description"),maxLength})}</message>
        </field-validator>

다른예..
<!--  ^\$?([1-9]{1}[0-9]{0,2}(\,[0-9]{3})*(\.[0-9]{0,2})?|[1-9]{1}[0-9]{0,}(\.[0-9]{0,2})?|0(\.[0-9]{0,2})?|(\.[0-9]{1,2})?)$ -->


간단한예..
12345.67 as a regex for this? 

^[0-9]{1,5}\.[0-9]{2}$ (doesn't compile in Eclipse) 
\b[0-9]{1,5}\.[0-9]{2}\b (doesn't compile in Eclipse) 
[0-9]{1,5}.[0-9]{2} (compiles, but is not correct) 

I'm using it like this btw: 
@RegexFieldValidator(key="validate.amount", fieldName="amount", 
message="", expression="[0-9]{1,5}\.[0-9]{2}") 




'Struts2' 카테고리의 다른 글

현재 URL 가져오기  (0) 2010.08.14
Struts2 @Results 에서 params이용 방법  (0) 2010.08.12
Validator 날짜 체크 Action  (0) 2010.08.11
Struts2 exceptionStack logfile  (0) 2010.08.06
Struts2 validation Byte Check  (0) 2010.08.06

오랜만에 재미 있게 읽을 글.. 일본에서 일을 하다보면 문제를 질문하기전에 왜..발생하고 어떤한조건에서 다시 발생하는지

 

간단한 정보정도는 알아 둔뒤 질문을 하러 가는것은 예의라기 보다는. 습관이 되어 가는듯.. 처음 이런식으로 질문했을때

 

왜.. 어디서.. 어떻게.. 등. 이런식으로 오히려 질문을 당해서 다시 알아 보러 갔던적이.. 역시나. ^^

 

가장 기본적이 문제이면서도 참. 그순간에는 생각이 잘안나는지..

 

혹시 문제가 된다면 삭제 하겠습니다..

 

원문출처 : http://blog.naver.com/saltynut/120039707278

 

Written by <?xml:namespace prefix = st1 />안재우(Jaewoo Ahn), 닷넷엑스퍼트(.netXpert)

데브피아와 같은 커뮤니티에서 왕성하게 활동하던 시절에 비하면 훨씬 적긴 합니다만지금도가끔 이런저런 질문을 받기도 합니다전혀 모르는 사람으로부터 메일이  때도 있고지인(혹은 실수로 가르쳐준 OTL)으로부터 메신저로 물어볼 때도 있고아주 가끔은 전화로 물어보는 사람들도 있습니다

 <?xml:namespace prefix = o />

옛날에는 바쁘다는 핑계로 씹어버리기도 했습니다저한테 메일을 보냈는데 답을 받지 못하셨던 분들에게는  자리를 빌어 죄송하다는 말씀을 드립니다.

 

그런데 말이죠..(변명과 핑계의 시작입니다. ^^)

바빠서 그런 경우는 있지만그런 질문들  일부는 답을   없거나 답을 해주고 싶지 않아서 그런 경우도 많습니다이번 글은 일부 개발자들(적어도 자기는 개발자라고 주장하는 사람들) 잘못된 질문 습관을 지적해보도록 하겠습니다.

 

얘기를 풀어나가기 위해 한가지 비유를 들어보도록 하겠습니다.

마침 제가 아침에 출근할  보니주차장  차에 실내등이 켜져 있더군요운전자가 끄는 깜빡하고 내린 거겠죠요걸 보고 이번 글을 설명할 아이디어가 떠올랐습니다. ^^

 

2  운전자 A씨의 이야기

 차는 차를 운전한지 2   A 소유입니다. A씨는 운전은 하지만 사실 차에 대해서는 모릅니다. (.. 예전  CF 광고문구네요.) A씨는 작년에 타던 중고차를 처분하고 이번에 사의 최신 자동차를 구입했습니다남들이 하는  보니 멋져 보여서 차에 사제 HID달고오디오 튜닝도 했습니다.

다음  A씨는 급한 약속이 있어서 가족과 함께 어딘가로 가기 위해 차의 시동을 걸어봅니다.어라멀쩡하던 차가 시동이  걸립니다  시동을 걸어보다가 자기 나름대로는 보닛도열어봤습니다만 도대체 뭐가 뭔지시동이   걸리는지 하나도 모르겠습니다아내는 바쁜데 이게 뭐냐고 구박하고애는 덥다고 에어컨 틀어달라고 빽빽 울어대기 시작했습니다나름유명회사의 최신 자동차를 비싸게 주고 샀는데 차가 말썽이 생기니 짜증이 이만 저만 나는 아닙니다.

일단 보험회사에 전화를 했는데 긴급출동 서비스 제공 대상 고객이 아니랍니다기억을 더듬어 보니보험 가입 첫해인 작년에는 긴급출동 서비스를 가입했었는데 올해 자동차 보험을 갱신하면서 어차피   쓰는  같아서 보험료 아낀다고 긴급출동 서비스를 빼버렸던  기억이 납니다.

일반 카센터에 전화를 할까 했지만돈이 많이 들어갈  같아서 무섭습니다어찌할까 발을동동 구르다가 문득 근처에 사는 아는 후배 중에 자동차에 대해  아는 B 있다는 것이 기억이 나서 전화를 합니다.

A : , B!  지금 되게 급한데 차가 시동이  걸려빨리 와서  해결해줘!

B : .. 제가 지금 바로는 안되고 30 내로는   있습니다만..

A : 아씨급하다니깐빨리 !

B : ... .. 알겠습니다.

결국 불쌍한 후배 B 바로 달려왔습니다.

B : 어디가 문제죠?

A : 몰라어제까지 되던 놈이 안되네빨랑 시동  걸어봐!

 

잠시  B 배터리가 방전되었다는 것을 찾아냅니다.

B : 배터리 방전이네요.

A : 그래서어떻게 해야 되는데?

B : 다른 차랑 점프 케이블로 연결하면 시동이 걸릴 겁니다.

A : 그래그게 어딨어?

B : 일단  차에 있습니다앞으로  이런 일이 있을지 모르니 선배님도 하나 구입하시고어떻게 하는지도 한번 보시죠.

A :  그런  몰라그냥 자네가 해결해줘.

B ...

 

결국 B씨가 혼자 점핑을 해서 시동을 걸어줍니다.

A : 드디어 걸렸네!

B : 선배님 그런데   말입니다아무래도 전기장치가  불안한  같은데요특별한증상 같은  없으셨나요?

A : 아아나중에 얘기하자구내가 급해서~

A씨는 서둘러 가족들을 태우고 떠납니다.

 

가족들과  일을 마친 A씨는 또다시 시동이 걸리지 않는 것을 발견합니다.

또다시 B에게 전화를 했지만 이번에는 B 전화를 받지 않습니다.

결국 A씨는 카센터에 전화를 했고출장 기사가 왔습니다.

그런데 이번에는 점핑으로도 시동이 걸리지 않아서 결국 견인을 하게 됩니다.

카센터에서 점검 결과 배터리가 완전히 나가 버렸다고 합니다.

문제는 아무래도 불법으로 장착한 사제 HID 오디오 때문인  같습니다.

결국 A씨는 견인비와 배터리값으로 많은 돈을 지출하게 됩니다.

그리고 마음 속으로 다시는 M사의 자동차는 사지 않겠다고 굳은 결심을 합니다.

 

A씨의 이야기에 담긴 것은?

A 얘기를 읽으면서 재밌으셨습니까여기에 숨겨져 있는 A씨와 일부 개발자들의 공통점을짚어내 보도록 하겠습니다.

 

1. 과정보다는 결과를 중요시한다.

A씨는 시동이 걸리지 않은 원인시동이 걸리지 않는 문제를 조치하는 과정에는 전혀 관심없이 빨리 차를 몰고 약속장소로 가야 한다는 결과에만 집착했습니다.

이렇듯 질문의 상당 부분들은 문제에 대한 해결 요청 경우가 많습니다일단 문제는 터져있는 상황이고빨리 해결 못하면 위에서 쪼아댈테고.. 그러다 보니 문제를 최대한 빨리 해결하는 것에 관심이 있지문제가 발생하는 원인이 무엇이며  원인을 제거하거나 회피하기 위해서 어떤 과정을 거쳐서 처리해야 한다는 것에는 관심이 없습니다.

 

2. 문제가 발생하는 것에는 항상 계기가 있다.

뭔가 문제가 발생해서 오는 질문들 중에 가장 황당한 질문은 어제까지는 됐는데갑자기 오늘 아침부터 갑자기  됩니다어떻게 해야 되나요?라는 것입니다컴퓨터나 소프트웨어가 갑자기 오늘부터 삐진 걸까요? ^^

아니  굴뚝에 연기가  일이 없듯이어제와 오늘 사이에는 분명히 무슨 일이 있었던 것입니다문제는  일들에 대해 대수롭지 않게 생각하고  아무것도 손댄  없다고 주장해버린다는 것입니다.

예전 고객 사이트들에서 실제로 이러한 질문들이 있었습니다멀쩡하게  돌아가던 프로그램이 있고 손댄 것도 아무것도 없는데 오늘 아침부터  된다는 것입니다어제와 오늘 사이에다른 작업을  것이 없냐고 물어도 절대 없다고 시치미를 떼었기에 문제를 찾는데는 상당한시간이 소요되었습니다결국 찾아낸 문제의 원인은  전날 퇴근하면서 설치한 XP 서비스팩때문이었습니다.

 

3. 문제에 대해 충분히 설명을 하지 않는다.

우리 사이트에서 갑자기 결제 오류가 나는데 어떻게 해야 되나요?

실제로 달랑   줄을 메일로 보내고 해결해달라고 하시는 분이 계셨습니다.

저를 전지전능한 신으로 착각하시나 봅니다. -_-;;

문제가 있을 때는 문제가 발생하는 상황에 대해서 정확하게 기술해야 합니다또한 여러분은일반 사용자가 아닌 개발자입니다갑자기 결제 오류가 나는데 해결해 달라 질문은 일반사용자가 하는 질문이지개발자가 하는 질문이 아닙니다기본적으로 개발자는 발생하는 오류에 대한 정보를 수집하기 위해 최선을 다해야 합니다다음은 개발자가 수집해야  최소한의 정보라고 생각되는 것을 나열한 것입니다.

n        정확한 오류 메시지의 내용은 무엇인가?

n        오류가 발생되는 것으로 추정되는 소스 코드 위치는 어디인가?

n         오류를 발생시키기 위한 상황은 무엇인가오류를 재현하려면 어떻게 해야 하는가?

n         오류가 특정 컴퓨터/서버/네트워크 위치에서만 발생하는가?

n        정상적으로 작동하던 때와 오류가 발생하는 시점 사이에 변경된 것은 무엇인가?

 

4. 문제를 해결하기 위한 스스로의 노력

적어도 개발자라면 문제가 있거나 과제가 주어졌다면 그것을 해결하기 위해 자기 스스로 최대한 노력을 해야 합니다물론 남이 해결해 주는  시간 상으로는  단축이  수도 있겠지만적어도 자기가 직접 노력을 해보고 나서 해봐야 하지 않을까요?

상당수의 질문들은 도움말을  분만 찾아보면 얻을  있는데다가인터넷이 발달한 요즘처럼 좋은 세상에는 네이버 지식인과 구글 검색만으로도 상당수의 답을 얻을  있습니다옛날에는 모든 해답이 MSDN  있었지만요즘은 구글에  있더군요애인이랑 식사할 맛있는스파게티 전문점을 검색하는데는 자신의 시간을 투자하면서 문제를 해결하기 위해 자료를 검색하는   스스로 하지 않나 모르겠습니다구글에서 5분이면 찾을  있는 것을 물어볼 귀찮으니깐 니가 대신 검색해서 내놔라 라는  밖에 되지 않습니다.

또한 많은 개발자들이 문제가 발생했을  디버깅조차 제대로 해보지 않는 경우가 많습니다(특히  개발자들의 경우). 디버깅을 해보면서 조금만 추적해보면 금새 답이 나오는데전체 코드도 아닌 쪼가리 코드만을 주고 해답을 찾아내라고 던지시더군요그때마다  머리 속에서는 코드 텍스트를 머리 속에서 컴파일해가면서 실시간 디버깅(?) 해야 합니다제발 디버깅 한번이라도 해보세요!

 

5. 적절한 사람에게 적합한 질문을 하라.

역시 제가 받은 황당한 질문 시리즈  하나는 비주얼 스튜디오  주시거나 구할  있는(구매한다는 의미가 아니죠?) 곳을 알려 달라는 것입니다그보다  황당한 것도 있습니다.어떤 분은 비주얼 스튜디오 싸게   있는 방법이 없냐고 물어보시더구요. -_-;; 비주얼 스튜디오 설치하다가 CD 에러가 난다는 분들도 계시고... 심지어 몇번째 장이 에러나는데 그거 하나만 구워서 보내줄  있냐고..

저는 MS 소프트웨어 판매 유통업에 종사하고 있지도 않고, MS 기술지원부서에 근무하고 있지도 않습니다제품은 소프트웨어 판매하는 곳에서 구매하시면 되고돈이 없으시면 알아서능력껏 어둠의 경로에서 구하세요그리고 제품 설치에 대한 질문은 MS 기술지원부서에다 하셔야지  저한테 하시는지.. (불법사용자라서 그럴까요? -_-;;)

어떤 분은 SQL 서버에서 데이터 마이닝을 하는 방법에 대해서 저한테 물어보시더구요안타깝게도 저는 DB 전문가가 아니랍니다답을 해드리고 싶어도 몰라서 못해드린답니다.

 

6. 멋도 모르면서 남들이 좋다고 하면  따라서 한다.

일단 개발자라고 하면 비주얼 스튜디오는 깔아야 한다고 생각하는 분들이 많더군요 깔아도 항상 최상위 버전(2005 경우 Team Suite) 깔아두시더라고요.

개발 툴이나 기술이 일단 남들이 하는 거면 그것이 자기한테 적합한지자신이 하고자 하는것에 맞는지 살펴보지도 않고 무조건  따라 하는 사람들이 있습니다정확한 목적의식없이할려니 의욕도  생기고 헤매기 십상입니다.

사실 개발자라는 직업 자체가 그렇습니다. IT 열풍과 미친 정부 덕에 IT 인력을 양산해 냈지만개발자는 단순히 밥벌이를 위해서라면 참으로 힘들고 괴로운 직업이거든요먹고 사는 목적이라면 이것 말고 다른 방법을 얼른 찾아보시는  빠를 겁니다.

 

7. 문제가 생기면  탓부터 한다.

요즘 작업을 하다 보면 개발자 혼자 원맨쇼로 작업을 하는  아니라 여러 명이 공동 작업을하는 경우가 많습니다그러다 보면 남이  소스나 모듈을 가져다 붙여서 작업을 해야 하는경우가 많은데문제가 생기면 정확한 문제의 원인이 무엇인지 찾아서 해결하는  아니라 문제가  때문에 발생한  아니라는  찾아내는데 주력하는 사람들이 있습니다거참당신 잘못이 아니라 다른 사람 잘못이라는 걸로 판명 낸다고 해서 문제가 해결되나요일단 문제를 해결해놓고 범인이 누군지 찾는  나중에 해야죠.

저희 회사가 하는 일이 개발 프레임워크와 같은 공통 모듈을 만드는 작업을 많이 하다 보니이러한 일을 부지기수로 겪습니다개발 프레임워크를 가져다 개발하면서 문제가 생기기만 하면 프레임워크 탓으로 돌리더군요.

 사이트에서 작업하면서 O사의 컴포넌트를 가져다 사용한 적이 있었습니다저희 쪽에서는 컴포넌트를   쓰기 쉽게 래핑해서 개발 프레임워크 내에 집어넣었습니다그런데 사용하다 보면서 갑자기 문제가 발생했습니다발생한 시점은 O사의 컴포넌트를 최신 버전으로교체하고  이후였고열심히 디버깅해본 결과 최종적인 오류는 O사의 컴포넌트 내부에서발생하는 것으로 판명되었습니다당장 이전 버전으로 롤백을 하면 문제는 없겠지만최신 버전에 포함되어 있는 기능이 필요하기에 당장 결정할 수는 없는 상황이었습니다그래서 문제를 O사에 문의했습니다유사한 문제가 발생한  있는지아니면 이를 수정할  있는 방안이 있는지워낙 급한 문제라서 바로 긴급 기술지원을 요청했고, O 엔지니어가 왔더군요. 엔지니어는 오자마자 시스템이나 코드는 열어보지도 않고 무조건 절대 자기 회사 컴포넌트에서 문제가 발생할리가 없다고 주장하더군요일단 보기라도 하고 말하라고 했더니 잠시 살펴본 후에 이번에는 래핑하는 프레임워크 코드가 잘못 되었다고 주장하더군요프레임워크 안의 코드는 그들이 제공하는 예제 코드를 그대로 가져다  것이었습니다. O 엔지니어는 자신들이 제공하는 예제를 돌리면 문제가 없으며 너희가 분명히 어딘가 코딩을 잘못 했을거다라고 하더군요그래서 아예 그럼 당신이 직접  예제를 가지고 돌려보라고 했습니다도대체 하는지 모르겠지만  시간을 예제 가지고 끙끙대고 있더군요.

그러다 엔지니어가 온지 무려 6시간 만에 자기들 컴포넌트의 문제인  같다고 시인하더군요.우리가 원하는  문제의 해결이지 누구 잘못인지를 따지는 것이 아닌데자기들 문제라고 시인하는데 무려 6시간이 소요되었습니다그래서 디버깅을 통해 빨리 문제를 분석하고 해결해줄  있냐고 했더니 한번 알아보겠답니다언제까지 해결하겠다는 것도 아니고 알아보겠다니정말 미치는 노릇이죠!

결국  사람을 믿느니 직접 찾아보는게 낫겠다고 싶어서 열심히 인터넷을 검색한 결과 유사한 문제를 여러  찾아냈고당장 해결되는 버전은 없지만 이를 피하기 위한 Workaround있다는 것을 알아냈습니다.

교통사고 부상자가 있을  부상자를 구호하는  우선이지 누가 가해자고 누가 피해자를 따지는  중요한  아닌 것과 똑같습니다.

 

8. 별거 아닌 습관 속에서 문제가 발생할 수도 있다.

A씨가 차에서 내리기 전에 실내등을 껐는지만 확인했다면 당장 시동이 걸리지 않는 문제는 없었을 겁니다(물론 근본적인 원인일  있는 불법 튜닝은 빼고). 이와 같이 개발자의 사소한 습관 때문에 엄청난 문제가 야기될  있습니다.

예를 들어 저는 while 루프를 작성할 때는 가장 먼저 루프를 탈출하는 코드부터 작성합니다.깜빡하고 빼먹어서 자칫 잘못하면 무한 루프가 되어 버릴 경우가 있기 때문이죠.

실제로  사이트에서 이런 일을  적이 있습니다개발자들이 중구난방으로 쓰던 코드를 통합 모듈로 작성해주고통합 모듈을 사용하도록 기존 코드를 수정하라고 했습니다수정하는데 시간은  걸리지만 문제점을 격리시킬  있으니까요그런데 개발자   중에 유난히 작업을 귀찮아 하는 사람이 있었습니다공교롭게도 통합 모듈을 적용해서 사이트를 돌렸는데갑자기  서버의 CPU 100% 치면서 사이트가 죽었다가 살아나는 현상이 생기더군요불평이 많던 개발자가 바로 통합 모듈 때문이라면서 온갖 비난을 쏟아내더군요한참문제를 찾아본 결과 특정 페이지에서 특정 조건 시에만 문제가 발생한다는 것을 찾아냈습니다열심히 코드를 디버깅 해본 결과, while 루프에 탈출문이 없어서 무한 루프를 돌고 있더군요어처구니 없게도  코드를 작성한 개발자는 불만이 가장 많고 문제가 생기자마자 목청껏떠들던 바로  개발자였습니다 민망했겠죠? ^^

 

9. 문제는 예방하는 것이 최선이지만소를 잃더라도 외양간을 고치자.

어쩌면 A씨가 긴급출동서비스만 넣어두었다면   시간과 비용을 절약할  있었을 겁니다.또한 점프 케이블을 준비해두고 점핑하는 방법을 알았다면   나았겠죠.

사전에 문제를 예측해서 예방하고문제가 발생했을  이를 최대한 빨리 해결하는 방법을 수립해두는 것은 중요합니다또한 문제 해결 방법을 알고 나면 다음에 동일한(혹은 유사한문제가 발생했을  스스로 대처할  있도록 숙달해두는  역시 중요합니다.

저는   물어본 질문을 다시 물어보는 사람을  싫어합니다.

 

10. 그래도 가장 중요한 것은 사람으로서의 예의이다.

위의 사례에서 보면 A씨는 자기의 문제를 해결하는데 급급해서 상대방의 입장을 전혀 고려해보지 않는 무례한 행동을 많이 합니다. B 입장에서는 앞으로 A씨를 대하는 것이 절대 예전처럼은 되지 않을 겁니다.

질문 메일을 받다 보면 이처럼 다짜고짜 용건만 말하고 빨리 답을 달라고 강요하는 사람들이있습니다이런 경우 답을 주기 싫지요답을 줘도 고맙다는 얘기를 듣는  하늘에  따기입니다.

고객 센터에 질문하는 것도 아니고누군가에 도움을 요청할 때는 자신이 누구인지를 밝히면서 양해를 구하고 이러한 상황인데 도와주시면 감사하겠다고 정중하게 말하는 것이 최소한의예의가 아닐까 합니다이런 메일이라면 최소한 도와주지 못하더라도 답장은 쓰게 되더라구요.

예전에 어떤 분은 제가 7 전에 어딘가에 올려둔 소스를 보고 나서님이 올린 소스  봤는데내가 이런 이런 기능이 필요한데 추가해서 빨리 보내주세요.라고   줄을 보내오셨습니다제가 답을 했을까요? ^^

마찬가지로 맞춤법띄어쓰기도 엉망이고어법에도 맞지 않는 글을 보내오는 경우도 그렇습니다.

 

맺으며

여러분들께서는 어떠십니까무엇보다 여러분들은 일반 사용자가 아니라 개발자라는 점을 잊지 마세요.

'프로그래밍칼럼' 카테고리의 다른 글

Chrome IE Tab Multi 크롬에서 IE를 사용하자~!!  (0) 2011.03.28

server.xml

  <GlobalNamingResources>
--  추가
      <Resource auth="Container" 
        autoReconnect="true" 
        driverClassName="org.postgresql.Driver" 
        maxActive="20" 
        maxIdle="10" 
        maxWrite="-1" 
        name="jdbc/postgres" 
        password="1234" 
        type="javax.sql.DataSource" 
        url="jdbc:postgresql://localhost:5432/postgres" 
        username="postgres"/>
-- 추가 
  </GlobalNamingResources>

context.xml
-- 추가
    <Resource name="jdbc/postgres" auth="Container"
            type="javax.sql.DataSource"
            username="postgres"
            password="1234"
            driverClassName="org.postgresql.Driver"
            url="jdbc:postgresql://localhost:5432/postgres"
            autoReconnect="true"
            maxActive="20"
            maxIdle="10"
            maxWrite="-1"/>
--추가

web.xml
--추가
<resource-ref>
  <description>postgreSQL</description>
      <res-ref-name>jdbc/postgres</res-ref-name>
  <res-type>javax.sql.DataSource</res-type>
  <res-auth>Container</res-auth>
</resource-ref>
--추가

postgresql-8.3-603.jdbc4.jar
C:\Program Files\Apache Software Foundation\Tomcat 6.0\lib 밑에 추가
C:\Java\jre6\lib\ext 밑에 추가
(프로젝트이름)\WebContent\Web-inf\lib  밑에 추가 또는 외부라이브러리 추가..

에러
Cannot load JDBC driver class 'org.postgresql.Driver
드라이버를 못찾는다.. 드라이버가 제대로 추가 되어있는지 확인한다 .
경우 xml내용을 확인한다. 데이터베이스명, 패스워드 등.

PS 이클립스경우.. 이클립스안에 있는 Server프로젝트를 수정한다.. 

'Eclipse' 카테고리의 다른 글

웹 화면 설계용 툴  (0) 2013.11.08
Eclipse 3.7 + Svn  (0) 2011.12.01
이클립스 메모리 관리  (0) 2011.07.12
eclipse 3.6 HeliosにVisualEditor을 인스톨  (0) 2011.02.11
Eclipse 탭 스페이스 변경  (0) 2010.08.06

안드로이드에서 에러가 발생할경우.. 밑과 같이 한다..
1. 프로젝트에서 자동빌드. 제거
2. [Gen]폴더 제거
3.Clean 실시해서 프로젝트를 깨끗히
   이때 재빌드가 되지않도록 체크를 제거한다.
4. eclipse를 닫는다.
5. 프로젝트에서 자동빌드를 유효화해 실시한다. 수동으로 할경우.. 이상하게 실패한다..

이상..

참조. 

  1. プロジェクトメニューの「自動ビルド」が有効の場合はチェックを外す
  2. 「gen」フォルダを削除
  3. 「クリーン」を選択して該当プロジェクトをきれいにする
     このとき、クリーン後に再ビルドするというチェックが入っていれば外す(重要!)
  4. Eclipseをいったん閉じる(重要!)
  5. プロジェクトメニューの「自動ビルド」を有効にする
     手動でビルドすると何故か失敗する…

'Android' 카테고리의 다른 글

Dialog 제어 , 샘플소스  (0) 2010.08.27
Window에서 Git환경구성과 주의점1  (0) 2010.08.06

Git는 처음부터 리눅스용 버전 관리 시스템으로 개발되었기에 Window용 서포터는 반응이 늦다.(?)
Windows환경에 따른 Git바이너리를 선택
Git는 표준에서는 Windows 환경을 서포트하고 있지 않다.Git의 코어 부분은 C로 기술되고 있지만, 주변 툴이나 서버능의 실현에는 Perl나 셸 스크립트를 이용하고 있기 때문이다.그 때문에, Windows 환경에서 Git를 이용하려면 , 이것들을 포함한 환경 구축이 필요하다.현재, Windows상에서 Git 및 그 주변 환경을 정리해 인스톨 할 수 있는 것으로서 msysgit와 Cygwin가 있다.

msysgit는, Windows 전용으로 GCC나 개발에 필요한 UNIX 툴을 제공하는 MinGW/MSys를 베이스로 작성된 Git 환경이다.필요한 환경을 일발로 구축할 수 있는 인스톨러가 준비되어 있어 이것을 이용하는 것으로 Git외, bash나 Perl 등, Git를 이용하기 위해서 필요한 툴을 간단하게 인스톨 할 수 있다.다만, Git와 Subversion의 제휴를 실시하는 git-svn나, Web 브라우저로 리포지터리(repository)를 열람할 수 있는 git-instaweb 등은 부속되어 있지 않다.(인스톨해도 없다.)

한편, Cygwin는 Windows 전용으로 UNIX 호환 환경을 제공하는 것으로, 인스톨러로 「git」를 선택하는 것으로 Perl나 bash등이 필요한 툴 일식이 인스톨 된다.우선 Git를 사용하고 싶으면 msysgit를, Cygwin를 벌써 이용하고 있다, 혹은 git-svn나 git-instaweb를 사용하고 싶으면 Cygwin와 사용법에 맞추어 어느 쪽을 이용하는지 선택하면 좋을 것이다.물론, 양쪽 모두를 공존시키는 것도 가능하다.

msysgit의 인스톨
msysgit의 인스톨러는 mysgit의 프로젝트 페이지로부터 다운로드할 수 있다.인스톨의 도중에 PATH 환경 변수의 설정을 어떻게 할까 묻는(그림 1) 것으로, 표 1을 참고에 희망하는 것을 선택하자.
그림 1 PATH 환경 변수의 설정 화면


표 1 msysgit의 PATH 환경 변수 설정
선택사항설명
Use Git Bash only 부속되는 「Git Bash」환경에서만  Git를 사용한다.통상은 이 설정으로 문제 없다
Run Git from the Windows Command Prompt 커멘드 prompt로부터도 Git를 이용할 수 있도록 설정한다
Run Git and included Unix tools from the Windows Command Prompt 커멘드 prompt로부터 Git 및 Perl등의 부속 UNIX 툴을 이용할 수 있도록 설정한다.find나 sort 등, Windows에 포함되는 커멘드 라인 툴과의 경합이 일어나는 경우가 있으므로 주의

또, Git는 암호화 통신에 SSH를 이용하지만, SSH 클라이언트로서 PuTTY(Windows 환경에서 넓게 사용되고 있는 GUI의 SSH 클라이언트)를 이용할 수도 있다.PuTTY를 이용하는 경우는 
그림 2의 화면에서 「Use PLink」를 선택해, PuTTY에 포함되는 「plink.exe」의 패스를 지정한다.
인스톨이 완료하면, 데스크탑에 작성되는 「Git Bash」아이콘, 혹은 스타트 메뉴의 「프로그램」 「Git」 「Git Bash」로부터 Bash를 기동할 수 있다.Git를 이용할 때 , 기본적으로는 이 환경으로부터 Git를 조작하게 된다.

Cygwin에 의한 Git의 인스톨
Cygwin로 Git를 인스톨 하는 경우는, 「Select Packages」화면에서 「git」를 선택하면 좋다.또, bash용의 보완 사전 「git-completion」 및 GUI 툴 「git-gui」도 준비되어 있으므로, 이용하고 싶은 경우는 이것들도 선택해 두자(그림 3).또, Git로부터 Subversion 리포지터리(repository)에 액세스 하는 「git-svn」기능을 이용하는 경우는, 별도 「subversion-perl」패키지도 필요했다(그림 4).
그림 3 Cygwin로 준비되어 있는 Git 관련 패키지
그림 4 git-svn를 이용하는 경우는 「subversion-perl」패키지도 필요

GUI로 Git를 조작할 수 있는 git-gui
Windows 환경에서 Git를 이용할 때에, GUI로 이용할 수 있는 클라이언트를 갖고 싶다고 하는 유저도 많을 것이다.현재 Windows 환경에서 이용할 수 있는 GUI 클라이언트로서는, Git에 부속되는 「git-gui」라고, 익스플로러의 쇼트 컷 메뉴로부터 이용할 수 있는 TortoiseGit라는 것이 있다.

 git-gui는 msysgit와 Cygwin판 Git의 양쪽 모두에 포함되어 있어 쉘로 「git gui」라고 실행하는 것으로 기동할 수 있는 것 외에 msysgit로 Git를 인스톨 했을 때는 스타트 메뉴의 「프로그램」 「Git」이하에도 등록되어 있다.

 git-gui를 기동하면, 우선 그림 6과 같은 톱 화면이 표시된다.로컬에 새로운 Git의 로컬 리포지터리(repository)를 작성한다면 「새로운 리포지터리(repository)를 만든다」( 「git init」에 상당), 다른 리포지터리(repository)로부터 파일을 다운로드/카피해 새로운 리포지터리(repository)를 작성하는 경우는 「기존 리포지터리(repository)를 복제한다」( 「git clone」에 상당), 기존의 로컬 리포지터리(repository)를 관리한다면 「기존 리포지터리(repository)를 연다」를 선택하면 좋다.
그림 6 git-gui의 스타트 업 화면

 새로운 리포지터리(repository)를 만드는 경우는 리포지터리(repository) 작성처를, 기존 리포지터리(repository)를 복제한다면 복제원URL와 리포지터리(repository) 작성처를 지정해 「작성」 「복제」를 클릭하면, 리포지터리(repository)의 작성을 해 관리 화면이 표시된다.(그림 7, 그림 8).
그림 7 리포지터리(repository)의 작성 화면
그림 8 리포지터리(repository)의 복제 화면

 리포지터리(repository)의 관리 화면에서는, 윈도우 좌상으로 변경이 더해진, 혹은 추가된 파일이 리스트 된다(그림 9).이 리스트중에서 위탁하고 싶은 파일의 아이콘을 클릭하면, 그 파일이 윈도우 우하의 「staging 된(위탁 예정 끝난) 변경」에 추가된다(그림 10).이 조작을 위탁하고 싶은 파일 모두에게 가면, 우하의 「위탁 메세지」텍스트 박스에 코멘트를 입력해 「위탁」을 클릭하면, 위탁이 실행된다.
그림 9 「위탁 예정에 들어가 있지 않은 변경」으로 변경된 파일이 리스트 된다
그림 10 「위탁 예정에 들어가 있지 않은 변경」의 파일 아이콘을 클릭하면, 그 파일이 위탁 대상으로 추가된다
 또, 메뉴에서는 브랜치의 작성이나 리모트 리포지터리(repository)에의 push등도 실시할 수 있는 것 외(그림 12), 「편집」 「옵션」으로 유저명이나 메일 주소등의 설정을 실시할 수도 있다(그림 13).
그림 12 브랜치를 지정하고 push를 실시할 수 있다
그림 13 옵션 설정에서는 유저명이나 메일 주소, 동작의 커스터마이즈가 가능

장래에 기대하고 싶은 TortoiseGit
Windows 환경에서 이용할 수 있는 GUI의 Git 클라이언트로서 현재 개발이 진행되고 있는 것이 TortoiseGit다.TortoiseGit는, 익스플로러의 쇼트 컷 메뉴로부터 조작할 수 있는 Subversion 클라이언트 「TortoiseSVN」의 자매 프로덕트에 해당한다.다만, TortoiseGit는 아직 개발중의 단계에서, 일부의 기능 밖에 실장되어 있지 않다.원고 집필시의 최신판인 0.2 Preview를 시험해 보았는데, 익스플로러에 그림 14와 같은 쇼트 컷 메뉴가 추가되어 로컬 리포지터리(repository)의 작성은 실시할 수 있었지만, 리모트 리포지터리(repository)의 복제나, 신규 파일의 추가라고 하는 조작은 실시할 수 없었다(그림 15).아직 실용 레벨에는 달하지 않기는 하지만, 앞으로의 성장에 기대하고 싶다.

그림 14 TortoiseGit의 쇼트 컷 메뉴
그림 15 TortoiseGit의 위탁 화면

일본어 관련된 부분은.. 번역하지 않았습니다..

'Android' 카테고리의 다른 글

Dialog 제어 , 샘플소스  (0) 2010.08.27
The project cannot be built until build path errors are resolved  (0) 2010.08.06


Preferences -> General -> Editors ->Text Editors

Insert spaces for tabs
를 체크..

지금까지 이것만 알았다. 하지만.. 안되는 경우가 발생 좀더 찾아보니..

1. eclipse menu -> windows -> preferences 
2. Java -> Code Style -> Formatter 
3. Formatter 에서 [ Edit ] 버튼을 누르고 
< Indentation > 텝에서 Tab policy을 Space only 로 변경하고..Profile 이름을 적당히 변경
하면 되더라는...

아~~하.. Tabs only로 되어 있었으니 안되는수 밖에
어쨋든 오늘도 재미난것을 발견~

'Eclipse' 카테고리의 다른 글

웹 화면 설계용 툴  (0) 2013.11.08
Eclipse 3.7 + Svn  (0) 2011.12.01
이클립스 메모리 관리  (0) 2011.07.12
eclipse 3.6 HeliosにVisualEditor을 인스톨  (0) 2011.02.11
Eclipse + Tomcat6.0 + postgres8.3  (0) 2010.08.06


Struts2에서 웹표시가 아닌 log에 에러내용을 남기고 싶을때.

Struts.xml 설정
<global-results>
<result name="error">/WEB-INF/web/jsp/error.jsp</result>
</global-results>

<global-exception-mappings>
<exception-mapping exception="java.lang.Exception" result="error"/>
</global-exception-mappings>

error.jsp 내용
<h1>ERROR</h1>
<s:actionerror/>
<p>
<s:property value="%{exception.message}"/>
</p>
<hr/>
<h3>Technical Details</h3>
<p>
<font style="font-size: 9px; color:gray">
<s:property value="%{exceptionStack}"/>
</font>
</p>
...

logfile에 남기기 위해 추가(log4j기준)
<%@page import="org.apache.log4j.Logger"%>
<s:set name="stackTrace" value="%{exceptionStack}" scope="page"/>
<%
String stackTrace = (String) pageContext.getAttribute("stackTrace");
Logger.getLogger(this.getClass()).error(stackTrace);
%>

출처:http://mr678.blogspot.com/2009/03/struts2-unchecked-exceptions-loggen.html

'Struts2' 카테고리의 다른 글

현재 URL 가져오기  (0) 2010.08.14
Struts2 @Results 에서 params이용 방법  (0) 2010.08.12
Validator 날짜 체크 Action  (0) 2010.08.11
validate money check struts2  (0) 2010.08.10
Struts2 validation Byte Check  (0) 2010.08.06

ByteRangeFieldValidator.Java
package com.nec.jp.cloudmgr.web.util;

import com.opensymphony.xwork2.validator.ValidationException;
import com.opensymphony.xwork2.validator.validators.FieldValidatorSupport;

public class ByteRangeFieldValidator extends FieldValidatorSupport {

    private boolean doTrim = true;
    private Byte maxLength = -1;
    private Byte minLength = -1;


    public void setMaxLength(Byte maxLength) {
        this.maxLength = maxLength;
    }

    public int getMaxLength() {
        return maxLength;
    }

    public void setMinLength(Byte minLength) {
        this.minLength = minLength;
    }

    public int getMinLength() {
        return minLength;
    }

    public void setTrim(boolean trim) {
        doTrim = trim;
    }

    public boolean getTrim() {
        return doTrim;
    }

    public void validate(Object object) throws ValidationException {
        String fieldName = getFieldName();
        String val = (String) getFieldValue(fieldName, object);

        if (val == null || val.getBytes().length <= 0) {
            // use a required validator for these
            return;
        }
        if (doTrim) {
            val = val.trim();
            if (val.getBytes().length <= 0) {
                // use a required validator
                return;
            }
        }

        if ((minLength > -1) && (val.getBytes().length < minLength)) {
            addFieldError(fieldName, object);
        } else if ((maxLength > -1) && (val.getBytes().length > maxLength)) {
            addFieldError(fieldName, object);
        }
    }
  
    
}





validators.xml -> 프로젝트/src/에 위치 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
        "-//OpenSymphony Group//XWork Validator Config 1.0//EN"
        "http://www.opensymphony.com/xwork/xwork-validator-config-1.0.dtd">

<validators>
    <validator name="required" class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/>
    <validator name="requiredstring" class="com.opensymphony.xwork2.validator.validators.RequiredStringValidator"/>
    <validator name="int" class="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator"/>
    <validator name="long" class="com.opensymphony.xwork2.validator.validators.LongRangeFieldValidator"/>
    <validator name="short" class="com.opensymphony.xwork2.validator.validators.ShortRangeFieldValidator"/>
    <validator name="double" class="com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidator"/>
    <validator name="date" class="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator"/>
    <validator name="expression" class="com.opensymphony.xwork2.validator.validators.ExpressionValidator"/>
    <validator name="fieldexpression" class="com.opensymphony.xwork2.validator.validators.FieldExpressionValidator"/>
    <validator name="email" class="com.opensymphony.xwork2.validator.validators.EmailValidator"/>
    <validator name="url" class="com.opensymphony.xwork2.validator.validators.URLValidator"/>
    <validator name="visitor" class="com.opensymphony.xwork2.validator.validators.VisitorFieldValidator"/>
    <validator name="conversion" class="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator"/>
    <validator name="stringlength" class="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator"/>
    <validator name="regex" class="com.opensymphony.xwork2.validator.validators.RegexFieldValidator"/>
    <validator name="conditionalvisitor" class="com.opensymphony.xwork2.validator.validators.ConditionalVisitorFieldValidator"/>
    <validator name="byte" class="com.nec.jp.cloudmgr.web.util.ByteRangeFieldValidator"/>
</validators>

'Struts2' 카테고리의 다른 글

현재 URL 가져오기  (0) 2010.08.14
Struts2 @Results 에서 params이용 방법  (0) 2010.08.12
Validator 날짜 체크 Action  (0) 2010.08.11
validate money check struts2  (0) 2010.08.10
Struts2 exceptionStack logfile  (0) 2010.08.06

+ Recent posts