뭐 오래전에 quartz를 한번 사용해봤었고.. 나름 편한듯 싶어.. 이번 프로젝트에서도 요넘을 사용하고자 프로토타입을 제작중.. 짜증나는 문제(??) 가 발생함..

Spring + quartz 를 사용하는데.. 요넘들을 같이 사용하면 어플 구동할때 처음에 무조건 실행하게 만드는게 쉽지 않음.. 뭐 다른 방법이 있는데 내가 찾지를 못하는 건지.. 찾다 귀찮아서 그냥 하나 제작함.

뭐.. 다행인건.. Job class 를 구동하는데.. 특별한 parameter가 필요하지 않기 때문에 좀더 쉽게 끝난듯..

MethodInvokingJobDetailFactoryBean.java
package com.quartz;

import java.lang.reflect.Method;

import org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean;

/**
 * 스케쥴러를 돌리고 싶고.. 무조건 어플이 처음 구동할 때.. 한번은 돌아줘야 하고..
 * 뭐 이런 경우가 가끔 생길지도 모른다.
 * 이럴때 도통 방법을 모르것더라.. 그래서 그냥 MethodInvokingJobDetailFactoryBean 이넘 상속받아서 하나 맹갔다.
 * 스프링 설정시 <property name="fisrtStart"><value>true</value></property> 만 넣어주면 됨.
 *
 * @author 배명훈
 *
 */
public class CtmMethodInvokingJobDetailFactoryBean extends MethodInvokingJobDetailFactoryBean {

    public void setFisrtStart(boolean fisrtStart) {
       
        if(fisrtStart) {
       
            try {
                // spring di로 삽입한 job object
                Class dymClass     = getTargetObject().getClass();            
                Method[] methods = dymClass.getMethods();
               
                for(int i = 0;i<methods.length;i++) {
                    String methodName = methods[i].getName();
                   
                    // spring di로 삽입한 target method를 찾자.
                    if(methodName.equals(getTargetMethod())) {
                        methods[i].invoke(getTargetObject(), null);
                    }
                }
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }  
    }
}

Spring 설정파일
<bean id="weatherProcMethodInvokingJobDetail"
        class="com.quartz.CtmMethodInvokingJobDetailFactoryBean">
        <property name="targetObject"><ref bean="weatherProc"/></property>
        <property name="targetMethod"><value>execute</value></property>
        <property name="concurrent"><value>false</value></property>
        <property name="fisrtStart"><value>true</value></property>
</bean>

스프링 설정 파일을 보면 알것지만.. MethodInvokingJobDetailFactoryBean 을 사용하는 것과 차이점은
firstStart 설정하는 것 밖에 없음..

ps.
    java reflection 은 정말 유용한 기술인듯..
Posted by 짱가쟁이
갑자기 궁금한게.. 내가 왜... 이짓을 하는걸까?


정말 단순하게 테이블을 만들고 사용할 수 있다.(당연히 단순한 예제라고 하니까.. ㅎㅎ)

보고 느낀 것은 model 쪽은 Swing, SWT 와 유사한듯 하다.

1. 우선 page class 에 Table 인스턴스 생성하고, 생성하자 헤더 설정 및 onRender() 메소드에 데이터를 작성해 주면 된다.

Table 클래스야 그냥 사용하면 될 거 같구.. Page 클래스에서 onRender() 를 override 해서 사용하는 거를 중심으로 봐야 할듯 하다.  렌더링 하기 전에 onRender() 에서 테이블로 데이터를 set 해준다.

Page Class
@Bindable protected Table table = new Table();

// 생성자
public HomePage() {
        table.setClass(Table.CLASS_ITS);    
        table.addColumn(new Column("no"));
        table.addColumn(new Column("name"));
        table.addColumn(new Column("age"));
        table.addColumn(new Column("job"));
}

@Override
public void onRender() {
    List list = new ArrayList();
      
     for(int i = 0;i<10;i++) {
            DemoTableModel model = new DemoTableModel();
            model.setNo(""+(i+1));
            model.setName("name: " + i);
            model.setAge("33");
            model.setJob("java programmer " + i);
          
            list.add(model);
    }
      
    table.setRowList(list);
}

DemoTableModel class
- User Guide 를 보면 커스텀서비스 어쩌구를 사용하는데.. 그넘 실제로 없다. 그래서 단순하게 하나 만들었다.
public class DemoTableModel {

