달력

32024  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

스프링 프레임워크에서 아무런 동작이 필요없이 View 를 보여줄 경우 아래와 같이 하면.. 간단히 해결.

Ant 경로와 같이 줄 경우 하위 경로의 매핑도 자동으로 .. ㅎ

<bean id="urlFilenameViewController"       

                class="org.springframework.web.servlet.mvc.UrlFilenameViewController" />

<bean id="urlMapping2" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <value>/**/*.do=urlFilenameViewController</value> </property> <property name="order" value="2" /> </bean>


위와같이 설정 후 JSP 파일경로(.do)를 호출하면 하위 경로 매핑하여 View 로 이동시켜줌.



Posted by tornado
|
status.index가 핵심이군....
홀짝 구별하려면 status.odd 로 하면 될것 같음.




<s:iterator value="model.targetBranchList" status="status">
    <s:property value="branchName" />
    <s:if test="#status.index <= (model.targetBranchList.size() - 2)">,</s:if>
</s:iterator>
Posted by tornado
|

resin.conf에 아래와 같이 추가해주던가....

    <system-property javax.xml.parsers.DocumentBuilderFactory="org.apache.xerces.jaxp.DocumentBuilderFactoryImpl" />
    <system-property javax.xml.parsers.SAXParserFactory="org.apache.xerces.jaxp.SAXParserFactoryImpl" />
    <system-property javax.xml.transform.TransformerFactory="org.apache.xalan.processor.TransformerFactoryImpl" />
    <system-property org.xml.sax.driver="org.apache.xerces.parsers.SAXParser" />


아니면 다음과 같이 리스너를 구현한다.

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class XmlTranslateListener implements ServletContextListener {

 public void contextInitialized(ServletContextEvent arg0) {
 
  System.setProperty("javax.xml.parsers.DocumentBuilderFactory", "org.apache.xerces.jaxp.DocumentBuilderFactoryImpl");
  System.setProperty("javax.xml.parsers.SAXParserFactory","org.apache.xerces.jaxp.SAXParserFactoryImpl");
  System.setProperty("javax.xml.transform.TransformerFactory","org.apache.xalan.processor.TransformerFactoryImpl");
  System.setProperty( "org.xml.sax.driver",  "org.apache.xerces.parsers.SAXParser" );
 }
   

 public void contextDestroyed(ServletContextEvent arg0) {
  // TODO Auto-generated method stub

 }

}

Posted by tornado
|


getSqlMapClientTemplate().execute(new SqlMapClientCallback() {
    public Object doInSqlMapClient(SqlMapExecutor executor) throws SQLException {
       executor.startBatch();
             
        while(....){
           // job....

        }

         return new Integer( executor.executeBatch()) ;    
    }
   });
Posted by tornado
|

원문 : http://blog.naver.com/jkhljesus?Redirect=Log&logNo=70016617377



여기저기 자료를 참고하며 고생끝에 해결 했네요.. ㅋ

iBatis 의 SqlMaps 를 이용 시 IN 절을 동적으로 생성할 때 처리하는 방법

IN절 이외에도 Dynamic SQL 구문 작성 시 유용할 듯 합니다.


XXX.java
--------------------------------------------------------------------------

List list = new ArrayList();
list.add(id);
list.add(id);


Map map = new HashMap();
map.put("listId",list);

return (Map) sm.getItem("em.ss.board.getBoardDetail", map);

XXX.xml

--------------------------------------------------------------------------

 <!-- CLOB Data 조회를 위한 정의  -->
 <resultMap id="getClobBoardData" class="hmap">
         <result property="TITLE" column="TITLE"/>
        <result property="CONTENT" column="CONTENT" typeHandler="clobHanlder"/>
</resultMap>


<select id="getBoardDetail" parameterClass="map" resultMap="getClobBoardData">
   SELECT  TITLE
               , CONTENT
   FROM TEX_BULLETIN_H
   WHERE ID
     <iterate prepend="IN" property="listId" open="(" close=")" conjunction=",">
       #listId[]#
     </iterate>  
         
</select>


Posted by tornado
|

하이버네이트 작업중에...... 새로운 로우가 추가되는 부분에서 계속 오류 ...

쿼리 찍어봤더니..

Insert  문이 아닌.. Update 문을 신나게 찍고 있다 -.-

