[Struts2] <s:select> 사용법

프로그래밍/Framework 2009. 4. 10. 11:37 Posted by galad
<s:select name="subsetListKey" list="subsetList" headerKey="1" listKey="codId" listValue="codeName"/>

headerKey는 필수. 기본 선택 번호 headerKey는 첫번째 필드에 줄 값. headerValue랑 쌍으로 쓰인다. default로 선택해주는 것은 value속성
listKey는 값
listValue는 보여지는 것.

추가.

<s:select name="serviceSystem" list="systemInfoList" headerValue="Select Value" headerKey="-1" listKey="systemId" listValue="systemName" value="%{#serviceTypeInfo.systemId}">

headerValue는 첫줄에 보여줄 값. 예를 들어 "선택해주세요" 같은 것
headerKey는 headerValue에 설정할 값. 선택했을 때 주어지는 값.
value가 selected를 설정하는 값. value에 입력되는 값과 listKey의 값이 같으면 기본선택으로 된다. listValue와는 관계없는 듯.

추가2.

<s:select name="contentTypeInfo.status" list="#{'R':'준비중', 'U':'사용중'}" cssClass="form"></s:select>
<select name="contentTypeInfo.status" class="form">
        <option value="R">준비중</option>
        <option value="U">사용중</option>
</select>
위의 2개는 같다. list 속성에 직접 "키:값"의 쌍으로 목록을 넣을 수 있다.
출처: http://www.zulutown.com/blog/2009/01/21/accessing-current-item-properties-in-a-struts2-iterator/

<s:iterator value="myList" status="status" id="item" > 
<s:property value="%{attr.item.name}"/> Doesn't work
<s:property value="%{#attr.item.name}"/> Works
<s:property value="attr.item.name"/> Doesn't work
<s:property value="#attr.item.name"/> Works
<s:property value="item.name"/> Doesn't work
<s:property value="name"/> Works
<s:property value="#attr.item.name"/> Works
</s:iterator>

        <action name="addContentType" class="com.omp.bp.cms.content.action.ContentTypeAction" method="addContentType">
            <result>/cms/content/contenttype/m_register_content_type_main.jsp</result>
        </action>
        <action name="registerContentType" class="com.omp.bp.cms.content.action.ContentTypeAction" method="registerContentType">
            <result>/cms/content/contenttype/m_register_content_type_main.jsp</result>
            <result name="TEST" type="chain">addContentType</result>
        </action>

위처럼 chain으로 해서 다른 액션에 바로 연결할 수 있으나, 주소가 안 바뀐다.
사용할 경우를 골라야 할 듯.

redirect와 병행 사용?
Action에서 멤버변수로 jsp에 넘긴 값도 request.getAttribute()로 받을 수 있다.

제목그대로...

<%= request.getAttribute("command") %>
이걸 하든

<s:property value="%{command}"/>
이걸 하든

 값이 나오더라....

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

[Struts2] 태그에서 변수 사용법  (0) 2009.04.08
[Struts2] result의 type 속성  (0) 2009.04.08
[Struts2] 링크들  (0) 2009.04.07
[iBatis] There is no DAO implementation found for...  (0) 2009.04.06
[Struts2] struts.properties  (0) 2009.03.13
http://www.javascriptkit.com/javatutors/languageattri.shtml
http://en.wikipedia.org/wiki/Client-side_JavaScript

Yes, there is a difference .

<script language="JavaScript"> is incorrect

There is no attribute "language" it has been deprecated.
The required attribute is "type" and the type="text/javascript"

Hence...

<script type="text/javascript"> is now the correct form

[Struts2] 링크들

프로그래밍/Framework 2009. 4. 7. 20:23 Posted by galad

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

[Shell Script] Shell Script 문법  (0) 2009.10.14
[Shell Script] PATH추가  (0) 2009.10.14
[Tomcat] 톰캣에 https 설정하기  (0) 2009.09.02
[unix] vi명령어  (0) 2009.04.16
[Tomcat] Quoting in attributes  (0) 2009.04.07

[Tomcat] Quoting in attributes

프로그래밍/Server 2009. 4. 7. 11:49 Posted by galad
출처: https://issues.apache.org/bugzilla/show_bug.cgi?id=45015

<mytags:tag value="<%= "hi!" %>" />

는 올바른 문법이 아니랜다. 톰캣5.5도 잡아준다. 그래서 value='<%= "hi!" %>' 와 같이 바꿨더니
다른 곳에서 가끔 에러난다.

