레이블이 자바객체지향인 게시물을 표시합니다. 모든 게시물 표시
레이블이 자바객체지향인 게시물을 표시합니다. 모든 게시물 표시

2013년 11월 3일 일요일

스프링,아이바티스트랜잭션예제[Spring Framework3.X,Transaction,iBATIS, @Transactional]

스프링,아이바티스트랜잭션예제[Spring Framework3.X,Transaction,iBATIS, @Transactional]
 
스프링의 트랜잭션 관리 방법중 @Transactional 애노테이션을 이용하여 iBATIS와 연동하는 간단 예제이다.(오라클 emp 테이블에 Data 1건 insert..)

먼저 Spring MVC 프로젝트 하나 생성하자.
 
1. pom.xml
 
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
 <modelVersion>4.0.0</modelVersion>
 <groupId>com.mungchung</groupId>
 <artifactId>sample</artifactId>
 <name>abc</name>
 <packaging>war</packaging>
 <version>1.0.0-BUILD-SNAPSHOT</version>
 <properties>
  <java-version>1.6</java-version>
  <org.springframework-version>3.0.6.RELEASE</org.springframework-version>
  <org.aspectj-version>1.6.9</org.aspectj-version>
  <org.slf4j-version>1.5.10</org.slf4j-version>
 </properties>
 <dependencies>
 
  <!-- Spring -->
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-context</artifactId>
   <version>${org.springframework-version}</version>
   <exclusions>
    <!-- Exclude Commons Logging in favor of SLF4j -->
    <exclusion>
     <groupId>commons-logging</groupId>
     <artifactId>commons-logging</artifactId>
    </exclusion>
   </exclusions>
  </dependency>
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-webmvc</artifactId>
   <version>${org.springframework-version}</version>
  </dependency>
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-tx</artifactId>
   <version>${org.springframework-version}</version>
  </dependency>
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-jdbc</artifactId>
   <version>${org.springframework-version}</version>
  </dependency>
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-orm</artifactId>
   <version>${org.springframework-version}</version>
  </dependency>
  <dependency>
   <groupId>org.apache.ibatis</groupId>
   <artifactId>ibatis-sqlmap</artifactId>
   <version>2.3.4.726</version>
  </dependency>
  <dependency>
   <groupId>commons-dbcp</groupId>
   <artifactId>commons-dbcp</artifactId>
   <version>1.2.2</version>
  </dependency>
  <dependency>
   <groupId>xerces</groupId>
   <artifactId>xercesImpl</artifactId>
   <version>2.9.1</version>
  </dependency>
  <dependency>
   <groupId>cglib</groupId>
   <artifactId>cglib</artifactId>
   <version>2.2</version>
   <type>jar</type>
   <scope>compile</scope>
  </dependency>
  <!-- AspectJ -->
  <dependency>
   <groupId>org.aspectj</groupId>
   <artifactId>aspectjrt</artifactId>
   <version>${org.aspectj-version}</version>
  </dependency>
  <!-- Logging -->
  <dependency>
   <groupId>org.slf4j</groupId>
   <artifactId>slf4j-api</artifactId>
   <version>${org.slf4j-version}</version>
  </dependency>
  <dependency>
   <groupId>org.slf4j</groupId>
   <artifactId>jcl-over-slf4j</artifactId>
   <version>${org.slf4j-version}</version>
   <scope>runtime</scope>
  </dependency>
  <dependency>
   <groupId>org.slf4j</groupId>
   <artifactId>slf4j-log4j12</artifactId>
   <version>${org.slf4j-version}</version>
   <scope>runtime</scope>
  </dependency>
  <dependency>
   <groupId>log4j</groupId>
   <artifactId>log4j</artifactId>
   <version>1.2.16</version>
   <exclusions>
    <exclusion>
     <groupId>javax.mail</groupId>
     <artifactId>mail</artifactId>
    </exclusion>
    <exclusion>
     <groupId>javax.jms</groupId>
     <artifactId>jms</artifactId>
    </exclusion>
    <exclusion>
     <groupId>com.sun.jdmk</groupId>
     <artifactId>jmxtools</artifactId>
    </exclusion>
    <exclusion>
     <groupId>com.sun.jmx</groupId>
     <artifactId>jmxri</artifactId>
    </exclusion>
   </exclusions>
   <scope>runtime</scope>
  </dependency>
  <!-- @Inject -->
  <dependency>
   <groupId>javax.inject</groupId>
   <artifactId>javax.inject</artifactId>
   <version>1</version>
  </dependency>
  <!-- Servlet -->
  <dependency>
   <groupId>javax.servlet</groupId>
   <artifactId>servlet-api</artifactId>
   <version>2.5</version>
   <scope>provided</scope>
  </dependency>
  <dependency>
   <groupId>javax.servlet.jsp</groupId>
   <artifactId>jsp-api</artifactId>
   <version>2.1</version>
   <scope>provided</scope>
  </dependency>
  <dependency>
   <groupId>javax.servlet</groupId>
   <artifactId>jstl</artifactId>
   <version>1.2</version>
  </dependency>
  <!-- Test -->
  <dependency>
   <groupId>junit</groupId>
   <artifactId>junit</artifactId>
   <version>4.7</version>
   <scope>test</scope>
  </dependency>
 </dependencies>
 <build>
  <plugins>
   <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
     <source>${java-version}</source>
     <target>${java-version}</target>
    </configuration>
   </plugin>
   <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <configuration>
     <warName>abc</warName>
    </configuration>
   </plugin>
   <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
     <execution>
      <id>install</id>
      <phase>install</phase>
      <goals>
       <goal>sources</goal>
      </goals>
     </execution>
    </executions>
   </plugin>
   <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-resources-plugin</artifactId>
    <version>2.5</version>
    <configuration>
     <encoding>UTF-8</encoding>
    </configuration>
   </plugin>
  </plugins>
 </build>