왜그럴까... 소스 한참 보다가 보니...

Util 클래스에서.. Wrapper 클래스가 null 이면.. 0 으로 바꿔주는 부분이 있다..

하여간 PK 부분이 null 이 아니고... 0 으로 들어가니... update xx  set kkk = ? where DOC_NO = ?

으로 계속 업데이트를 하고 앉아있지 ㅡㅡ

 

many-to-one 으로 지정된 클래스에서 이렇게 됨 ㅡㅡ;

 

괜히 무게잡구 담배만 빨았네 ㅡㅡ;

Posted by tornado
|

[link]spring ide

JAVA/Framework 2005. 4. 27. 19:09
Posted by tornado
|

Spring 가지고 놀다보니... JdbcDaoSupport 가 눈에 띤다..

자세한 내용은 Spring doc 를 참고하면 되고...   오늘 신경 거슬리게 만든것 하나..

 

Select Count(*) from tbl_xxx  <-- 이 쿼리 날려야 하는데..

도큐먼트에 SqlFunction 이라는 넘을 쓰면 된단다..

해보니... 잘 된다 ^^

 

그런데!!!!!!

 

Select Count(*) from tbl_xxx where xx > ? and yy < ?                 

이넘~!~! 안된다 ㅜㅜ

 

왜 안되지??

파람 넘겨주는 데가 없다.. 아무래도 PreparedStatement 를 생성하는것 같지 않다.

그래서리... API 찾아보니.. 허거걱...

queryForInt(String arg0, Object arg1)  <-- 요런넘이 있네 ^^

 

Object[] params = new Object[]{new Integer(xx), new Integer(yy)};

return getJdbcTemplate().queryForInt(query, params);

 

간단하게 끝남...

그냥 JDBC 코딩 하는것 보다.. 무지 편리함..

Transaction 처리도.. 설정에서 끝남...

    <!--  Transaction Manager -->
 <bean id="transactionManager"
     class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
     <property name="dataSource"><ref bean="dataSource"/></property>
 </bean>

 

   <bean id="xxxService"
     class = "org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
    <property name="transactionManager"><ref local="transactionManager" /></property>
    <property name="target"><ref local="xxxServiceTarget" /></property>
    <property name="transactionAttributes">
       <props>
       <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
    <prop key="list*">PROPAGATION_REQUIRED,readOnly</prop>
    <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
    <prop key="create*">PROPAGATION_REQUIRED,-xxxException</prop>
    <prop key="read*">PROPAGATION_REQUIRED,readOnly</prop>
    <prop key="update*">PROPAGATION_REQUIRED</prop> 
    <prop key="delete*">PROPAGATION_REQUIRED</prop>
       </props>
    </property>
   </bean> 

 

이런식으로... 트랜잭션 매니저 셋팅하고... 프락시 셋팅하고..

설정에서... - 표시로 익셉션을 발생시키면.. 된다..

 

근데.. DataSource 를 반드시 이용해야 하는데..

테스트 할때 proxool 을 사용했다...

데이터 소스 없다 ㅡㅡ

소스포지 가서 proxool cvs 보니... dev 에 테스트 있네 ㅡㅡ

소스 받아서 컴팔하고 해서 성공..

 

 

Posted by tornado
|

The documented method of obtaining a reference to the WebApplication context is:

Code:
  WebApplicationContext webApplicationContext = WebApplicationContextUtils.getWebApplicationContext(servletContext);



Unfortunately, this does not work when using the Struts ContextLoaderPlugIn. The workaround is the following:

Code:
WebApplicationContext webApplicationContext = (WebApplicationContext)
        servletContext.getAttribute(ContextLoaderPlugIn.SERVLET_CONTEXT_PREFIX);



Can the ContextLoaderPlugIn be modified to support the documented method? It should be a simple one-line change and would have saved a lot of time.

포럼 보다가.. 가져옴..

Posted by tornado
|

작년부터 스트럿을 썼는데..  Validator 를 한번도 써보지 않았다 ^^;

 

http://struts.apache.org/userGuide/dev_validator.html

 

여기 보니 상당히 자세히 나왔음..

 

간단하게 몸풀기 예제 하나 적어놔야쥐..

 

