这个jsp程序调试不通过,请各位热心人帮助解答.

03-06-12 clear

下面是我正在学的"jsp程序设计实务"书上一个例子,主要是示范Request Scope的Bean.
EasyCalculator.html是一个内含表单的网页,目的是让用户输入一道简易运算式后,送至Web服务器端进行处理.送出算式后首先接受处理的是ExprTokenizer.jsp.使用一个ExprTokensList Bean来检查用户输入的算式是否正确.当ExprTokenizer.jsp验证用户输入的算式格式无误后,把tokensList对象通过Forward程序传至EasyCalculator.jsp中进行处理,否则它会把错误信息回应给用户.EasyCaculator.jsp的主要目的是处理算式的计算结果,并以网页的形式将计算后的值送至用户的浏览器显示.在EasyCalculator.jsp程序中使用了两个Bean:一个是由ExprTokenizer.jsp传来ExprTokensList,另一个则是处理算式计算的ExprParserBean.

EasyCalculator.html代码:
<html>
<head>
<title>简易计算机</title>
<meta http-equiv="Content-Type" content="text/html; charset=big5">
</head>
<body bgcolor="#FFFFFF">
<form method="get" action="ExprTokenizer.jsp" name="form1">
<p>请输入一道运算式:</p>
<p>
<input type="text" name="expression" size="21" maxlength="21">
<input type="submit" name="Submit" value="输入">
</p>
</form>
</body>
</html>

EasyCalculator.jsp文件代码:
<%@ page language="java" %>
<%@ page import="java.lang.*" %>
<%@ page contentType="text/html; charset=gb2312" %>
<jsp:useBean id="tokensList" scope="request" class="xbook.ch8.beans.ExprTokensList" />
<jsp:useBean id="exprParser" scope="page" class="xbook.ch8.beans.ExprParser" />
<%
exprParser.setTokensList( tokensList ) ;
%>
<html>
<head>
<title>计算结果</title>
</head>
<body bgColor="#FFFFFF" >
<div align="center" >
<h1><jsp:getProperty name="exprParser" property="answer" /></h1>
</div>
</body>
</html>

ExprParser.java文件代码:

package xbook.ch8.beans ;

import java.lang.* ;
import xbook.ch8.beans.* ;

public class ExprParser {
String answer ;

public ExprParser() {
this.answer=null ;
}

protected double calculate( double firstElement, String operator, double secondElement )
throws Exception {
if( "+".equals( operator ) )
return firstElement+secondElement ;
else if( "-".equals( operator ) )
return firstElement-secondElement ;
else if( "*".equals( operator ) )
return firstElement*secondElement ;
else if( "/".equals( operator ) ) {
if( secondElement>-1E-5 && secondElement<1E-5 )
throw new Exception() ;
else
return firstElement/secondElement ;
}
else
return firstElement ;
}

public String getAnswer() {
if( this.answer==null )
return "算式格式有误!" ;
else
return this.answer ;
}

public void setTokensList( ExprTokensList tokenList ) {
double result=0.0 ;

Object element=tokenList.getElement() ;
if( element!=null ) {
if( element instanceof Double )
result=((Double)element).doubleValue() ;
else
return ;

while( ( element=tokenList.getElement() )!=null ) {
String opr="" ;
if( element instanceof String )
opr=(String)element ;
else
return ;

if( ( element=tokenList.getElement() )!=null && element instanceof Double )
try {
result=this.calculate( result, opr, ((Double)element).doubleValue() ) ;
}
catch( Exception ex ) {
return ;
}
else
return ;
}
}
this.answer=String.valueOf( result ) ;
}
}

ExprTokenizer.jsp文件代码:
<%@ page language="java" %>
<%@ page import="java.lang.*" %>
<%@ page contentType="text/html; charset=gb2312" %>
<%
String expr=request.getParameter( "expression" ) ;
%>
<jsp:useBean id="tokensList" scope="request" class="xbook.ch8.beans.ExprTokensList" >
<jsp:setProperty name="tokensList" property="expression" value="<%=expr %>" />
</jsp:useBean>
<%
if( tokensList.isParsingOk() ) {
%>
<jsp:forward page="EasyCalculator.jsp" />
<%
}
else {
%>
<html>
<head>
<title>错误讯息</title>
</head>
<body bgColor="#FFFFFF" >
<div align="center" >
<h3><jsp:getProperty name="tokensList" property="errorMessage" /></h3>
</div>
</body>
</html>
<%
}
%>

ExprTokensList.java文件代码:

package xbook.ch8.beans ;

import java.lang.* ;
import java.util.* ;

public class ExprTokensList {
Vector tokensList ;
Vector improperTokens ;

public ExprTokensList() {
tokensList=new Vector() ;
improperTokens=new Vector() ;
}

public String getErrorMessage() {
if( improperTokens.size()==0 )
return "没有发现任何错误!" ;
else {
String msg="在算式中发现不适当的元素: " ;
for( Enumeration e=improperTokens.elements() ; e.hasMoreElements() ; )
msg+=( "\""+(String)e.nextElement()+"\" " ) ;
return msg ;
}
}

public Object getElement() {
if( tokensList.size()==0 )
return null ;
else {
Object element=tokensList.firstElement() ;
tokensList.removeElementAt( 0 ) ;
return element ;
}
}

public boolean isParsingOk() {
if( improperTokens.size()==0 )
return true ;
else
return false ;
}

public void setExpression( String expr ) {
StringTokenizer tokenizer=new StringTokenizer( expr, " +-*/", true ) ;
while( tokenizer.hasMoreTokens() ) {
String token=tokenizer.nextToken() ;

if( token.equals( " " ) )
continue ;

if( token.equals( "+" ) || token.equals( "-" ) || token.equals( "*" ) || token.equals( "/" ) )
tokensList.addElement( token ) ;
else {
try {
tokensList.addElement( new Double( token ) ) ;
}
catch( NumberFormatException ex ) {
improperTokens.addElement( token ) ;
}
}
}
}
}
问题:
在执行到ExprTokenizer.jsp的
<jsp:useBean id="tokensList" scope="request" class="xbook.ch8.beans.ExprTokensList" >
<jsp:setProperty name="tokensList" property="expression" value="<%=expr %>" />
</jsp:useBean>
这句时出错,提示:
java.lang.ClassFormatError: xbook/ch8/beans/ExprTokensList (Bad magic number)
at java.lang.ClassLoader.defineClass0(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:502)
我猜是expression这个属性在ExprTokensList.java里没定义的原因,但又不知怎么改才好使.请帮助调试一下,谢谢!