</project>
 

2. 컨트롤러
 
package onj.edu.transaction;
import java.util.Locale;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class HomeController {
 @Autowired
 private TransactionMain transactionMain;

 @RequestMapping(value = "/hello", method = RequestMethod.GET)
 public String home(Locale locale, Model model) {
  String msg = "";
  try {
   msg = transactionMain.insert();
  } catch (Throwable e) {
   msg = "Transaction 오류";
   e.printStackTrace();
  }
  model.addAttribute("msg", msg );
  return "onj";
 }
}
 
3. 트랜잭션 메인 클래스
 
package onj.edu.transaction;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
public class TransactionMain {
 @Autowired
 private Tran1 tr1;

 @Transactional(propagation = Propagation.REQUIRED)
 public String insert() throws Throwable {
  tr1.insertTest();
 
  return "Transaction Success!!";
 }
}

4. 트랜잭션 처리 클래스(간단히 EMP 테이블에 한건 인서트)

package onj.edu.transaction;
import java.util.HashMap;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.ibatis.SqlMapClientTemplate;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
public class Tran1 {
 @Autowired
 private SqlMapClientTemplate sqlMapClientTemplate;

 @Transactional(propagation = Propagation.REQUIRED)
 public void insertTest() {
  HashMap<String, String> hashMap = new HashMap<String, String>();
  hashMap.put("empno", "101");
  hashMap.put("ename", "오엔제이");
  sqlMapClientTemplate.insert("sql.empinsert1", hashMap);
 }
}
 
5. web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
 <context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>/WEB-INF/spring/root-context.xml</param-value>
 </context-param>


 <listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
 </listener>
 <servlet>
  <servlet-name>onjServlet</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <init-param>
   <param-name>contextConfigLocation</param-name>
   <param-value>/WEB-INF/spring/onjServlet-context.xml</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
 </servlet>
 
 <servlet-mapping>
  <servlet-name>onjServlet</servlet-name>
  <url-pattern>*.html</url-pattern>
 </servlet-mapping>