왜 그런지는 모르겠다.



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

[Shell Script] Shell Script 문법  (0) 2009.10.14
[Shell Script] PATH추가  (0) 2009.10.14
[Tomcat] 톰캣에 https 설정하기  (0) 2009.09.02
[unix] vi명령어  (0) 2009.04.16
[Tomcat] 톰캣, JSP 등등 버전 에러 시  (0) 2009.04.07
출처: http://www.mail-archive.com/user-java@ibatis.apache.org/msg06617.html

forgot to register implementation in dao.xml
맨날 까먹어서 맨날 다시 만든다...

SELECT rownum AS rn, A.num, A.status
FROM
  (
    SELECT num, status FROM bp_test1 WHERE status != 'D' ORDER BY status ASC, num ASC
  ) A
WHERE rn >= 1 AND rn <= 10

이건 안됨. rn을 못찾는군...

SELECT rownum, A.num, A.status
FROM
  (
    SELECT num, status FROM bp_test1 WHERE status != 'D' ORDER BY status ASC, num ASC
  ) A
WHERE rownum >= 1 AND rownum <= 10

이건 되는군.

근데 웃기는건 WHERE 절을 rownum >= 2로 하면 데이타가 없다. 꼭 2가 아니라 2 이상으로 하면 안나온다.

찾아보니
rownum이 1보다 크다는 조건은 항상 거짓이 됩니다. 
select문으로 조회된 첫 번째 로우에 대해서 rownum이 1로 지정될텐데
그럼 rownum이 1보다 크다는 조건이 거짓이 되므로 제외됩니다. 
그러면 그 다음의 두번째 로우가 첫번째 로우가 되고 rownum이 1이 지정됩니다.
역시 조건이 거짓이 되므로 제외됩니다.
그런 식으로 모든 로우에 대해 조건을 만족하지 못하게 되니 조회되는게 없게 됩니다.

이렇다는군...

그럼.

select * from (
    select rownum rn, a.
    from rowtest a
    where rownum <= 10
) a where rn >= 6

이렇게 하라는데, 이건 안쪽의 쿼리에 정렬이 없을 때에나 사용가능하다.
조건 처리 후, 정렬 하기 때문에, 정렬 후에 rownum으로 갯수를 한정하고 싶으면 서브쿼리로 해야할 듯.

삼중으로 가야할 듯 해서 뒤져보니 역시나...
SELECT *
FROM
  (
    SELECT rownum rn, A.*
    FROM
      (
        SELECT num, status
        FROM bp_test1
        WHERE
          status != 'D'
        ORDER BY status ASC, num ASC
      ) A
    WHERE
      rownum <= 20 --Maximun
  )
WHERE
  rn >= 6 --Start#


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

[ORACLE] 특수문자 입력  (0) 2009.10.21
[Oracle] Toad 단축키  (0) 2009.08.22
[Oracle] [펌] sqlplus 사용법  (0) 2009.03.24
[펌] MSSQL 함수모음  (0) 2009.01.14
[펌] MSSQL 날짜 함수  (0) 2009.01.14

[Subclipse] ignore

프로그래밍/Library 2009. 4. 2. 15:38 Posted by galad
출처: http://www.powerjava.net/blog/soulcarta/entry/%EC%9D%B4%ED%81%B4%EB%A6%BD%EC%8A%A4-Subversion%EC%97%90%EC%84%9C-svnignore-%ED%99%9C%EC%9A%A9?TSSESSIONpowerjavanetblog=65e29ee642ab6606387be3a96f4dddc0

.classpath와 같은 개인별로 다를 수 밖에 없는 설정파일이라든가 이미지폴더 내의 Thumb.db파일 등을 버전관리에서 제외하기

But, 일단 버전관리가 시작된 프로젝트에서는 설정하기가 어렵다.
Set Property에서 추가해도 안되는 듯?

꼼수로 위의 링크에서와 같이 일단 Repository에서 삭제한 후, Update해서 로컬에서도 지우고,
미리 백업 받아놓은 것을 다시 로컬에 복사해 넣으면 신규 파일로 인식되면서 우클릭->Add to ignore가 활성화된다.
여기서 추가하면됨.

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