준비물 :  commons-validator.jar , jakarta-oro.jar  <-- 필수

나머지 준비물 : vssh 에 필요한 lib 들...

 

1. 폼빈 작성(DynaValidatorForm)

 

<form-bean name="loginForm"
               type="org.apache.struts.validator.DynaValidatorForm">
   <form-property name="id" type="java.lang.String" />
   <form-property name="passwd" type="java.lang.String" />
</form-bean>

 

2. ActionServlet 작성 (검증만 할것이기 때문에 암것도 없다..)

package test;

 

import ........

 

public class LoginAction extends Action {
 
    public ActionForward execute(
        ActionMapping mapping,
        ActionForm form,
        HttpServletRequest req,
        HttpServletResponse res
    )throws IOException, ServletException {

        return mapping.findForward("success");

    }

}

 

 

3. action-mappings 에 등록..

   <action-mappings>
    <action
      path="/login"
      type="test.LoginAction"
      name="loginForm"
      scope="request"
      input="/login.vm"
      unknown="false"
      validate="true"
    >
      <forward
        name="success"
        path="/index.do"
        redirect="true"
      />
     

</action-mappings>

 

4. validator-rules.xml 등록..(첨부자료에 있음..)

 

5. validation.xml 만들기..

<?xml version="1.0" encoding="euc-kr" ?>
<!DOCTYPE form-validation PUBLIC
          "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.0//EN"
          "http://jakarta.apache.org/commons/dtds/validator_1_0.dtd">

<form-validation>
 <formset>
  <form name="loginForm">
   <field property="id" depends="required,minlength,maxlength">
    <arg0  key="아이디" resource="false"/>
    <arg1 name="minlength" key="${var:minlength}" resource="false"/>
    <arg1 name="maxlength" key="${var:maxlength}" resource="false"/>
    <var>
     <var-name>minlength</var-name>
     <var-value>3</var-value>
    </var>
    <var>
     <var-name>maxlength</var-name>
     <var-value>12</var-value>
    </var>    
   </field>
   <field property="passwd" depends="required">
    <arg0 key="비밀번호" resource="false"/>
   </field>
  </form>
 </formset>
</form-validation>

 

6. messageResource_ko.properties 만들기(native2ascii 해줄것)

# Struts Validator Error Messages
errors.required=<Font color="green">{0}</font> 는(은) 반드시 입력하셔야 합니다!!
errors.minlength=<Font color="green">{0}</font> 는(은) 최소 <Font color="red">{1}</font> 자 이상 입력하셔야 합니다!!
errors.maxlength=<Font color="green">{0}</font> 는(은) 최대 <Font color="red">{1}</font> 자 이하 입니다!!

 

7. struts-config.xml 에  messageResource 등록하기..

<message-resources parameter="messageResource" />

 

8. struts-config.xml 에 Validator PlugIn 등록

 <plug-in className="org.apache.struts.validator.ValidatorPlugIn">
  <set-property property="pathnames"
   value="/WEB-INF/validator-rules.xml, /WEB-INF/validation.xml"/>
 </plug-in>

 

9. 입력폼 만들기.

##------------------------------

## PRINT ERROR MESSAGE 

##------------------------------

#macro (errorMarkup)
    #if ($errors.exist())
        <ul>
        #foreach ($e in $errors.all )
            <li>$e</li>
        #end
        </ul>
    #end
#end

<table width="100%" border="0" cellspacing="0" cellpadding="0">
  <tr>
    <td>
    #errorMarkup()
    </td>
  </tr>
  <tr>
 <form method="POST"
  name="loginForm"
  action="$link.setRelative("/login.do")" >
    <td width="400" height="200" align="center">     
   <fieldset style="width:95%">
  <legend align="left" align="center" width="100%" >&nbsp;<B>로그인 하세요</B>&nbsp;&nbsp;</legend>
  <table width="95%" border="0" align="center" cellpadding="0" cellspacing="0" bordercolor="#C6C6C6">
          <tr>
            <td width="50%" style="padding-left:6px">ID</td>
   
          <td width="50%" style="padding-left:6px"><input type="text" name="id"  value="$!loginForm.get("id")" /></td>
          </tr>
          <tr>
            <td width="50%" style="padding-left:6px">PWD</td>
   <td width="50%" style="padding-left:6px"><input type="password" name="passwd" value="$!loginForm.get("passwd")" /></td>
          </tr>   
          <tr>
            <td width="50%"style="padding-left:6px" colspan="2">
     <input type="submit" value=" 전 송 " >
   </td>
          </tr>   
        </table>   
   </fieldset>
    </td>
    </form>
  </tr>
