SSH2框架

近几年来SpringMVC的发展是比较迅速的,他的优点也慢慢的体现出来了,甚至很多公司要求SpringMVC替代SSH框架,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框架的系统从职责上分为四层:表示层、业务逻辑层、数据持久层和域模块层,以帮助开发人员在短期内搭建结构清晰、可复用性好、维护方便的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>)

————————————————
版权声明:本文为CSDN博主「webin」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/swebin/article/details/52583718

猜你喜欢

转载自www.cnblogs.com/qiu18359243869/p/12602912.html