</web-app>
 
6. /spring/root-context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:tx="http://www.springframework.org/schema/tx"
 xmlns:context="http://www.springframework.org/schema/context"
 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
  http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
  http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">

 <tx:annotation-driven proxy-target-class="true"/>

 <context:component-scan base-package="onj.edu.transaction">
  <context:exclude-filter type="annotation" __EXPRESSION__="org.springframework.stereotype.Controller" />
 </context:component-scan>

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
  destroy-method="close">
  <property name="driverClassName">
   <value>oracle.jdbc.driver.OracleDriver</value>
  </property>
  <property name="url">
   <value>jdbc:oracle:thin:@192.168.0.7:1521:onj</value>
  </property>
  <property name="username">
   <value>scott</value>
  </property>
  <property name="password">
   <value>tiger</value>
  </property>
 </bean>
   
    <bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
        <property name="configLocation" value="classpath:/sql-map-config.xml"/>
        <property name="dataSource" ref="dataSource"/>
    </bean>
   
    <bean id="sqlMapClientTemplate" class="org.springframework.orm.ibatis.SqlMapClientTemplate">
        <property name="sqlMapClient" ref="sqlMapClient"/>
    </bean>
 <bean id="transactionManager"
  class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <property name="dataSource" ref="dataSource" />
 </bean>
 <bean id="tr1" class="onj.edu.transaction.Tran1"/>
 <bean id="trMain" class="onj.edu.transaction.TransactionMain"/>
</beans>

7. /spring/onjServlet-context.xml

 <!-- Enables the Spring MVC @Controller programming model -->
 <annotation-driven/>
 <tx:annotation-driven proxy-target-class="true"/>
 <!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
 <resources mapping="/resources/**" location="/resources/" />
 <!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
 <beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  <beans:property name="prefix" value="/views/" />
  <beans:property name="suffix" value=".jsp" />
 </beans:bean>

 <context:component-scan base-package="onj.edu.transaction"/>

</beans:beans>
 
8. src/main/resources/sql-map-config.xml
 
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMapConfig PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
  "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
    <settings useStatementNamespaces="true"/>   
    <sqlMap resource="sqlmap/sql.xml"/>
</sqlMapConfig>

