레이블이 다중 애플리케이션인 게시물을 표시합니다. 모든 게시물 표시
레이블이 다중 애플리케이션인 게시물을 표시합니다. 모든 게시물 표시

2013년 11월 5일 화요일

[닷넷4.0,ADO.NET강좌, .NET4.X, C#4.X]ADO.NET 개요, 소개, 특징 ADO.NET 개요, 소개

[닷넷4.0,ADO.NET강좌, .NET4.X, C#4.X]ADO.NET 개요, 소개, 특징   ADO.NET 개요, 소개  
 
ADO.NET 개요, 소개
 
ADO.NET은 .NET Framework 프로그래머에게 데이터 액세스 서비스를 제공하는 클래스 집합이다.  분산된 데이터 공유 응용 프로그램을 만들기 위한 다양한 구성 요소를 제공하고 또한 관계형, XML 및 응용 프로그램 데이터에 대한 액세스를 제공하는 .NET Framework의 핵심 부분이다.
 
ADO.Net은 Microsoft Accss와 SQL Server, Oracle 과 같은 관계 형 데이터베이스 뿐 아니라 비 관계형 데이터 원본도 조작이 가능한데 ADO.Net은 .Net Framework 안에 통합 되어 있으며 .NET 언어들(특히 C#)과 같이 쓰이도록 설계 되었다.
 
 기존의 ADO와 비교해 볼 때 ADO.Net은 확장성과 상호 운영성이 개선된 ADO 인데 ADO가 연결 지향형인데 반해 ADO.Net의 경우 비 연결성 데이터 집합을 처리 하도록 설계 되었습니다. 연결이 끊어진 레코드 집합은 응용 프로그램에만 도움이 되는데 이는 데이터를 로컬 상태에서 보다 빠르게 처리하고 전송 할 수 있기 때문이다. 또한 ADO.Net은 XML을 보편적인 데이터 전송 형식으로 사용하고 있다.
 
 ADO.Net은 System.Data.dll 어셈블리 안에 들어 있는데 ADO.Net의 모든 클래스들이 System.Data.dll  안에 들어 있으므로 결국 System.Data.dll 자체가 곧 ADO.Net 이라고 할 수 있다.
 
 그럼 왜 이름을 System.Data 라고 하지 않고 ADO.Net이라고 했을까?  ADO.Net이라는 이름은 ADO(ActiveX Data Object)로부터 따온 것이다. MS는 .NET 환경에서 권장 되는 데이터 액세스 인터페이스 임을 나타내기 위해 ADO.Net 이라고 명명 한 것이다.
 
.NET Framework에서의 클래스 라이브러리(Class Library)들을 굳이 다시 크게 나누어, Base Class Library와 그 외의 클래스 라이브러리(Class Library)로 구분하자면, Base Class Library(BCL)에는 Collections나 IO등과 같은 프로그래밍에 있어서의 좀 더 근원적인 알고리즘(Algorithm)과 자료구조 및  하드웨어(Hardware)에 보다 근접한 부분에 해당한다고 볼 수 있다. 그 외의 라이브러리들에는 Directory Service, XML Support등과 같은 보다 추상적이고 다양한 종류의 라이브러리를 접할 수 있고 그 중의 하나가 ADO.NET이라고 불리는 데이터(Data) 관련 클래스 라이브러리(Class Library) 이다. 

2013년 10월 24일 목요일

[닷넷,C#4.0강좌]C# 델리게이트 Action Delegate Action 델리게이트는 Func 델리게이트와 거의 유사하다. 차이점이라면...

[닷넷,C#4.0강좌]C# 델리게이트 Action Delegate 

Action 델리게이트는 Func 델리게이트와 거의 유사하다. 차이점이라면 반환 형식이 없다는 것이다. 이 Action 델리리게이트 역시 닷넷4.0 프레임워크에는 대략 17가지 준비되어 있다.
 
public delegate TResult Action< >()
public delegate TResult Func<in T >(T arg)
public delegate TResult Func<int T1, in T2>(T1 arg, T2 arg)
public delegate TResult Func<int T1, in T2, in T3 >(T1 arg, T2 arg, T3 arg)
……
……
public delegate TResult Func<in T1,,,in T16>(T1 arg, T2 arg, T3 arg,,, T16 arg)
Func 델리게이트와는 반환값이 없는 것이 특징이며 형식 매개변수는 모두 입력 매개변수 이다.
 
[사용 예문]
 
입력 매개 변수가 없는 경우…
 
Action action1 = () => Console.WriteLine(“No Parameter Action Delegate”);
action1();
 
입력 매개 변수가 두개인 경우…
 
int sum=0;
 
//입력 매개변수는 둘, 더한 결과를 밖에서 선언한 sum에 저장
Action<int, int> action2 = (x, y) => sum=x*y;
action2(1,2); 
Console.WriteLine(“1+2={0}”, sum);      //9 리턴
 

[예제]
 
using System;
namespace Lambda
{
    class Program
    {
        delegate int Sum(int[] arg);
        static void Main(string[] args)
        {
            Action action1 = () => Console.WriteLine("No Parameter Action Delegate");
            action1();
            int ret = 0;
            Action<int> action2 = (x) => ret = x * x;
            action2(3);
            Console.WriteLine("action2(3), 3*3={0}", ret);
            Action<double, double> action3 = (x, y) =>
            {
                double d = x / y;
                Console.WriteLine("Action<t1, t2>({0},{1}) : {2}", x, y, d);
            };
            action3(8, 4);
        }
    }
}
 

[결과]
No Parameter Action Delegate
action2(3), 3*3=9
Action<t1, t2>(8,4) : 2

2013년 10월 12일 토요일

22. 스프링3.X 게시판(Spring AOP적용, DAO단 DML문 실행시 로깅, 스프링 충고 spring advice) Spring Framework3.2 게시판 2단계 : 지금까지 구현한 게시판의 기본 기능에 Spring AOP를 적용하여 충고(Advice)를 적용하자.

22. 스프링3.X 게시판(Spring AOP적용, DAO단 DML문 실행시 로깅, 스프링 충고 spring advice)
 
Spring Framework3.2 게시판 2단계 : 지금까지 구현한 게시판의 기본 기능에 Spring AOP를 적용하여 충고(Advice)를 적용하자.

onj.board.dao.SpringBoardDAO.java의 insert, update, delete등 DML문장 실행시 로그를 남기기 위해 ...

1. 로깅을 위해 Oracle Table 만들자.

SQL> create table boardlog (
          methof varchar2(50),
   sql varchar2(1000),
   ilsi date);
 
2. Spring AOP용 Aspect(Pointcut + advice)를 만들자.(LogginAspect.java)
 
package onj.board.aop;
 
import onj.board.dao.BoardDAO;
import onj.board.dao.LoggingDAO;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.AfterReturning;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
 
@Aspect
public class LoggingAspect {
 @Autowired
 private LoggingDAO loggingDAO;
 
 @Autowired
 private BoardDAO boardDAO;
 // 사후충고(반드시 정상 리턴 후 호출)
 // SpringBoardDAO의 모든메소드중 파라미터가 1개 있는 메소드가 충고받을 포인트컷
 // 본 게시판에는 리스트보기와 , getSql() 만 메소드 파라미터가 없어 충고 적용 안됨
 @AfterReturning(pointcut="execution(* onj.board.dao.SpringBoardDAO.*(*))", returning="result")
 public void logAfterReturning(JoinPoint joinPoint) {
System.out.println("<<<<<<<<< DAO 로깅 충고 실행");  
  loggingDAO.writeLog(joinPoint.getSignature().getName(), boardDAO.getSql());  
 }
}

3. 로그를 DB에 넣을 DAO단 클래스 제작. LoggingDAO.java

package onj.board.dao;
 
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
@Component("loggingDAO")
public class LoggingDAO {
 private JdbcTemplate jdbcTemplate;
 @Autowired
 private DataSource dataSource;
 public JdbcTemplate getTemplate() {
  if (jdbcTemplate == null) {
   this.jdbcTemplate = new JdbcTemplate(dataSource);
  }
  return jdbcTemplate;
 }
 // DAO단 쿼리 로깅
 public int writeLog(String mehtodName, String dml)
   throws DataAccessException {
  //로그용 테이블에 로그 저장
  String sql = "insert into boardlog(method, sql, ilsi) values (? , ? ,sysdate) ";
  
  Object[] obj = { mehtodName, dml };
  return getTemplate().update(sql, obj);
 }
}
 

4. boardConfig.xml에 aspect 추가
 <aop:aspectj-autoproxy/>
 <context:component-scan base-package="onj.board.dao"/>
 <context:component-scan base-package="onj.board.service"/> 
 
 <bean id="myLogger" class="onj.board.aop.LoggingAspect" />
 
</beans> 

5. [결과확인]
 
10월 09, 2013 2:13:52 오후 org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["ajp-bio-8009"]
10월 09, 2013 2:13:52 오후 org.apache.catalina.startup.Catalina start
INFO: Server startup in 3491 ms
<<<<<<<<< DAO 로깅 충고 실행
<<<<<<<<< DAO 로깅 충고 실행
<<<<<<<<< DAO 로깅 충고 실행
<<<<<<<<< DAO 로깅 충고 실행
<<<<<<<<< DAO 로깅 충고 실행
<<<<<<<<< DAO 로깅 충고 실행
<<<<<<<<< DAO 로깅 충고 실행
<<<<<<<<< DAO 로깅 충고 실행
<<<<<<<<< DAO 로깅 충고 실행
<<<<<<<<< DAO 로깅 충고 실행

boardlog 테이블을 select 해보라!!

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

[개강확정강좌]오라클자바커뮤니티에서 운영하는 개발자 전문교육 ,개인80%환급(www.onjprogramming.co.kr)






2013년 9월 9일 월요일

자바FTP,자바교육,자바강좌,오엔제이프로그래밍,자바로 만든 FTP 클라이언트(파일업로드예)

자바FTP,자바교육,자바강좌,오엔제이프로그래밍,자바로 만든 FTP 클라이언트(파일업로드예)


FTP를 위한 컴포넌트는 http://www.savarese.org/downloads/NetComponents/ 에서 다운 받으시구요...

/**------------------------------------------------------------------------------------
  * 시스템명 : FTP Client
  * 작 성 자 :
  * 수 정 자 : 이종철(오엔제이프로그래밍실무교육센터,오라클자바커뮤니티)
  * 파 일 명 : OracleJavaFtpClient.java
  * 버    전 : 1.3
  * 개    요 :파일을 FTP서버의 Log 폴더에 저장한다.
   *-----------------------------------------------------------------------------------*/


package new_OracleJava.util;

import java.io.*;
import new_OracleJava.engine.OracleJavaConfig;
import com.oroinc.net.ftp.*;


public class OracleJavaFtpClient{
    static String server = "xxx.xxx.xxx.xxx";
    static int port = 21;
    public static String id = "id"
    public static String password = "pwd"
   
    FTPClient ftpClient = null;

    public OracleJavaFtpClient() {     
            ftpClient = new FTPClient();
    }

    public void sendFile() {
           
            try {                                                 
                    boolean res = false;
            String MyFile = "/use/local/logs/a.log";         
               
            File f = new File(MyFile);

            BufferedInputStream bi = new BufferedInputStream(new FileInputStream(f.getPath()));
            ftpClient.setFileType(FTP.BINARY_FILE_TYPE); 
           
            //FTP 서버의 폴더...
            ftpClient.changeWorkingDirectory("/ftpserver/usr/local");
           
            if (bi != null) {
              res = ftpClient.storeFile(OracleJavaConfig.libSystemChkFileName, bi);
            }         
            else {
                    System.out.println("FileStrema 생성 오류!!!");
            }
           
            bi.close();
                       
            //ftpClient.storeFile(OracleJavaConfig.libWAS2FTPPath, new FileInputStream(new File(MyFile)));
            if (res) {
                    Log.println("OracleJavaSystemChkThread", "FTP 전송 OK~~~");
                    System.out.println("FTP 전송 OK~~~");
            }
            else {
                    Log.println("OracleJavaSystemChkThread", "FTP 전송 실패~~~");
                    System.out.println("FTP 전송 실패~~~");
            }
                //ftp.logout();
                //ftp.disconnect(); 
                //ftp = null;
            }
            catch(Exception e) {
                Log.println("OracleJavaSystemChkThread", "*******************************************************************************");
          Log.println("OracleJavaSystemChkThread", "******************************** Exception FTP Send****************************");
          Log.println("OracleJavaSystemChkThread", "*******************************************************************************");
          Log.println("OracleJavaSystemChkThread", e.toString() + "\n");
            }
    }

    // 계정과 패스워드로 로그인
    public boolean login(String user, String password) {
        try {
            //this.connect();
            return ftpClient.login(user, password);
        }
        catch (IOException ioe) {
            ioe.printStackTrace();
        }
        return false;
    }

    // 서버로부터 로그아웃
    public boolean logout() {
        try {
            return ftpClient.logout();
        }
        catch (IOException ioe) {
            ioe.printStackTrace();
        }
        return false;
    }

    // 서버로 연결
    public void connect() {
        try {
           
            ftpClient.connect(server, port);           
            int reply;
            // 연결 시도후, 성공했는지 응답 코드 확인
            reply = ftpClient.getReplyCode();
       
            if(!FTPReply.isPositiveCompletion(reply)) {
                ftpClient.disconnect();               
                Log.println("OracleJavaSystemChkThread", "*************************************************");
                Log.println("OracleJavaSystemChkThread", "서버로부터 연결을 거부당했습니다\n");
                Log.println("OracleJavaSystemChkThread", "************************************************");
                System.exit(1);
            }
        }
        catch (IOException ioe) {
            if(ftpClient.isConnected()) {
                try {
                    ftpClient.disconnect();
                } catch(IOException f) {
                    //
                }
            }
            Log.println("OracleJavaSystemChkThread", "*************************************************");
            Log.println("OracleJavaSystemChkThread", "서버 연결 불가!!\n");
            Log.println("OracleJavaSystemChkThread", "************************************************");           
        }

// FTP의 ls 명령, 모든 파일 리스트를 가져온다
    public FTPFile[] list() {
        FTPFile[] files = null;
        try {
            files = this.ftpClient.listFiles();
            return files;
        }
        catch (IOException ioe) {
            ioe.printStackTrace();
        }
        return null;
    }

    // 파일을 전송 받는다
    public File get(String source, String target) {
        OutputStream output = null;
        try {
            File local = new File(source);
            output = new FileOutputStream(local);
        }
        catch (FileNotFoundException fnfe) {
            fnfe.printStackTrace();
        }
        File file = new File(source);
        try {
            if (ftpClient.retrieveFile(source, output)) {
                return file;
            }
        }
        catch (IOException ioe) {
            ioe.printStackTrace();
        }
        return null;
    }


    }

    // 서버로부터 연결을 닫는다
    public void disconnect() {
        try {
            ftpClient.disconnect();
        }
        catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }

}




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

다른 자바 프로그램에서... 다음과 같이 호출하여 이용했습니다.

                OracleJavaFtpClient ftpClient = new OracleJavaFtpClient();               
                ftpClient.connect();
                ftpClient.login(OracleJavaFtpClient.id, OracleJavaFtpClient.password);
                ftpClient.sendFile();
                ftpClient.logout();
                ftpClient.disconnect();



오라클자바커뮤니티 실전 개발 교육 - 개인80% 환급

Spring3.X, MyBatis, Hibernate실무과정

강좌명 Spring3.X, MyBatis, Hibernate실무과정(평일야간)
오라클자바커뮤니티(www.oraclejavanew.kr) 추천 실전강좌
교재 자체교재 or PDF 파일 제공
강좌 일정 09월12일(목) ~ 10월04일(금)((평일야간) 19:00~22:00, 12일) 총 36시간
강의 장소 [C강의장]구로디지털단지역2번 출구-> 미니스톱끼고 우회전 -> 100m 직진 후 골목길 끝에서 이마트방향 우회전 -> 50m 직진 후 우체국 옆골목으로 길건너서 직진 -> 150미터 직진 후 JnK 타워에서 우회전 -> 50미터 직진 후 우측에 코오롱빌란트2차 803호 (구로구 구로3동 222-8 코오롱디지털타워 빌란트2차 803호)
[약도보기]
수강절차 - 강좌내용 확인
- 전화 또는 홈페이지(www.onjprogramming.co.kr)를 통한 수강지원 및 수강료 결제(무통장입금, 온라인 카드결제)
- 고용보험 가입자(재직자)인 경우 고용보험환급 관련 서류 제출
- 수강전 : 커리큘럼 및 장소에 대해 다시 한번 공지
- 교육 전 설문 작성(간단한 개발 경력, 수강 목적, 강좌진행방식 등)
- 강좌 수강
- 수강후 : 교육 후 설문 작성
수강료 - 590,000원
[고용주환급]대기업:14만원 전후, 중소기업:187,047 원환급

[개인수강지원(개인환급)]정규직 472,000 ,비정규직:전액환급
대기업(상시근로자 300인 이상 대기업)은 개인환급 불가합니다.

재직자 내일배움카드 : 정부지원금 80% 자기부담금 20%
(구 능력개발카드 명칭이 내일배움카드로 변경 / 연간 총한도 200만원)


* 휴강 :법정공휴일
수강료
입금안내
- 온/오프라인 카드결제, 계좌이체(수강안내->입금안내 참조)
문의사항 02-851-4790 번으로 연락 부탁 드립니다.
교육개요 본과정은 자바 웹개발에서 가장 많이 사용되고 있는 자바기반 프레임워크인 Spring3.2를 학습하는데 스프링이 왜 도입되어야 하는지부터, 기본모듈구성, 아키텍처 DI, DL, IoC, 최근 개발모델의 핵심인 Spring AOP, AspectJ Annotation, 표현언어인 SpEL, Spring MVC, Spring MVC TEST Framework, Spring WebFlow, Spring JDBC, Spring Transaction등 개발에 필요한 부분을 체계적으로 실습을 통해 학습하며 SQLMapper인 MyBatis, Hibernate 까지 학습하는 Spring 최고의 교육 입니다.

[특징]
- 실무/실습에 근거한 이론 취득
- 단기간에 스프링 개발자로 양성
- 문답씩 수업으로 수강 효과 극대화
- 이론/실습 과제로 인한 개발력 UP
교육목표 - Spring의 도입배경 및 아키텍처에 대해 이해한다.
(자바빈의 태동부터 EJB, 그리고 현재까지)
- Eclipse, Maven, STS 플러그인에 대한 이해
(개발환경 설정의 이해)
- Spring IoC(DI, DL)의 이해
(실습을 통한 setter,getter,constructor injection의 이해)
- Spring AOP의 이해
(실습을 통한 Spring AOP의 이해, AOP어렵지 않습니다)
- AspectJ Annotation에 대한 이해
(Spring의 AspectJ 지원 및 Annotation 대한 이해 by 실습)
- Spring Web MVC, JDBC의 이해
(실습을 통한 Spring MVC, JDBC의 이해)
- Spring Controller에 대한 이해
(간단한 Controller의 구현을 통한 MVC Font Contrller의 이해)
- Spring Web Flow에 대한 이해
(실습을 통한 Spring Web Flow 및 JSF에 대한 이해)
- SpEL에 대한 이해
(실습을 통한 Spring SpEL의 이해)
- Servlet3 비동기 요청에 대해 이해한다.
(실습을 통한 비동기 서블릿에 대한 이해)
- MyBatis Mapper에 대해 이해한다.
(실습을 통한 MyBatis 구성, 작동원리 이해)
- Hibernate Mapper에 대해 이해한다.
(실습을 통한 Hibernate 구성, 작동원리 이해)
- 실무 개발 환경에 적응력 UP
(Spring, MyBATIS 기반 게시판 작성)
교육대상 - JAVA, JSP 개발자
- 자바개발은 오래 했지만 프레임워크에 대해 자신이 없는 개발자
- 단기간에 스프링을 박살 내고 싶은 개발자.
(스프링 혼자 공부하기는 어렵습니다!!)
선수학습 - JAVA, JSP
 

Spring3.2 J2EE Framework에 대한 흐름과 Spring Framework에 대한 이해
개발 환경 설정(Eclipse4.3 KEPLER, Tomcat7, Spring3.2 다운로드 및 설치)
Maven, STS 플러그인 설치
Spring IoC
DL(Dependency LookUp) &DI(Dependency Injection)
Dependency Pull, CDL(Contaxtualized Lookup)
Setter/Constructor/Mathod Injection
Spring 설정
Spring AOP 란 ?Code, Advice, JoinPoint, PointCut, Aspect, WeavingProxyFactoryBean
Annotation기반 AOP(AspectJ)
기타 Spring의 선언적 AOP 선언
Spring JDBC
Spring MVC
Spring Controller
Spring Webflow, JSF
Spring 표현언어 SpEL
Servlet3 비동기 요청처리
Spring3.2 Transaction 관리
Spring MVC TEST Framework
MyBatis/hibernate [MyBatis]
개요 및 소개
개발환경 설정 및 설치
Data Mapper란
sqlMapConfig 이해 및 환경설정
Spring, MyBatis 연동
SQL Map XML File 이해
SqlMapClient 이해
SQL의 실행(Insert/update/delete) 이해와 실습
고급 쿼리 사용방법의 이해와 실습
Spring MyBatis 응용예제 작성

[Hibernate]
Hibernate 소개
SessionFactory 설정
1:1, 1:다 매핑
Session Interface
Hibernate DML
Spring, Hibernate 예제 프로그램 작성

2013년 8월 6일 화요일

다중 애플리케이션(Struts Multi-Application)

다중 애플리케이션(Multi-Application)


오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의)   
 스트럿츠 1.1이상에서는 다중 애플리케이션 사용이 가능 합니다.

애플리케이션의 모듈이 동일한 웹애플리케이션의 일부 이지만 서로 독립적입니다.

다중 애플리케이션을 사용하는 이유는 업무를 좀 더 조직화, 세분화 할 수 있다는 장점이 있습니다.

쇼핑몰을 개발하는데 상품의 디스플레이 부분과 쇼핑카트를 구현 하는 부분을 별도의 다중 애플리케이션으로 구성 하는 것이 가능 합니다. 이렇게 하는 이유는 상호 독립적이고 수평적인 개발이 가능하도록 하기 위해서 입니다.


기본 애플리케이션이 아닌 모듈은 config/ 로 시작 합니다.

config/ 다음에 오는 부분은 애플리케이션 모듈의 접두어가 되며 프레임웍 전반을 걸쳐클라이언트의 요청을 처리하는데 사용 됩니다.

아래에 간략히 방법을 설명 하고 예제를 만들어 보도록 합니다.
(이클립스에서 톰캣 애플리테이션으로 Login이라는 프로젝트를 작성 후… 별도의 test라는 독립된 애플리케이션을 만들려고 합니다.)

1.        웹 애플리테이션의 web.xml 파일에 다중 애플리케이션을 위한 설정을 합니다.

<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>config/test</param-name>
                  <param-value>/WEB-INF/struts-test-config.xml</param-value>
          </init-param>
          <load-on-startup>1</load-on-startup>               
        </servlet>


2.        이번에 어떻게 모듈(애플리케이션)을 Switch하는지 알아 봅니다.

두 가지의 큰 방법이 있는데 아래와 같습니다.

-        forward를 이용하는 방법

struts-config.xml에서 test 애플리케이션으로 스위칭을 하기 위해서 forward를 이용합니다.

유심히 볼 부분은 contextRelative가 true가 되어 있다는 것이다. 이 값은 하나의 웹 애플리테이션을 사용 하는 경우에는 false(path 설정 시 기준을 애플리케이션을 기준으로)  이지만 다중 웹 애플리케이션을 사용 하기 위해서는 true(path 설정 시 기준이 context가 기준)로 설정 합니다.

즉 아래에서 test 라는 또 하나의 애플리케이션을 가리킬 때 /test/mysubmit과 같이 컨텍스트를 기준으로 경로를 사용 했습니다. (현재 톰캣 프로젝트를 하나 만들었죠^^ Login 이라는 것을…)

<struts-config>
...
<global-forwards>
<forward name="toModuleB"
contextRelative="true"
path="/test/mysubmit"
redirect="true"/>
...
</global-forwards>

</struts-config>



- org.apache.struts.actions.SwitchAction를 이용하는 방법

<action-mappings>
<action path="/toModule"
type="org.apache.struts.actions.SwitchAction"/>
...
</action-mappings>



이제 예제를 만들어 보도록 하겠습니다. 예제는 개념을 익히기 위해 최대한 간단히 작성 했습니다.


[처리흐름]

Login이라는 톰캣 프로젝트(웹애플리케이션)를 하나 만들고 별도의 독립적인 test라는 애플리케이션을 만들어 struts-config.xml과는 별도로 struts-test-config.xml을 만들어 보겠습니다. (물론 둘은 업무적으로 어떤 연관성을 가지지는 않고 있습니다. 예문에서는 단지 다중 애플리케이션을 설정하고 로딩 하는 것만 살펴 볼테니까요…)

사용자가 /Login/login.jsp를 실행 합니다.

실행 화면은 다음과 같습니다. (간단히 ID와 PASSWORD만 입력 받고 submit 버튼을 누릅니다.)

 

Submit 버튼을 누르면 이 액션을 /toTest라는 path로 넘어갑니다. 이 요청을 우선 Login 애플리케이션에서 받습니다.

<action
                path="/toTest"
                type="login2.toTest"
                validate="false" 
                name="loginForm"             
        />

위와 같이 설정이 되어 있습니다. 그래서 login2.toTest 라는 클래스가 실행을 하겠죠…

toTest.java 에서는 간단히 위에서 설명한 2번 방법대로 forward를 이용하여 test라는 애플리케이션으로 스위칭을 해 버립니다.

public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) {
                               
                //sub application인 test로 버네기 위해 forward 이용
                return (mapping.findForward("toTest"));
               
        }

위에서 return (mapping.findForward("toTest")); 부분의 처리를 위해 당연히 “toTest” 라는 forward가 있어야 겠죠^^

메인 설정 파일인 struts-config.xml에서 아래와 같이 정의하고 있습니다.

<forward name="toTest"
                contextRelative="true"
                path="/test/mysubmit.do"
                redirect="true"/>


이제 제어가 /test/mysubmit.do라는 액션으로 인해 test 라는 애플리케이션으로 넘어 가게 됩니다. 물론 위의 /test/mysubmit.do 는 struts-test-config.xml에서 정의를 하고 있습니다. 그 설정 내용은 다음과 같습니다.

<action-mappings>           
        <!-- 현재의 설정 파일은 struts-test-config.xml 이므로... path에 "/test/mysubmit" 아님을 주의! -->
        <action
                path="/mysubmit"   
                type="login2.Welcome2"   
                validate="false"                 
        />
         
    </action-mappings>


이제는 login2.Welcom2라는 클래스가 실행 되겠죠^^

그 내용은 단순히 result.jsp로 포워딩 시키는 일을 합니다.

요기까지 입니다.

그럼 이젠 전체 소스를 확인 하도록 하죠….

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


-------------------------------
/Login/test/login.jsp
-------------------------------
<%@ page pageEncoding="euc-kr" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<html>
<body>

<html:form action="/toTest" focus="id">
        <table>             
                <tr>                       
                        <th align="right">ID</th>                                             
                        <td><html:text property="id" value=""/></td>
                </tr>
                <tr>
                        <th align="right">PASSWORD</th>                                             
                        <td><html:password property="pwd" redisplay="false"/></td>
                </tr>
                <tr>                     
                        <th></th>
                        <td>
                            <html:submit/>
                            <html:reset/>                             
                        </td>
                </tr>                               
        </table>
</html:form>
</body>
</html>


-------------------------------
/WEB-INF/struts-config.xml
-------------------------------

<?xml version="1.0" encoding="UTF-8"?>
<!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>
     
    <!-- ========== Form Bean Definitions ================================== -->
    <form-beans>
        <form-bean name="loginForm" type="login2.LoginForm">                 
            <form-property name="pwd" type="java.lang.String" />
            <form-property name="id" type="java.lang.String" />           
        </form-bean>           
    </form-beans>
   
 
    <!-- ========== Global Forward Definitions =============================== -->
    <global-forwards>
        <forward name="toTest"
                contextRelative="true"
                path="/test/mysubmit.do"
                redirect="true"/>
    </global-forwards>
   
    <!-- ========== Action Mapping Definitions =============================== -->
    <!-- valiedate를 true라고 함으로써 LoginForm의 validate가 호출 됩니다.            -->
    <action-mappings>           
        <action
                path="/toTest"
                type="login2.toTest"
                validate="false" 
                name="loginForm"             
        />         
    </action-mappings> 
       
</struts-config>



-------------------------------
/WEB-INF/struts-test-config.xml
-------------------------------

<?xml version="1.0" encoding="UTF-8"?>
<!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>
   
    <!-- ========== Global Forward Definitions =============================== -->
    <global-forwards>
        <forward name="success" path="/result.jsp"/>
    </global-forwards>
   
    <action-mappings>           
        <!-- 현재의 설정 파일은 struts-test-config.xml 이므로... path에 "/test/mysubmit" 아님을 주의!  메인 애플리케이션의 foreard에 기술한 /test/mysubmit에 의해 아래의 매핑과 연결됨, 결국 login2.Welcom2가 실행됨-->
        <action
                path="/mysubmit"   
                type="login2.Welcome2"   
                validate="false"                 
        />
         
    </action-mappings>                         
</struts-config>


-------------------------------
/WEB-INF/src/login2/toTest.java
-------------------------------
package login2;

import org.apache.struts.action.Action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;


public class toTest extends Action {       
       
        public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) {
                               
                //sub application인 test로 보내기 위해 forward 이용
                return (mapping.findForward("toTest"));
               
        }
}


-------------------------------
/WEB-INF/src/login2/Welcome2.java
-------------------------------
package login2;

import org.apache.struts.action.Action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import login2.Constants;

public class Welcome2 extends Action {       
       
        public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) {
                               
                //성공적으로 처리 되었음, test 애플리케이션의 result.jsp로 보내버림...                return (mapping.findForward(Constants.SUCCESS));
               
        }
}




-------------------------------
/Login/test/result.jsp
-------------------------------
OK~