我使用JSP编写一个在线考试的程序,在实现随机抽题功能的时候我使用了SQL语句的newid()语句,实现了随机从表中抽取了5道题,并用for循环输出.
提交答卷后,转入自动评分界面时.
我遇到了个问题,我用的是reques.getparameter()获取每个单项选择题的value.得到的是ABCD之一,
但是在与数据库中的正确答案比较时.我不知道用什么语句来查询表了.select 正确答案 from 题库 这样肯定是不对的,因为我是随机抽取的题目,而刚刚那个语句则是按顺序得到数据库中每道题的答案,应该怎样让每一道题的答案和数据库中的正确答案一一对应呢?用什么样的语句?或者说是不是在提交答案时把每道题的编号提交上来?该怎么实现呢???等高手!
knightzhuwei 是不是在抽题的时候同时把正确答案也抽取出来,放到session对象中,而后在提交后的页面再取得session里的值,然后跟提交的答案进行比较?
请问应该用session的哪个方法啊?getAttribute()和setAttribute()? 用for循环放入?可否写出明确的句子? for(i=1;i<=10;i++){ session.setAttribute("daan",<%=rs.getString("正确答案")%>) }这个思路对吗??
取出来的时候怎么取啊?都连成一块了....
抽题时,将抽出的题目包装成一个对象,比如:Question对象,
然后将5个Question对象放入session对象中,这样在判断答案时就从session对象中取回这5个题目就行了
本例共3个文件:
text.Question.java
index.jsp
check.jsp
将编译好的Question.class放入站点目录 下的 WEB-INF/classes/test目录下
将 index.jsp,check.jsp 放入任意目录下,但要保证两个文件在同一个目录里
程序清单:
=======================test.Question.java=====================
//单选题为例
package test;
public class Question{
public String description;//问题描述
public String[] answers;//备选答案
public char answer;//正确答案,因为是单选的,所有只有一种答案
public int id;//问题的ID,这个必须是唯一的
}
=========================index.jsp==========================
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@ page import="java.util.*,test.*" %>
<%
//设置问题,这里只简单创建了两个对象
//实际上应该是从数据库读取的数据重新拼装的
//1:
Question q = new Question();
q.description="今天什么日子?";//问题内容
q.answers=new String[]{"春节","元宵节","不知什么节","清明节",};//备选答案
q.answer='C';//正确答案
q.id=1234;//ID号
//将问题装入session
session.setAttribute(""+q.id,q);
//2:
q=new Question();
q.description="下面哪一个不是 JAVA 关键字 ";
q.answers=new String[]{"static ","public ","final","goto",};
q.answer='D';
q.id=4567;
//将问题装入session
session.setAttribute(""+q.id,q);
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
单选题:
<br>
<form name='qfm' action='check.jsp' method='post'>
<%
//从session中取得所有对象的名称
Enumeration en = session.getAttributeNames();
int x = 1;//问题标号
while(en.hasMoreElements()){
String objName = en.nextElement().toString();
Object sessionObj = session.getAttribute(objName);
//检查session对象是否为 Question对象,如果不是则进行下一轮循环
if(!(sessionObj instanceof Question))
continue;
Question que = (Question)sessionObj;
out.println(x+++":");//打印标号,并将标号加1
out.println(que.description+"<br/>");//打印问题描述
char anid = 'A';//备选答案名称 从 A 开始 依次加大,如: B C ...
for(int i=0; i<que.answers.length; i++){
//打印一个单选按钮,并将该按钮的名称和session中的Question对象名称统一起来
//而它的值设置成 anid,如果是第一个选项就设置成选中状态
out.println("<input type='radio' name='"+objName+"' value='"+anid+"' "+(i==0?"checked":"")+"/> "+anid);
//打印全部备选答案
out.println(" "+que.answers[i]+"<br/>");
//
++anid;
}
}
%>
<button type='submit'>submit</button>
</form>
</body>
</html>
=====================check.jsp=====================
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8" import="java.util.*,test.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
结果:<br/>
<%
//取得request对象中的所有参数的名称
Enumeration en=request.getParameterNames();
int x=1;//问题标号
while(en.hasMoreElements()){
String objName = en.nextElement().toString();
Object sessionObj = session.getAttribute(objName);
if(!(sessionObj instanceof Question))continue;
Question que = (Question)sessionObj;
out.println(x+":"+que.description+"<br/>"+
" 用户回答:"+request.getParameter(objName)+
" 正解:"+que.answer+"<br/>");
++x;
}
%>
</body>
</html>
然后将5个Question对象放入session对象中,这样在判断答案时就从session对象中取回这5个题目就行了
本例共3个文件:
text.Question.java
index.jsp
check.jsp
将编译好的Question.class放入站点目录 下的 WEB-INF/classes/test目录下
将 index.jsp,check.jsp 放入任意目录下,但要保证两个文件在同一个目录里
程序清单:
=======================test.Question.java=====================
//单选题为例
package test;
public class Question{
public String description;//问题描述
public String[] answers;//备选答案
public char answer;//正确答案,因为是单选的,所有只有一种答案
public int id;//问题的ID,这个必须是唯一的
}
=========================index.jsp==========================
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@ page import="java.util.*,test.*" %>
<%
//设置问题,这里只简单创建了两个对象
//实际上应该是从数据库读取的数据重新拼装的
//1:
Question q = new Question();
q.description="今天什么日子?";//问题内容
q.answers=new String[]{"春节","元宵节","不知什么节","清明节",};//备选答案
q.answer='C';//正确答案
q.id=1234;//ID号
//将问题装入session
session.setAttribute(""+q.id,q);
//2:
q=new Question();
q.description="下面哪一个不是 JAVA 关键字 ";
q.answers=new String[]{"static ","public ","final","goto",};
q.answer='D';
q.id=4567;
//将问题装入session
session.setAttribute(""+q.id,q);
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
单选题:
<br>
<form name='qfm' action='check.jsp' method='post'>
<%
//从session中取得所有对象的名称
Enumeration en = session.getAttributeNames();
int x = 1;//问题标号
while(en.hasMoreElements()){
String objName = en.nextElement().toString();
Object sessionObj = session.getAttribute(objName);
//检查session对象是否为 Question对象,如果不是则进行下一轮循环
if(!(sessionObj instanceof Question))
continue;
Question que = (Question)sessionObj;
out.println(x+++":");//打印标号,并将标号加1
out.println(que.description+"<br/>");//打印问题描述
char anid = 'A';//备选答案名称 从 A 开始 依次加大,如: B C ...
for(int i=0; i<que.answers.length; i++){
//打印一个单选按钮,并将该按钮的名称和session中的Question对象名称统一起来
//而它的值设置成 anid,如果是第一个选项就设置成选中状态
out.println("<input type='radio' name='"+objName+"' value='"+anid+"' "+(i==0?"checked":"")+"/> "+anid);
//打印全部备选答案
out.println(" "+que.answers[i]+"<br/>");
//
++anid;
}
}
%>
<button type='submit'>submit</button>
</form>
</body>
</html>
=====================check.jsp=====================
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8" import="java.util.*,test.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
结果:<br/>
<%
//取得request对象中的所有参数的名称
Enumeration en=request.getParameterNames();
int x=1;//问题标号
while(en.hasMoreElements()){
String objName = en.nextElement().toString();
Object sessionObj = session.getAttribute(objName);
if(!(sessionObj instanceof Question))continue;
Question que = (Question)sessionObj;
out.println(x+":"+que.description+"<br/>"+
" 用户回答:"+request.getParameter(objName)+
" 正解:"+que.answer+"<br/>");
++x;
}
%>
</body>
</html>
温馨提示:答案为网友推荐,仅供参考
第1个回答 2009-02-08
newid()取出来的时候循环的时候把每道题的答案按顺序存到session里 对应 1 2 3 4 5。。
页面上 value1 value2..与用户答案 A B C..对应
比较的时候就那value1得到的答案与从session里得到的答案比较应该就行了吧。。
是不是可以这样
存的时候用
for(i=1;i<=10;i++){
String s=rs.getString("正确答案")
session.setAttribute("daan"+i,s)
rs.next();
}
取的时候按照daan1 daan2。。。的顺序来区别不同的题啊。。。本回答被提问者采纳
页面上 value1 value2..与用户答案 A B C..对应
比较的时候就那value1得到的答案与从session里得到的答案比较应该就行了吧。。
是不是可以这样
存的时候用
for(i=1;i<=10;i++){
String s=rs.getString("正确答案")
session.setAttribute("daan"+i,s)
rs.next();
}
取的时候按照daan1 daan2。。。的顺序来区别不同的题啊。。。本回答被提问者采纳
第2个回答 2009-02-06
给你的 那张表 加个字段 字段就是 答案
不就可以咯
查询返回后的 放到 session里面就是咯
然后客户提交后
从session里面 取出 比较
不久OK拉
不就可以咯
查询返回后的 放到 session里面就是咯
然后客户提交后
从session里面 取出 比较
不久OK拉
第3个回答 2009-02-09
程序我就不写了! 给你提供 解决方案
你取题目的同时 就应该把正确答案一起取出来!
在JSP 里面放一个HIDDEN, 里面放入正确答案。
提交的时候得到你选择的答案与HIDDEN 里面的值比较。
OK 完工!
你取题目的同时 就应该把正确答案一起取出来!
在JSP 里面放一个HIDDEN, 里面放入正确答案。
提交的时候得到你选择的答案与HIDDEN 里面的值比较。
OK 完工!