출처: http://blog.empas.com/ganemochi/11897983

<SCRIPT LANGUAGE="JavaScript">
        function chk(form) {
         re=/^[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*.[a-zA-Z]{2,3}$/i;

                if(form.email.value.length<6 || !re.test(form.email.value)) {
                        alert("메일형식이 맞지 않습니다.");
                        form.email.value="";
                        form.email.focus();
                } else {
                        alert("제대로된 형식");
                }
        }
</script>

<form name="form1">
        <input type="text" name="email"><input type="button" value="체크" onclick="chk(this.form)">
</form>

^[0-9a-zA-Z]                --> 첫글자는 숫자또는 영문자
[-_.]?                           --> - 또는 _ 또는 . 이 0번 또는 1번  .은 특수문자 이므로 . 으로
[0-9a-zA-Z]                 --> 숫자또는 영문자
([-_.]?[0-9a-zA-Z])*@ --> @ 앞에(-,_,. 이 0~1번, 그 뒤에는 숫자,영문자)이 한번 또는 여러번
[0-9a-zA-Z]                --> @ 뒤에는 숫자 또는 영문자
[-_.]?                          --> - 또는 _ 또는 . 이 0번 또는 1번
([-_.]?[0-9a-zA-Z])*.   --> . 앞에(-,_,. 이 0~1번, 그 뒤에는 숫자,영문자)이 한번 또는 여러번
[a-zA-Z]{2,3}$             --> . 뒤 마지막 문자열은 영문자가 2~3개

[EL] EL

프로그래밍/Web 2009. 5. 18. 19:18 Posted by galad
<s:property value="#parameters.변수명" /> => request.getParameter()

<s:property value="#request.변수명"> => request.getAttribute()
<s:property value="#session.변수명"> => session.getAttribute()

[jQuery] select option

프로그래밍/Web 2009. 5. 14. 14:03 Posted by galad
출처: http://www.texotela.co.uk/code/jquery/select/

        // 이메일
        $("#email_select").selectOptions("${email_select}");
        $("#email2").val("${email2}");
        // 생일
        $("#birth1").selectOptions("${birth1}");
        $("#birth2").selectOptions("${birth2}");
        $("#birth3").selectOptions("${birth3}");

좋군...
<s:checkbox name="codeId" fieldValue="%{serviceType}" theme="simple"></s:checkbox>

위의 태그는 실제로 다음의 HTML을 만듬.

<input type="checkbox" name="codeId" value="s1" id="getServiceType_codeId"/>
<input type="hidden" id="__checkbox_getServiceType_codeId" name="__checkbox_codeId" value="s1" />

아래의 히든 input은 스트러츠에서 쓰는 듯하고,
체크 박스에 값 설정하려면 스트러츠 태그에서 value속성이 아닌 fieldValue를 써야한다. 주의!

참조: http://struts.apache.org/2.1.6/docs/checkbox.html

추가.
value속성은 boolean값 입력해서 checked/unchecked 설정하는데 쓰임
JSP:
<s:checkbox label="checkbox test" name="checkboxField1" value="aBoolean" fieldValue="true"/>

Velocity:
#tag( Checkbox "label=checkbox test" "name=checkboxField1" "value=aBoolean" )

Resulting HTML (simple template, aBoolean == true):
<input type="checkbox" name="checkboxField1" value="true" checked="checked" />

추가2.

체크박스가 같은 이름으로 여럿이고 그 중에서 체크된 것의 값만을 받으려 할 때,
일일이 체크된 것을 스크립트로 계산할 필요없다.
Action에 멤버변수로 체크박스의 체크된 값만을 받을 수 있다.

<s:checkbox name="codeId" fieldValue="%{serviceType}" theme="simple"></s:checkbox>
이 경우엔 Action에서
private String codeId;로 해서 getter/setter만 있으면 체크된 것들의 fieldValue만 가져온다.
"XXXX, XXXX, XXXX" 와 같이 콤마로 구분한다. 다만 사이사이 공백도 있으므로 trim할 것.

추가3.
checkbox 인터셉터를 설정하면 체크안해도 값을 넘겨받을 수 있다.
<!-- 회원관리 -->
        <action name="manage*" class="com.omp.bp.cms.manage.action.ManageAction" method="manage{1}">
            <interceptor-ref name="checkbox">
              <param name="uncheckedValue">N</param> // uncheck시 값
          </interceptor-ref>
            <interceptor-ref name="bpCommonStack"></interceptor-ref>
            <result>/cms/manage/manage{1}.jsp</result>
            <result name="JoinApproved" type="redirect">/manage/manageJoin.omp</result>
            <result name="Updated" type="redirect">/manage/manageMember.omp</result>
        </action>


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

[Strust2] <s:radio> 사용법  (1) 2009.07.29
[Struts2] Model-driven interceptor  (0) 2009.05.27
[iBatis] queryForMap() 사용법  (0) 2009.04.21
[iBatis] iterate 사용법  (1) 2009.04.13
[Struts2] <s:iterator> <s:if> 사용법  (0) 2009.04.13

[iBatis] queryForMap() 사용법

프로그래밍/Framework 2009. 4. 21. 18:57 Posted by galad
참조: http://openframework.or.kr/Wiki.jsp?page=QueryForMapExample

<resultMap id="AccountResult" class="Account">
  <result property="id" column="ACC_ID"/>
  <result property="firstName" column="ACC_FIRST_NAME"/>
  <result property="lastName" column="ACC_LAST_NAME"/>
  <result property="emailAddress" column="ACC_EMAIL"/>
</resultMap>


<select id=
"selectAllAccounts" resultMap="AccountResult">
  select * from ACCOUNT
</select>

위와 같은 iBatis sql문에 대해 다음과 같이 쿼리.

queryForMap("selectAllAccounts", null, "id");

파라미터는 null이고, 쿼리 결과를 Map으로 받는데 키는 id에 대응하는 ACC_ID 칼럼값이 된다.
테이블에서는 모든 값(칼럼)을 가져와서 Accout 클래스형으로 값을 저장.
즉, key=ACC_ID칼럼값, value=Account클래스의 형태의 Map이 된다.

queryForMap("selectAllAccounts", null, "id""emailAddress");

역시 파라미터는 null이고 결과를 Map으로 받는데, 키는 id에 대응하는 ACC_ID 칼럼값이며,
값은 emailAddress에 대응하는 ACC_EMAIL칼럼값만 가져온다.
즉, key=ACC_ID칼럼값, value=ACC_EMAIL칼럼값의 형태의 Map이 된다.

두번째 사용법.

<statement id="getContentType" resultClass="org.apache.commons.collections.SequencedHashMap">
    SELECT * FROM OMPDBA.CONTENT_TYPE WHERE STATUS = 'U'
</statement>

위와 같이 resultMap이 없는 경우.

queryForMap(sqlId, paramMap, keyColumn, valueColumn);

파라미터명으로 써있는데로, 실제 칼럼명 자체를 파라미터로 넘겨준다.

중요.
    <statement id="SELECT_SERVICE_TYPE" resultClass="java.util.HashMap">
        SELECT
            a.SERVICE_TYPE, b.SERVICE_TYPE_NAME
        FROM
            CONTENT_SERVICE_SYSTEM a, SERVICE_TYPE b
        WHERE
            a.SERVICE_TYPE = b.SERVICE_TYPE
            AND a.CONTENT_TYPE = #PARAM0#
            AND b.STATUS = 'U'
        ORDER BY
            b.DISPLAY_ORDER ASC
    </statement>


위의 두번째 사용법에서 resultClass에 주목.
queryForMap은 결과를 map으로 돌려주는 것이므로, 위의 쿼리 결과는 SequencedHashMap이 Map안에 들어간 형태로 나와버린다?
이건 아닌 듯. resultClass 속성을 삭제하면 결과가 String으로 나와버림.
원하는 key-value형태로 나오지 않음.
java.util.HashMap(Map아님. interface라 안되는듯)으로 하면, ORDER BY 해도 순서가 제멋대로.
org.apache.commons.collections.map.ListOrderedMap로 해도 순서가 제멋대로.
즉, 키-값으로 넣을 수 있는 것이 반드시 resultClass 또는 resultMap 속성에 와야 하지만, 그렇다고 순서를 보장하진 않음.(Map답네..)

[unix] vi명령어

프로그래밍/Server 2009. 4. 16. 10:24 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
[Tomcat] 톰캣, JSP 등등 버전 에러 시  (0) 2009.04.07
[Tomcat] Quoting in attributes  (0) 2009.04.07

[iBatis] iterate 사용법

프로그래밍/Framework 2009. 4. 13. 20:13 Posted by galad
    <statement id="CHECK_SUB_CONTENT_TYPE_FOR_DELETE" resultClass="java.lang.String">
        SELECT
            COUNT(*) TOTAL_COUNT
        FROM
            SUB_CONTENT_TYPE
        <iterate prepend="WHERE" property="deleteContentTypeList" open="("  conjunction="," close=")">
            CONTENT_TYPE IN #deleteContentTypeList[]#
        </iterate>
    </statement>

    <statement id="CHECK_SUB_CONTENT_TYPE_FOR_DELETE" resultClass="java.lang.String">
        SELECT
            COUNT(*) TOTAL_COUNT
        FROM
            SUB_CONTENT_TYPE
        <iterate prepend="WHERE CONTENT_TYPE IN " property="deleteContentTypeList" open="("  conjunction="," close=")">
            #deleteContentTypeList[]#
        </iterate>
    </statement>

    <statement id="CHECK_SUB_CONTENT_TYPE_FOR_DELETE" parameterClass="java.util.List" resultClass="java.lang.String">
        SELECT
            COUNT(*) TOTAL_COUNT
        FROM
            SUB_CONTENT_TYPE
        <dynamic prepend="WHERE">
            <iterate property="deleteContentTypeList" open="("  conjunction="," close=")">
                CONTENT_TYPE IN #deleteContentTypeList[]#
            </iterate>
        </dynamic>
    </statement>

버근지 뭔지 몰라도 위의 방식은 하나도 안된다. property속성을 쓰면 안되는건지...
근데 되는 사람들도 있는 것 같고..

    <statement id="CHECK_SUB_CONTENT_TYPE_FOR_DELETE" resultClass="java.lang.String">
        SELECT
            COUNT(*) TOTAL_COUNT
        FROM
            SUB_CONTENT_TYPE
        <dynamic prepend="WHERE">
            <iterate open="CONTENT_TYPE IN ("  close=")" conjunction="," >
                #[]#
            </iterate>
        </dynamic>
    </statement>

이것처럼 아예 property 속성을 없애고, list의 이름을 없이 하면 잘됨.

참고:http://lostsin.tistory.com/tag/iBATIS

sql의 xml설정은 다음과 같이 하고

     <delete id="deletes" >
          DELETE FROM users
          <dynamic prepend="WHERE id IN">
              <iterate open="(" conjunction="," close=")">
                  #[]#
              </iterate>
          </dynamic>
      </delete>


DAO는 다음과 같이 한다
    public int delete(Integer[] ids) {
        return getSqlMapClientTemplate().delete("users.deletes", ids);
    }

해당 쿼리는 <iterate> 구문에 의하여 WHERE id IN (1,2,3,4,5) 방식으로
값이 매핑되게 된다.


보너스1.
List<>를 사용하는 방법도 xml 쿼리 부분은 동일하다.

List<String> list = new ArrayList<String>(3);

list.add("1");

list.add("2");

list.add("3");

List objs = sqlMapClient.queryForList("select-test",list);




보너스2.
parameterClass="map" 을 사용할 땐

     WHERE

session_id IN

<iterate property="sessionIds" open="(" close=")" conjunction=",">

#key[]#

</iterate>

hash의 key 값으로 사용된 string을 지정해주면 된다 (?)

추가.
            HashMap map = new HashMap();
            map.put("deleteContentTypeList", deleteContentTypeList);
            map.put("updateId", updateId);
            map.put("updateTime", updateTime);
           
            this.update("contenttype.DELETE_CONTENT_TYPE", map);

    <statement id="DELETE_CONTENT_TYPE">
        UPDATE
            CONTENT_TYPE
        SET
              STATUS = 'D'
            , UPDATE_ID = #updateId#
            , UPDATE_TIME = #updateTime#
        <dynamic prepend="WHERE">
            <iterate property="deleteContentTypeList" open="CONTENT_TYPE IN (" close=")" conjunction=",">
                #deleteContentTypeList[]#
            </iterate>
        </dynamic>
    </statement>

이건 또 된다. map에 넣어서 넘겨주면 멀쩡히 잘 되는군...

# 추가
list 를 패러미터로 전달 시 iterate 태그에서 property 를 설정하면(map으로 넘겼을 떄 말고),
전달된 list 에서 해당 property 를 찾으려고 시도하는 것 같다.
<iterate> 태그에서 property 속성을 제거하면 정상적으로 작동한다.

<select id="selectSomething" parameterClass="list">
    // select something and use iterate
    <iterate> // iterate 태그 내 property 속성을 제거하라
        #someList[]#
    </iterate>
</select>