这个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里没定义的原因,但又不知怎么改才好使.请帮助调试一下,谢谢!