</table>

 

편하긴 한데.. 설정 바꾸고.. 리로딩 하고 -.-;;

업로드 되는 곳이면 업로드 하면서 검증하는건지??

 

 

 

 

Posted by tornado
|

   <property name="mappingDirectoryLocations">
     <value>/WEB-INF/hbm</value>
    </property>

 

스프링 + 하이버네이트 사용시에 하이버네이트 설정을 스프링에서 하게 되는데

API 를 보니...

 

public void setMappingDirectoryLocations(Resource[] mappingDirectoryLocations)
Set locations of directories that contain Hibernate mapping resources, like "WEB-INF/mappings".

Can be used to add to mappings from a Hibernate XML config file, or to specify all mappings locally.

See Also:
Configuration.addDirectory(java.io.File)

요런 넘이 있었넹...

몰랐다는 -.-;;

Posted by tornado
|

하이버네이트 보던 도중.. 이런 에러 발생..

정확한 에러는

net.sf.hibernate.LazyInitializationException: Failed to lazily initialize a collection - no session or session was closed
 at net.sf.hibernate.collection.PersistentCollection.initialize(PersistentCollection.java:209)
 at net.sf.hibernate.collection.PersistentCollection.read(PersistentCollection.java:71)
 at net.sf.hibernate.collection.Set.size(Set.java:106)

.

.

.

 

머 대충 이런 메세지다.

 

이 에러가 발생하는 원인은.. mapping 설정 중에 lazy="true" 부분이 있다.

하이버네이트 설명중에 lazy="true" 일 경우.. 객체를 뒤늦게 초기화 한다(?) 라고 하는데..

이게 쿼리는 이미 만들어져있지만 실제 데이터를 꺼내와서 객체에 담는 작업을 나중에 한다는 말인지.. 잘 모르겠다 ㅡ,.ㅡ 

 

예상이지만 하이버네이트의 PersistenceCollection 의 동작방식이 열쇠를 쥐고 있을 것 같다.

 

지금 연습삼아 만들어보는 게시판의 클래스와 Mapping 정보를 보면 이렇다.

   /**
    * @hibernate.set
    *  table="board_file"
    *  lazy="true"
    *  inverse="false"
    *  order-by="idx"
    *  cascade="all"
    *
    * @hibernate.collection-key
    *  column = "parent"
    * @hibernate.collection-one-to-many
    *  class = "com.javarush.board.dto.AttatchFile"
    */
    public Set getAttatchFile() {
        return articleFile;
    }

    public void setAttatchFile(Set attatchFile) {
        this.attatchFile= attatchFile;
    }

 

hbm.xml 파일로 번역되면 아래와 같이 된다.

 

        <set
            name="attatchFile"
            table="board_file"
            lazy="true"
            inverse="false"
            cascade="all"
            sort="unsorted"
            order-by="idx"
        >

              <key
                  column="parent"
              >
              </key>

              <one-to-many
                  class="com.javarush.board.dto.AttatchFile"
              />

        </set>

 

하나의 게시물을 읽어올때... 게시물 고유번호에 대한 자식들(Upload) 을 같이 가져와야 하는데..

이 매핑 정보를 통해 별도의 쿼리 없이 Upload 정보를 담고있는 객체들이 Set 에 입력되어서

게시물 Bean 에 담겨서 반납된다..

 

문제는... lazy="true" 일때.. 하이버네이트 세션이 닫혀있으면.. 객체정보를 가져오지 못한댄다 ㅡㅡ

 

그래서... 세션이 닫히기 전에 객체를 초기화 시켜줘야 했다.

초기화 방법은 간단..

 

Session ss = factory.openSession();

bean = mgr.read(new Integer(게시물고유번호));

 

// Set 의 size() 를 호출하여 객체를 초기화(객체로딩???)시킨다.

bean.getAttatchFile().size(); <-- 요기서 명시적으로 객체를 로딩하는것 같다.

 

