linux+tomcat+jdk1.4.2环境下运行显示验证码的jsp文件错误!请高手指点!
img.jsp文件中包含的包如下:
import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*"
在windows系统下运行正常,将代码转移到linux环境下后提示下列错误,不知是什么原因,请高手指点!
java.lang.NoClassDefFoundError
java.lang.Class.forName0(Native Method)
java.lang.Class.forName(Class.java:141)
java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment(GraphicsEnvironment.java:62)
java.awt.image.BufferedImage.createGraphics(BufferedImage.java:1041)
java.awt.image.BufferedImage.getGraphics(BufferedImage.java:1031)
org.apache.jsp.admin.image_jsp._jspService(image_jsp.java:73)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:324)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
问题点数:100、回复次数:11Top
1 楼RomandAccessFile(goodghost)回复于 2005-01-26 12:24:58 得分 10
你用的Class.forName方法找不到注册的类,环境出错,最好你设一下Path和ClassPathTop
2 楼zhiye(智野)回复于 2005-01-26 12:27:13 得分 0
如果是Path或ClassPath设置有问题的话,那其他程序应该也有问题才对吧.实际上其他程序运行是正常的!Top
3 楼eyes2near(eyes2near)回复于 2005-01-26 12:37:44 得分 50
这样处理:
看不懂找我:msn:eyes2near@hotmail.com
在Java运行时加上参数:-Djava.awt.headless=true
确切的说是因为再linux你没有启动Xserver,所以如果不设置以上参数就会出问题。你应该修改你的servlet container的启动脚本,在启动选项中加入上边的参数。Top
4 楼singedcat(以夢為馬)回复于 2005-01-26 12:44:21 得分 10
upTop
5 楼chshzh2000(地皮)回复于 2005-01-26 12:48:56 得分 10
设一下Path和ClassPath
Top
6 楼eyes2near(eyes2near)回复于 2005-01-26 13:05:59 得分 0
这个不是Path和ClassPath的问题,你就按照我上边说的做就一定ok的,这个问题我已经给许多人讲过了。Top
7 楼meeting(太阳雨)回复于 2005-01-26 13:43:16 得分 20
楼上已说了,肯定没错.
JDK1.4以上在LINUX下加参数:-Djava.awt.headless=true
具体的说就是在tomcat的/bin/catalina.sh加上JAVA_OPTS=-Djava.awt.headless=true
早期的JDK版本就要在LINUX上装个什么包Top
8 楼hcqhappy(月坏)回复于 2005-01-26 13:45:59 得分 0
eyes2near zhiye (智野) 能不能分享一下你的验证码 代码吗 谢谢Top
9 楼zhiye(智野)回复于 2005-01-26 13:59:21 得分 0
to:hcqhappy(月坏),你的msn?Top
10 楼eyes2near(eyes2near)回复于 2005-01-26 14:00:04 得分 0
我的生成验证码的代码,懒得修改,你凑合看吧。
<%@ page contentType="image/jpeg" %>
<%@ page import="java.awt.*,java.awt.image.*,com.sun.image.codec.jpeg.*,java.util.*,java.io.*"%>
<%
int width=100, height=12;
String[] keys={"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"};
Random random =new Random();
StringBuffer sb = new StringBuffer();
for(int i=0;i<8;i++){
sb.append(keys[random.nextInt(keys.length)]);
}
String validateString = sb.toString();
String imgFile;
String rpath = application.getRealPath("/userhome/validatecodebg");
InputStream imageIn;
JPEGImageDecoder decoder;
BufferedImage image;
Graphics g;
try{
File folder = new File(rpath);
String[] files = folder.list();
imgFile = files[random.nextInt(files.length)];
imageIn = new FileInputStream(new File(rpath+"/"+imgFile));
decoder = JPEGCodec.createJPEGDecoder(imageIn);
image = decoder.decodeAsBufferedImage();
imageIn.close();
width = image.getWidth();
height = image.getHeight();
g = image.getGraphics();
}catch(Exception e){
image = new BufferedImage(width,height, BufferedImage.TYPE_INT_RGB);
g = image.getGraphics();
g.setColor(Color.white);
g.fillRect(0,0,width,height);
}
g.setColor(Color.black);
//g.drawLine(0,0,width,height);
Font mFont = new Font("",Font.BOLD,12);
g.setFont(mFont);
g.drawString(validateString,2,height-2);
g.dispose();
ServletOutputStream output=response.getOutputStream();
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(output);
encoder.encode(image);
session.setAttribute("User.ValidateCode",validateString);
%>Top
11 楼zhiye(智野)回复于 2005-01-26 14:11:24 得分 0
也是在网上找到的,给你参考一下:
<%@ page contentType="image/jpeg" import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*" %>
<%!
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);
}
%>
<%
//设置页面不缓存
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", 0);
// 在内存中创建图象
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(180,250));
g.fillRect(0, 0, width, height);
//设定字体
g.setFont(new Font("宋体",Font.PLAIN,18));
//画边框
g.setColor(new Color());
g.drawRect(0,0,width-1,height-1);
// 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
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);
}
// 取随机产生的认证码(4位数字)
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);
}
// 将认证码存入SESSION
session.setAttribute("rand",sRand);
// 图象生效
g.dispose();
// 输出图象到页面
ImageIO.write(image, "JPEG", response.getOutputStream());
%>Top




