WebObjects/Web 應用程式/開發/自定義資源管理器
外觀
以下是一個關於如何編寫自己的 WOResourceManager 的簡單示例
需要實現的主要方法是 urlForResourceNamed() 和 bytesForResourceNamed()。
- urlForResourceNamed 簡單地從您想要的任何地方(例如 jar 檔案)為資源構建一個 URL。不幸的是,urlForResourceNamed 使用 pathForResourceNamed,因此您也需要重寫它
private URL urlForResourceNamed(String aResourceName)
{
return this.getClass().getResource( aResourceName );
}
public String pathForResourceNamed(String aResourceName, String aFrameworkName, NSArray someLanguages)
{
URL anURL = this.urlForResourceNamed( aResourceName );
if ( anURL != null )
{
return anURL.toExternalForm();
}
return null;
}
public String urlForResourceNamed(String aResourceName, String aFrameworkName, NSArray someLanguages, WORequest aRequest)
{
String anURL = super.urlForResourceNamed( aResourceName, aFrameworkName, someLanguages, aRequest );
this.bytesForResourceNamed( aResourceName, aFrameworkName, someLanguages );
return anURL;
}
- bytesForResourceNamed 簡單地從您想要的任何地方(例如 jar 檔案)檢索資源
public InputStream inputStreamForResourceNamed(String aResourceName, String aFrameworkName, NSArray someLanguages)
{
return this.getClass().getResourceAsStream( aResourceName );
}
public byte[] bytesForResourceNamed(String aResourceName, String aFrameworkName, NSArray someLanguages)
{
if ( aResourceName != null )
{
URL anURL = this.urlForResourceNamed( aResourceName );
if ( anURL != null )
{
String aKey = anURL.toString();
WOURLValuedElementData anElement = (WOURLValuedElementData) _cache.get( aKey );
if ( anElement == null )
{
synchronized( this )
{
InputStream anInputStream = this.inputStreamForResourceNamed( aResourceName, null, null );
if ( anInputStream != null )
{
try
{
InputStream aBufferStream = new BufferedInputStream( anInputStream );
byte[] someBytes = new byte[ aBufferStream.available() ];
aBufferStream.read( someBytes );
aBufferStream.close();
anInputStream.close();
{
Data someData = new Data( someBytes );
String aType = this.contentTypeForResourceNamed( aKey );
anElement = new WOURLValuedElementData( someData, aType, aKey );
_cache.put( aKey, anElement );
}
}
catch(Exception anException)
{
SZLog.warning( anException );
}
}
}
}
return ( (Data) anElement.data() ).bytesNoCopy();
}
SZLog.debug( "Null url for resource named '" + aResourceName + "'." );
return null;
}
throw new IllegalArgumentException ( "ResourceManager.bytesForResourceNamed: null resource name." );
}
- 最後但並非最不重要的是,您需要處理那些古怪的 WOURLValuedElementData,這樣 dataForResourceNamed 才能正常工作
public NSData dataForResourceNamed(String aResourceName)
{
this.bytesForResourceNamed( aResourceName, null, null );
String aKey = this.urlForResourceNamed( aResourceName ).toString();
WOURLValuedElementData anElement = (WOURLValuedElementData) _cache.get( aKey );
return anElement.data();
}
- 最後,您需要將您的資源管理器註冊到 WOApplication
anApplication.setResourceManager( new ResourceManager() );
語言和框架的處理留給讀者作為練習。