log4j:WARN No appenders could be found for logger (org.springframework.web.context.ContextLoader).
log4j:WARN Please initialize the log4j system properly.

위와 같은 오류가 발생..

web.xml (before)
<listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
        <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>

web.xml 설정을 보니.. 저런 식으로 선언했더니. 위와 같은 오류가 나면서 로그를 제대로 기록하지 못하더라.

혹시나.. 로그 리스너를 먼저 선언해야 할까? 하는 무식한 생각에 위치를 바꿨더니. 제대로 동작하더라.. 뭐밍??

web.xml(after)
<listener>
        <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
<listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

뭐.. 생각해보니. 스프링컨텍스트로더를 마지막에 올리는게 맞을거 같다는 생각을 해보면서두.. 쩌ㅃ~
Posted by 짱가쟁이
iterator는 value 에서 list 객체를 사용하고 객체의 id를 'field'라 정함.
id를 토대로 해당 리스트의 값에 접근한다.

if 이넘은 test, id 라는 넘을 사용한다는데.. 여기서 사용한 test는 boolean을 체크할때 사용한다.

<s:iterator value="initVo.fields" id="field">
    <s:if test="#field == 'authKey'">
        <s:textfield name='%{initVo.actionName}.%{field}' value='입력하고 싶은 값'> <li><s:property/>    </li></s:textfield><br>
    </s:if>
    <s:else>
        <s:textfield name='%{initVo.actionName}.%{field}' value=''> <li><s:property/></li></s:textfield><br>
    </s:else>
</s:iterator>

#field == 'authKey' <- 리스트의 값이 'authKey'랑 같으면 해당 textfield를 출력하는 코드.
물론 or(||) and(&&) 조건도 사용할 수 있다.
Posted by 짱가쟁이

서비스하나 맹가놓고.. soap, rest, json 등.. 입맛에 맞는 넘으로 endpoint를 열어 놓는 세상.. 참 좋구만..

Spring 설정을 보면..

import

<import resource="classpath:META-INF/cxf/cxf.xml" />
<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
<import resource="classpath:/META-INF/cxf/cxf-extension-jaxws.xml" />
<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
<import resource="classpath:META-INF/cxf/cxf-extension-http-binding.xml" />

작업하다 추가된 넘들이라.. 기억이 가물가물하지만.. 저넘들 하나하나가 특정 프로토콜을 사용하는 데 필요하다.

JOSN endpoint 설정

<jaxws:endpoint id="getServiceJson"
        implementor="#starMapServiceImpl"
        implementorClass="star.map.service.StarMapService"
        address="/StarMapService/JSON"
        bindingUri="http://apache.org/cxf/binding/http">
        <jaxws:serviceFactory>
            <bean class="org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean">
                <property name="wrapped" value="false"/>
                <property name="properties">
                    <map>
                        <entry key="Content-Type" value="text/plain"/>
                        <entry>
                           <key><value>javax.xml.stream.XMLInputFactory</value></key>
                            <bean class="org.codehaus.jettison.mapped.MappedXMLInputFactory">
                                <constructor-arg>
                                    <map>
                                        <!-- targetNamespace : http://map.star -->
                                        <entry key="http://map.star" value=""/>
                                    </map>
                                </constructor-arg>
                            </bean>
                        </entry>
                        <entry>
                           <key><value>javax.xml.stream.XMLOutputFactory</value></key>
                            <bean class="org.codehaus.jettison.mapped.MappedXMLOutputFactory">
                                <constructor-arg>
                                    <map>
                                        <!-- targetNamespace : http://map.star -->
                                        <entry key="http://map.star" value=""/>
                                    </map>
                                </constructor-arg>
                            </bean>
                        </entry>
                    </map>
                </property>
            </bean>
        </jaxws:serviceFactory>
</jaxws:endpoint>

