经验不足,差一点重构整个系统 博客分类: Struts2 HibernateSpringBeanSSHXML
呵呵,很久没有来JavaEye写文章了,公司工作也不让随便上网,也好,工作中发现了不少问题和大家分享吧。
1. 郁闷的Form表单问题,请看下面代码:
- <form name="form1" action="userCRUDAction!editUser.action?user.id=${user.id}">
这真已经是一个再简单不过的Struts2的表单提交了,不过运行后,你会发现user.id=null。 为什么? 你现在试试把代码换成以下就好了。
- <form name="form1" action="userCRUDAction!editUser.action?user.id=${user.id}" method="post">
或者:
- <form name="form1" action="userCRUDAction!editUser.action">
- <input type="hidden" name="user.id" value="${user.id}" />
原因看出来了吧,重点就是这个 method="post", Form默认的传输是GET,你得养成好习惯记得在每写一个FORM的时候,就给加上。
2. 吓出一身冷汗的Spring scope问题。
天天Struts2,Webwork,Spring,Hibernate挂在嘴边,结果一用的时候才真正明白,真正懂这几个框架的人真的非常非常少。更别去谈成功的项目了。
以下代码在任何SSH框架的项目里是太平常的我都不愿意写了:
- public class UserController extends ActionSupport {
- private static final long serialVersionUID = 1L;
- private static Logger logger = Logger.getLogger(BaseController.class);
- private IUserService userService;
- private User user;
- private Date createDate;
- ..................
然后把 userService 注入:
- <bean id="userCRUD" class="com.libe.controller.UserController">
- <property name="userService" ref="userService" />
- </bean>
代码单元测试也通过了,社会和谐了,呵呵。可是一放到服务器上,开始出莫名奇妙的问题了,测试人员不停的提交那些根本不可能出现的问题,好吧。开断点,看着断点也吓出一身冷汗:许多本应该为null的对象,竟然都有值了!@##¥%。
代码查了又查看了又看,终于又回到这个XML配置片断了,修改成如下:
- <bean id="userCRUD" class="com.libe.controller.UserController"
- scope="prototype">
- <property name="userService" ref="userService" />
- </bean>
就是加了一个 scope="prototype"。 然后回头看看项目,几十个Action竟然都没有加,汗,测试员提出的问题应该和这个有关,大家都知道Spring的默认设置为:singleton,Spring的容器只维护该类的一个实例感觉应该和启动后,Tocmat加载的Servlet挺相似。如果这个时候Action设置成了singleton,大家可以试着想像一下在那个Action里的 user, createDate,等等其它私有属性在那几个测试员的交差点击下,会出现多么混乱的情况。
3.Hibernate的滥用:
我一直承认自己的Hibernate用的不好,所以更多的时候是在测试,以达到最佳实践。从最开始对Hibernate的疯狂吹捧,再到将Hibernate项目转成JDBC项目之痛,到现在反复看文档做测试尽可能客观的来对待Hibernate,已经有一年多了。
我这个项目其实根本不适合使用Hibernate
1.从一开始就不是按照对象建模再建表,对象建立都是跟表走。
2.表结构冗余非常严重,一般通过关联取的信息已经在主控表里了。
3.用着最新的Hibernate却当Hibernate2.1使用,那些什么lazy, cache, proxy, out-join全部都不管,这也是让我最郁闷的一点,lazy=false,你就等着Hibernate给你刷屏吧。
想改变这一切,可是我来的有点晚,项目已经做了一大半了,要全部设计的话似乎已经不可能了。
上一篇: iOS应用审核的通关秘籍