这个动态图片的实现原理是在servlet的response中写入一个ImageOutputStream,并由servlet容器将其转成图片,在非webwork的实现中,可以直接操作response,但是在webwork中,要想直接操作response的output则必须使用不需要对response操作的result类型
实现一个Result:
<o:p> </o:p>
不可以用普通的dispatcherResult在response的outputStream中写入东西,否则将覆盖所有的dispatcher的jsp页面
<o:p>上次的代码忘记加上response的设置不缓存了,这样即使使用IE的回退也会刷新图片
/**
* @see com.opensymphony.webwork.dispatcher.WebWorkResultSupport#doExecute(java.lang.String,
* com.opensymphony.xwork.ActionInvocation)
*/
@Override
protected void doExecute(String finalLocation, ActionInvocation invocation) throws Exception
{
HttpServletRequest request = (HttpServletRequest) invocation.getInvocationContext().get(
ServletActionContext.HTTP_REQUEST);
HttpServletResponse response = (HttpServletResponse) invocation.getInvocationContext().get(
ServletActionContext.HTTP_RESPONSE);
response.setHeader( " Pragma " , " No-cache " );
response.setHeader( " Cache-Control " , " no-cache " );
response.setDateHeader( " Expires " , 0 );
VerifyImage verify = new VerifyImage();
OutputStream os = response.getOutputStream();
String str = verify.GetImage(os);
session = request.getSession( true );
session.setAttribute( " rand " , str);
}
</o:p><o:p> </o:p>
在xwork.xml中配置result-type:
<result-types><o:p></o:p>
<result-type name="image" <o:p></o:p>
class="com.bnt.afp.action.verify.ImageResult"/><o:p></o:p>
</result-types><o:p></o:p>
<o:p> </o:p>
添加一个生成图片的action:
<action name="imageAction"<o:p></o:p>
class="com.bnt.afp.action.verify.ImageAction"><o:p></o:p>
<result name="success" type="image"/><o:p></o:p>
</action><o:p></o:p>
<o:p> </o:p>
在需要生成验证图片的地方这样调用:
<img border=0 src="imageAction.action">
<o:p>
ImageAction里只要简单的返回SUCCESS就可以了
</o:p>
{
return SUCCESS;
}
VerifyImage中生成图片的方法:(来自网上一个JSP生成动态验证图片的实例)
public String GetImage(OutputStream outputStream){
int width = 60 , height = 20 ;
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();
Random random = new Random();
g.setColor(getRandColor( 200 , 250 ));
g.fillRect( 0 , 0 , width, height);
g.setFont( new Font( " Times New Roman " ,Font.PLAIN, 18 ));
g.setColor(getRandColor( 160 , 200 ));
for ( int i = 0 ;i < 155 ;i ++ )
{
int x = random.nextInt(width);
int y = random.nextInt(height);
int xl = random.nextInt( 12 );
int yl = random.nextInt( 12 );
g.drawLine(x,y,x + xl,y + yl);
}
String sRand = "" ;
for ( int i = 0 ;i < 4 ;i ++ ){
String rand = String.valueOf(random.nextInt( 10 ));
sRand += rand;
g.setColor( new Color( 20 + random.nextInt( 110 ), 20 + random.nextInt( 110 ), 20 + random.nextInt( 110 )));
g.drawString(rand, 13 * i + 6 , 16 );
}
g.dispose();
try {
ImageIO.write(image, " JPEG " , outputStream);
outputStream.flush();
return sRand;
} catch (IOException e) {
e.printStackTrace();
return " fail " ;
}
}
public Color getRandColor( int fc, int bc){
Random random = new Random();
if (fc > 255 ) fc = 255 ;
if (bc > 255 ) bc = 255 ;
int r = fc + random.nextInt(bc - fc);
int g = fc + random.nextInt(bc - fc);
int b = fc + random.nextInt(bc - fc);
return new Color(r,g,b);
}
转载请注明作者和来源.