[Utils] Paros 사용법  (0) 2009.09.06
[Subversion] 오리지널 서브버젼 이클립스 플러그인  (0) 2009.08.28
[firebug] 파이어버그 가이드  (0) 2009.03.20
[MD5] MD5 암호화  (0) 2009.03.13
[BASE64] BASE64 인코딩  (0) 2009.02.27

[넋두리] 4년 뒤, 대한민국은...

사는 얘기 2009. 4. 2. 13:07 Posted by galad
도대체 어떤 모습일런지...
현재 가카와 정부는 국민이 반대하는 것만 골라서 하고 있고...
앞으로도 3년반도 넘게 남았을 뿐이고...
그렇다고 아예 눈감고 귀막으면 그것이야말로 그들이 원하는 것이고...
아.. 답답하다.

[Oracle] [펌] sqlplus 사용법

프로그래밍/DB 2009. 3. 24. 14:25 Posted by galad
출처: http://sjunious.egloos.com/828939

1. DB를 사용하기위해 ORACLE로 LOGIN 방법
가. SQLPLUS [Enter]
User ID : xxxxxx
password : xxxxxxxx
나. SQLPLUS user_id [Enter]
password : xxxxxxxx
다. SQLPLUS user_id/password [Enter]
※ 다. 와 같은 방법으로 Login 하게 되면 사용자명과 암호가 노출된다
그러므로 가장좋은 방법은 가, 그리고 나. 이다

2. SQLPLUS 상에서는 Auto Commit이 안된다. 그러므로 중간 중간 " COMMIT "를
수행한다.

3. SQL 문장의 Terminate 는 ==> “ ; ”

4. 한 화면씩 보여주는 기능
==> set pause on; (설정)
set pause off; (해제)
※ 설정을 하고나서 SQL 명령을 수행하면 커서가 그 다음 LINE에서 대기하고
있으므로 [Enter] Key를 친다. 그 다음부터는 Enter키로 한화면씩 보면 됨

5. SQL 명령어를 모를 경우 ?
==> help [명령어]

6. Unix 명령어를 사용하기 위해서는 ?
==> “ ! ” 를 붙여 사용한다.

7. 바로전에 실행한 SQL문을 FILE로 저장하려면 ?
==> “ save ”

8. 파일의 내용을 메모리로 불러오려면 ?
==> “ get ” 를 붙여 사용한다.

9. 메모리로 불러온 SQL문이나 메모리에 있는 명령을 실행 하려면 ?
==> “ / ” 를 붙여 사용한다.

10. 바로 전에 수행한 명령어를 편집하려면 ?
==> “ ed ” 를 붙여 사용한다.

11. 바로 전에 수행한 명령어 보려면 ?
==> “ l ” 를 붙여 사용한다.

12. SQL문이 있는 FIle을 바로 실행하려면 ?
==> “ @ ” 또는 " Start " 를 붙여 사용한다.

13. set heading off / on
==> Columns 명을 나타내지 않는다.

14. set arraysize line_number(숫자);
==> 한번에 DATA를 가져오는 단위

15. set timing on / off
==> sql문을 수행하는데 소요되는 시간을 나타내어 준다.

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

[Oracle] Toad 단축키  (0) 2009.08.22
[oracle10g] 페이징 시 rownum 사용하기  (0) 2009.04.06
[펌] MSSQL 함수모음  (0) 2009.01.14
[펌] MSSQL 날짜 함수  (0) 2009.01.14
[펌] date 타입 변환 함수  (0) 2009.01.14

[Apple] iPod Touch 인터넷 공유기 접속 문제

Apple 2009. 3. 20. 09:51 Posted by galad
출처: http://d.hatena.ne.jp/wild-man/20081013/p1

지르고 본 아이팟 터치가 집에서 인터넷이 안되길래 한참 헤메다가..
현재 쓰는 인터넷 공유기가 일본서 쓰던거라 야후 저팬을 뒤져서 해결했다..

사용중인 무선인터넷 공유기가 iodata라는 일본 회사의 wn-g54/r3 라는 녀석인데,
살 때는 몰랐으나, 위의 글을 읽어보니 싸구려에 적당히 쓸만한 수준의 녀석이라네 ㅡ.ㅡ;;

아무튼 문제인 즉슨, 무선랜에 보안 설정이 WEP로 되어 있는데, 이걸 터치에서 지원은 하나
제품 특성을 탄다는 얘기가 있다고 그러네..
그래서 암호화를 WEP에서 WPA2로 바꿨더니 잘 되더라...라는 이야기.

