项目零散知识积累(一)

一 : oracle与MySQL一个简单的细节对比


         oracle :  由于oracle在解析sql语句的时候,是从后往前的,所以连接表的时候,a.id = b.aid ,其中b表为小表。where子句解析顺序从前往后,并且解析之前,优先进行连表过滤,在进行条件过滤。


         MySQL : 从前往后解析的,b.aid = a.id ,其中b表为小表。where子句解析顺序也是从前往后的,这个顺序跟组合索引相关,并且跟一个条件过滤多少条记录有关,当然一个条件过滤的越多越应该放在前面,这个过滤得越多,也就是选择性大。但是选择性不是唯一条件,因为要考虑实际项目的值得分布情况,以及被使用的频率。


二 : 需求,把考生端登录信息记录下来(url,租户编号)并显示在管理端页面。


     在考生登录考生端时,在后台的controller中,参数是HttpServletRequest。当然这个取值的过程可以在controller中进行,但是最好还是简洁些,把参数传入到Service层,在ServiceImpl中进行取值。

    String serverName = request.getServerName;

    String serverPort = request.getServerPort;

    String contextPath = request.getContextPath;

    String url = "http://" + serverName + contextPath + serverPort ;拼接成自己想要的形式。


三 : 项目中一个简单逻辑。


    当考生点击,开始考试,Angularjs通过注入的http服务,去后台异步请求。getAnswerStructureList和getQuestionView,其中getAnswerStructureList还会获取有关考生登录地址,所使用的浏览器信息获取并写入考试记录表中,表示考生事件(开始考试和退出考试)。


   假如是自己获取考生相关信息,应如何做?


   首先,自己并没有一个完整的思路,也就是一开始自己没有相关解决方案,这个时候应立即抽象出关键字去搜索。而这个关键是什么,则先问问自己的需求什么?自己想要的是什么?java 用户ip地址;java 用户浏览器获取;java 用户浏览器获取;看看别人是怎么取出来的。比如别人用了什么工具?UserAgentUtils-1.2.4.jar。UserAgent,Browser,OperatingSystem。


四 : javascript处理"对象"。

   

     for循环中希望一个时间,在每次取值时,不希望它变化,可是不小心这个时间的获取是通过new。var time = new Date();for () { time1 = time ; time1 = time2 }这个时候由于time是个对象,当time1变化的时候,time也跟着变化。有些时候,项目中自己是很难发现这个小细节的。找到问题原因了,解决办法也就好想了。这个固定的时间变量,每次取得时候,都应new一个新的并把时间放进去。


     var startTime = "2017-4-15";

     for循环中,startTime1 = new Date(startTime);


五 : 对$.jheartbeat理解。

 

     如果一开始并没有接触过,那么请立即搜索,$.jheartbeat。会发现这个使用也是非常简单的,所以呀很多没有见过的东西,别怕,别急,也就那么回事,如果东西很复杂,想必做出来也没有多少人使用。


     这是jquery的插件。jhertbeat.js,定时执行任务,而且代码都模式化,可以先不用管具体细节,拿来用了再说。慢慢地就理解这个东西是咋回事了。


     设置好,访问后台的path。(走哪个controller)

     delay:5000

     div_id:"div_heartbeat"


     项目使用逻辑。在考试中,也就是状态为ing时,每隔5秒发送一次请求,后台响应为,但是什么数据都不响应回来。只要前台接受到响应,证明是处于连接状态,并拼接一个div,当处于"断网"时,利用相关文字信息进行显示提示。无响应时,div中没有文字信息即可。


     在$.ajax中进行处理。

     error:function(e) {$('#' + $.jheartbeat.options.div_id).append("Error Request Data") }

     success:function(data){$('#' + $.jheartbeat.options.div_id).html(data))}


六 : 项目中模板的一个细节漏洞


     修改模板模板信息后组卷,系统提示null。对于DML时,我们常把更新和插入放在一个方法中,但是这就需要每次都进行一个简单的判断。即使是个简单判断,项目中的大神在写个这个逻辑的时候,也犯错了。


    原逻辑,未判断当前是否为更新操作。因为,原逻辑在保存模板信息前,这个模板是没有的。所以一开始:template.getTemplateId()等于null。但是,作修改时,非null,则必须把原来的信息也一并取上。


    再次细节:如果更新和插入写在一个方法里,得注意进行必要的判断,Service层和DAO层都必须进行判断。并思考,更新时哪些数据被遗漏了,又是怎么被遗漏的?


七 : 项目中对删除试卷的逻辑少一个校验


   一份试卷想要被删除,那么这份试卷是不被任何实体所引用的,这是最基本逻辑。


   项目中最开始得校验,只考虑到这份试卷被考试(制定一场考试)所用后,那么这份试卷是不能被删除的,其实在最开始也应该考虑到这份试卷同样被参考者所使用(引用),那么同样也是不能被删除的。也就是最开始,他在思考逻辑的时候,考虑的并不是那么完整,因为这份试卷被一场考试所引用,然后项目中也有这样的功能,这份被引用的试卷也是可以被换下来的,那当换下来之前,这份试卷被参考者所引用呢?最初的逻辑,这份试卷也是可以被删除的,因为应用程序逻辑只针对试卷是否被一场考试所引用的校验。所以不管以后新增什么功能,这个逻辑还是应该有的。


