精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-03-28
呵呵. 本末倒置了 |
|
返回顶楼 | |
发表时间:2008-04-07
fuliang 写道 1、我曾经参加过一个项目,原来使用Hibernate,从这个项目派生出一个项目要用JPA,有了DAO接口就可以方便替换了,否则,你在每个Service中找使用的HibernateDAO,然后改成现在的JPA实现的DAO,这是一个烦琐而易出错的事情,这就是依赖于具体实现的害处。 接口作为一种契约,其他使用你代码的人只需要知道你接口中提供的方法,就可以使用你的代码了,而接口通常是方法的最小子集(要暴露给用户使用的部分)。如果你只有实现类,往往会让使用你代码的人陷于细节,自己查找你到底暴露那些方法给我用。维护方面,如果你的实现需要很大改动的时候,有了接口别人在修改你代码的时候,就会知道我只要实现了你定义的接口的功能就ok了,其他的细节和我无关。 2、你所说的得改两处,是因为接口没有定义好,改动两处当然是不可避免的。如果你没有接口,别人要修改的话,他都不知道他的改动对其他部分的影响有多大,因为他很可能不知道,你要暴露什么,其他部分依赖于哪些方法。 3、基于实现类违反了面向对象的设计原则:OCP、LSP、DIP 1.替换Dao,是否方便没接口什么事。都得重新实现一个Dao,方法、参数都一样。没有接口情况下我直接替换掉原来的Dao类就可以了。你说以前的名称HibernateDao,现在叫JpaDao,这是你实现设计时用了接口:Dao,我来设计Dao就是一个类,不管用Hibernate还是JPA都叫这样一个Dao类,反正一个系统中没有必要存在两种Dao。对,我这样做要修改java代码,你那样做只需要修改配置文件,但这种高层应用中这个没有多大意义 接口作为契约没错,但是像你做的这种网站,包括很多web项目,这种契约就是一种过渡设计。我质疑就是你这里为什么每个Dao、Service都是一个接口、一个实现类 2.在实际开发中接口不可能一次定义好,通常是,一边开发一般往接口里面添加方法,然后再往实现类里添加方法,因为接口总要添加两次。类中由public、private方法,看到public就知道是要暴露给上层了 3.违反什么原则,说这个没什么意义,归根还是到你说的方便修改、低耦合、契约上面来了 |
|
返回顶楼 | |
发表时间:2008-04-10
楼主跑了一下你的程序,报一个如下的错误,楼主看看是怎么回事呀?
严重: Servlet.service() for servlet jsp threw exception org.apache.jasper.JasperException: /decorators/main.jsp(15,10) According to TLD or attribute directive in tag file, attribute test does not accept any expressions at org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:40) at org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:407) at org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:148) at org.apache.jasper.compiler.Validator$ValidateVisitor.checkXmlAttributes(Validator.java:1172) at org.apache.jasper.compiler.Validator$ValidateVisitor.visit(Validator.java:819) at org.apache.jasper.compiler.Node$CustomTag.accept(Node.java:1512) at org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2343) at org.apache.jasper.compiler.Node$Visitor.visitBody(Node.java:2393) at org.apache.jasper.compiler.Node$Visitor.visit(Node.java:2399) at org.apache.jasper.compiler.Node$Root.accept(Node.java:489) at org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2343) at org.apache.jasper.compiler.Validator.validate(Validator.java:1737) |
|
返回顶楼 | |
发表时间:2008-04-10
刚刚开始研究sitemesh,感觉似乎是struts2和sitemesh有冲突.
|
|
返回顶楼 | |
发表时间:2008-04-10
<一>:
@Override public List findByName(String name) { return getHibernateTemplate().find("from Song s where s.name like '%" + name + "%'"); } 有被SQL注入的可能,所以应该用: @Override public List findByName(String name) { return getHibernateTemplate().find("from Song s where s.name like ?", "%" + name + "%"); } 或: @Override public List findByName(String name) { return getHibernateTemplate().findByNamedParam( "from Song s where s.name like :theValue", "theValue", "%" + name + "%" ); } <二>: @Override public List getBandsByName(String name) { return getHibernateTemplate().find("from Band b where b.name = ?", new String[]{name}); } 为什么多创建一个数组?(代码中有很多个地方都用这种方式)只需要: @Override public List getBandsByName(String name) { return getHibernateTemplate().find("from Band b where b.name = ?", name); } |
|
返回顶楼 | |
发表时间:2008-04-10
lonelyblue 写道 <一>:
@Override public List findByName(String name) { return getHibernateTemplate().find("from Song s where s.name like '%" + name + "%'"); } 有被SQL注入的可能,所以应该用: @Override public List findByName(String name) { return getHibernateTemplate().find("from Song s where s.name like ?", "%" + name + "%"); } 或: @Override public List findByName(String name) { return getHibernateTemplate().findByNamedParam( "from Song s where s.name like :theValue", "theValue", "%" + name + "%" ); } <二>: @Override public List getBandsByName(String name) { return getHibernateTemplate().find("from Band b where b.name = ?", new String[]{name}); } 为什么多创建一个数组?(代码中有很多个地方都用这种方式)只需要: @Override public List getBandsByName(String name) { return getHibernateTemplate().find("from Band b where b.name = ?", name); } 谢谢指教,的确有你说的问题。 |
|
返回顶楼 | |
发表时间:2008-04-10
thelongestday 写道 刚刚开始研究sitemesh,感觉似乎是struts2和sitemesh有冲突.
我这儿没有那个问题,你的那个错误说是${sessionScope.user.userName}的问题,感觉这个没什么问题。 |
|
返回顶楼 | |
发表时间:2008-04-14
请问 下 你做的时候 用了哪些包?? 谢谢
|
|
返回顶楼 | |
发表时间:2008-05-08
这儿有个好同志: http://www.iteye.com/topic/125465
把他的包加上再下一个sitemesh-2.3.jar就行了 |
|
返回顶楼 | |
发表时间:2008-05-08
总体感觉还行,不过部分代码需要优化为好
1.DAO既然使用泛型,那就干脆点。想想再抽象出一个基类,通过类反射和泛型的特点再优化下 2.Action中看到开关条件(switch case)这个我想还是可以优化点好 |
|
返回顶楼 | |