題目描述:##
我們在個人作業1中,用各種語言實現了一個命令行的四則運算小程序。進一步,本次要求把這個程序做成GUI(可以是Windows PC 上的,也可以是Mac、Linux,web,手機上的),成為一個有基本功能、一定價值的程序。在下面的功能需求中實現兩個:
- 記錄用戶的對錯總數,程序退出再啟動的時候,能把以前的對錯數量保存並在此基礎上增量計算。
- 有計時功能,能顯示用戶開始答題后的消耗時間。
- 界面支持中文簡體/中文繁體/英語,用戶可以選擇一種.
簡單的分工說明:(兩人組)##
畢川:###
- 負責算法的設計,中綴表達式的計算。(原因)在第一次個人作業中,我舍友說:“我點了你的鏈接,我輸入了10000道題......誒,你的服務器好像崩了!!!!!!,用戶體驗太差”吸取上次的教訓,決定改變一下自己用程序生成式子和計算結果這種方式。所以我們討論決定用題庫的方式解決速度慢的問題。原本想在網上找一下題庫的,找了很久都只有題沒有答案,所以決定用算法自己算答案。
- 記錄用戶的對錯總數,程序退出再啟動的時候,能把以前的對錯數量保存並在此基礎上增量計算。
我:###
- 界面支持中文簡體/中文繁體/英語,用戶可以選擇一種.
- 有計時功能,能顯示用戶開始答題后的消耗時間。
最后封裝成一種替代第一次作業中生成題目的方法(也就是從數據庫中取)。
實現過程:(我)##
- 界面支持中文簡體/中文繁體/英語,用戶可以選擇一種
對於這題,我畫了一個簡單的表面流程圖,描述了這個切換語言的過程。(無技術基礎看)
關於具體實現過程參考下面的執行過程:(有技術基礎看)
流程圖分解說明:
(1)語言單選框點擊事件的發生,使用的是jquery中的click方法觸發####
(2)lanaguage參數設置為三個,也就是單選框的value值,分別對應簡體中文simpleChinese,繁體中文traditionalChinese,英語English。####
(3)使用ajax異步傳輸####
/*
firstPage1:表示第一個頁面從上往下第一個文字語言需要動態變化的位置
firstPage2:表示第一個頁面從上往下第二個文字語言需要動態變化的位置
result.firstPage1:表示從后台獲取的對應語言對應位置的配置文件內容
result.firstPage2:表示從后台獲取的對應語言對應位置的配置文件內容
*/
<script type="text/javascript">
$(function(){
var lanaguage1=$('input:radio:checked').val();
$.ajax({
dataType:"json",
type:"post",
data : {
lanaguage : lanaguage1
},
url : "LanguageServlet?page=firstPage",
success : function(result) {
$("#firstPage1").html(result.firstPage1);
$("#firstPage2").val(result.firstPage2);
}
});
});
</script>
(4)根據傳入的語言參數,用properties對象的方法加載對應的語言配置文件的內容####
由於涉及三種語言,所以設置了三個配置文件,分別是simpleChinese。properties,traditionalChinese.properties,English.properties.大概的內容如下圖
/*
加載語言配置文件代碼
*/
if(lanaguage.trim().equals("simpleChinese")){
InputStream inputStream= Test.class.getClassLoader().getResourceAsStream("simpleChinese.properties");
prop.load(inputStream); ///加載屬性列表
}
else if(lanaguage.trim().equals("traditionalChinese")){
InputStream inputStream= Test.class.getClassLoader().getResourceAsStream("traditionalChinese.properties");
prop.load(inputStream); ///加載屬性列表
}
else{
InputStream inputStream= Test.class.getClassLoader().getResourceAsStream("English.properties");
prop.load(inputStream); ///加載屬性列表
}
String firstPage1=prop.getProperty("firstPage1");
String firstPage2=prop.getProperty("firstPage2");
(5)獲取內容轉化為JSON並返回頁面####
/*
PrintWriter pw = response.getWriter();
JSON用到的包是阿里巴巴的fastJSON.jar
*/
Map<String,String>map=new HashMap<>();
map.put("firstPage1", firstPage1);
map.put("firstPage2", firstPage2);
String json=JSON.toJSONString(map);
pw.print(json);//返回數據
(6)在用jquery中的html方法在對應的地方填充JSON數據也就是第(3)中success成功后中的方法。####
以上就是功能一的全部描述。
- 有計時功能,能顯示用戶開始答題后的消耗時間。
(1)對於這一功能我也畫一個非常簡單流程圖表示####
(2)具體實現過程####
(該功能沒有使用數據庫,利用cookie功能實現存儲,存儲時間為一年)
①設置了一個TimerReturn類來表示(便於數據處理)
②前端js主要時間代碼(百度而來,修改了一點點,本應附上鏈接后面沒找到(PS:如有侵權告知刪除))
/*
timeShow為顯示時間的位置。
document.getElementById("time").value=two_char(h) + ":" + two_char(m) + ":" + two_char(s);
由於時間不在答案提交的form中,所以使用form中添加<input type="hidden" id="time" name="time">進行所需的時間提交
*/
<script>
function two_char(n) {
return n >= 10 ? n : "0" + n;
}
function time_fun() {
var sec=0;
setInterval(function () {
sec++;
var date = new Date(0, 0)
date.setSeconds(sec);
var h = date.getHours(), m = date.getMinutes(), s = date.getSeconds();
document.getElementById("timeShow").innerText = two_char(h) + ":" + two_char(m) + ":" + two_char(s);
document.getElementById("time").value=two_char(h) + ":" + two_char(m) + ":" + two_char(s);
}, 1000);
}
</script>
③后台進行返回結果的處理,把結果session並且把結果存儲到cookie中。
String time=(String)request.getParameter("time");
List<TimerReturn>timeList=(List<TimerReturn>) request.getSession().getAttribute("timeList");
if(timeList==null){
timeList=new ArrayList<>();
}
TimerReturn timeReturn=new TimerReturn(list.size()+"",time,list.size()-count+"",count*1.0/list.size()*100+"%");
timeList.add(timeReturn);
request.getSession().setAttribute("flag", "true");//控制前端時間記錄的表頭是否顯示,如果沒有獲取到flag則不顯示
request.getSession().setAttribute("timeList", timeList);
/*
寫入Cookie
*/
boolean flag=true;//用於判定是否是第一存入cookie,true表示第一次存
for(int i=0;i<c.length;i++){
if(c[i].getName().equals("timeList")){
String totalTimeList=c[i].getValue()+"M"+perTimeList;//用M拼接每次的結果
Cookie c1=new Cookie("timeList", totalTimeList);
c1.setMaxAge(3600*24*30*12);//設置cookie存在時間單位s
response.addCookie(c1);
flag=false;
}
}
if(flag==true){
Cookie c1=new Cookie("timeList", perTimeList);
c1.setMaxAge(3600*24*30*12);
response.addCookie(c1);
}
④前端用c標簽獲取
<c:forEach var="Result" items="${timeList}">
<c:if test="${!empty Result.time}">
<tr>
<td>${Result.totalCount}</td>
<td>${Result.time}</td>
<td>${Result.errorCount}</td>
<td>${Result.correctRate}</td>
</tr>
</c:if>
</c:forEach>
效果動圖:##
附上具體的網頁鏈接:我也自己試試
結對細節##
事前討論的代碼規則
- 變量命名的規則:以變量的功能命名,使用完整的英文描述,采用駝峰命名法。
- 函數傳參過程中盡量采用形式傳值
- 花括號“{}”不允許省略,即使只有一段代碼。
- 使用括號“()”來強調運算符優先級。
- 記得格式化代碼,eclipse里面Ctrl+Shilft+F
代碼共同提交記錄
實驗總結##
-
實驗方面的不足:
- 雖然出題的速度可以比第一次作業快很多,但是沒有找很多題庫(但是有時間應該是不成問題的)只有390+題。
- 前端技術差,沒有好的排版(也沒有找一個好的樣式)。
- 本可以不跳轉頁面都用ajax的,然后沒有改。
-
結對方面不足:
- 雖然之前一起合作過,但是還是缺乏更多的交流,和事前的討論,以至於在編程方面都修改了某個東西,后面整合出了問題。后面還是把計時和錯誤的統計結合在一起。
- 太缺少一起開發的經歷,以前都是一個人做完。除非一些項目結構,每一部分沒有什么聯系的一起開發還可以。
- 命名方面還是需要事先規定,有的命名還是不夠清晰,以至於隊友看不懂。
- 簡單的項目我認為1+1不一定大於1,但是項目稍微大的,1+1一定大於2,兩個人的考慮總比單獨的兩個人更周全。
-
對隊友的看法:
- 合作中沒有遇到意見不一致,討論的結果都是兩個人贊同的。
- 隊友的實力是非常強的,而且速度快,合作過程中遇到問題一起討論,然后交流自己的意見,說出自己方案的優缺點,然后選擇一種較好的方案一致通過。
- 如果要說建議的話,在后面合作中遇到不合了才能提出,這次合作上沒有遇到什么不合的地方。
- 對隊友說的話就是:合作愉快。
-
遇到的問題:
- 在cookie拼接的時候本來用了||分割每次要存儲的結果。可是在java提取時,用split()分割時被當成了特殊符號,一直沒有成功,后來經過檢查發現,最后用一個不會涉及到的字符M來分割,就可以了。
- 在數據庫寫入時,一直沒有寫入成功。也沒有錯誤,苦惱了很久,后面重啟了一下IDE,然后就。。。。。成功了。這種莫名其妙的問題經常遇到。