//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页,涵盖了丰富的...
标题中的“今天的收获真不小作文.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%,与目标相差甚远。 通过现状调查,小组发现中空混凝土外墙成型的主要问题包括露筋、孔洞、蜂窝、夹渣、裂缝和其他,其中露筋和孔洞问题最为...
初中语文文摘生活没甚不好意思
校园内景色优美,景点甚多。在校园内移动,因时间、交通工具和用户兴趣等原因,需要选择线路。本设计的主要任务是为在大学校区内生活、购物、参观的人们提供行走线路查询、选择、景点介绍的帮助。实现的基本功能如下...
"双泥条一次切坯布坯系统"虽然看似与传统意义上的电信技术相距甚远,但其实它在特定场景下扮演着重要的角色,尤其是在光纤通信的制造过程中。这个系统主要涉及的是光纤预制棒的生产环节,这是光纤制造的关键步骤。 ...
总结来说,虽然成人用一次性纸尿裤看似与传统IT行业相距甚远,但实际上,它们已经与信息技术紧密结合,涵盖了从产品设计、生产制造到销售服务的各个环节。这些融合了IT技术的设备,不仅提升了用户体验,也为行业带来...
4. **面试体验**:分享面试过程中的感受,例如“跟您的谈话是一次愉快而收获甚大的经历”。 5. **岗位理解**:针对申请的职位,阐述自己对职责和要求的理解,展示自信和适应能力,如“我完全有信心胜任此工作岗位”...
本文主要讲述了PAE甚高频收发信机的故障维修案例,特别关注了其电源模块的问题。甚高频收发信机在民航空管通信系统中扮演着至关重要的角色,而PAE 5000系列设备由于使用年限较长,故障率较高,其中电源模块故障尤为...
【开篇词】:“这一次,让我们一起来搞懂MySQL1” MySQL是一个广泛应用的关系型数据库管理系统,深受开发者喜爱。本文档的作者林晓斌,别名“丁奇”,具有丰富的MySQL数据库经验,从百度到阿里的任职经历使他从...