한국에서 이런 문제 갖고 있는건 나밖에 없을 듯. 검색해도 어째 문제있어요 라는 사람들이 거의 없더만...
집에 가서 해보고 잘 되나 봐야겠다...

'Apple' 카테고리의 다른 글

[Mac] 멀티부팅 - boot think  (0) 2010.01.29
영감을 불어넣는 무언가  (0) 2010.01.15
[iPhone] 아이폰에서 이모티콘 쓰기  (0) 2009.12.21
[mac] 부팅 시 에러 등  (0) 2009.12.13
[Apple] 구입한 지는 좀 되었지만...  (0) 2009.03.18

[Apple] 구입한 지는 좀 되었지만...

Apple 2009. 3. 18. 13:57 Posted by galad
어쨌든 이제 맥 유저 겸 아이팟 터치 유저로써...
애플관련 글도 좀 써야겠다...

[MD5] MD5 암호화

프로그래밍/Library 2009. 3. 13. 16:52 Posted by galad
출처: http://edit.tistory.com/tag/MD5%EC%95%94%ED%98%B8%ED%99%94
        http://www.javapattern.info/50

MD5 는 해시 함수의 일종입니다..
해시 함수는.. 기본적으로 복호화를 목적으로 하지 않습니다.

http://ko.wikipedia.org/wiki/%ED%95%B4%EC%8B%9C_%ED%95%A8%EC%88%98

복호화는 불가능하다고 생각하시는게 편할 겁니다.

복호화는 안된단다... 원래 그렇게 만들어진게 아니라네...
그럼 ID/PW를 암호화할 필요가 있나?

▶ SecurityUtil.java

import java.security.*;

public class  SecurityUtil {

    /**
     * byte[] ret = HashUtil.digest("MD5", "abcd".getBytes());
     *  처럼 호출
     */
    public static byte[] digest(String alg, byte[] input) throws NoSuchAlgorithmException {
        MessageDigest md = MessageDigest.getInstance(alg);
        return md.digest(input);
    }

    public static String getCryptoMD5String(String inputValue) throws Exception {
        if( inputValue == null ) throw new Exception("Can't conver to Message Digest 5 String value!!");
        byte[] ret = digest("MD5", inputValue.getBytes());
        String result = Base64Util.encode(ret);  
        return result;
    }
}


위 의 클래스에 해당 스트링값을 던지게 되면 실제 digest된 결과 문자열을 되돌려 줄수 있도록 처리하였는데 이것이 끝이냐~ 아닙니다. 실제 던져진 해쉬함수에 의한 결과를 System.out으로 찍게 되면 찌그러진 코드형태로 나오게 되는데 이것을 우리 눈으로 비교하여 String문자비교를 통하여 추후 사용할 수 있도록 하려면 Base64 인코딩을 시도해야 합니다.

그 유틸리티 클래스는 아래와 같습니다.

▶ Base64Util.java

import sun.misc.*;
import java.io.*;

/**
*

* Filename  : Base64Util.java

* Class     : Base64Util   

* Function  : Base64 Encoding/Decoding을 수행하는 클래스

* Comment   :

* History    : 2000-08-16 2:48오후                    

*


* @version  1.0
* @author carouser
*/
public class Base64Util {

    public Base64Util() {}

    /**
     * Base64Encoding을 수행한다. binany in ascii out
     *
     * @param encodeBytes encoding할 byte array
     * @return encoding 된 String
     */
    public static String encode(byte[] encodeBytes) {
      
        BASE64Encoder base64Encoder = new BASE64Encoder();
        ByteArrayInputStream bin = new ByteArrayInputStream(encodeBytes);
        ByteArrayOutputStream bout = new ByteArrayOutputStream();
        byte[] buf = null;

        try{
            base64Encoder.encodeBuffer(bin, bout);
        } catch(Exception e) {
            System.out.println("Exception");
            e.printStackTrace();
        }
        buf = bout.toByteArray();
        return new String(buf).trim();
    }

    /**
     * Base64Decoding 수행한다. binany out ascii in
     *
     * @param strDecode decoding할 String
     * @return decoding 된 byte array
     */
    public static byte[] decode(String strDecode) {
      
        BASE64Decoder base64Decoder = new BASE64Decoder();
        ByteArrayInputStream bin = new ByteArrayInputStream(strDecode.getBytes());
        ByteArrayOutputStream bout = new ByteArrayOutputStream();
        byte[] buf = null;

        try {
            base64Decoder.decodeBuffer(bin, bout);
        } catch(Exception e) {
            System.out.println("Exception");
            e.printStackTrace();
        }

        buf = bout.toByteArray();

        return buf;

    }
}


