黑马程序员技术交流社区

标题: 继上一个jsp问题引发的新问题!!高手请进哦!!!! [打印本页]

作者: 安路凤    时间: 2012-6-8 14:38
标题: 继上一个jsp问题引发的新问题!!高手请进哦!!!!
http://bbs.itheima.com/thread-16465-1-1.html
能解决问题的奉上金钱30
这是上一个问题的链接  我已经解决了一半
我把每一个选项 通过 ajax 用HashMap存起来
但是不晓得是我没能存储成功,还是我取的时候有问题,就是显示空指针
现在把问题贴出来 各位高手帮忙看看
这是选择题答题页面
  1. <%
  2. request.setCharacterEncoding("utf-8");
  3. PageBean pageBean=new PageBean();
  4. String condition=(String)session.getAttribute("condition");
  5. session.removeAttribute("condition");
  6. if(condition==null)
  7. {
  8. condition="";
  9. }
  10. int pageNum=2;
  11. int currPage;
  12. String url="exam_1.jsp";
  13. if(request.getParameter("pages")==null)
  14. {
  15. currPage=0;
  16. }
  17. else
  18. {
  19. currPage=new Integer(request.getParameter("pages")).intValue();
  20. }
  21. System.out.println("here is currPage!");
  22. pageBean.setCondition(condition);
  23. pageBean.setCurrPage(currPage);
  24. pageBean.setPageNum(pageNum);

  25. session.setAttribute("pageBean", pageBean);

  26. Map map = null;
  27. if(session.getAttribute("test") != null)
  28. {
  29. map = (Map)session.getAttribute("test");
  30. }

  31. Convert con=new Convert();
  32. String t_type=(String)session.getAttribute("t_type");
  33. QuestionDO qus=new QuestionDO();
  34. List<QuestionInfo> list=qus.findQuestion(pageBean);
  35. int start=currPage*pageNum;
  36. int end=start+pageNum;
  37. if(list!=null && list.size()>0)
  38. {
  39. for(int i=start;i<end;i++)
  40. {
  41. QuestionInfo info=new QuestionInfo();
  42. info=list.get(i);
  43. %>

  44. <p>第<%= info.getId()%>题. <%= con.toGbk(info.getQuestion())%>()

  45. A.<input type="radio" name="t<%=info.getId()%>" value='a' <%= QuestionUtil.getResultByQid(map,info.getId().toString(), "a") %>> <%= con.toGbk(info.getAs1())%>
  46. B.<input type="radio" name="t<%=info.getId()%>" value='b' <%= QuestionUtil.getResultByQid(map,info.getId().toString(), "b") %>> <%=con.toGbk(info.getAs2())%>
  47. C.<input type="radio" name="t<%=info.getId()%>" value='c' <%= QuestionUtil.getResultByQid(map,info.getId().toString(), "c") %>> <%=con.toGbk(info.getAs3())%>
  48. D.<input type="radio" name="t<%=info.getId()%>" value='d' <%= QuestionUtil.getResultByQid(map,info.getId().toString(), "d") %>> <%=con.toGbk(info.getAs4())%>
  49. <%
  50. }
  51. }
  52. %>

  53. <p align="center">
  54. <%=Pagination.getPaginationScript(pageBean.getCurrPage(), pageBean.getPageNum(), pageBean.getRecordNum(), pageBean.getCondition(), url) %>

  55. <p><input type="submit" value="提交答案">
  56. </form>
  57. </div>
  58. </body>
  59. <script type="text/javascript" src="js/jquery-1.4.2.js"></script>
  60. <script type="text/javascript">
  61. $(function(){
  62. $("input[type=radio]").click(function(){
  63. //alert("题号:" + $(this).attr("name") + "答案:" + $(this).val());
  64. var qid = $(this).attr("name");
  65. var correct = $(this).val();
  66. //提交状态
  67. $("#s"+qid).html("loading");
  68. $.post("ajax/questionSubmit.jsp?qid="+qid + "&correct="+correct,function(date,state){
  69. if(state == "success"){
  70. $("#s"+qid).html("ok");
  71. //alert(date);
  72. }
  73. else{
  74. alert("网络繁忙请稍候重试!错误信息"+state);
  75. }
  76. });
  77. });
  78. });
  79. </script>
