Springmvc与ssh2框架的优势和劣势

转载:http://www.osblog.net/blog/542.html

近几年来SpringMVC的发展是比较迅速的,他的优点也慢慢的体现出来了,甚至很多公司要求SpringMVC替代SSH框架,SpringMVC到底有那些区别呢?

SpringMVC框架是什么?

SpringMVC框架流程

Spring 框架是高度可配置的,而且包含多种视图技术,例如 JavaServer Pages(JSP)技术、Velocity、Tiles、iText 和POI。Spring MVC 框架并不知道使用的视图,所以你可以自主的选择视图。Spring MVC 分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。

SpringMVC是一个典型的教科书式的mvc构架,而不像struts等都是变种或者不是完全基于mvc系统的框架,对于初学者或者想了解mvc的人来说我觉得 spring是最好的,它的实现就是教科书!第二它和tapestry一样是一个纯正的servlet系统,这也是它和tapestry相比 struts所没有的优势。而且框架本身有代码,而且看起来容易理解。


SSH2框架是什么?

SSH框架流程

SSH框架的系统从职责上分为四层:表示层、业务逻辑层、数据持久层和域模块层,以帮助开发人员在短期内搭建结构清晰、可复用性好、维护方便的Web应用程序。其中使用Struts作为系统的整体基础架构,负责MVC的分离,在Struts框架的模型部分,控制业务跳转,利用Hibernate框架对持久层提供支持,Spring做管理,管理struts和hibernate。具体做法是:用面向对象的分析方法根据需求提出一些模型,将这些模型实现为基本的Java对象,然后编写基本的DAO(Data Access Objects)接口,并给出Hibernate的DAO实现,采用Hibernate架构实现的DAO类来实现Java类与数据库之间的转换和访问,最后由Spring做管理,管理struts和hibernate。


SpringMVC和SSH的比较:

struts封装的功能更多更全面,用法比较独有。springmvc比较接近原生servlet,灵活度高。而且因为springmvc的controller是单例的,以及没有大量的过滤器,性能要比struts2好。

还有一点就是Spring有自己的JdbcTemplate,用来执行原生态的SQL语句。

如:

1
2
3
4
5
@Transactional
public  Integer click(String id){
     jdbcTemplate.update( "UPDATE content set count=count+1 where id=?" ,id );
     return  jdbcTemplate.queryForInt( "select count from content where id=?" ,id);
}

SSH中操作数据库使用的是Hibernate的数据映射,操作的是对象。

如:

1
2
3
4
public  void  click(user){
     //update(user);
     save(user);
}

Hibernate本来就是基于JDBC的封装,所以较之执行原生态SQL效率上肯定比操作对象更快。

注意:如果想使用Spring来实现Hibernate的功能,那么可以知己封装

如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
     public  T save(T entity){
         Field[] declaredFields = entityClass.getDeclaredFields();
         String pk= "" ;
         for (Field f : declaredFields){
             boolean  annotationPresent = f.isAnnotationPresent(Id. class );
             if (annotationPresent){
                 pk = f.getName();
                 break ;
             }
         }
         if (StringUtils.isBlank(pk)){
             Method[] declaredMethods = entityClass.getDeclaredMethods();
             for  (Method method : declaredMethods) {
                 boolean  annotationPresent = method.isAnnotationPresent(Id. class );
                 if (annotationPresent){
                     String field = method.getName().replace( "get" "" );
                     //首字母转小写
                     pk = field.replace(field.charAt( 0 ), ( char )(field.charAt( 0 )+ 32 ));
                     break ;
                 }
             }
         }
         Map<String, Object> map = EntityToMapUtil.convertEntityToMap(entity);
         Object pkvalue = map.get(pk);
         if (pkvalue!= null &&StringUtils.isNotBlank(pkvalue.toString())){
             update(map,pk);
             return  entity;
         }
         SimpleJdbcInsert simpleJdbcInsert= new  SimpleJdbcInsert(jdbcTemplate);
         KeyHolder keyHolder = simpleJdbcInsert.withTableName(table())
         //.usingColumns(new String[keySet.size()])
         .usingGeneratedKeyColumns(pk)
         .executeAndReturnKeyHolder(map);
         try  {
             BeanUtils.setProperty(entity, pk, keyHolder.getKeys().values());
         catch  (Exception e) {
             e.printStackTrace();
             return  null ;
         }
         return  entity;
     }
     
     public  void  insert(Map map,String... pks){
         Set<String> columns = map.keySet();
         for (String pk : pks){
             if (columns.contains(pk))
                 columns.remove(pk);
         }
         SimpleJdbcInsert simpleJdbcInsert= new  SimpleJdbcInsert(jdbcTemplate);
         KeyHolder keyHolder = simpleJdbcInsert.withTableName(table())
         .usingColumns(columns.toArray( new  String[columns.size()]))
         .usingGeneratedKeyColumns(pks)
         .executeAndReturnKeyHolder(map);
     }  

原来就是使用反射来获取对象的属性,然后对应数据库字段,最后拼写成SQl语句,效率上感觉影响不是很大。


我们现在的公司就是采用SpringMVC来做为基础框架的,而且没有整合Hibernate。最新版的SpringMVC还支持RestFull,可以直接返回相应的JSON或者XML。

如代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@RestController
@RequestMapping ( "public" )
public  class  CommonController {
     @Autowired
     private  ContentService contentService;
     @RequestMapping ( "ViewClick" )
     public  String clicks(HttpServletRequest request, @RequestParam  String id){
         int  clicks= 0 ;
         synchronized  ( this ) {
             clicks= contentService.click(id);
         }
         return  "document.write('" +clicks+ "')" ;
     }
}
1
@RestController //关键注解

在前台调用(这只是我的博客目前使用的一个小功能)

1
阅读(< script  src = "../public/ViewClick?id=${content.id}" ></ script >)

这个功能也可以在APP开发中作为服务器接口使用很是方便的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值