String passwd = SecurityUtil.getCryptoMD5String("Carouser");

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

[Subclipse] ignore  (0) 2009.04.02
[firebug] 파이어버그 가이드  (0) 2009.03.20
[BASE64] BASE64 인코딩  (0) 2009.02.27
[가니메데] 이클립스 가니메데에서 WTP사용하기  (0) 2009.02.03
[Cognos] 기본개념  (0) 2009.01.29

[Struts2] struts.properties

프로그래밍/Framework 2009. 3. 13. 11:12 Posted by galad
출처: http://naingyo.springnote.com/pages/1531074

  • 스트럿츠2는 사용자가 필요한 프레임워크의 기능을 적합하게 변경하기 위한 여러가지 프로퍼티를 가진다.
    이러한 프로퍼티를 변경하기 위해 struts.properties 파일에 프로퍼티 키와 값으로 선언한다.
  • properties 파일은 클래스 경로 어떤 곳이라도 위치할 수 있다. 보통 /WEB-INF/classes 하위에 위치한다.
  • 이클립스에서는 Java Resources (src) 의 바로 밑에서 struts.xml파일을 하나 추가해준다. ( default package )
    그러면 자동으로 빌드되면서 classes폴더로 들어가게 된다.
    확인은 webapps 에서 할 수 있다.
  • key=value로 이루어져 있는 프라퍼티 값들을 통해서 스트럿츠2의 동작을 제어하게 된다.

  • struts.properties 파일은 struts2-core-2.x.jar 의 org/apache/struts2/default.properties 에 있는 디폴트 값을 오버라이드 할 수 있는데 그때는 디폴트값과 다른 것만 설정하면 된다.

struts.properties
struts.i18n.reload=true #properties 파일들을 수정하고 저장하면,다음 요청에 변경사항이 반영됨을 볼 수 있음.
struts.devMode=true
struts.configuration.xml.reload=true
struts.continuations.package=org.apache.struts2.showcase
struts.custom.i18n.resources=globalMessages
struts.url.http.port=9090
struts.action.extension=action
struts.serve.static=true
struts.serve.static.browserCache=false
struts.multipart.maxSize=2097252 #디폴트로 임시디렉토리 지정. 최대 사이즈 지정


  • 스트럿츠2의 액션 확장자의 디폴트 값은 .action 이지만 struts.action.extension=do 라고 작성해주면 스트럿츠1 처럼 .do를 액션 요청으로 인식하게 된다.

참고: http://forums.sun.com/thread.jspa?threadID=5294908

StringReader sr = new StringReader(sb.toString());
InputSource xmlSource = new InputSource(sr);

ret = xpath.evaluate("//GetLASeR/RET", xmlSource); // 여기까지는 가능
ret = xpath.evaluate("//GetLASeR/RET", xmlSource); // 여기서 예외발생 - Stream closed.
evaluate() 실행하면 스트림의 처음부터 끝까지 읽어서 검색하는 듯.
그래서 첫번째를 실행하고 스트림이 닫혔기 때문에, 두번째의 evaluate()에서 예외발생
(스트림이니까 한번 쭉 읽어들이고 나면 다시 처음부분으로는 접근불가?)

검색 원본이 파일일 경우에는 이런 예외가 발생하지 않는데,
// 검색 원본 InputSource 객체 생성 - 검색 원본이 XML문서 파일이므로.
InputSource xmlSource = new InputSource("WebContent/ch13/bml.xml");

System.out.println("--책 아이디로 제목 찾기");
String title = xpath.evaluate("/booklist/book/title[../@id='b2']", xmlSource);
System.out.println(title);
       
System.out.println("--책 아이디로 book 엘리먼트 찾기");
Node nBook = (Node) xpath.evaluate("/booklist/book[@id='b2']", xmlSource, XPathConstants.NODE);
Element eBook = (Element) nBook;
System.out.println(eBook.getAttribute("kind"));
아마도 두번째 evaluate()부터는 다시 파일에서 읽어들여서 처리하는 듯하다.
참고: http://www.stylusstudio.com/xmldev/200210/post10820.html

InputSource xmlSource = new InputSource(new StringReader(sb.toString()));