9.  SLQ매퍼, src/main/resources/sqlmap/sql.xml
 
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE sqlMap PUBLIC "-//iBATIS.com/DTD SQL Map 2.0//EN" "http://www.ibatis.com/dtd/sql-map-2.dtd">
<sqlMap namespace="sql">
 <insert id="empinsert1" parameterClass="hashMap">
  INSERT INTO emp (empno, ename) VALUES (#empno#, #ename#)
 </insert>
</sqlMap>

10.마지막으로 view 역할을 하는 jsp(/views/onj.jsp)
 
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<head>
 <title>Home</title>
</head>
<body>
//트랜잭션처리결과 출력
<P> ${msg} </P>
</body>
</html>

2013년 10월 24일 목요일

[JAVA TIP]java.util.Arrays.sort를 이용한 배열정렬(Array Sort)

[JAVA TIP]java.util.Arrays.sort를 이용한 배열정렬(Array Sort)
 
예제를 보시면 이해가 되리라 생각 합니다.
참고하시구요, 열공 하세요.
 
//
//  @Java Tip
//  @author 오라클자바커뮤니티, 오엔제이프로그래밍
//  @Desc : java.util.Arrays 클래스의 sort메소드를 이용한 정렬
// 
package onj;
import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;

public class ArraySortExam {
 public static void main(String[] args) {
  String[] myArray = { "c", "a", "b" };
  // 일단 그냥 출력 해보자. c, a, b 순으로 출력
  for (String s : myArray) {
   System.out.println(s);
  }
  // Ascending Sort, 오름차순 정렬
  Arrays.sort(myArray);
  // a, b, c로 출력
  for (String s : myArray) {
   System.out.println(s);
  }
  // 이번에는 내림차순(Descending) 졍렬
  Arrays.sort(myArray, Collections.reverseOrder());
  // c, b, a로 출력
  for (String s : myArray) {
   System.out.println(s);
  } 

2013년 10월 21일 월요일

자바객체복제(cloneable 예제) 간단히 만든 java clone 예제 입니다.

자바객체복제(cloneable 예제)

간단히 만든  java clone 예제 입니다. 따라해 보세요 
package onj;
class Person extends Object implements Cloneable  {
String name;   //인스턴스변수
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}

public class CloneTest {
public static void main(String[] args) throws CloneNotSupportedException {
Person p = new Person();
p.name = "홍길동";
Person p2 = (Person)p.clone();
System.out.println("p2.name" + p2.name);
}

2013년 8월 8일 목요일

[오라클자바커뮤니티, 자바교육]스트럿츠에서의 파일 업로드 Example 입니다.(struts file upload)

스트럿츠에서의 파일 업로드 Example 입니다.(struts file upload)


오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의)  



스트럿츠의 폼에서 File을 인식하기 못하기 때문에

org.apache.struts.upload.FormFile 클래스를 사용하여야 합니다.

제가 작업하던중 스트럿츠의 파일 업로드에 사용한 소스입니다.

궁금하신 점은 답글 남겨주시거나 메일 보내주시면 대답해 드리겠습니다. ^^


///////////////// image_insert.jsp/////////////////////////////////////


<%@ page contentType="text/html;charset=EUC-KR" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>


<html:form action="/ImageInsert" enctype="multipart/form-data" >
  <table>
    <TR bgcolor=FFFFFF>
                      <TD height="30" bgcolor='#E6EBF0'>* 이미지(대)</TD>
                      <TD colspan="2">
                        <html:file property="image_path[0]" size="30"/>       
                      </TD>
                    </TR>
                    <TR bgcolor=FFFFFF>
                      <TD height="30" bgcolor='#E6EBF0'>* 이미지(중)</TD>
                      <TD colspan="2">
                        <html:file property="image_path[1]" size="30"/>               
                      </TD>
                    </TR>
                    <TR bgcolor=FFFFFF>
                      <TD height="30" bgcolor='#E6EBF0'>* 이미지(소)</TD>
                      <TD colspan="2">
                        <html:file property="image_path[2]" size="30"/>               
                      </TD>
                    </TR>
  </table>
</form:html>

///////////////////struts-config.xml///////////////////////////////////

<form-beans>
  <form-bean name="imageinsertForm" type="ImageInsertForm"/>
</form-beans>

<action-mappings>
  <action         
                path="/ImageInsert"
                type="ImageInsertAction"
            name="imageinsertForm"                       
            validate="false"
            input="/image_insert.jsp"
        />

///////////////////ImageInsertForm.java///////////////////////////////

import org.apache.struts.upload.FormFile;
public class ImageInsertForm  extends ActionForm
{

    private FormFile[] image_path = new FormFile[3];
   
    public FormFile[] getImage_path() {
                return image_path;
        }
        /**
        * @param image_path The image_path to set.
        */
        public void setImage_path(FormFile[] image_path) {
                this.image_path = image_path;
        }
}       

////////////////////ImageInsertAction.java/////////////////////////////

import org.apache.struts.upload.FormFile;

public class GoodsInsertAction extends BaseAction
{
        public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)
        {
                  FormFile image_path[] = ((ImageInsertForm)form).getImage_path();
                  ImageDAO imageDAO = new ImageDAO();
                  imageDAO.imageInsert( image_path );
                 
                  return (mapping.findForward( "image_insert_success" ));
        }
}

/////////////////////////// GoodsFile.java////////////////////////////
/**
 * @author Administrator
 *
 * TODO To change the template for this generated type comment go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
public class GoodsFile
{
        private String fileName = null;
        private String tempFileName = null;

        public String getFileName() {
                return fileName;
        }
       
       
        public String getTempFileName() {
                return tempFileName;
        }
       


        public void setFileName(String fileName) {
                this.fileName = fileName;
        }



        public void setTempFileName(String tempFileName) {
                this.tempFileName = tempFileName;
        }
}

////////////////////ImageDAO.java///////////////////////////////////

import org.apache.struts.upload.FormFile;

public class ImageDAO
{

    public  void imageInsert( FormFile[] image_path )
    {
        Connection con=null;
        PreparedStatement pstmt=null;
        ResultSet rs = null;
        String sql = "";
        GoodsFile goodsFile[] = new GoodsFile[ 3 ];
        String path = "D:\\upload";

        try
        {
                for( int i = 0 ; i < 3 ; i++ )
                {
                        goodsFile[ i ] = FileUploadUtil.doFileUpload( image_path[ i ] , gcode , Integer.toString( ( i + 1 ) ) );
                }

                con = DriverManager.getConnection(ConnectionPoolManager.URL_PREFIX+"oraclejava");
               
                sql = "INSERT INTO IMAGES( IMAGE_PATH1 , IMAGE_PATH2 , IMAGE_PATH3 ) VALUES(  :IMAGE_PATH1 , :IMAGE_PATH2 , :IMAGE_PATH3 );
                pstmt = con.prepareStatement(sql);
                pstmt.setString( 1 , goodsFile[ 1 ].getFileName()  );
                    pstmt.setString( 2 , goodsFile[ 2 ].getFileName() );
                    pstmt.setString( 3 , goodsFile[ 3 ].getFileName() );
                pstmt.executeUpdate();
 
                }
        catch( Exception e )
        {
                return null;
        }
        finally
        {
                    try
                {

                    if ( rs != null )
                        rs.close();
                    if ( pstmt != null )
                        pstmt.close();
                    if ( con != null )
                        con.close();
                }
                catch ( Exception ignore )
                {
               
        }         
    }
}


///////////////////////FileUploadUtil.java/////////////////////////////
ublic class FileUploadUtil
{
        public static GoodsFile doFileUpload(FormFile fileList  )
        throws FileNotFoundException, IOException
        {
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                InputStream stream = fileList.getInputStream();

                               

                //파일을 업로드할 절대 경로를 지정해야 한다.
                String path = "D:\\upload\";
                OutputStream bos = new FileOutputStream( path + fileList.getFileName()  );
                int bytesRead = 0;
                byte[] buffer = new byte[8192];
                while ((bytesRead = stream.read(buffer, 0, 8192)) != -1)
                {
                        bos.write(buffer, 0, bytesRead);
                }
                bos.close();
                stream.close();

        GoodsFile boardFile = new GoodsFile();
        boardFile.setFileName(fileList.getFileName());
        boardFile.setTempFileName(fileList.getFileName() );

        return boardFile;
}
} 
[출처] 오라클자바커뮤니티 - http://www.oraclejavanew.kr/bbs/board.php?bo_table=LecStruts&wr_id=64

[ORACLEJAVA커뮤티니, oraclejavanew.kr]Struts Bean 커스텀 태그

Struts Bean 커스텀 태그

자바 빈과 관련된 프로퍼티에 접근 하는데 이용되며 페이지 scope 속성들과 변수의 기술을 통해 페이지의 나머지 부분에서 쉽게 접근 할 수 있도록 자바 빈을 정의하는데 사용 됩니다.

또한 Bean 태그 라이브러리의 태그들에서는 요청 쿠키, 헤더 그리고 파라미터 값을 기반으로 하는 새로운 빈을 생성 해야 하는 경우 편리하게 이용 할 수 있는 메커니즘도 제공 합니다.

아래는 Bean 태그 라이브러리의 커스텀 태그들 입니다.


Custom tags within the Bean tag library

cookie : 지정한 요청 쿠키의 값에 근거해 변수를 정의
define : 지정한 빈 프로퍼티에 값에 근거해 변수를 정의
header : 지정한 요청 헤더의 값에 근거해 변수를 정의
include : 동적인 애플리케이션 요청의 응답을 로드해 빈으로 이용 할 수 있게 함
message  : 국제화된 메시지를 표시
page : 지정한 아이템을 빈으로써 페이지 문맥에서 꺼냄
parameter : 지정한 요청 파라미터에 근거해 변수를 정의
resource : 웹애플리케이션의 자원을 로드해 빈으로 이용 할 있게 함
size : Collection 또는 Map 요소의 개수를 포함한 빈을 정의
struts : 지정한 스트럿츠 내부 설정 객체를 빈으로
write : 지정한 빈 프로퍼티의 값을 표시


1.define 태그

지정한 빈의 프로퍼티 값을 꺼내 현재 페이지의 나머지 부분에서 접근 할  수 있도록 정의 합니다.반환되는 프로퍼티 값이 자바 원시 데이터 타입인 경우를 제외하고는 형 변환이 일어 나지 않습니다. 단 자바 원시데이터 타입인 경우엔 이 원시 데이터 타입의 래퍼형으로 변환 됩니다. (int 형이면 Integer로…)


[예:게시판의 VIEW 구현 시 이용]

<td width=490 style= "padding-left:10 ">
<bean:define id="content” name="boardForm" property="boardValue.content"/ >
<%= BoardUtils.convertHtmlBr((String)content) %>
< / t d >

2.header 태그

name으로 지정된 요청 헤더 값을 꺼내 String 타입의 페이지 scope 속성으로 정의

multiple 속성에 null이 아닌 값을 설정 한 경우 id 속성은 HttpServletRequest.getHeader() 대신 HttpServletRequest.getHeaders()를 호출하여 얻은 결과값을 포함 합니다.

[예제: 아래 예제는 요청 헤더와 헤더 값을 출력 합니다.]

<%@ page pageEncoding="euc-kr" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<html>
<body>
<%
java.util.Enumeration names =
((HttpServletRequest) request).getHeaderNames();

while (names.hasMoreElements()) {
String name = (String) names.nextElement();
%>

<bean:header id="head" name="<%= name %>"/>
 <br>Header Name : <%= name %> = <%= head %>
 
<%
}
%>
</body>
</html>

[결과]

Header Name : accept = */*
Header Name : accept-language = ko,en;q=0.5
Header Name : accept-encoding = gzip, deflate
Header Name : user-agent = Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)
Header Name : host = localhost
Header Name : connection = Keep-Alive
Header Name : cookie = JSESSIONID=EF8A4D1130ADFD06F6E78BE2A7BA9801

3.include 태그

지정한 애플리케이션 컴포넌트(또는 외부의URL)에 내부적으로 요청을 보내 수행 하고 이때 얻은 응답을 String 타입의 빈으로 만듭니다. 이때 생성된 빈은 id 속성의 값을 변수 명으로 가지며 페이지 scope에 저장 됩니다.

이 태그는 <jsp:include>와 비슷합니다. 그러나 표준 <jsp:include>에서는 해당 컴포넌트를 수행해서 얻은 응답을 직접 출력 스트림에 쓰는 반면 Bean 태그라이브러리의 include 태그에서는 페이지 범위를 가지는 빈으로 저장하는 것이 차이가 있습니다.

아래 처럼 include 태그를 이용해서 페이지 범위의 빈에 저장

<bean:include id="footerSpacer" page="/long/path/footerSpacer.jsp"/>

이제 페이지의 적절한 곳에서 <bean:write>를  이용하여 출력 할 수 있습니다.

<bean:write name="footerSpacer" />

[예제-test.jsp]
<%@page pageEncoding="euc-kr" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<html>
<body>
<bean:include id="inc" page="/include.jsp"/>
<br>
원래 페이지의 내용...<br>
<bean:write name="inc"/>
<br>========================<br>
<bean:write name="inc"/>
</body>
</html>

[include.jsp]
include되는 페이지의 출력...


4.message 태그

스트럿츠 태그 라이브러리에서 가장 널리 이용되는 태그 중 하나이며 지정된 메시지 키를 이용하여 국제화된 메시지를 꺼내와 출력 스트림에 출력 합니다. “{0}”와  같은 파라미터 치환을 5개까지 허용 합니다.

메시지를 꺼내오기 위해서는 key 속성을 사용하여 직접 지정 할 수도 있으며 name과 property 속성을 사용하여 빈에서 간접적으로 꺼내 올 수도 있습니다. 그리고 bundle 속성에는 MessageResources 객체를 얻어 올 수 있는 애플리케이션 범위의 빈의 이름을 지정 할 수도 있습니다. Locale 속성을 지정하지 않은 경우 필요한 locale은 세션에서 키 Action.LOCALE_KEY를 사용하여 얻습니다.

아래는 간단한 예 입니다.

<head>
<html:base/>
<title><bean:message key="title.login"/></title>
    </head>

5.parameter 태그

지정된 요청 파라미터의 값을 꺼내 String 타입의 페이지 범위의 속성으로 정의 합니다. 만약 multiple 속성에 null 이 아닌 값이 설정 될 경우에는 getParamter() 대신 getParameters() 메소드를 호출하고 String[] 타입의 페이지 범위 속성을 정의 합니다. 


오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의)  