    private String no;
    private String name;
    private String age;
    private String job;
    public String getNo() {
        return no;
    }
    public void setNo(String no) {
        this.no = no;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAge() {
        return age;
    }
    public void setAge(String age) {
        this.age = age;
    }
    public String getJob() {
        return job;
    }
    public void setJob(String job) {
        this.job = job;
    }
}

Template Page
<html>
  <head>
    $headElements
  </head>
  <body>

    $table

    $jsElements

  </body>
</html>

$headElements
- 요넘은 사용하면 table이 사용할 수 있는 css, style을 포함시킨다.
(아래는 실제로 가져온 웹 소스)
<link href="/click_demo/click/table.css" rel="stylesheet" type="text/css"/>

<style id="c_1886087593" type="text/css">
 th.sortable a {background: url(/click_demo/click/column-sortable-light.gif)
 center right no-repeat;}
 th.ascending a {background: url(/click_demo/click/column-ascending-light.gif)
 center right no-repeat;}
 th.descending a {background: url(/click_demo/click/column-descending-light.gif)
 center right no-repeat;}
</style>


$jsElements
- 요넘은 JavaScript, js 를 포함시킨다.
<script src="/click_demo/click/control.js" type="text/javascript"></script>
<script src="/click_demo/click/extras-control.js" type="text/javascript"></script>
<script id="c_862758709" type="text/javascript">
    addLoadEvent(function(){
        initMenu();
    });
</script>

요넘.. 필요한거 알아서 참조도 해주고.. 무쟈게 고마운 넘임 ㅋㅋ

Posted by 짱가쟁이
출처

1.  Web Application Structure

WEB-INF/ 디렉토리에 click.xml 과 web.xml 파일을 추가한다.
Click application configuration files
  • WEB-INF/click.xml   -   Application Configuration
  • WEB-INF/web.xml   -   Servlet Configuration  
click.xml
- click.xml 에 아래의 내용을 추가한다.
- page class 와 htm 파일을 package name으로 매핑 시켜 준다.
<?xml version="1.0" encoding="UTF-8"?>
<click-app>
  <pages package="com.demo.page"/>
  <pages package="com.demo.page" autobinding="annotation"/>
</click-app>

web.xml
- web.xml에 아래의 내용을 추가한다.
<?xml version="1.0" encoding="UTF-8"?>
<web-app>

  <servlet>
    <servlet-name>ClickServlet</servlet-name>
    <servlet-class>org.apache.click.ClickServlet</servlet-class>
    <load-on-startup>0</load-on-startup>
  </servlet>
 
  <servlet-mapping>
    <servlet-name>ClickServlet</servlet-name>
    <url-pattern>*.htm</url-pattern>
  </servlet-mapping>
 
  <welcome-file-list>
    <welcome-file>redirect.html</welcome-file>
  </welcome-file-list>
 
</web-app> 

2.  JAR Files

아래의 jar 파일들을 WEB-INF/lib 디렉토리에 추가한다.
  • click-x.x.x.jar
  • click-extras-x.x.x.jar
'x.x.x' 는 Click 의 버전
jar 파일들은 다운로드 받은 Click 의 dist 디렉토리에서 얻을수 있다.

3.  Welcome File

web 루트 디렉토리에 redirect.html 파일을 생성하고, 아래의 내용을 추가해라. redirect.html 은 web.xml 의 welcome-file 에서 설정한 넘임.
<html>
<head><meta http-equiv="Refresh" content="0;URL=home.htm"></head>
</html>

4.  Home Page

welcom file 에서 추가한 home page(Click page)를 만들어야 한다.

4.1> Page를 상속받은 class를 만들고 home.htm 파일을 만들면 될듯.
HomePage.java
- 컴파일된 class 파일은 WEB-INF/classes 디렉토리에 생성되게 한다.
package com.demo.page;

import org.apache.click.Page;

public class HomePage extends Page {

}

4.2> 웹 root 디렉토리에 home.htm 파일을 추가한다.
home.htm
- 아래의 내용을 추가한다.
<html>
<head>
  <title>Home</title>
  <link rel="stylesheet" type="text/css" href="style.css" title="Style"/>
</head>

<body>
 