뭐.. 이넘과 매핑되는 소스코드를 보면.. (다운로드 받으면 제공되는 예제 참조함)
private static void createJsonRestService(Object serviceObj) {
        // Build up the server factory bean
        JaxWsServerFactoryBean sf = new JaxWsServerFactoryBean();
        sf.setServiceClass(CustomerService.class);
        // Use the HTTP Binding which understands the Java Rest Annotations
        sf.setBindingId(HttpBindingFactory.HTTP_BINDING_ID);
        sf.setAddress("http://localhost:8080/json");
        sf.getServiceFactory().setInvoker(new BeanInvoker(serviceObj));

        // Turn the "wrapped" style off. This means that CXF won't generate
        // wrapper JSON elements and we'll have prettier JSON text. This
        // means that we need to stick to one request and one response
        // parameter though.
        sf.getServiceFactory().setWrapped(false);

        // Tell CXF to use a different Content-Type for the JSON endpoint
        // This should probably be application/json, but text/plain allows
        // us to view easily in a web browser.
        Map<String, Object> properties = new HashMap<String, Object>();
        properties.put("Content-Type", "text/plain");

        // Set up the JSON StAX implementation
        Map<String, String> nstojns = new HashMap<String, String>();
        nstojns.put("http://demo.restful.server", "acme");

        MappedXMLInputFactory xif = new MappedXMLInputFactory(nstojns);
        properties.put(XMLInputFactory.class.getName(), xif);

        MappedXMLOutputFactory xof = new MappedXMLOutputFactory(nstojns);
        properties.put(XMLOutputFactory.class.getName(), xof);

        sf.setProperties(properties);

        sf.create();
    }


결국 JaxWsServerFactoryBean 를 생성..

REST

1. Spring 설정으로 배포
<jaxws:endpoint id="getServiceHttp"
      implementor="#starMapServiceImpl"
      implementorClass="star.map.service.StarMapService"
      address="/StarMapService"
      bindingUri="http://apache.org/cxf/binding/http">
      <jaxws:serviceFactory>
         <ref bean="jaxWsServiceFactoryBean"/>
      </jaxws:serviceFactory>
</jaxws:endpoint>

<bean id="jaxWsServiceFactoryBean"
    class="org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean" scope="prototype">
      <property name="wrapped" value="false" />
</bean>     

2. 소스코드로 배포
private static void createRestService(Object serviceObj) {
        // Build up the server factory bean
        JaxWsServerFactoryBean sf = new JaxWsServerFactoryBean();
        sf.setServiceClass(CustomerService.class);
        // Use the HTTP Binding which understands the Java Rest Annotations
        sf.setBindingId(HttpBindingFactory.HTTP_BINDING_ID);
        sf.setAddress("http://localhost:8080/xml/");
        sf.getServiceFactory().setInvoker(new BeanInvoker(serviceObj));

        // Turn the "wrapped" style off. This means that CXF won't generate
        // wrapper XML elements and we'll have prettier XML text. This
        // means that we need to stick to one request and one response
        // parameter though.
        sf.getServiceFactory().setWrapped(false);

        sf.create();
}




SOAP

1. Spring 설정으로 배포
    <jaxws:endpoint
      id="getServiceSoap"
      implementor="#starMapServiceImpl"
      implementorClass="star.map.service.StarMapService"
      address="/StarMapService/SOAP" />

2. 소스코드로 배포
private static void createSoapService(Object serviceObj) {
        JaxWsServerFactoryBean sf = new JaxWsServerFactoryBean();
        sf.setServiceClass(CustomerService.class);
        sf.setAddress("http://localhost:8080/soap");
        sf.getServiceFactory().setInvoker(new BeanInvoker(serviceObj));
        sf.getServiceFactory().setWrapped(false);

        sf.create();
    }
Posted by 짱가쟁이

몇년만에 웹을 만지는 느낌은.. 너 누구니??

우선 서비스 서버 작업 후 API 테스트 페이지가 필요하더라.. 콘솔에서 테스트를 하면 편하고 좋기는 하지만.. 가끔 외부에서 모바일 기기로 테스트 하려니.. 좀 난감한 경우가 생기더라.. 어쩔수 없이 웹으로 작업하던중.. 예전에 들었던 jquery라는 넘을 사용하고 싶다라는 욕구 때문에 .. 쩌ㅃ~

우선 결론은 사용해보니.. "편하다"

Example.
Script
   function comboChange() {
        var options = {
                   success     : showInitResponse,
                   url              : "/path/test.action",
                   contentType : "application/x-www-form-urlencoded;charset=UTF-8",
                   type           : "post", /* get, post */
                   dataType    : "html" /* xml, html, script, json */
               };
         $('#INIT').ajaxSubmit(options);
    }

    // post-submit callback
    function showInitResponse(responseText, statusText)  {
           //submit후 작업부분
         document.getElementById('result').innerHTML = responseText;
    }