<bean:parameter id="param1" name="param1"/>
<bean:parameter id="param2" name="param2" multiple="true"/>
<bean:parameter id="param3" name="param3" value="UNKNOWN VALUE"/>


6.resource 태그

지정된 웹 에플리케이션 자원의 값을 꺼내 input 속성의 값에 따라 InputStream이나 String 타입의 한 형태로 사용 할 수 있게 합니다. input 속성의 값이 null이 아닌 값인 경우 InputStream을 생성하며 그 외에는 String으로 로딩 합니다.

<bean:resource id="webxml" name="/WEB-INF/web.xml"/>

얻어진 정보를 JSP 페이지에서 보기 위해서는 아래처럼 하면 됩니다.

<pre>
<bean:write name="webxml" filter=”true” />
</pre>

[예제]
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<html>
<body>
<bean:resource id="webxml" name="/WEB-INF/web.xml"/>
<pre>
<bean:write name="webxml" filter=”true” />
</pre>
</body>
</html>

7.write 태그

빈 프로퍼티의 값을 꺼내 String 형태로 출력하는 태그로써 자주 사용되는 것입니다. 즉 자바 빈에서 속성 값을 get 하는 것 입니다. 만약 filter 속성이 “true” 이면 “<” 인 경우 <로 변환 됩니다. 

