Vikings

T3 里的图片显示

例子参考:
T3自带的workbeanch里有
1.ChartService class
2.ChartAsset class
3.IChartProvider的例子代码

思路:
因为在DAO,service里返回的Info对象里已经有图片的属性,
类型是byte[]
所以直接out.write(byte[])获得图片.

题外:
其中,AbstractService相比T4少了Webresponse属性,
不可以直接在IChartProvider里定义 
public void sendDynaAsset(WebResponse response);
然后在实现类里用这句 
OutputStream out = response.getOutputStream(new ContentType("image/jpeg"));
来操作out.write .
T3里都在AbstractService里操作out, service()方法里就有参数ResponseOutputStream output

代码:
1. ChartService
public class ChartService extends AbstractService{

  
public void service(
        IEngineServiceView engine,
        IRequestCycle cycle,
        ResponseOutputStream output)
        
throws ServletException, IOException
    
{

.

  
try
        
{
            IChartProvider provider 
= (IChartProvider) component;

            
byte[] bytes = provider.getImageBytes();

            
//默认规则,page页面里若数据库里没有bytes,则返回null
            if (bytes==null)
                
//显示默认图片
                bytes = drawDefaultImage();         
            
            output.setContentType(
"image/jpeg");

            
// I've seen a few bits of wierdness (including a JVM crash) inside this code.
            
// Hopefully, its a multi-threading problem that can be resolved
            
// by synchronizing.

            
synchronized (this)
            
{
                output.write(bytes);
            }

        }


   }


protected byte[] drawDefaultImage() {
        
int width = 102, height = 126;
        BufferedImage image 
= new BufferedImage(width, height,
                BufferedImage.TYPE_INT_RGB);
        Graphics g 
= image.getGraphics();

        g.setColor(Color.WHITE);
        g.fillRect(
00, width, height);

        g.setColor(Color.RED);
        g.setFont(
new Font("Default", Font.PLAIN, 22));
        g.drawString(
"暂无照片"10, height / 2 - 10);

        
byte buffer[] = null;
        
try {
            ByteArrayOutputStream out 
= new ByteArrayOutputStream();
            ImageIO.write(image, 
"JPEG", out);
            buffer 
= out.toByteArray();
        }
 catch (Exception e) {
            log.info(
"绘制默认图片失败");
        }

        
return buffer;
    }

}


2. ChartAsset
与workbeanch里的CharAsset一样,没有任何增删
public class ChartAsset extends AbstractAsset{
  
private IEngineService _chartService;
  
private IComponent _chartProvider;
 
public ChartAsset(IRequestCycle cycle, IComponent chartProvider)
    
{
        
super(nullnull);
        
        IEngine engine 
= cycle.getEngine();

        _chartService 
= engine.getService(ChartService.SERVICE_NAME);
        _chartProvider 
= chartProvider;
    }


}

3. IChartProvider
Service类回调接口
public interface IChartProvider
{
    
public byte[] getImageBytes();
}


4.Page类
需要实现IChartProvider回调接口的getImageBytes()方法
public abstract SaryPage extends BasePage implements IChartProvider{
 
private IAsset chartImageAsset;

    
public IAsset getChartImageAsset() {
        
if (chartImageAsset == null)
            chartImageAsset 
= new ChartAsset(getRequestCycle(), this);

        
return chartImageAsset;
    }

 
/**
     * This method is invoked by the service (in a seperate request cycle from
     * all the form handling stuff). The {
@link #getChartImageAsset()} method
     * provides an {
@link IAsset} that is handled by the {@link ChartService},
     * and the asset encodes the identity of this page.
     * 
     
*/

    
public byte[] getImageBytes() {
        
if (getSary().getXp()!=null)
            
return getSary().getXp();
        
else
            
//默认规则,page页面里若数据库里没有bytes,则返回null
            return null;
    }


}


5.  Html页面
<img jwcid="@Image" width="102" height="126"  image="ognl:chartImageAsset"/>

6. .application文件 注册ChartService
<application name="SaryProject" engine-class="cn.vikings.tapestry.common.SaryEngine">
    
 
<service name="chart" class="cn.vikings.tapestry.common.chart.ChartService"/>

</application>

图片显示搞店. 就这么简单.
不用再很BT得传一句HQL语句和图片ID来,再用JDBC查一次数据库.

posted on 2007-10-29 16:56 Vikings 阅读(693) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航: