《Spring編程技術(shù)與應(yīng)用》課件18_第1頁
《Spring編程技術(shù)與應(yīng)用》課件18_第2頁
《Spring編程技術(shù)與應(yīng)用》課件18_第3頁
《Spring編程技術(shù)與應(yīng)用》課件18_第4頁
《Spring編程技術(shù)與應(yīng)用》課件18_第5頁
已閱讀5頁,還剩18頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

數(shù)據(jù)庫設(shè)計(jì)程序中所涉及的各表的字段含義解釋如下:?jiǎn)芜x題表(danxuan)、多選題表(mxuan)、填空題表(tiankong)的結(jié)構(gòu)相似。含字段有:number為題號(hào),content為試題內(nèi)容,diff為難度,knowledge為所屬知識(shí)點(diǎn),answer為答案。只是填空題的答案字段長(zhǎng)度更大些??荚嚨怯洷恚╬aperlog)含字段有:username為用戶名,paper為試卷,useranswer為用戶解答。其中,后面兩個(gè)字段為text類型??荚噮?shù)配置表(configure)含字段有:knowledges為考核知識(shí)點(diǎn)的集合,sxamount為單選題的數(shù)量,sxscore為單選題的小題分?jǐn)?shù),……。其中,knowledges為一個(gè)文本串,列出所有考核知識(shí)點(diǎn),每個(gè)知識(shí)點(diǎn)用單引號(hào)括住,知識(shí)點(diǎn)之間用逗號(hào)分隔。18.1.1組卷相關(guān)數(shù)據(jù)對(duì)象的封裝設(shè)計(jì)(1)引入Question類記錄下某類題型的抽題信息包括題型編碼、每小題分值、以及抽到的試題編號(hào)構(gòu)成的數(shù)組。publicclassQuestion{ intbh[];//各小題編號(hào)

intscore;//每小題分?jǐn)?shù)

inttype;//題型,值為1表示單選,為2表示多選}(2)引入ExamPaper類記錄整個(gè)抽取的試卷publicclassExamPaper{List<Question>allst=newArrayList<Question>();//存放各類大題的抽題信息}18.1.2組卷業(yè)務(wù)邏輯程序(1)按組卷配置要求組卷publicstaticExamPapergenPaper(JdbcTemplatejdbcTemplate){ ExamPaperpaper=newExamPaper(); Stringsql="selectknowledgesfromconfigure";//查考核知識(shí)范圍

Stringknowledges=jdbcTemplate.queryForObject(sql,String.class); sql="selectsxamountfromconfigure";//查配置得到單選數(shù)量

intamount=jdbcTemplate.queryForInt(sql); if(amount>0){ sql="selectsxscorefromconfigure";//查配置得到每小題分?jǐn)?shù)

intscore=jdbcTemplate.queryForInt(sql); Questionq=newQuestion(); q.type=1;//單選題型

q.score=score; q.bh=pickst(jdbcTemplate,"danxuan",amount,knowledges);//調(diào)抽題處理

paper.allst.add(q);//將單選題的組卷選題加入試卷中

}

……//其他類試題的選題處理與上面類似

returnpaper;}(2)某類題型的抽題算法privatestaticint[]pickst(JdbcTemplatejdbcTemplate,Stringtable,intcount,Stringknowledges){ArrayList<Integer>have=newArrayList<Integer>();//存放選好的題的編號(hào)sql="selectcount(*)from"+table+"whereknowledgein("+knowledges+")";intrealAmout=jdbcTemplate.queryForInt(sql);//可供抽取試題總數(shù)if(realAmout<count){ count=realAmout;//不夠數(shù)量,按實(shí)際數(shù)量抽題}intpick=0;//統(tǒng)計(jì)選題數(shù)量sql="selectnumberfrom"+table+"whereknowledgein("+knowledges+")";List<Integer>result=jdbcTemplate.queryForList(sql,Integer.class);while(pick<count){//選所取的范圍內(nèi)選count道試題 intnum=(int)(Math.random()*realAmout);//隨機(jī)叫號(hào) Integern=result.get(num);//根據(jù)隨機(jī)數(shù)得到相應(yīng)記錄的試題編號(hào) if(!(have.contains(n))){//判該題是否已選過 have.add(n);//未選過,則選中該題 pick=pick+1; }}。。。。。18.1.3組卷MVC控制器(1)試卷內(nèi)容顯示處理封裝

DisplayPaper存儲(chǔ)某大類試題的顯示所需信息,包括大類名稱、每小題分值、題型,每小題內(nèi)容。其中,題型用于生成解答界面的判定處理,各類試題的解答控件不同。publicclassDisplayPaper{ List<String>content=newArrayList<String>();//各小題的試題內(nèi)容

Stringname;//該類試題名稱

inttype;//試題類型

intscore;//小題分值}(2)組卷及顯示處理控制器@RequestMapping(value="/disppaper",method=RequestMethod.GET) publicStringdisplay(Modelmodel,HttpServletRequestrequest){ ExamPaperpaper=ExamPaper.gen(jdbcTemplate);//調(diào)組卷算法組卷

intlen=paper.allst.size();//求試題大類數(shù)量

DisplayPaper[]disp=newDisplayPaper[len];//存放顯示的試卷內(nèi)容

for(intk=0;k<len;k++){ Questionq=paper.allst.get(k);//第k個(gè)題型

disp[k]=newDisplayPaper(); disp[k].type=q.type; disp[k].name=getTxName(q.type);//獲取題型名稱

disp[k].score=q.score; for(inti=0;i<q.bh.length;i++)//獲取此類試題的各題內(nèi)容

disp[k].content.add(getContent(q.bh[i],q.type)); }Gsongson=newGson(); Stringx1=""; try{x1=URLEncoder.encode(gson.toJson(paper),"utf-8"); }catch(UnsupportedEncodingExceptione){ } model.addAttribute("paper",x1);//傳遞試卷的Json串用于后續(xù)判分處理等

model.addAttribute("disppaper",disp); return"display"; }privateStringgetTxName(inttype){//根據(jù)題型編碼得到題型名稱

switch(type){ case1:return"單選題"; case2:return"多選題"; case3:return"填空題"; } returnnull;}privateStringgetContent(intbh,inttype){//根據(jù)題型編碼和題型查試題內(nèi)容

Stringsql=null; switch(type){ case1://單選

sql="selectcontentfromdanxuanwherenumber="+bh;break; case2://多選

sql="selectcontentfrommxuanwherenumber="+bh;break; case3://填空

sql="selectcontentfromtiankongwherenumber="+bh;break; } return(String)jdbcTemplate.queryForObject(sql,String.class);}18.1.4試卷顯示視圖<%@pagecontentType="text/html;charset=UTF-8"%><%@tagliburi="/jsp/jstl/core"prefix="c"%><%@tagliburi="/jsp/jstl/functions"prefix="fn"%><html><body><c:setvalue="一二三四五六"var="s"/><formaction="givemark/${paper}"method=post><c:setvalue="1"var="k"/><c:forEachitems="${disppaper}"var="st"><fontsize=4face="黑體"color=red>${fn:substring(s,k-1,k)}.${}</font><fontsize=3face="宋體"color=green>(每小題${st.score}分)</font><br><c:setvalue="1"var="x"/><c:forEachitems="${st.content}"var="content"><tablewidth=98%align=centerstyle="word-break:break-all"><tr><tdalign=leftvalign=topwidth=20><b><fontcolor=blue>${x}.</font></b></td><td><pre><font>${content}</font></pre></td></tr></table><tablewidth=50%align=center><tr><c:iftest="${st.type<=2}"><c:forTokensitems="A,B,C,D,E"delims=","var="item"><tdalign=right>${item} </td><tdalign=left><c:choose><c:whentest="${st.type==1}"><inputtype=radiosize="30"name="data${k}-${x}"value=${item}></c:when><c:whentest="${st.type==2}"><inputtype=checkboxsize="30"name="data${k}-${x}"value=${item}></c:when></c:choose></td></c:forTokens></c:if><c:iftest="${st.type==3}"><TextArearows="6"cols="40"name="data${k}-${x}"></TextArea></c:if></table><c:setvar="x"value="${x+1}"/></c:forEach><c:setvar="k"value="${k+1}"/><br></c:forEach><palign="center"><inputtype="submit"name="button"value="交卷"></form></body></html>18.2閱卷處理18.2.1閱卷邏輯的方法設(shè)計(jì)

publicstaticint[]givescore(inttype, Stringanswer[],Stringuseranswer[],

intscore){//對(duì)某個(gè)題型的解答進(jìn)行判分

intsum[]={0,0}; switch(type){ case1://單選

for(intk=0;k<answer.length;k++){ if(answer[k].equals(useranswer[k])) sum[0]+=score;//累計(jì)得分

sum[1]+=score;//累計(jì)總分

} break;

……//其他類試題的閱卷處理略

} returnsum;//返回結(jié)果含大題得分和大題總分

}18.2.2閱卷控制器@RequestMapping(value="/givemark/{paper}",method=RequestMethod.POST)publicStringmarking(@PathVariable("paper")Stringpaper,Modelmodel,

HttpServletRequestrequest){ inttotal=0;//用來統(tǒng)計(jì)總分值

intgetscore=0;//用來累計(jì)用戶得分

ArrayList<String[]>allanswer=newArrayList<String[]>();//整卷的用戶解答

try{ paper=URLDecoder.decode(paper,"utf-8");//進(jìn)行URL解碼

}catch(UnsupportedEncodingExceptione){ }Gsongson=newGson(); //以下解開JSON串恢復(fù)試卷

ExamPaperp=(ExamPaper)gson.fromJson(paper,ExamPaper.class); for(intk=0;k<p.allst.size();k++){//循環(huán)處理各類題型

Questionme=p.allst.get(k);//獲取第k個(gè)大題

Stringans[]=newString[me.bh.length];//定義記錄標(biāo)準(zhǔn)答案的數(shù)組Stringusera[]=newString[me.bh.length];//定義記錄學(xué)生解答的數(shù)組

for(inti=0;i<ans.length;i++){ ans[i]=getAnswer(me.bh[i],me.type);//獲取標(biāo)準(zhǔn)答案

usera[i]=request.getParameter("data"+(k+1)+"-"+(i+1));//讀用戶解答

} intscore[]=ExamPaper.givescore(me.type,ans,usera,me.score);//評(píng)分

allanswer.add(usera);//將本大題的用戶解答加入列表中

total+=score[1];//計(jì)算整卷總分值

getscore+=score[0];//計(jì)算整卷總得分

}intlastscore=(int)(getscore*100.0/total);//將用戶得分轉(zhuǎn)百分制

model.addAttribute("score",lastscore);Stringuser=request.getRemoteUser();//取得用戶標(biāo)識(shí)

//登記用戶解答,試卷為paper參數(shù),解答為allanswer列表

Stringsql="selectcount(*)frompaperlogwhereusername='"+user+"'"; intx=jdbcTemplate.queryForInt(sql); if(x>0)//只記錄最新測(cè)試試卷,如以前有測(cè)試記錄則更新、否則插入

sql="updatepaperlogsetpaper='"+paper+"',useranswer='"+

gson.toJson(allanswer)+"'whereusername='"+user+"'"; else sql="insertintopaperlog(username,paper,useranswer)values('"+

user+"','"+paper+"','"+gson.toJson(allanswer)+"')";

jdbcTemplate.update(sql);

return"score";//用score.jsp顯示得分}18.2.3學(xué)生得分顯示視圖<%@pagecontentType="text/html;charset=UTF-8"%><%@tagliburi="/jsp/jstl/core"prefix="c"%><scripttype="text/javascript">alert("你的得分:${score}");window.location="/";//返回系統(tǒng)首頁</script>18.3查閱試卷18.3.1顯示內(nèi)容的封裝設(shè)計(jì)publicclassPaperCompare{ Stringname;//該大題的題型名稱

List<Map<String,Object>>content=newList<Map<String,Object>>();}18.3.2查卷訪問控制器設(shè)計(jì)@RequestMapping(value="/searchpaper",method=RequestMethod.GET) publicStringsearchpaper(Modelmodel,HttpServletRequestrequest){ Stringuser=request.getRemoteUser(); Stringsql="select*frompaperlogwhereusername='"+user+"'"; List<Map<String,Object>>x=jdbcTemplate.queryForList(sql); List<PaperCompare>me=newArrayList<PaperCompare>();//所有大題的數(shù)據(jù)

Gsonjson=newGson(); List<String[]>x2;//學(xué)生解答

if(x.size()>0){ ExamPaperx1=(ExamPaper)(json.fromJson((String)(x.get(0).get("paper")),

ExamPaper.class)); x2=(ArrayList<String[]>)(json.fromJson((String)(x.get(0).get("useranswer")),

newTypeToken<ArrayList<String[]>>(){}.getType()));for(intk=0;k<x1.allst.size();k++){//處理各大類題型

Questionq=x1.allst.get(k);//第k大類題型

PaperComparepac=newPaperCompare(); =getTxName(q.type); for(inti=0;i<q.bh.length;i++){//對(duì)這類試題的每道題

Map<String,Object>onest=newHashMap<String,Object>(); onest.put("content",getContent(q.bh[i],q.type));//試題內(nèi)容

onest.put("answer",getAnswer(q.bh[i],q.type));//標(biāo)準(zhǔn)答案

onest.put("solution",x2.get(k)[i]);//用戶解答

pac.content.add(onest);//將Map對(duì)象加入列表中

} me.add(pac); } } model.addAttribute("paper",me); return"searchpaper"; } 18.3.3查卷顯示視圖<%@pagecontentType="text/html;charset=UTF-8"%><%@tagliburi="/jsp/jstl/core"prefix="c"%><%@tagliburi="/jsp/jstl/functions"prefix="fn"%><html><body><c:setvalue="一二三四五六"var="s"/><c:setvalue="

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論