在线测试引擎项目详解
发布时间: 2025-08-17 01:03:19 阅读量: 2 订阅数: 3 

### 在线测试引擎项目详解
#### 1. 项目运行
要运行这个在线测试引擎应用程序,你可以创建一个`run.bat`文件,内容如下:
```plaintext
javac -g:none -bootclasspath c:\j2me_cldc\bin\api\classes;
-classpath
c:\j2mecldc\bin\api\classes;
-d c:\testmanager *.java
c:\j2mecldc\bin\preverify -d c:\testmanager
-classpath c:\j2me_cldc\bin\api\classes; c:\testmanager
c:\j2mecldc\bin\kvm –classpath
c:\j2mecldc\bin\api\classes;c:\testmanager %1%
```
这里假设CLDC已安装在`c:\j2mecldc`目录,`TestManager`项目已安装在`c:\testmanager`目录。项目的完整源代码位于`TestManager.java`、`MainScreen.java`、`QuestionParser.java`、`Books.asp`和`TestFile.asp`中。你也可以从CD复制代码来运行。不过,为了测试这个应用程序,你需要安装并运行个人Web服务器(或其他Web服务器),还需要将ASP文件复制到服务器的根目录。
#### 2. 项目文件组成
项目包含以下文件:
| 文件名称 | 说明 |
| ---- | ---- |
| `TestManager.java` | 主Java(CLDC)文件 |
| `MainScreen.java` | 包含四个内部类:`NextScreen`、`Results`、`ResultScreen`和`TestHistory` |
| `QuestionParser.java` | 问题解析类 |
| 第三方XML解析器 | 用于解析XML数据 |
| `Books.asp` | 与服务器交互获取主题列表 |
| `TestFile.asp` | 根据用户选择生成测试问题 |
| `MaintenanceSoft.mdb` | MS Access数据库,存储主题、问题、结果等数据 |
#### 3. 数据库表结构
`MaintenanceSoft.mdb`文件包含三个表:
- **MainData表**:包含可供测试的主题名称。
- **QuestionData表**:存储问题的详细信息,如`QuestionId`、`QuestionText`和`NoOfChoices`。
- **AnswerData表**:存储特定问题的答案详细信息,如`QuestionId`、`ChoiceNo`、`AnswerText`和`Correct`。
#### 4. 程序运行流程
程序的运行流程如下:
```mermaid
graph TD
A[启动应用程序] --> B[执行TestManager类]
B --> C[请求http://host/books.asp获取主题列表(XML格式)]
C --> D[XML解析器解析XML并存储在PDA的Palm数据库中]
D --> E[调用MainScreen类创建GUI并显示主题列表]
E --> F[用户选择测试主题并按OK]
F --> G[调用QuestionParser类生成XML文件]
G --> H[解析XML文件并存储数据]
H --> I[调用NextScreen类显示第一个问题]
I --> J{用户操作}
J -->|Next| K[判断是否为最后一题]
K -->|否| I
K -->|是| L[调用Results类显示结果]
J -->|Review| M[调用Results类显示临时结果]
J -->|Prev| N[判断是否为第一题]
N -->|否| I
N -->|是| I
```
具体步骤如下:
1. 执行Java类文件`TestManager`启动应用程序,它会使ASP文件`http://host/books.asp`读取MS Access文件中存储的主题,并以XML格式返回。
2. XML解析器解析XML并将结果存储在PDA的Palm数据库中。
3. 调用`MainScreen`类,创建GUI组件并在滚动文本框中显示从XML解析的文本(主题列表)。
4. 用户输入要尝试的测试序列号并按OK,调用`QuestionParser`类,将选择作为参数传递给`TestFile.asp`,生成同名的XML文件。
5. 解析器再次解析包含测试数据的XML,并将问题及其选项和正确答案存储在数据库中。
6. 调用`MainScreen`的内部类`NextScreen`,创建新的GUI组件并显示第一个问题。
7. 用户可以选择按下`Next`、`Prev`或`Review`按钮。
- 按下`Next`按钮,将用户选择的答案与正确答案进行匹配,并存储结果(`Correct`、`Wrong`、`Unanswered`或`Unattempted`)。如果不是最后一题,调用`critical`函数显示下一个问题;否则,调用`Results`类显示最终结果。
- 按下`Review`按钮,调用`Results`类显示临时结果。
- 按下`Prev`按钮,如果不是第一题,将`serialno`变量减1并调用`critical`函数显示上一个问题。
#### 5. `TestManager.java`代码分析
以下是`TestManager.java`的代码:
```java
import java.io.InputStream;
import java.util.Hashtable;
import java.util.Enumeration;
import com.sun.kjava.*;
import java.lang.*;
import javax.microedition.io.*;
import java.io.*;
import java.util.*;
import org.kxml.*;
import org.kxml.io.*;
import org.kxml.parser.*;
/* This is the main class of the testmanager. It starts the testmanager with
a welcome screen... when the user presses the “Ok” button it calls an XML
parser and stores the results provided by the parser in the palm Database...
*/
public class TestManager extends Spotlet {
boolean subject_id = false;
boolean subject_name = false;
boolean root_flag = false;
int ij = 1;
int ijk = 0;
String name1 = "";
Database dbg;
AbstractXmlParser xmlParser;
ParseEvent event;
DataInputStream dos;
DataInputStream din;
private Button bt = new Button("Ok",85,145);
private Button exit = new Button("Exit",110,145);
private TextBox message = new TextBox("Welcome to the Test Manager..",10,10,130,50);
public static void main(String args[])throws Exception {
TestManager CallParser = new TestManager();
}
public TestManager() {
register(NO_EVENT_OPTIONS);
bt.paint();
exit.paint();
message.paint();
String nameing = "data_base";
int cid = 0x4B415754;
int tid = 0x44425370;
dbg = new Database (tid,cid,Database.READWRITE);
Database.create(0,nameing,cid,tid,false);
}
public void penDown(int x, int y) {
if(bt.pressed(x,y)) {
unregister();
start();
parseData();
new main_screen();
} else {
System.exit(0);
}
}
public void start() {
try {
din = Connector.openDataInputStream("testhttp://www.s-cop.com/books.asp");
din.close();
dos = Connector.openDataInputStream("testhttp://www.s-cop.com/books.xml");
xmlParser = new XmlParser(new InputStreamReader(dos));
} catch(IOException e) {
System.out.println( "gh" );
}
}
void parseData() {
do {
try {
event = xmlParser.read ();
if(event.getType()==Xml.START_TAG) {
StartTag stag = (StartTag)event;
String name = stag.getName();
root_flag = true;
if (name.equals("SubjectID")) {
subject_id = true;
} else if (name.equals("SubjectName")) {
subject_name = true;
}
}
if(event.getType()== Xml.TEXT) {
TextEvent tevent = (TextEvent)event;
String name = tevent.getText();
name = name.trim();
if ((subject_id)&&(root_flag))
name1 = name1+"è"+name+"è";
else if ((root_flag)&&(subject_name))
name1 = name1+name+"\n";
}
if(event.getType()== Xml.END_TAG) {
EndTag end_tag = (EndTag)event;
String name = end_tag.getName();
if (name.equals("ROOT")) {
root_flag = false;
name1 = name1 +"ì";
byte[] data = name1.getBytes();
dbg.setRecord(ij,data);
ij++;
name1 = "";
} else if (name.equals("SubjectID")) {
subject_id = false;
} else if (name.equals("SubjectName")) {
subject_name = false;
}
}
} catch(IOException ex) {
System.out.println("Exception occured");
}
} while (!(event instanceof EndDocument));
System.out.println("**** END OF DOCUMENT ****");
String stre = ""+ij;
byte[] data2 = stre.getBytes();
dbg.setRecord(ijk,data2);
}
}
```
代码解释:
- **包导入**:导入项目所需的基本包和XML解析器相关包。
- **类声明**:`TestManager`类继承自`Spotlet`,是在线测试引擎的主类。
- **变量声明**:声明了用于存储结果的临时变量、XML解析器和事件对象、数据输入流、按钮和文本框等。
- **构造函数**:初始化GUI组件和数据库。
- **事件处理**:处理按钮点击事件,当用户按下OK按钮时,调用`start`和`parseData`函数,并调用`main_screen`类;当用户按下Exit按钮时,退出应用程序。
- **`start`函数**:向服务器发送ASP请求,获取可用测试的列表,并将XML流传递给解析器。
- **`parseData`函数**:解析XML数据,根据标签设置标志,将文本存储在数据库中。
#### 6. `MainScreen.java`代码分析
```java
import com.sun.kjava.*;
import java.lang.*;
import javax.microedition.io.*;
import java.io.*;
import java.util.*;
/* This screen pertains to the main testmanager’s screen. On this screen all
the tests available at a particular instant of time are shown..When the user
presses a choice then a request is made to the central server to generate
that test’ s XML file and and send it to the parser and then show the first
question to the user..
*/
public class MainScreen extends Spotlet {
static int op = 1;
static int serialno = 1;
static String answer[][] = new String[50][2];
static Database database;
static String exam_code = "";
static String exam_name = "";
static String total_number = "";
static void entry(String str) {
String previous = "";
byte[] data_prev;
try {
data_prev = database.getRecord(65535);
previous = new String(data_prev);
} catch(Exception e) {
previous = "?";
}
try {
database.deleteRecord(65535);
} catch (Exception e) {
}
previous = previous+str+"?";
byte[] enter = previous.getBytes();
database.addRecord(enter);
}
private Button bt = new Button("Ok",85,145);
private Button exit = new Button("Exit",110,145);
private TextField choicefield;
String strp = "";
Database dbg;
private ScrollTextBox first;
String choose[] = new String[150];
String choose_text[] = new String[150];
int qno = 1;
Graphics gr = Graphics.getGraphics();
public MainScreen() {
register(NO_EVENT_OPTIONS);
choicefield = new TextField("Option:",10,145,50,10);
choicefield.setUpperCase(true);
choicefield.setFocus();
String textx = reading();
first = new ScrollTextBox(textx,0,0,150,140);
bt.paint();
exit.paint();
first.paint();
choicefield.paint();
String name = "history";
int cid = 0x4B415755;
int tid = 0x44425371;
database = new Database (tid,cid,Database.READWRITE);
Database.create(0,name,cid,tid,false);
}
public String reading() {
String nameing = "data_base";
String str22 = " ";
int cid = 0x4B415754;
int tid = 0x44425370;
dbg = new Database (tid,cid,Database.READONLY);
byte[] data = dbg.getRecord(1);
String questiontext = new String(data);
String puttext = "";
char kg = 'a';
int iq = 1;
int county = 0;
StringBuffer sb = new StringBuffer();
while (kg != 'ì') {
kg = questiontext.charAt(iq);
if(kg != 'è')
sb= sb.append(kg);
```
0
0
相关推荐