  <div id="header">
    <span id="title">Home</span>
  </div>

  <div id="container">
    <b>Welcome</b> to Home page your application starting point.
  </div>
 
</body>
</html>

4.3>  web root 디렉토리에 style.css 파일을 생성한다.
style.css
body {
    font-family: Arial;
}

#header {
    background-color: navy;
}

#title {
    color: white;
    font-size: 18px;
    font-weight: bolder;
}

#container {
    padding-top: 1em;
    padding-left: 1.5em;
    position: relative;
    z-index: 0;
}

h3.title {
    margin-top: 0em;
    margin-bottom: 1em;
}

밑 에 처럼 프로젝트를 구성하면 된다.


환 경설정이 성공적으로 끝나고 context path quickstart 면 아래와 같은 결과가 나와야 할듯.
http://localhost:8080/quickstart/


실행결과

Home

Welcome to Home page your application starting point.



5.  Border Template
Page class 를 상속받아서 BorderPage를 만들어 보자. 뭐 내가 아직 실제로 돌려보지 않아서 뭐가 뭔지. 해보면 되것지.. 쩌ㅃ~

우선은 border-template.htm 파일을 생성하고 아래 코드를 추가하면 된다.
border-template.htm
<html>
<head>
<title>Click Quickstart - $title</title>
<link rel="stylesheet" type="text/css" href="$context/assets/style.css" title="Style"/>
<link rel="stylesheet" type="text/css" href="style.css" title="Style"/>
</head>

<body>
 
  <div id="header">
    <span class="title">$title</span>
  </div>
 
  <div id="container">
    #parse($path)
  </div>
 
</body>
</html>

다음으로, border-tamplate.htm 파일의 템플릿을 가지는 BorderPage.java 를 만들자.
BorderPage.java
package com.demo.page;

import org.apache.click.Page;

public class BorderPage extends Page {

   public String getTemplate() {
      return "/border-template.htm";
   }

}

BorderPage 클래스에서 "/border-template.htm" 랑 자동으로 매핑 안해주니까. 알아서 잘 맞춰줘야할듯.

다음으로, HomePage 클래스를 수정해주자.
HomePage.java- Example를 그대로 실행시키고 싶으면 click.xml 의 page 설정을 변경시켜줘야 한다.
change : <pages package="com.demo.page" autobinding="annotation"/>
package com.demo.page;

import org.apache.click.util.Bindable;

public class HomePage extends BorderPage {

    // page 에서 어노테이션을 사용할려면 click.xml 참조 ..
    // <pages package="com.demo.page" autobinding="annotation"/>
    @Bindable protected String title = "Home";

    // 어노테이션 없이 사용할 수도 있음.
    public HomePage() {
        getModel().put("title", "Home");
    }
}


마지막으로, home.htm 에서 page border 를 삭제하고(??) 아래의 내용만 포함시켜라.
(?? 돌려봐야 알듯.. 뭔소린지.. 모르것음 ㅋ)
home.htm
<b>Welcome</b> to Home page your application starting point.

위에꺼 설정 맞춰주면 아래와 같은 구조가 되어야 한다.
Click application web files
하여튼.. 죄다 업데이트 하고 돌려보면 처음에 했던 넘이랑 똑같아 진단다. 쩌ㅃ~
(sytle.css 가 적용이 안되는듯.. 화면이 결과랑 틀리게 나옴)

실행결과

Home

Welcome to Home page your application starting point.