2013년 8월 3일 토요일

Explain Plan - 오라클힌트, Oracle Hint-실행계획 SQL연산(INLIST ITERATOR)

실행계획 SQL연산(INLIST ITERATOR)

구로디지털 오엔제이프로그래밍실무교육센터


인덱스 컬럼이 IN-LIST구에 나타나는 경우의 ROW 연산 입니다. INLIST ITERATOR는 IN-LIST의 인수 만큼 반복연산을 수행 합니다.

SQL> desc emptest;
 이름                                      널?      유형
 ------------------ -------- --------------------------
 EMPNO                                              NUMBER
 DEPTNO                                             NUMBER
 ENAME                                              VARCHAR2(46)
 ADDR                                               VARCHAR2(44)
 SAL                                                NUMBER

SQL> select count(*)  from emptest;

  COUNT(*)
----------
   2500000

SQL> select index_name, table_name from user_indexes 
where table_name like 'EMPTEST';

INDEX_NAME                     TABLE_NAME                     
------------------------------ ------------------------------
IDX_EMPTEST_ADDR               EMPTEST                      
IDX_EMPTEST_DEPTNO             EMPTEST

ADDR 컬럼으로 인덱스가 있다. Addr 컬럼을 이용해 보자.

SQL> select empno, ename
  2  from emptest
  3  where addr in ('서울1','서울10001');

     EMPNO ENAME