result 에 삽입하고 싶은 페이지 url을 설정하고 ajaxSubmit() 을 사용하면 땡.

Html
<s:form name="INIT" action="INIT" theme="simple" method="post">
        <s:select id="apiId" name="apiId" list="#{'INBO01':'INBO01', 'INTC02':'INTC02'}" onchange="javascript:comboChange();"></s:select>           
</s:form>

<div id="result"/>

콤보박스가 API명을 선택하면 해당 API 테스트 페이지를 삽입한다. 뭐.. 테스트 페이지는 Reflect를 사용해서 한방에 끝내기는 했지만... Reflect 단점상.. 가독성이 떨어진다. ㅡㅡ;;

우선.. 하도 많은 사이트를 참조해서 출처를 올리려니.. 기억이 가물가물..

Posted by 짱가쟁이

Install Subclipse (SVN Plugin)

  1. If you are on 64-bit Windows you will need a 64-bit SVN client (Subclipse only comes with a 32-bit SVN client). You can download and install a free one called Slik from http://www.sliksvn.com/en/download.
  2. In Eclipse, go to Help -> Eclipse Marketplace...
  3. Select "Eclipse Marketplace" and click "Next"
  4. Search for "Subclipse". It should be the first result on the list. Click the "Install" button for Subclipse.
  5. Click "Next", agree to the terms, and "Finish". You will get a dialog about unsigned content, click "Ok". When done installing, click "Restart Now".

http://wiki.wholebraincatalog.org/wiki/Setting_up_development_environment:_Helios#Running_the_Server

64bit Helios에 SVN Clinet 설치하기 무쟈게 짜증난다. 위 URL로 타고 들어가면 이클립스 마켓에서 검색해서 나온넘으로 설치하면 된다고 하지만. 정작 동작을 안하더라 말이쥐.. 뭐 우짜우짜 설치를 하기는 했는데.. 자세히 문서로 작성하기 귀찮더라 말이지.. 언제 또 사용하게 될지 모르지만.. 필요하면 그때 또 찾으면 될듯 쩌ㅃ~ 귀찮으~

'eclipse' 카테고리의 다른 글

[eclipse] - wsdl 시각화?  (0) 2010.08.31
[eclipse] - Data Source Explorer 사용하자 (2)  (0) 2010.07.16
[eclipse] - Data Source Explorer 사용하자 (1)  (0) 2010.07.16
Posted by 짱가쟁이
2010. 12. 21. 16:37

# 소프트웨어 테스트 유형
1. 단위 테스트
- 논리적인 작업 단위(클래스나 메서드 등)를 격리시켜 테스트
2. 통합 테스트
- 둘 이상의 애플리케이션 구성 단위를 묶어서 같이 테스트
3. 기능 테스트
- 애플리케이션의 특정 기능을 끝에서 끝까지 테스트하며, 보통 둘 이상의 애플리케이션 구성 단위가 관련된다.
4. 시스템 통합 테스트
- 둘 이상의 애플리케이션 간의 상호작용을 테스트
5. 성능 테스트
- 애플리케이션 혹은 시스템의 성능을 처리량, 부하, 메모리 사용량 등의 관점에서 테스트

위에 나열된 목록은 대표적인 것들만 간추린 것이며, 훨씬 만은 유형의 테스트가 존재한다고 한다. 쩌ㅃ~
Posted by 짱가쟁이
2010. 10. 27. 16:49

Swing framework 는 여러가지 컨트롤들을 가지고 있지만, 아쉽게도 Tree table 같이 개발에 필요한 컨트로를 가지고 있지 않다.

SwingX Project는 아래의 몇몇개의 유용한 컴포넌트를 제공한다.

  • Sorting, filtering, and highlighting for tables, trees, and lists
  • Find/search
  • Auto-completion
  • Login/authentication framework
  • TreeTable component
  • Collapsible panel component
  • Date picker component
  • Tip-of-the-Day component

SwingX Download

Swing은 멋없는 UI와 필요한 컴포넌트가 없다라는 편견으로 SWT를 주로 사용했지만.. 자바 진영에서 Swing에 투자를 좀 하는 듯 싶다. look and feel과 SwingX 등.. 재미난 것들이 많은 듯..


