struts-2.3.14.3 + hibernate-4.2.2.Final + spring-3.2.4 整合实现简单注册功能始末

第一次写博客,mark一记,哈哈~

其实,从6,7月份就开始学习ssh2,看视频+官网文档+google,大概有了个映像,然后模仿网上尝试示例做一个简单的注册功能demo。先是jsp+mysql实现基本功能,接着加入struts2,然后加hibernate,都很顺利,可是整合完spring时,总是404错误,控制台又没错误显示,完全找不到头脑。只能反复读程序,google询问(不会junit,不会日志),折腾了好几天还是无果,然后就放下了,花两个月刷了leetcode。刷完题便闲了,又想起之前的这个,于是搞了几天,总算搞完了,于是想写日志记录下。

先看了下junit,又看了下log4j,果断加入。虽然,控制台没有显示,可是日志里都有明确记录,这下好了,错误出来了,逐条google。原来很多问题出在NoClassDefFoundError,好多jar包没加,好了,迅速加入jar包,似乎很快就要搞定了。其实问题才刚刚开始。。。

先是:java.lang.IllegalArgumentException: warning no match for this type name:regist.service。找了很久,原来是在beans.xml文件中,<aop:pointcut id="bussinessService"expression="execution(public * regist.service.*.*(..))" />中execution写错了,原来写的是execution(public * regist.service.*(..)),.*.*表示包下任何类的任何方法,之前少了一个“.*”。。。

然后各种问题都是由于SessionFactory的错误,开始纠错。检查beans.xml中sessionfactory的bean的声明,从datasource到sessionfactory到spring事务管理,最终问题锁定在DAO层(sessionFactory已注入)

public void save(User u) {
// TODO Auto-generated method stub

Session session = sessionFactory.getCurrentSession();
//session.beginTransaction();
session.save(u);
//session.getTransaction().commit();
}

一切似乎都毫无问题,各种google之后,有人说把session.beginTransaction(); 和 session.getTransaction().commit();注释掉,然后试了试,果然可以了,具体原理等搞完这个再详查吧,大概和spring事务管理有关吧。反正sessionfactory的问题算是解决了。

接下来的问题,同样是找了很久。这次是空指针报错,ava.lang.NullPointerException at regist.action.registerAction.execute。先看看这个方法:

public String execute() throws Exception {
User u = new User();
u.setUsername(username);
u.setPassword(password);
 
if(um.checkUser(u))
return "fail";
um.add(u);
return "success";
}

其中um是通过spring注入的service层的用户管理类:

UserManager um ;

public UserManager getUm() {
return um;
}


@Resource(name="userManager")
public void setUm(UserManager um) {
this.um = um;
}

问题就出在这里,似乎um并没有拿到spring初始化的对象,难道是spring并没有初始化um?还是annotation出错了?还是beans.xml配置错了?还是别的?没办法,一个个试吧,先把annotation去掉了,老老实实用xml方式在beans.xml里一个个敲入了要初始化的bean对象,试了下,还是不行。于是各种google,有人说是action的初始化没有交给spring,导致空指针,要加入struts-spring-plugin.jar包,检查了下,有的啊,怎么就是不行呢。又是各种查,觉得确实是action没有初始化成功的问题,可是该怎么解决呢?最终在一个帖子里,有人说把struts.xml里的action的class不写具体的类,而是通过spring初始化的对象的name,像这样:

<struts>

<package name="registration" extends="struts-default">


<action name="register" class="register">
<result name="success">/registsuccess.jsp</result>
<result name="fail">/registfail.jsp</result>
</action>

</package>

</struts>

改完,测了下,成功了。具体为什么,还有待深讨,看下源码实现过程应该可以了解。

反正总算是整合完成了,虽然只是最最基础的,但还是挺开心的。


总结:log4j+junit+google 掌握这些,感觉很多问题都不再是问题了。光看教程是没用的,很多问题只有在你自己实现过程中才会暴露出来,问题可能很诡异,很奇怪,很让人无从下手,但掌握一些测试技巧,看看日志文件,再google一下,问题也许就能解决,于是你也真正前进了一点点。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值