달력

092017  이전 다음

  •  
  •  
  •  
  •  
  •  
  • 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

스프링 프레임워크에서 아무런 동작이 필요없이 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 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 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 tornado


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

        }

         return new Integer( executor.executeBatch()) ;    
    }
   });
신고
Posted by Tornado 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 tornado

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

쿼리 찍어봤더니..

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

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

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

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

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

 

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

 

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

신고
Posted by Tornado tornado

[link]spring ide

JAVA/Framework 2005.04.27 19:09

http://www.springframework.org/spring-ide/eclipse/

 

 

이거 편리하네 ^^

 

신고
Posted by Tornado 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 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 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 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 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 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 tornado

업데이트합니다. ^^;

아파치 검색엔진 Lucene과 OR 매핑 (오픈 표준) 툴 Hibernate API입니다.

 

J2SE/J2EE Platform API
Java 2 Platform Standard Edition 5.0 API Specification
New Features and Enhancements J2SE 5.0
JDK 5.0 Overview
Java 2 Platform Enterprise Edition, v 1.4 API Specification
JSTL 1.1 Tag Reference
The J2EE 1.4 Tutorial
Spring-related Docs
Spring Reference Manual
Spring API
Spring Tag Manual
Apache-Jakarta products Docs
Lucene API
Apache Ant Manual
Digester API
Digester Developer Guide
Apache Struts API
SourceForge products Docs
Hibernate API
XDoclet API

신고
Posted by Tornado 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 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 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 tornado

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

 

Spring Framework Forum IndexSpring Framework
Spring Framework Support Forums
 

 

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

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

신고
Posted by Tornado 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 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 좀 더 보구 가지고 놀아야쥐...

 

신고
Posted by Tornado tornado