6.  Logging
click.xml 에서 dubug mode 로 설정하면 로그를 볼 수 있단다. 아래와 같이 따라 해보삼.
click.xml
<?xml version="1.0" encoding="UTF-8"?>
<click-app>

  <pages package="com.quickstart.page"/>

  <mode value="debug"/>

</click-app> 
실행결과는 알아서 보삼. 구찮다.

7.  Whats Next ?
After you have the Quick Start application up and running you might be wondering, where do I go from here? At this point you are recommended to:

   1. Use the Quick Start Project Builder to generate a more complete project example.
   2. Read the Click Best Practices topic.
   3. Review the Click Examples application.

      There is a lot of good code examples and patterns you can lift into your application. 

8.  Quick Start Project Builder
Ant task project-quick-start 를 사용하면 빨리 click web application을 만들수 있다고 한다.

자세한 내용은 출처 참고

내도 이제 시작해봐야할듯...

Posted by 짱가쟁이
User Guide 를 보면 2가지 방법을 소개하고 있다.

1. Page 클래스에서 ActionLink instance 를 생성하고, Control's listener 메소드를 추가한다. listener 메소드 이름은 꼴리는데로 사용해도 되지만, return type 은 boolean 으로 선언해야 한다. true, false 로 이벤트를 계속 처리할 지 말지를 결정하는 듯 싶다.

장점 : 코드를 간결하게 작성 할 수 있단다.
단점 : The disadvantage of this type of control listener binding is that no compile time safety is provided, and you miss out on the compiler refactoring capabilities provided with modern IDEs. (뭔소리임??) 대충 컴파일 하고 있을 때 안전하게 동작하지 않다는 말인듯..

page class
@Bindable protected ActionLink controlListenerType1 = new ActionLink(this, "onLinkClick");
@Bindable protected String msg1;

// controlListenerType1 control's listener
public boolean onLinkClick() {
    msg1 = "controlListenerType1 : HomePage#" +
                   hashCode() + " object method <tt>onLinkClick()</tt> invoked.";
    return true;
}

page template
page template
<b><a href="$controlListenerType1.href">Control Listener Type1</a></b>

#if($msg1)
    <div id = "msgDiv">$msg1</div>
#end 


2. 안전한 컴파일 시간을 제공(아마.. 컴파일 할때 바인딩을 해준다는 말인듯..)하는 ActionListener interfacre 를 사용한다.
page class
@Bindable protected ActionLink controlListenerType2 = new ActionLink();
@Bindable protected String msg2;

page template
public HomePage() {
        controlListenerType2.setActionListener(new ActionListener() {
          
            @Override
            public boolean onAction(Control source) {
                // TODO Auto-generated method stub
                msg2 = "controlListenerType2 : HomePage#"
                           + hashCode() + " object method <tt>onLinkClick()</tt> invoked.";
                return true;
            }
        });
    }

흠.. 매번 이벤트가 도착하면 instance를 새로 생성한다. 뭐.. 계속 읽다보면 다른 해결책일 있을듯.. 따로 찾아보기가 좀 귀찮다. 복덩이는 언제 오냐?? 쩌ㅃ~

setStateful(true);

위 코드를 추가하면 HttpSession 안에 해당 Page를 저장하기 때문에 기존에 작업하던 내용이 그대로 유지된다.


Posted by 짱가쟁이
흠.. 항상 한글이 문제인듯.

User Guide 를 보면 charset 을 설정하는 몇가지 방법을 소개하고 있다.

1. velocity.properties 에 charset 설정
- WEB-INF/ 디렉토리에
velocity.properties 생성 후 설정
velocity.properties
input.encoding=UTF-8

위 방법으로 테스트를 해봤지만 성공하지 못함.(설정을 못해서 그럴수도 있을듯)

2. click.xml
click.xml
<?xml version="1.0" encoding="UTF-8"?>
<click-app> 
    <headers>
         <header name="Content-Type" value="text/html;charset=UTF-8"/>
     </headers>
     <pages package="com.demo.page" autobinding="annotation"/>
     <mode value="debug"/>