ss.close();

 

Iterator iter = bean.getAttatchFile().iterate();

 

while(iter.hasNext()){

  Object = iter.next();

}

 

이렇게 해서 세션이 닫히기 전에 객체들을 가져왔다.

 

만약 위에 코드가 아래처럼 되어있으면 영락없이 LazyInitializationException 가 던져진다

Session ss = factory.openSession();

bean = mgr.read(new Integer(게시물고유번호));

ss.close();

// 세션이 닫힌 상태기 때문에 아래쪽으로는 LazyInitializationException  가 발생한다 ;;

Iterator iter = bean.getAttatchFile().iterate();

 

while(iter.hasNext()){

  Object = iter.next();

}

 

Posted by tornado
|

훔... 하이버네이트만 쓸때는

Query q = sess.creaeQuery("from CustomBean as xxx order by xx asc");

q.setFirstResult(0);

q.setFetchSize(20);

list = query.list();

 

sess.close();

 

이렇게 하면 꼭 mysql 에서 limit 을 쓴것처럼 가져오는데..

 

Spring + Hibernate 를 쓰니까... 이게 좀 애매해 짐..

그래서 HibernateDaoSupport 를 상속한 DAOImpl 클래스 안에다가..

무식하게 시리..

return getHibernateTemplate().find(

    "from XXXBean as xxx order by xxx.desc limit ?,?"

    , new Object[]{ new Integer(first), new Integer(fetchSize) } ) ;

 

이렇게 했는데.. 일단 돌아가기는 원활히 돌아가는데..

기분이 영~~ 찝찝하네...

재미있는건... 코딩이 더 힘들것 같았던 struts + spring + hivernate 가

일단 기본 설정파일이 완성된 후에는 코딩량이 줄었다는 것임 ;;

 

pstmt.setString(1, xxx);

pstmt.setString(2, yyy);

.

.

.

.

pstmt.executeUpdate();

 

이런짓거리 안해두 되니 무지 편리 ㅎㅎㅎ

Posted by tornado
|
Posted by tornado
|

 /**
  * @hibernate.property
  * @hibernate.column name="contents" sql-type="text" not-null="true"
  */
 public String getContents() {
     return contents;
 }

 public void setContents(String contents) {
     this.contents = contents;
 }

 

음.. 매녈에 없어서 메일링에서 보구 찾았음

 

 

Posted by tornado
|

springframework.org 보다가 배낌

 

 

  <bean id="propertyConfigure"

      class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
      <list>
        <value>WEB-INF/jdbc.properties</value>
      </list>
    </property> 
  </bean>

 

  <bean id="dataSource"
     class = "org.apache.commons.dbcp.BasicDataSource">   
   <property name="driverClassName" ><value>${jdbc.driver}</value></property>
   <property name="url"><value>${jdbc.url}</value></property>
   <property name="username"><value>${jdbc.user}</value></property>
   <property name="password"><value>${jdbc.password}</value></property>
  </bean>
 

ㅋ.. 편리하군... 설정으로 끝나다뉘~~

Posted by tornado
|

Spring 시작..


http://www.springframework.org/download.html

에 가서 다운로드 받는다.

압축 풀고.. dist 디렉토리에 가보면 jar 파일, dtd, tld 등등이 보인다.

이 파일들을 사용할 수 있게 클래스 패스에 걸던, Eclipse 에서

해당 프로젝트에 등록하던지 한다.

=====================================
package test;

public interface Hello{

 public void sayHello();

}

=====================================
package test;

public class HelloImpl implements Hello{

 public String name;

 public HelloImpl(){
  System.out.println("Default Constructure called..");
 }

 public void sayHello(){ 
  System.out.println("Hello~~~ " + name);
 }

 public void setName(String name){
  this.name = name;
 }
}


=====================================


위의 파일을 Spring 설정 파일에 등록해야 사용할 수가 있다.

hello.xml 파일로 아래 내용 저장..

=====================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
  <bean id="hello"
 class="test.HelloImpl">
    <property name="name">
      <value>tornado</value>
    </property>
  </bean>
</beans>
=====================================


이제 이 파일을 테스트 해볼 클래스를 만든다.

=====================================
package test;

import org.springframework.context.*;
import org.springframework.context.support.*;

public class HelloTest{