八 : ajax异步请求的数据,获取下来,然后再js中定义一个全局变量,这个变量的值为ajax异步请求的。


   首先,Angularjs 中的ajax并没有同步数据这个功能,所以这种思考方式是错误的,后面再做信息统计的时候,也有这种想法,并验证了这种方式是错误的。由此知道,javascript也是可以获取session的。混写。那么这个时候,就需要跳出原来的思维了,寻求另一种解决办法。


九 : 项目中的一个逻辑记录。


    如果当前考试未被强制交卷,当点击下一题时,一是,save_answer;二是,getQuestioView。而这个save_anser 是 AngularJS 中自定义服务写的一个方法,它做了什么呢?它先把答案缓存到AnswerContainer,如果被强制交卷的话,则返回'false',if(!data.success) { end_exam()}。而且项目中,gotoQuestion方法逻辑也很复杂,既要考虑是怎么跳的?又的做好答案缓存,以及是否结束考试。并且,这个gotoQuestion在很多地方都被用到。



十 : 项目交卷的方式记录以及修改了的gotoQuestion方法


   交卷方式:手动交卷 、 强制交卷 、 锁屏次数达到配置的次数时自动交卷 、 自动交卷。

   手动交卷 : 当考生在答题完成时,点击交卷按钮,项目中执行相应的方法,end_exam,方法中并且会调用gotoQuestion方法,在这里,应该是保存最后答的一题,因为相对最后一题来说,它没有最后的一题了,所以在交卷的时候,调用一次gotoQuestion方法,然后根据考试的配置信息,是否给考生看成绩,调到相应的页面。


   强制交卷 : 当考生在答题过程中,管理端的老师进行当前学生强制交卷后,正常情况下,该考生会点击下一题时,系统自动交卷,并调到相应页面。那这个过程,项目做了什么呢?首先当考生点击下一题时,会去后台将答案进行缓存,并响应回来,上面第九条中也说明了,缓存答案的方法是gotoQuestion 中save_answer,它根据判断是否为强制,如果是则执行end_exam方法。所以在gotoQuestion方法中传入一个operation参数,根据这个operation进行相应的end_exam方法,这个operation有,正常的changeQuestion,有endExam,有autoEndExam。


   锁屏次数交卷 : 项目中根据考生进入考试中,然后考生退出当前窗口时,记录一次离开信息,当离开的次数达到设置时,则系统进行交卷。listenScreen.js中进行控制,调用autoEndExam方法


   自动交卷 : 当考试时间到了,系统自动交卷。并弹到考试时间用完页面,当点击退出考试时,执行退出当前页面操作。clock.js中对时间进行管理,当时间到了,调用autoEndExam方法。

  

   分析 :

      第一,在js定义一个全局变量,并在ajax相应数据回来进行赋值,这种方式是错误的,而且方向就错了,因为我想要的值,本来就存在当前页面中了,我可以随时取就行,为什么我会多此一举,并且这个多此一举本身就是错误的。


      第二,修改gotoQuestion方法的参数,也就是添加一个参数条件。并在程序中进行判断执行,满足不同的条件,进行相应的结束考试,这种思维方式要学习。


      第三,接触多了,会发现,这些个程序项目呀,对于判断那还是相当重要的,感觉很多逻辑都是判断呀,比如运营商和普通租户就是一个判断,根据你是谁,然后执行相应的方法。gotoQuestion中的operation判断,根据你是changeQuestion呢?是endExam还是autoEndExam?而进行相应的逻辑代码。这里随便举个例子而已,所以以后写程序代码的时候,抓关键点也就是不同或者叫做分类抑或异同,然后执行相应逻辑。几乎都是这样子的。


      第四,当在完成一个小功能时,一个自己认为正常的逻辑方法应该可以满足自己想要的需求,但是尝试了很久,发现依然不行,那么这个时候,应立即停下来,想想,为什么不行?必须快速跳出原有思维,寻求另一种解决方法,或者说同一种解决思维的不同表达方式。记住,一定要及时跳出原有思路。不然,花了时间,依然没有解决问题。


十一 : javascript的一个小知识


   javascript可以获取session的。


   javascript支持加强for循环。而且java一般也会尽量要求使用加强for循环代替原来的循环方式,其实for的加强循环底层是利用的迭代器。


   这个记录,原于项目中,老是报当前的某个方法,not a function。并且原有的for循环方式是老式的那种,然后跳出原有思维,采用同一种思维的不同表现形式,那就是采用加强for代替,就没有报 not a function 了。在这之前,也遇见过,有些浏览器不走 if , 然后跳出思维,找到同一种解决方法的不同表现形式,既然不走if 那就让你走 else  ,结果浏览都正常实现我的功能了。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值