---------- ----------------------------------------------
         1 홍길동1
     10001 홍길동10001

경   과: 00:00:00.00

Execution Plan
----------------------------------------------------------
|   0 | SELECT STATEMENT
|   1 |  INLIST ITERATOR            
|   2 |   TABLE ACCESS BY INDEX ROWID| EMPTEST
|*  3 |    INDEX RANGE SCAN          | IDX_EMPTEST_ADDR

위의 는 INLIST ITERATOR를 나타내게 하기 위해 넣은 힌트 구문이며 힌트 구문을 사용하지 않는 다면 아래와 같은 실행 계획이 수립됩니다.


SQL> select  empno, ename
  2  from emptest
  3  where addr in ('서울1','서울10003');

     EMPNO ENAME
---------- ----------------------------------------------
         1 홍길동1
     10003 홍길동10003

경   과: 00:00:00.00


--------------------------------------------------------------------
|   0 | SELECT STATEMENT
|   1 |  INLIST ITERATOR            
|   2 |   TABLE ACCESS BY INDEX ROWID| EMPTEST
|*  3 |    INDEX RANGE SCAN          | IDX_EMPTEST_ADDR |  

2013년 8월 2일 금요일

Java Template Method 패턴 예제 , java design pattern

Java Template Method 패턴 예제   