 public static void main(String[] args) throws Exception{

  ApplicationContext ac =
   new FileSystemXmlApplicationContext("d:/source/spring/test/hello.xml");
  
  Hello hello = (Hello) ac.getBean("hello");

  hello.sayHello();

 }

}
=====================================

시작해보면.... HelloImpl 클래스의 생성자가 호출되는것을 볼 수 있고.

sayHello() 를 통해 메세지가 출력되는 것을 볼수 있당..

property 엘리먼트를 이용해서 특정 메소드에 변수를 전달 할 수도 있다.

 

내친김에 DataSource 를 등록해볼까나???

jndi 도 가능하고, DBCP 도 가능하다.

Application 이니.. DBCP 의 BasicDataSource 를 등록해 보자..

hello.xml 파일에 bean 을 등록...

(물론 DBCP 를 위한 commons-pool, commons-dbcp, commons-collection,
mysql driver 등은 준비해야쥐)

  <bean id="dataSource"
   class = "org.apache.commons.dbcp.BasicDataSource">
   
   <property name="driverClassName" >
     <value>org.gjt.mm.mysql.Driver</value>
   </property>
   <property name="url">
     <value>jdbc:mysql://localhost:3306/test</value>
   </property>
   <property name="username">
     <value>root</value>
   </property>
   <property name="password">
     <value>1111</value>
   </property>
  </bean>

위에 부분을 등록한다.


HelloTest 클래스의 main 메서드에 아래만 등록해 보면 된다.

절라 간단..


DataSource ds = (DataSource)ac.getBean("dataSource");

if(ds == null) System.out.println("null");
else System.out.println("Ok");

Connection conn = ds.getConnection();

PreparedStatement pstmt = conn.prepareStatement("select now()");

ResultSet rs = pstmt.executeQuery();

if(rs.next()){
   
    System.out.println(rs.getString(1));
}

conn.close();

 

시작은 했는데...... 개념이 헷갈리넹 ㅜㅜ

설정은 또 왜이리 많은겨  -.-;;

 

음주가무 해야 하는데 쩝~

 

Posted by tornado
|

http://forum.springframework.org/index.php

 

Spring Framework Forum IndexSpring Framework
Spring Framework Support Forums
 

 

스프링 사용하다가 막히면 바로 찾게 되는 곳.

싱싱하고 현장에서 검증된 유용한 정보가 올라온다...

Posted by tornado
|

벨로시티에서 제공하는 툴들은 여러 종류가 있다.

GenericTools
VelocityView
VelocityStruts

이 있는데... 간단하게 GenericTools 에 있는 DateTool 을 사용해봤다.

http://jakarta.apache.org/velocity/tools/generic/

요기 GenericTools 를 볼 수 있당.

사용법은 무지 간단..

먼저 Tool 을 사용하기 위해..  toolbox.xml 을 WEB-INF/ 디렉토리에 생성하고,
VelocityViewServlet 에 해당 툴을 등록시켜주면 된다.

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

<toolbox>

  <tool>
    <key>date</key>
 <scope>application</scope>
 <class>org.apache.velocity.tools.generic.DateTool</class>
  </tool>

</toolbox>
=============================================

web.xml 에서 VelocityViewServlet 에 init-param 으로 toolbox.xml 을 지정해 주어야 한다.

=============================================

<init-param>
  <param-name>org.apache.velocity.toolbox</param-name>
  <param-value>/WEB-INF/toolbox.xml</param-value>
</init-param>

=============================================

이렇게 적어주고... 해당 컨텍스트 리로딩..

마지막으로 test.vm 파일에 아래와 같이 적어준당..

=============================================

<BR><HR><BR>
$date.getDate()

<BR>
$date.format('yyyy-MM-dd aaa H:m:s', $date)

<BR>
$date.short || $date.medium || $date.long

<BR>
$date.get('yyyy-M-d H:m:s a')

=============================================

http://localhost:8080/velocity/test.do 

오옷... 날짜 나와따~~

이런식으로 제공되는 Tool들을 지정해서 쓰면 된당..


 

Posted by tornado
|

벨로시티에 스트러츠도 함 붙여볼까??

필요한 jar 파일을 lib 에 복사하자..

struts.jar 는 필수이고