复制代码
以下是ajax页面
  1. <%
  2. Long qid=Long.parseLong(request.getParameter("qid"));
  3. String correct=request.getParameter("correct");
  4. QuestionInfo q=new QuestionInfo();
  5. q.setId(qid);
  6. q.setCorrect(correct);

  7. if(session.getAttribute("test")==null)
  8. {
  9. Map map=new HashMap();
  10. map.put(qid, q); //键——值
  11. session.setAttribute("test", map);
  12. }
  13. else
  14. {
  15. Map map=(Map)session.getAttribute("test");
  16. map.put(qid, q);
  17. session.setAttribute("test", map);
  18. }
  19. %>
复制代码
答题页面会提交到result.jsp
请问在这里该怎么取值呢???我要在这个页面与数据库对比答案并给出得分


作者: 符云爵    时间: 2012-6-8 15:55
<script type="text/javascript">
$(function(){
$("input[type=radio]").click(function(){
//alert("题号:" + $(this).attr("name") + "答案:" + $(this).val());
var qid = $(this).attr("name");
var correct = $(this).val();
//提交状态
$("#s"+qid).html("loading");
$.post("ajax/questionSubmit.jsp?qid="+qid + "&correct="+correct,function(date,state){
if(state == "success"){
$("#s"+qid).html("ok");
//alert(date);
}
else{
alert("网络繁忙请稍候重试!错误信息"+state);
}
});
});
});
</script>