</click-app>


<?xml version="1.0" encoding="UTF-8"?>
<click-app charset="UTF-8">
    <pages package="com.demo.page" autobinding="annotation"/>
    <mode value="debug"/>
</click-app>

위 두가지 방법중 성공한 넘은 밑에 넘이 성공했슴.

더 뒤져보면 왜 위 두넘이 실패했는지 알 수 있것지만.. 귀찮다.. 누군가 찾아서 알려줬으면 좋것다. ㅎ

흠.. 요넘 GWT 보다는 개발하기 좀 편한듯(쉽다).. 짧은 시간에 rich web app. 개발 한다면 요넘 추천하고 싶다. 아직은 시작단계라 그런지 단점은 안보인다 ㅎㅎ



Posted by 짱가쟁이

<?xml version="1.0" encoding="UTF-8"?>

<beans default-autowire="no" default-lazy-init="false"
 default-dependency-check="none"
 xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:aop="http://www.springframework.org/schema/aop"
 xmlns:tx="http://www.springframework.org/schema/tx"
 xmlns:jee="http://www.springframework.org/schema/jee"
 xsi:schemaLocation="
 http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
 http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.0.xsd">

 <!-- DB 설정파일 위치 지정 -->
 <bean id="dbConfig" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  <property name="location"><value>WEB-INF/config/db.properties</value></property>
 </bean>

    <!-- dataSource 정의 -->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName"><value>${jdbc.driverClassName}</value></property>
        <property name="url"><value>${jdbc.url}</value></property>
        <property name="username"><value>${jdbc.username}</value></property>
        <property name="password"><value>${jdbc.password}</value></property>
        <property name="maxActive"><value>${jdbc.maxActive}</value></property>
        <property name="maxIdle"><value>${jdbc.maxIdle}</value></property>
        <property name="maxWait"><value>${jdbc.maxWait}</value></property>
    </bean>
 
    <bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
     <property name="dataSource" ref="dataSource" />
     <property name="configLocation" value="WEB-INF/config/sqlMapConfig.xml" />
    </bean>    
   
    <bean id="transactionManager"
  class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <property name="dataSource" ref="dataSource"/>
 </bean>
 
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
     <tx:attributes>
      <tx:method name="execute*" read-only="false" rollback-for="BizException" propagation="REQUIRED"/>
     </tx:attributes>
    </tx:advice>
   
    <aop:config>
     <aop:pointcut id="testServiceProcOperation" expression="execution(* test.logic.proc.*Proc.*(..))" />
     <aop:advisor advice-ref="txAdvice" pointcut-ref="testServiceProcOperation"/>
    </aop:config>
</beans>

Posted by 짱가쟁이
2010. 6. 28. 15:59
출처


Rich web application 어쩌구 하면서 이런 저런 제품들이 쏟아져 나왔고.. 웹 어플의 한 주류를 차지하고 있는듯 싶다. 우선은 남들이 하니까.. 나도 한번 해볼까?? 라는 생각은 있었지만, 왠지 모를 거부감에 아직까지 손도 못대고 있었다. 오늘 왠지 할짓도 없고, 심심하기도 해서 Apache open source 를 뒤적이다가 Click 이라는 넘을 보게 되었다.

Click 이라는 넘은 현대적인 JEE web application framework(web 2.0 을 의미하는듯) 라고 소개하고 있다. 물론 rich client 프로그래밍 스타일도 지원한다. 뭐 이런 잘낳다고 떠드는 건 솔직히 필요 없고 하루만에 배우고 사용할 수 있다는 말에 쵸큼 끌린다. ^^

IBM developerworks 에 올라온 기사를 보면 JSP, MVC framework 를 사용안하고 웹 어플리케이션을 개발할 수있다고 소개하고 있다. 유사한 다른 넘들보다는 좀 가벼운 프레임웤이라고 하는데.. 뭐 다른 넘들을 사용 안해봐서 비교불가다. 쩌ㅃ~

