zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Ant构建原理及build.xml文档描述
    Selenium WebDriver的工作原理
    appium工作原理
    jmeter获取mysql数据并作为请求参数使用
    linux sar的使用
    hdu 1520 Anniversary party
    hdu 1331 Function Run Fun
    hdu 1208 Pascal's Travels
    hdu 1159 Common Subsequence
    poj 1129 Channel Allocation
  • 原文地址:https://www.cnblogs.com/qiu18359243869/p/12602912.html
Copyright © 2011-2022 走看看