StringManager 와 단일 모드

7252 단어 디자인 모드
tomcat 소스 코드 에는 org. apache. catalina. util. StringManager 가 있 습 니 다. 기본적으로 모든 tomcat 구성 요소 (예 를 들 어 connector, container, realm, loader, logger 등) 가 사 용 됩 니 다.이것 은 이상 한 메 시 지 를 관리 하 는 helper class 입 니 다.
 
    tomcat 와 같은 Servlet 용기, 이상 메 시 지 는 시스템 관리자 나 프로그래머 에 게 매우 중요 합 니 다.관리 자 는 이상 한 메 시 지 를 통 해 오 류 를 빠르게 찾 을 수 있 습 니 다.프로그램 이상 에 대해 tomcat 는 이상 메 시 지 를 ServletException 에 봉 하여 프로그래머 Servlet 의 오 류 를 알 립 니 다.
 
    Tomcat 은 이러한 이상 한 소식 을 어떻게 관리 합 니까?첫 번 째 로 제외 해 야 할 것 은 하 드 인 코딩 이 코드 에 있다 는 것 이다.이것 은 매우 규범 에 맞지 않 는 방법 으로 매번 메 시 지 를 편집 할 때마다 코드 를 다시 컴 파일 해 야 하기 때문에 매우 번거롭다.Tomcat 은 이 메 시 지 를 properties 파일 에 저장 하여 편집 하기 편리 합 니 다.또한 자바 의 ResourceBundle 류 를 이용 하여 국제 화 를 편리 하 게 실현 할 수 있 습 니 다. tomcat 는 매우 광범 위 한 Servlet 용 기 를 사용 하 는 것 을 알 아야 합 니 다.그러나 tomcat 의 핵심 가방 은 수백 가지 가 있 습 니 다. 이러한 종류의 이상 한 정 보 를 properties 파일 에 저장 하면 유지 보수 에 악몽 을 가 져 올 수 있 습 니 다.
 
    Tomcat 의 방법 은 하나의 패키지 가 하나의 properties 파일 을 공유 하 는 것 입 니 다. 만약 여러분 의 기계 에 tomcat 가 설치 되 어 있다 면% TOMCAT 를 열 수 있 습 니 다.HOME% / server / lib 의 catalina. jar (tomcat 의 가장 핵심 적 인 가방, catalina 는 tomcat 의 코드) 를 보면 기본적으로 모든 가방 에 LocalString. properties 파일 이 들 어 있 는 것 을 발견 할 수 있 습 니 다. 예 를 들 어 org. apache. core 는 바로 이 파일 들 로 tomcat 에 필요 한 이상 정 보 를 저장 합 니 다.
 
    StringManager 는 이러한 이상 한 메 시 지 를 처리 하기 위 한 helper class 입 니 다. 가방 의 어떤 종류 가 이상 한 메 시 지 를 사용 해 야 할 때 StringManager 를 예화 한 다음 getString (String key) 방법 을 호출 할 수 있 습 니 다.
 
예 를 들 어 sm. getString ("httpConnector. alreadyInitialized"),
위의 문 구 는 "HTTP connector has already been initialized" 를 되 돌려 줍 니 다.
만약 당신 에 게 LocalStrings 가 있다 면CN. properties 파일 은 해당 중국어 메 시 지 를 되 돌려 줍 니 다.
 
    그러나 각 클래스 가 하나의 StringManager 대상 을 실례 화하 면 이 대상 에 포 함 된 이상 한 메시지 가 똑 같 고 자원 의 낭 비 를 가 져 올 수 있 습 니 다.모든 가방 의 클래스 가 하나의 StringManager 대상 을 공유 하면 효율 이 크게 향상 된다.그 걸 어떻게 해?여기까지 읽 으 면 디자인 패턴 을 잘 아 시 는 분 들 은 다 생각 하 실 거 라 고 믿 습 니 다.  맞 아, 바로 단일 모드 야.
   
일례
         단일 모드 는 대상 의 생 성 모드 로 하나의 인 스 턴 스 만 있 고 자체 적 으로 예화 되 어 전체 시스템 에 이 인 스 턴 스 를 제공 합 니 다.
 
/**
 *     
 * @author linhai
 */
public class Singleton {
	
	//         
	private static Singleton instance;
	
	//       
	private Singleton(){}
	