红色部分是不是错了?   jq实现异步的post方法参数不是那样传的好像$.post("url",{"参数名":"参数值","":""... ,function(data){//   }});   参数部分在{}中,键值对的方式,多个参数之间用逗号分开。 我同事负责web开发的说你那样传参也可以,我没试过不知道,以前我学jsp的,现在都负责android开发,半年多没接触web的东西了有些忘却。 funtion中的date返回值是从jsp的out对象得到的,你应该在ajax页面中用out.write()方法把结果进去,data就是out.write()写入的内容。   有错的地方还希望指出。
作者: 安路凤    时间: 2012-6-8 16:29
符云爵 发表于 2012-6-8 15:55
$(function(){
$("input[type=radio]").click(function(){
//alert("题号:" + $(this).attr("name") + " ...

我现在解决这个问题了
我把ajax页面里面的改成了这样子的map.put(aid,correct)
直接放了一个String参数 而没有采用q这个对象 所以取得时候直接取出来的就是答案了
其实放q也是可以的但是我不晓得怎么取出来   
不过我传参这里没有错哦  这么些也是可以的哦  
作者: 安路凤    时间: 2012-6-8 16:31
<%
List<UserInfo> user =(List<UserInfo>) session.getAttribute("userlist");
if(user==null)
{
  response.sendRedirect("login.jsp");
}
String t_type=(String)session.getAttribute("t_type");
QuestionDO q=new QuestionDO();
List<QuestionInfo> list=q.findAnswers();
Map map = (Map)session.getAttribute("test");
int n=0;
//String m=(String)map.get(1);
//out.println(m);
if(list.size()>0)
{
  for(int i=0;i<list.size();i++)
  {
   QuestionInfo info=list.get(i);
   if(info.getCorrect().equals(map.get(info.getId())))
    n++;
  %>
   <ul style="list-style: none;">
   <li>正确答案<%=info.getCorrect() %></li>
   <li>您给出的答案<%=map.get(info.getId()) %></li>
   </ul>
  <%
  }
}
这里就是我的最终解决办法啦 !!我已经运算出来啦!!!

作者: 符云爵    时间: 2012-6-8 17:30
安路凤 发表于 2012-6-8 16:29
我现在解决这个问题了
我把ajax页面里面的改成了这样子的map.put(aid,correct)
直接放了一个String参数  ...

明白了,前面是没看明白问题在哪:L   jq练的还是少,着实没用过你那样传参的方法,看来我同事是对的,你也是对的。用String没问题,那QuestionInfo肯定也没问题,取的方法也一样,或许你指定HashMap的具体类型看看HashMap<Long ,QuestionInfo> map = new HashMap<Long ,QuestionInfo>();

给你提点建议:
1. jsp页面中最好不要出现java逻辑代码,直接操作后台数据库的更不能出现,存在不安全性,特别是你使用了EL标签;
2. 学jsp时老师强烈要求不要使用EL标签,不知为何,代码阅读性灰常差,一开始来公司时看前面的人写的jsp页面,一页面接近7,000行的代码,整个都是EL标签,那尖括号匹配起来是灰常的难找,看到你想砸电脑,至今印象深刻。 后边学到struts2时,s标签是不支持EL标签的,不能一起使用,只有jstl标签支持,我们老师是推荐使用c标签的;
3. 不是学了SSH么,多练练好。
作者: 安路凤    时间: 2012-6-8 20:42
符云爵 发表于 2012-6-8 17:30
明白了,前面是没看明白问题在哪   jq练的还是少,着实没用过你那样传参的方法,看来我同事是对的,你 ...

嗯确实是学了ssh了,但是这个作业要求的是要使用javaBean和jsp做,也就是不要用到三大框架,所以就这么写了。
其实很多人都说过了不要在前台里面写java逻辑代码,那想要体现到jap页面上该怎么写呢???
我一直不知道要怎么样去写   纠结的要命
作者: 符云爵    时间: 2012-6-9 19:03
安路凤 发表于 2012-6-8 20:42
嗯确实是学了ssh了,但是这个作业要求的是要使用javaBean和jsp做,也就是不要用到三大框架,所以就这么写 ...

酱紫啊。。或许可以用servlet,如果servlet也不需要用到那只能像你这样写了:L
即是说,不要在jsp直接操作数据库,比如查询,删除,插入,更改,也不要出现业务逻辑,在jsp只处理结果,像你作业的这种情况,查询的代码应该在后台的java代码中操作,查询到集合再返回到jsp页面,再循环和用户的答案进行比较打分。
作者: 安路凤    时间: 2012-6-9 19:50
符云爵 发表于 2012-6-9 19:03
酱紫啊。。或许可以用servlet,如果servlet也不需要用到那只能像你这样写了
即是说,不要在jsp直接操作 ...

我专门写了一个DAO用以连接数据库 还有一个JavaBean专门负责处理数据
之后是业务层负责return 数据 这样子行不
作者: 符云爵    时间: 2012-6-9 20:34
安路凤 发表于 2012-6-9 19:50
我专门写了一个DAO用以连接数据库 还有一个JavaBean专门负责处理数据
之后是业务层负责return 数据 这样 ...

= =我不敢说不可以咯,功能怎么样都能实现的,区别在于你项目的框架是怎么设计的。
如果你用的MVC模式+DAO模式的话这样还少一个层,C层,就是控制器层,用来操作业务逻辑层,也就是BIZ。
模式要搞清楚了,DAO和BIZ都属于M层:
其中,DAO是直接与数据库打交道的,一般来说就4种动作,增删改查;  
而BIZ是用来处理复杂的业务的,负责与DAO打交道,比如一个业务需要有多种数据库动作,那在这里可以调用多个DAO来进行处理。
控制器层负责与BIZ打交道,由servlet,struts2中的action来实现(目前我就知道这两种,也只学过这两种),同理一个控制器可以包括多个业务,可以调用多个BIZ进行处理,处理结果返回给V层,也就是jsp,进行处理后显示给用户。
以上是我学习MVC,工作上,对这个框架的见解,不知与你学的是否有出入?
作者: 安路凤    时间: 2012-6-9 20:42
符云爵 发表于 2012-6-9 20:34
= =我不敢说不可以咯,功能怎么样都能实现的,区别在于你项目的框架是怎么设计的。
如果你用的MVC模式+DA ...

我们一样的  刚开始写的时候考虑的不是很周到,所以这个项目完成后正在一点点的改
现在改的有点模样了 分出 mvc  了呵呵
作者: 符云爵    时间: 2012-6-9 20:53
安路凤 发表于 2012-6-9 20:42
我们一样的  刚开始写的时候考虑的不是很周到,所以这个项目完成后正在一点点的改
现在改的有点模样了 分 ...

多练练就熟悉了。框架是开始项目前就得设计好,不能后期再做修改。 不管是分模块开发还是分层开发,只要框架搭建好了,就容易管理了。如果是大项目,后期再改就完蛋了,想象一下都觉得恐怖。   要不怎么说jsp比其它语言开发前期更繁琐,后期维护简单呢,加了框架那些确实文件要多多了,开发时你都会觉得好多东西是重复的,比如DAO和BIZ,完全可以舍弃掉一层,但它是有必要存在的。 在后期维护上,查找问题起来很简单,因为层次分得很清晰,修改起来也简单。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2