项目心得
在这个项目中我先使用的是三层架构,分别是dao层、service层、和web层。
然后使用的是hibernate的框架对dao层中数据进行增删改查。后期我会使用struts2框架和spring框架一起使用。
遇到的问题
1)没有搞清楚不同的模块之间的关联不能太紧密。
比如登陆和注册模块
- ToLoginServlet的就只需要做跳转到login.jsp页面就可以了,不需要加入注册模块中保存Customer的代码,对于登陆的逻辑写在LoginServlet中就好了,注册的逻辑写在RegisterServlet中就好了。ToRegisterServlet中只需要写跳转到jsp的代码就可以了。
- 这样做的好处就是,当后期我们查看自己写的代码时不会凌乱。这就有解耦的意思,尽量不要让登陆和注册的逻辑写在一个servlet中,这样会很凌乱,而且后期要改变一个功能的时候,就要改动很多地方,而且还会忘记自己写的那一部分代码在什么地方。也就是说,页面跳来跳去就会搞混淆。
不同的功能写在不同的servlet中虽然servlet会很多但是会很清晰,容易查找,并且模块之间的关联性也小了。
2)登陆之后只是暂时保存了customer的数据,当我跳转到更新用户数据的时候,request中的customer就消失了。
解决方案将customer保存在session中
HttpSession session=req.getSession();
session.setAttribute("custmor",custmor);
3)更新用户数据的时候不能够更新成功。
后果就是插入了两个一样名字的数据
这是因为我没有将瞬时的用户数据转换为脱管状态。
custmor是new 出来的是瞬时态的。
cust是get()出来的是持久状态。
cust调用了set方法就变为了脱管状态。
脱管状态的数据更新才不会有两个同名的数据。
public void updateInfo(Custmor custmor) throws ServiceException{
Session session=HibernateSessionFactory.getSession();
Transaction tran =session.beginTransaction();
Custmor cust=custDao.findByName(custmor);
if(cust!=null){
cust.setAddress(custmor.getAddress());
cust.setEmail(custmor.getEmail());
cust.setPassword(custmor.getPassword());
cust.setTelephone(custmor.getTelephone());
cust.setZip(custmor.getZip());
custDao.saveOrUpdate(cust);
}else{
throw new ServiceException("更新失败");
}
tran.commit();
session.close();
}
4)更新数据的时候名字不可变,因为在数据库中查找的时候是按照名字来查询的,所以可以给name的input标签加一个属性readonly="true"只可以读不可更改。
5)如何在数据库中保存图片。。。。。。