Template Method Pattern
 

오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의) 
www.onjprogramming.co.kr

상위클래스 쪽에 템플릿이 되는 메소드가 정의되어 있고 , 그 메소드의 정의내에는 추상메소드가 사용되너 상위클래스만 보면 추상메소드가 어떤식으로 호출되는지 알수있지만 최종적으로 어떤 처리를 하는지 모른다.
 하위클래스에서 어떠한 처리를 하는지에 관계없이 큰 틀은 상위클래스가 결정한데로 처리된다. 실제로 어떤일을 하는지는 하위클래스의 구현된 내용을 봐야 한다.
 상위클래스의 템플릿 메소드에 알고리즘이 기술되어 있으므로 하위클래스에서는 알고리즘을 일일이 기술할 필요가 없다. (개개의 하위클래스에 일일이 알고리즘을 기술한다면 수정사항이 발생되면 일일이 개별 하위클래스를 수정해야 한다.)


// AbstractDisplay.java
public abstract class AbstractDisplay { 
    public abstract void open();       
    public abstract void print();       
    public abstract void close();       
    public final void display() {     
        open();                           
        for (int i = 0; i < 5; i++) {     
            print();                   
        }
        close();                           
    }
}

// GreetingDisplay.java
public class GreetingDisplay extends AbstractDisplay { 
    private String s;                               
    public GreetingDisplay(String s) {    this.s =s;              }
    public void open() {                         
        System.out.println("hello " + s);                 
    }
    public void print() {                           
        System.out.println("your name is " + s);                     
    }
    public void close() {                         
        System.out.println("bye~ " + s);               
    }
}
// StringDisplay.java
public class StringDisplay extends AbstractDisplay {   
    private String string;                             
    private int width;                                 
    public StringDisplay(String string) {             
        this.string = string;                         
        this.width = string.getBytes().length;         
    }
    public void open() {    printLine();    }
    public void print() {  System.out.println("|" + string + "|");    }
    public void close() {  printLine();      }
    private void printLine() {                   
        System.out.print("+");                   
        for (int i = 0; i < width; i++) {  System.out.print("-");      }
        System.out.println("+");               
    }
}
// Main.java
public class Main {
    public static void main(String[] args) {
        AbstractDisplay d1 = new GreetingDisplay("이종철");                 
        AbstractDisplay d2 = new StringDisplay("Hello, world.");   
        AbstractDisplay d3 = new StringDisplay("안녕하세요~");   
        d1.display();                                               
        d2.display();                                               
        d3.display();                                               
    }
}