struts 구동에 필요한 commons-digester, commons-beanutils, validator 등등을 복사한다.


WEB-INF 디렉토리에 struts-config.xml 파일을 생성한다.

=====================================================================

<?xml version="1.0" encoding="EUC-KR"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">

<struts-config>
 
 <data-sources />
 
 <form-beans />   
 
 <global-exceptions />   
   
 <global-forwards />     
   
 <action-mappings>
  
 </action-mappings> 
           
 <controller />   

</struts-config>


=====================================================================

암것도 없다 ㅡㅡ;;


web.xml 에 ActionServlet 을 등록한다.


<servlet>
  <servlet-name>action</servlet-name>
  <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> 
  <init-param>
 <param-name>config</param-name>
 <param-value>/WEB-INF/struts-config.xml</param-value>
  </init-param>

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

  <load-on-startup>2</load-on-startup>
</servlet>

 

<servlet-mapping>
  <servlet-name>action</servlet-name>
  <url-pattern>*.do</url-pattern>
</servlet-mapping>


머 위치는 적당히 알아서 넣는다.

톰캣 다시 시작... (로그에 보면... struts.jar, commons-xxx 등등이 로딩된게 보일게다..)


간단한 Action 을 만든다...

===============================================================
package test;

import javax.servlet.*;
import javax.servlet.http.*;

import java.io.*;

import org.apache.struts.action.*;

public class TestAction extends Action{
 
 public ActionForward execute(
  ActionMapping mapping ,
  ActionForm form ,
  HttpServletRequest req ,
  HttpServletResponse res)
  throws IOException , ServletException
 {
  
  String target = "success";


  return mapping.findForward(target);
 }

}

 

===============================================================

간단하게 하는거라...
ant 안쓰고 그냥 지저분하게 컴파일함..
예전에 ant 모를때는 ejb 컴파일을 .bat 파일로 만들어서
컴파일 했다는 ㅡㅡ;

D:\tomcat_ex\webapps\velocity\WEB-INF\classes\test>javac -classpath %CLASSPATH%;d:\tomcat_ex\common\lib\servlet.jar;..\..\lib\struts.jar *.java


컴파일 되었으면... struts-config.xml 에 action 등록..

==============================================================


<action-mappings>

  <action
 path = "/test"
 type = "test.TestAction"
 scope = "request">

 <forward name="success" path="/test.vm" />

  </action>
 
</action-mappings> 


==============================================================

http://localhost:8080/manager/html/reload?path=/velocity 

해당 컨텍스트 리로드 하고..

http://localhost:8080/velocity/test.do 를 요청...


오옷... test.vm 으로 포워딩 대따...

 


request 에 객체 를 담아볼까낭~~~


TestAction 클래스를 수정한당...

================================================================

package test;

import javax.servlet.*;
import javax.servlet.http.*;

import java.io.*;
import java.util.*;

import org.apache.struts.action.*;

public class TestAction extends Action{
 
 public ActionForward execute(
  ActionMapping mapping ,
  ActionForm form ,
  HttpServletRequest req ,
  HttpServletResponse res)
  throws IOException , ServletException
 {
  
  String target = "success";
  
  List _list = new ArrayList();

  for(int i = 0; i < 10; i++){
   _list.add(new String("Number : " + ( i + 1) ) );
  }

  req.setAttribute("TEST_LIST", _list);

  return mapping.findForward(target);
 }

}

================================================================

컴파일 하고... Manager 에서 리로딩 하던지.. 톰캣 재시작 하던지..


test.vm 에 아래 코드 추가..

#foreach( $t in $TEST_LIST)

<B>$t</B></br>


#end


http://localhost:8080/velocity/test.do <-- 요청한다..


오옷... 찐하게 뭐가 나와따~~~~

 

Tool 좀 더 보구 가지고 놀아야쥐...

 

'JAVA > Framework' 카테고리의 다른 글

첨으로 Spring 해바따..  (0) 2005.02.14
[펌] Spring Framework Forum  (0) 2005.02.14
벨로시티 GenericTool 중에.. DateTool  (0) 2005.02.12
[울트라 초 간단] Velocity 시작 ㅡㅡ  (0) 2005.02.12
헷갈리 ㅡㅡ;;  (0) 2005.02.12
Posted by tornado
|