前段时间用用Struts2+Spring+Hibernate+sitemesh做的一个在线音乐站点写的一个在线音乐
的站点.功能实现的相对比较粗糙(如歌曲列表没考虑分页什么的),另外只能使用IE(使用了ActiveX
控件播放音乐的).刚学的struts2,主要是想练一下.
的站点.功能实现的相对比较粗糙(如歌曲列表没考虑分页什么的),另外只能使用IE(使用了ActiveX
控件播放音乐的).刚学的struts2,主要是想练一下.
- 16:21
- 浏览 (3189)
- 论坛浏览 (17495)
- 评论 (54)
- 分类: Spring
- 相关推荐
评论
yeshucheng
2008-05-08
回复
总体感觉还行,不过部分代码需要优化为好
1.DAO既然使用泛型,那就干脆点。想想再抽象出一个基类,通过类反射和泛型的特点再优化下
2.Action中看到开关条件(switch case)这个我想还是可以优化点好
1.DAO既然使用泛型,那就干脆点。想想再抽象出一个基类,通过类反射和泛型的特点再优化下
2.Action中看到开关条件(switch case)这个我想还是可以优化点好
thelongestday 写道
刚刚开始研究sitemesh,感觉似乎是struts2和sitemesh有冲突.
我这儿没有那个问题,你的那个错误说是${sessionScope.user.userName}的问题,感觉这个没什么问题。
lonelyblue 写道
<一>:
有被SQL注入的可能,所以应该用:
或:
<二>:
为什么多创建一个数组?(代码中有很多个地方都用这种方式)只需要:
@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);
}
谢谢指教,的确有你说的问题。
lonelyblue
2008-04-10
回复
<一>:
有被SQL注入的可能,所以应该用:
或:
<二>:
为什么多创建一个数组?(代码中有很多个地方都用这种方式)只需要:
@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);
}
thelongestday
2008-04-10
回复
刚刚开始研究sitemesh,感觉似乎是struts2和sitemesh有冲突.
thelongestday
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)
严重: 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)
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.违反什么原则,说这个没什么意义,归根还是到你说的方便修改、低耦合、契约上面来了
cindy_taozhiang
2008-03-28
回复
呵呵. 本末倒置了
tiyi 写道
俺到现在还没搞清楚用sitemesh的好处是什么……
1.增加一点复杂度,使你的网站看起来更牛一些.
2.让除了你之外的其他人维护你做的东西的时候困难一些.当然这不能只靠sitemesh,还需要靠其他的东西.很多,很多.
比如前段时间我看了别人的一个网站的代码,里边用到了以下东西:
spring mvc
spring ioc
hibernate
sitemesh
prototype
buffalo
ajaxanywhere
dwr
ehcache
javabb
OpenVendor
tidy
displaytag
以上只是不完全统计.因为只是粗略看了一眼,看到了有这么多东西.还有些莫名其妙的jar包,不知道是什么东东的
其它的一些js,还用到了什么诸如xhconn,im之类的别人写好的东西,一堆一堆的,有个二十来个js.
还把所有的js写在一个jsp文件中到处被引用.
所有的js文件加起来600多K大.
配置文件一驼一驼的,又是xml又是properties的,又在WEB-INF下又在 classes下的.
结果呢,网站其实功能不多.但是却程序运行不稳定.
我指的线程问题是单例模式下访问器的同步问题,有同步synchronized就有可能死锁,如果没有synchronized,那么假想两个线程调用访问器,而其中一个线程在new之前睡眠,醒来的时候第二个线程已经new完成而第一个线程不知道,怎么样?这是单例吗?更恐怖的是表现的线程频繁!
asheng88 写道
fuliang 写道
action是线程不安全的,需要每次请求创建一个action
spring管理的bean不都是单例的吗?也许表现层的action例外!
业务bean呢?service和dao都是单例的吧,是什么保证单例线程安全?
Spring管理的bean可以配置成singleton和prototype的,
一般DAO和Service都应该是单例的,Struts2的Action模型本身就不是单例的,因为
通常Action是有数据成员,并且通过getter,setter与页面的字段绑定.
service和dao事实上他们通常没有可变的东西,Service只依赖于dao,dao只有CRUD操作,
本身就是线程安全.当然你也可以使用一些共享的可变变量,把他们搞成线程不安全的,然后配置成
原型模式的,当然这会影响一点效率.
fuliang 写道
action是线程不安全的,需要每次请求创建一个action
spring管理的bean不都是单例的吗?也许表现层的action例外!
业务bean呢?service和dao都是单例的吧,是什么保证单例线程安全?
asheng88 写道
fuliang 写道
前段时间用用Struts2+Spring+Hibernate+sitemesh做的一个在线音乐站点写的一个在线音乐
的站点.功能实现的相对比较粗糙(如歌曲列表没考虑分页什么的),另外只能使用IE(使用了ActiveX
控件播放音乐的).刚学的struts2,主要是想练一下.
的站点.功能实现的相对比较粗糙(如歌曲列表没考虑分页什么的),另外只能使用IE(使用了ActiveX
控件播放音乐的).刚学的struts2,主要是想练一下.
表现层的action也可以注射到spring容器?
Action可以由Spring容器来管理,Service可以直接注入到Action中,但需action配成prototype的,因为struts2,action是线程不安全的,需要每次请求创建一个action
fuliang 写道
前段时间用用Struts2+Spring+Hibernate+sitemesh做的一个在线音乐站点写的一个在线音乐
的站点.功能实现的相对比较粗糙(如歌曲列表没考虑分页什么的),另外只能使用IE(使用了ActiveX
控件播放音乐的).刚学的struts2,主要是想练一下.
的站点.功能实现的相对比较粗糙(如歌曲列表没考虑分页什么的),另外只能使用IE(使用了ActiveX
控件播放音乐的).刚学的struts2,主要是想练一下.
表现层的action也可以注射到spring容器?
我的相册
cooliris
共 9 张
共 9 张
最近加入圈子
链接
最新评论
-
struts2 OGNL实例化数组的 ...
goodfifa07 写道请问楼主怎么捕获用数组发生的异常把logger级别调到 ...
-- by fuliang -
struts2 OGNL实例化数组的 ...
请问楼主怎么捕获用数组发生的异常
-- by goodfifa07 -
Java nio(三)
不错哦最近项目要用 可以向你请教此类的问题么 我的QQ1067302 希望能得到 ...
-- by bojianpc -
使用Struts2+Spring+Hiber ...
谢谢你的代码 我是一个初学者 ,没有什么资格说什么. 感谢.
-- by huobao89 -
学SSH2时写的入门例子
塔破铁鞋无觅处 谢谢了!
-- by songzhiyou







评论排行榜