Apache click 은 HTML template, POJOs 를 사용한다고 한다.
HTML 템플릿은 Apache Velocity template engine(?) 을 사용하고, 특별한 tag 없이 사용할 수 있다고 한다.
대 충 이런 놈이다..라는 것만 알고, 오늘부터 요넘을 study 해봐야 할듯.


'study' 카테고리의 다른 글

추상화(abstraction), 일반화(generalization)  (0) 2016.03.02
[도서] - 자바 병렬 프로그래밍  (0) 2010.06.30
[도서] - Java Performance Fundamental  (0) 2010.06.30
용어정리  (0) 2010.06.28
Posted by 짱가쟁이
참조


Excel file을 다루는 Java APIs 를 소개한다. 위 참조를 보면 자세한 설명이 있음. 간략하게 소개하면..
1. Andy Khan's Java Excel API
2. The xlSQL Excel JDBC Driver
3. OpenXLS
4. Apache POI



Posted by 짱가쟁이
KTF Khub 작업을 하던중... jdk 1.6 버전에서 khub 테스트 코드가 동작을 안하더라.. 이유를 찾아보니.. jaxb 버전 문제로 클라이언트 코드가 동작은 안함. 뭐. jdk 버전을 낮춰서 작업하면 되것지만.. cxf를 공부하고 있는 도중이였기에 cxf에서 제공하는 "wsdl2java" 툴을 사용하게 되었음.

우선 콘솔창에서 작업해도 무난히 동작하지만.. 이클립스를 사용하기 때문에 편하게 ant로 작업했음.(이클립스 너무 편한듯.. 쩌ㅃ~)

khub_wsdl2java.xml
<?xml version="1.0"?>
<project name="cxf khub_wsdl2java" basedir="."> 
   <property name="cxf.home" location ="C:\Develop\02. Documents\01. Apache cxf\apache-cxf-2.2.7\apache-cxf-2.2.7"/>

   <path id="cxf.classpath">
      <fileset dir="${cxf.home}/lib">
         <include name="*.jar"/>
      </fileset>
   </path>
    
   <target name="cxfWSDLToJava">
      <java classname="org.apache.cxf.tools.wsdlto.WSDLToJava" fork="true">
         <arg value="-client"/>
         <arg value="-d"/>
         <arg value="D:\wsdl2java\khub_client"/>
         <arg value="http://125.131.85.42/khub/WebService?wsdl"/>
         <classpath>
            <path refid="cxf.classpath"/>
         </classpath>
      </java>
   </target>
</project>

cxf 홈 디렉트리, java code 생성 경로, wsdl 경로만 변경하면.. 무난히 동작함.
Ant로 빌드하면 코드가 생성되는데.. 패키지 구조가 좀 지져분한게 생성됨.. 뭐 따로 설정하면 되것지만.. 이거는 수작업을 함.
생성된 빌드를 보면 "IWebService_IWebServicePort_Client" 라는 넘이 있는데.. 이놈이 실제로 Entry point 가 된다.
jdk1.6 으로 작업하고 싶다면.. Apache CXF를 사용하는 것도 무난할듯..

Posted by 짱가쟁이
IBM developersorks 를 뒤적이다가 흥미로운 기사가 있어 참고용으로 남긴다. (난중에 쓸일이 있을지도 모를듯 ^^)
우선 일반적인 케이스와, WS-Security 상태로 나눠서 결과를 통계로 보여준다. 자세한 내용은 기사를 참조하기 바란다.

출처 

'framework > apache cxf' 카테고리의 다른 글

[Apache cxf] - session support  (0) 2010.06.28
[Apache cxf] - WSDL to Java  (0) 2010.06.28
[Apache cxf] - Spring 에서 endpoint 설정하자  (0) 2010.06.28
[Apache cxf] - client remote ip 가져오자  (1) 2010.06.28
[CXF] - cxf 소개  (0) 2010.06.28
Posted by 짱가쟁이
이전버튼 1 2 이전버튼