//LoginAction.java
package netstore.web.security;
import org.apache.struts.action.Action;
import javax.servlet.ServletContext;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForm;
import javax.servlet.http. HttpServletRequest;
import javax.servlet.http. HttpServletResponse;
import netstore.dao.CustomerDAO;
import netstore.dao.impl.hibernate.CustomerDAOImpl;
import netstore.framework.NetstoreBaseAction;
import netstore.model.service.INetstoreService;
import netstore.model.businessobjects.Customer;
import netstore.framework.SessionContainer;
import netstore.framework.exceptions.InvalidLoginException;
import netstore.framework.util.IConstants;
/** 如果此用户不存在,则customer为null,即用户验证失败,此时应该返回给登陆页面
*但是此时的返回值却没有体现这一点??????????????
*
*该类的基类NetstoreBaseAction是何时如何初始化的?????????????
*/
public class LoginAction extends NetstoreBaseAction {
public ActionForward execute(ActionMapping mapping,ActionForm form,
HttpServletRequest request,
HttpServletResponse response)throws Exception{
String email=((LoginForm)form).getEmail();
String password=((LoginForm)form).getPassword();
INetstoreService service=this.getNetstoreService();
//获取servlet上下文
ServletContext servlet=this.getServlet().getServletContext();
SessionContainer container=getSessionContainer(request);
//CustomerDAO test=new CustomerDAOImpl();
//Customer customer= test.findCustomer("ghsea@126.com","fish");**********1/
System.out.println(email);
System.out.println(password);
// Customer customer= test.findCustomer(email, password);************2/
if(service==null){
System.out.println("The Service is NULL;");
}
Customer customer=service.authenticate(email, password);***********3/
/* 只是利用适配器模式改变了接口,为什么利用原始的接口验证用户能够正常进行,改变接口后却
* 查找不到用户?问题出在哪里?
*/
//如果customer为null,容器将会抛出InvalidLoginException(),path="/security/signin.jsp"
//如果此用户不存在,则customer为null,即用户验证失败,此时应该返回给登陆页面
//但是此时的返回值却没有体现这一点??????????????,这一点在struts-config.xml
//中配置实现了一个全局异常,但是这个功能现在并没有正常运行???
//将该用户保存到SessionContainer
container.setCustomer(customer);
return mapping.findForward(IConstants.SUCCESS_KEY);
}
}
Customer customer=service.authenticate(email, password);是最初的验证用户的方法,authenticate(email, password)这个接口适配了findCustomer(email, password);这个接口。奇怪的是,单独对findCustomer( )进行测试时
能够验证出用户(ghsea@126.com,fish),但是方法2和方法3却找不到这个用户,只有方法1可以找到这个用户。方法1可以找到用户方法2不能找到用户,那么只有一种可能,方法2中的两个参数并不是(ghsea@126.com,fish),这两个参数是以signin.jsp->LoginForm->LoginAction这样的流程传过来的,LoginForm只是简单将jsp页面传来的数据封闭,应该不会有问题,那么问题应该出在signin.jsp,这个页面中的两个数据通过一个text,一个password输入框提供参数,由于每次测试时,只是简单的从抛出异常的页面退回到signin.jsp没有重新输入数据就提交数据,这个页面提交的并不是第一次输入的正确数据,而是默认数据(password框有一个默认值),因此方法2找不到正确的用户。那么方法3的问题出在哪儿呢?
观查Tomcat,里面打印出了ghsea@126.com,fish这样的正确信息,那么方法3的两个参数是没有错误的,方法3这个接口里面封装的一个利用Hibernate查找用户的接口,但是运行这个方法后Tomcat里面竟然没有任何Hibernate的执行过程,那么
方法3是否执行过就值得怀疑了,页面抛出的异常指示方法3这一行抛出了NullPointerException,于是该怀疑是不是由于
service本身就是null,其实早就该怀疑是这个问题,但是此前却一直考虑这个异常是由authenticate( )方法内部抛出的,这是不应该的,因为通过分析authenticate( )方法所封闭的方法findCustomer(email, password)的源码很容易发现,这个方法内部根本不会抛出空指针异常,充其量只是抛出一些自定义异常。OK,为了验证这个异常是不是由service本身就是null造成的,添加一行if(service==null){System.out.println("The Service is NULL;");}测试一下,结果tomcat下果然显示了The Service is NULL;,由此可以确定问题的根源INetstoreService service=this.getNetstoreService();这一行抛出了空指针异常,整个应用的初始化出现了问题。
查找这个问题的根源花费了几个小时,这其中还包括返回去,测试DAO层的findCustomer(email, password);这样的基础方法,结果表明这个方法最初也是不能正常执行的(非方法本身的问题,是其他DAO层的问题造成的)。在确信DAO层的这些方法能够正常执行后,再来分析这些WEB层的流程,就可以把分析的范围大大缩小,否则这些程序一层包一层,整个执行流程历经多个层,你如何能找得出问题的根源出在哪里,唯一的方法是“各个击破”。因此,这个经历该使自己重视应用开发过程中的测试了吧,即使只是写一些简单的包含main()方法的test类或者是像这个程序里面打印一些信息那样,不管怎么样,你自己要确信整个应用中哪些地方是不会出问题的(或者说基本不会有问题的),这样,在出现新问题,你去查找问题的根源时才会有的放矢,并且拥有一定的信心,否则,你只能放弃整个应用的进一步调试,因为你根本不可能找出问题所在。
分享到:
相关推荐
当第一次接触到“全国大学生数学建模竞赛”这个名字时,即便作为数学专业的学生,也对其知之甚少。随着对这一赛事的进一步了解,得知它是全国四大重要赛事之一,这激发了参与者的兴趣与动力。参赛不仅意味着能够在...
尽管学校已通过宣传标语提醒学生减少一次性用品的使用,但收效甚微。 调查目标旨在理解大学生的一次性用品使用情况及他们的环保意识。通过对大学城200名大学生进行问卷调查,发现近70%的学生每天都会使用一次性用品...
标题中的“【①古今中外,对水的比拟甚多。一句......阅】阅兵是古今中外.docx”似乎与实际内容无关,因为文件描述和部分内容并没有提及“阅兵”或与军事相关的主题,而是围绕水的比喻展开,讨论了以水为鉴的人生...
【甚高频系统原理及调试详解】是一份深入探讨无线电通信技术的专业文档,主要针对甚高频(Very High Frequency,VHF)这一频段的系统设计、工作原理和调试方法进行了详尽阐述。这份演示文稿共计49页,涵盖了丰富的...
一次性水分测定纸盒,作为其中的佼佼者,不仅在科研领域大放异彩,同样在教育环节中扮演着关键角色。今天,我们就来深入了解这一独特的学习工具,探究其在教育科研中的应用与价值。 一次性水分测定纸盒的设计理念...
市面上各种鱼龙混杂的培训班以及误导人的文章会把很多初学者带入歧途,浮躁的跟风将会让你最后收获甚微,根本 达不到企业的用人要求。为了更好的帮助大家学习和成长,少走弯路,在今天的文章里,SIGAI的作者以自己...
标题中的“今天的收获真不小作文.doc”显然是一篇关于作者个人经历的文章,描述他在特定日期——10月3日下午的观察和学习体验。虽然这个标题和描述直接来源于一个语文作业或作文,但我们可以从中提取一些与IT行业...
综上所述,虽然“加强型一次性纸碗”看似与传统IT技术相距甚远,但其设计和制造过程实际上融合了多个领域的知识和技术,其中包括环保科技、工业设计、材料科学、结构工程、自动化制造以及质量控制等多个IT相关领域。...
#### 一、30瓦甚高频放大器概述 - **定义与功能**:30瓦甚高频(Very High Frequency, VHF)放大器是一种电子设备,主要用于将较低功率(通常为4至6瓦)的VHF信号放大至30瓦。这种放大器广泛应用于无线通信系统中,...
在经历了多次面试失败后,这位大学生最终获得了一个IT公司的实习机会,但在实际工作中却发现与预想相差甚远。这促使他重新考虑职业选择,转向事业单位或公务员考试,寻找更适合自己的发展道路。 通过这些经历,我们...
1、不要再用 more and more了;该词组被评为中国恶俗词组榜第一!!老师说。。可以用a growing number of.. 2、inevitable。。不可避免。。
总结起来,尽管"一种方便识别的一次性纸杯"听起来似乎与传统的IT行业相距甚远,但它实际上涉及到了UI/UX设计原则、物联网技术、3D建模、项目管理等多个IT领域的核心知识。这些知识点不仅对日常生活用品设计有所启发...
然而,实际数据显示,中空混凝土外墙外观质量一次验收合格率仅为81.5%,与目标相差甚远。 通过现状调查,小组发现中空混凝土外墙成型的主要问题包括露筋、孔洞、蜂窝、夹渣、裂缝和其他,其中露筋和孔洞问题最为...
总之,这份“上海市黄浦区2011届九年级物理第一次模拟试题(上学期期末)(扫描版)”是一份难得的备考资源,它不仅仅是一次模拟考试,更是对学生学习成果的一次全面检验,对老师教学方法的一次反馈,对学生未来学习...
初中语文文摘生活没甚不好意思
校园内景色优美,景点甚多。在校园内移动,因时间、交通工具和用户兴趣等原因,需要选择线路。本设计的主要任务是为在大学校区内生活、购物、参观的人们提供行走线路查询、选择、景点介绍的帮助。实现的基本功能如下...
当程序挂起时,使用传统的调试手段可能收效甚微。这时,Linux提供了一种称为“魔术键控序列”的功能,通过特定的键盘输入组合,可以触发内核生成堆栈转储或其他有用的信息,帮助定位引起挂起的组件或代码段。 #### ...
如“久仰兄长大名,奉上拙著一本,鄙人才疏识浅,书中可能谬误甚多,特此敬请斧正。”,这样的题目教会学生在社交场合中如何使用得体的语言,体现了语文教育在培养学生人文素养和交际能力方面的重要性。 最后,文言...
总结来说,虽然成人用一次性纸尿裤看似与传统IT行业相距甚远,但实际上,它们已经与信息技术紧密结合,涵盖了从产品设计、生产制造到销售服务的各个环节。这些融合了IT技术的设备,不仅提升了用户体验,也为行业带来...
4. **面试体验**:分享面试过程中的感受,例如“跟您的谈话是一次愉快而收获甚大的经历”。 5. **岗位理解**:针对申请的职位,阐述自己对职责和要求的理解,展示自信和适应能力,如“我完全有信心胜任此工作岗位”...