這個jsp程式除錯不透過,請各位熱心人幫助解答.

clear發表於2003-06-12
下面是我正在學的"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裡沒定義的原因,但又不知怎麼改才好使.請幫助除錯一下,謝謝!

相關文章