	//          
	public static Singleton getInstance()
	{
		if(instance==null)
		{
			instance=new Singleton();
		}
		return instance;
	}

}

 
 
 
    위의 코드 는 바로 단일 모드 의 전형 적 인 예제 이다.단일 사례 의 요점 은 두 가지 가 있 습 니 다. 하 나 는 민영화 구조 함수 입 니 다. 그러면 다른 종 류 는 실행 할 수 없습니다. 단일 사례 를 보장 합 니 다. 두 번 째 는 정적 인 공장 방법 을 제공 하고 자신의 인 스 턴 스 를 되 돌려 클 라 이언 트 를 호출 하 는 것 입 니 다. Singleton instance = Singleton. getInstance ().
 
 
  
 
 
 
StringManager
         단일 모드 를 알 게 되 었 습 니 다. 가방 하 나 를 실현 하려 면 StringManager 대상 만 있 으 면 간단 합 니 다. 하나의 Map (tomcat 는 HashTable) 을 사용 하여 가방 이름 을 key 로 하고 StringManager 인 스 턴 스 를 value 로 할 수 있 습 니 다.
 
package com.scnulh.catalina.util;

import java.text.MessageFormat;
import java.util.HashMap;
import java.util.Map;
import java.util.MissingResourceException;
import java.util.ResourceBundle;

public class StringManager {
	
	/**
	 * ResourceBundle  ,    tomcat         
	 */
	private ResourceBundle bundle;
	
	/**
	 *   StringManager   Map,    key,value StringManager  
	 */
	private static Map<String, StringManager> stringManagers=
		new HashMap<String, StringManager>();
	
	/**
	 *         
	 * @param packageName    
	 */
	private StringManager(String packageName)
	{
		//   LocalStrings,                LocalStrings     
		String baseName=packageName+".LocalStrings";
		//    ,      
		bundle=ResourceBundle.getBundle(baseName);
	}
	
	/**
	 *   StringManager       ,              
	 *     	
	 * @param packageName    
	 * @return
	 */
	public synchronized static StringManager getStringManager(String packageName)
	{
		//  map   
		StringManager stringManager=stringManagers.get(packageName);
		
		//      StringManager    ,    ,    Map   
		if(stringManager==null)
		{
			stringManager=new StringManager(packageName);
			stringManagers.put(packageName, stringManager);
		}
		return stringManager;
	}
	
	
	//============   StringManager           ===========
	public String getString(String key)
	{
		//        
		if(key==null)
		{
			String msg="key is null";
			throw new NullPointerException(msg);
		}
		String result=null;
		try
		{
			result=bundle.getString(key);
		}
		catch(MissingResourceException e)
		{
			result="can not find message with the key "+key;
		}
		
		return result;
	}
	
	public String getString(String key,Object[] args)
	{
		String result=null;
		String initMessage=getString(key);
		
		try
		{
			Object[] notNullArgs=args;
			for(int i=0;i<args.length;i++)
			{
				if(args[i]==null)
				{
					if(notNullArgs==args)
						notNullArgs=(Object[])args.clone();
					args[i]="null";
				}
			}
			//MessageFormat   
			result=MessageFormat.format(initMessage, notNullArgs);
		}
		//             
		//                iae.printStackTrace(); 
		catch(IllegalArgumentException iae)
		{
			StringBuilder sb=new StringBuilder();
			sb.append(initMessage);
			for (int i = 0; i < args.length; i++) {
                sb.append(" arg[" + i + "]=" + args[i]);
            }
			result=sb.toString();
			
		}
		return result;
	}
	//        ,        
	public String getString(String key,Object arg)
	{
		Object[] args=new Object[]{arg};
		return getString(key, args);
	}
	
	public String getString(String key,Object arg1,Object arg2)
	{
		Object[] args=new Object[]{arg1,arg2};
		return getString(key, args);
	}
	public String getString(String key,Object arg1,Object arg2,
			Object arg3)
	{
		Object[] args=new Object[]{arg1,arg2,arg3};
		return getString(key, args);
	}
	public String getString(String key,Object arg1,Object arg2,
			Object arg3,Object arg4)
	{
		Object[] args=new Object[]{arg1,arg2,arg3,arg4};
		return getString(key, args);
	}
	
	public static void main(String[] args)
	{
		StringManager stringManager=
			StringManager.getStringManager("ex03.pyrmont.connector.http");
		String string=stringManager.getString("httpConnector.alreadyInitialized");	
		
		System.out.println(string);
		
		string=stringManager.getString("httpConnector.anAddress", "192.165.23.26",12);
		System.out.println(string);

	}

}

 

좋은 웹페이지 즐겨찾기