Posted by 짱가쟁이

String tmp = "<Coolbar><aa>한글</aa><bb>bb</bb></Coolbar>";
InputStream bai = new ByteArrayInputStream(tmp.toString().getBytes("UTF-8"));

'java > util' 카테고리의 다른 글

[util] - 자바 문자열 압축/압축풀기  (0) 2011.11.14
[util] - 특정 디렉토리 파일 목록 출력하자.  (0) 2011.06.17
[util] - byte to hex string  (0) 2010.09.07
[java] - replaceNull  (0) 2010.07.05
[java] - File readLine  (2) 2010.07.01
Posted by 짱가쟁이
서버에 접근하기 힘들고.. 로그는 봐야 할때.. Tomcat web root 폴더에 log 파일을 생성하게 만들고..

본인은 D:\www\log 경로에 로그파일을 생성했다.


C:\Program Files\Apache Software Foundation\Tomcat 6.0\conf\web.xml 파일을 조금 수정하면 땡.

<init-param>
            <param-name>listings</param-name>
            <param-value>true</param-value>
</init-param>

fasle 를 true로 변경하면.. 디렉토리 구조로 로그파일에 접근이 가능하다. 뭐.. 다른 보안상의 문제점이 있기는 하것지만.. 로그를 외부에서 꼭 봐야 한다면.. 요넘도 나쁘지는 않을 듯..


Posted by 짱가쟁이


install_service.bat
@set TARGET_APP=batch.weather.Launcher
@set JVM_PATH="C:\Program Files\Java\jdk1.6.0_21\jre\bin\client\jvm.dll"
@set DIST_HOME="D:\star_map\dist"
@set OUT_LOG="D:\star_map\log\stdout.log"
@set ERR_LOG="D:\star_map\log\stderr.log"
@set JSEXE="D:\star_map\JavaService-2.0.10\JavaService.exe"
 
@set CLASSPATH="D:\star_map\dist\lib\Altibase.jar";%CLASSPATH%
@set CLASSPATH="D:\star_map\dist\lib\aspectjweaver.jar";%CLASSPATH%
@set CLASSPATH="D:\star_map\dist\lib\commons-collections.jar";%CLASSPATH%
@set CLASSPATH="D:\star_map\dist\lib\commons-configuration-1.2.jar";%CLASSPATH%
@set CLASSPATH="D:\star_map\dist\lib\commons-dbcp.jar";%CLASSPATH%
@set CLASSPATH="D:\star_map\dist\lib\commons-lang-2.1.jar";%CLASSPATH%
@set CLASSPATH="D:\star_map\dist\lib\commons-logging.jar";%CLASSPATH%
@set CLASSPATH="D:\star_map\dist\lib\commons-pool.jar";%CLASSPATH%
@set CLASSPATH="D:\star_map\dist\lib\hoon.jar";%CLASSPATH%
@set CLASSPATH="D:\star_map\dist\lib\hsqldb.jar";%CLASSPATH%
@set CLASSPATH="D:\star_map\dist\lib\ibatis-2.3.4.726-hoon.jar";%CLASSPATH%
@set CLASSPATH="D:\star_map\dist\lib\log4j-1.2.13.jar";%CLASSPATH%
@set CLASSPATH="D:\star_map\dist\lib\msbase.jar";%CLASSPATH%
@set CLASSPATH="D:\star_map\dist\lib\mssqlserver.jar";%CLASSPATH%
@set CLASSPATH="D:\star_map\dist\lib\msutil.jar";%CLASSPATH%
@set CLASSPATH="D:\star_map\dist\lib\mysql-connector-java-3.1.13-bin.jar";%CLASSPATH%
@set CLASSPATH="D:\star_map\dist\lib\ojdbc14.jar";%CLASSPATH%
@set CLASSPATH="D:\star_map\dist\lib\quartz-1.5.2.jar";%CLASSPATH%
@set CLASSPATH="D:\star_map\dist\lib\spring.jar";%CLASSPATH%


@%JSEXE% -install WEATHER_SERVICE %JVM_PATH% -Djava.class.path=%CLASSPATH% -Xms64M -Xmx512M -start %TARGET_APP% -out %OUT_LOG% -err %ERR_LOG% -current %DIST_HOME% -description "Weather batch service"

Posted by 짱가쟁이