在深圳做开发做了两年。大大小小参与过三个项目的开发,一个是某医院内部的管理系统,一个是电商,最近做的是一个电商项目。前一个项目采用的是ssh框架搭建的,最近的项目采用的是ssm框架搭建的。在实际开发中,我觉得这两个框架,他们最大的区别在于hibernate与mybatis的区别。Hibernate与mybatis相比较,mybatis更为轻便、灵活,容易掌握。mybatis可以把sql语句从Java代码中分离了出来,放在了配置文件中书写,大大降低里java代码与SQL语句的耦合度,更容易对sql语句操作,重要的是mybatis还可以书写动态的sql语句,但mybatis也存在一些缺陷,比如mybatis本身的缓存机制没有hibernate那么完善,hibernate除了本身有良好的缓存机制,还可以使用第三方缓存。Hibernate较完整的封装了JDBC,但学起来要比mybatis更困难一些。Hibernate的DAO层开发比MyBatis简单,对对象的维护和缓存要比MyBatis好。
(springmvc与Struts的区别:springmvc是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应,参数的传递是直接注入到方法中的,是该方法独有的。
struts2是类级别的拦截, 一个类对应一个request上下文, struts是在接受参数的时候,可以用属性来接受参数, 这就说明参数是让多个方法共享的,这也就无法用注解或其他方式标识其所属方法了)。
该商城是一个综合性B2B平台,主要针对医药药店。产品涵盖滋补品,营养保健品,中西药,医疗器械等相关产品。
在整个项目中,我们采用的是nginx+tomcat来部署的(面试官会可能问nginx是谁来部署的?如何部署的?Nginx的执行流程,优点),
nginx一方面做加载静态资源的服务器,另一方面来做反向代理和负载均衡。因为该项目需要在多个环境中运行,我们利用了nginx的反向代理解决了不同环境同系统访问地址不统一带来的问题。
因为整个项目实现的功能较多, 所以采用分布式的架构设计,整个项目包括后台管理系统、前台系统、订单系统、登录系统、搜索系统、购物车系统等,这样做的好处是使每个功能模块独立出来,降低了各系统之间的耦合度,增删一个功能不会影响其他功能模块。
因为项目是采用分布式架构设计的,各模块之间是相互独立的,而各个模块的访问路径又是不同的,所以当跨域访问的时候请求数据的时候会受到跨域受限制的问题。比如当用户首次访问该网站首页的时候。首页页面会异步请求后台管理系统商品的数目。这是就会出现跨域受限的问题。以前开发时,如果在本模块中,我们是通过ajax异步请求数据的,但是不支持Ajax跨域的。Jsonp通过script标签的src可以跨域请求的特性。加载资源,将加载的资源(通过一个方法名将一个数据进行包裹)当做是js脚本解析,定义一个回调函数。(是怎么实现的)获取传入的数据。我们使用jsonp是因为jsonp的兼容性比较好。并且在请求完毕后通过callback的方式回传结果。但是Jsonp有一个缺点,是只支持get请求而不支持post等其他类型的http等。
这样我们解决了浏览器访问当前页面去加载后台数据出现的跨域问题。但是另一个问题又来了。其他系统该如何调用后台系统的数据呢。我们想可以发送http请求来访问后台数据。我们想到的是httpclient来解决此问题。因为httpClient可以使用java代码模拟浏览器发送http请求(get方法如何传递参数?定义uribuilder对象,在uribuilder里设置参数,以key和value,都是string类型的,然后将uribuilder放到uri中,在后将uri讲给httpget请求。Post方法如果传输数据?模拟表单提交,将数据封装到list集合中,然后将集合数据放入构造的表单实体中,在将表单实体请求放到httppost对象中)向外抛出一个接口,执行过程是:1.创建httpClient对象,2.构建请求POST,get请求,3.如果有参数,就去构造参数。
3.1 get
使用uribuilder去构造请求参数
3.2 post
构建表单实体,把表单实体放入到 post请求对象中。
4、执行请求 ,并且接受响应
5、处理响应结果
6. 释放连接。无论执行方法是否成功,都必须释放连接。
HttpClient实现认为是线程安全的。
每次连接发起Http请求的时候都会重新建立连接(经历3次握手),用完就会关闭连接(4次挥手),这样会消耗很多时间,所有我们采用了连接池。如果不采用连接池,每次连接都会打开一个端口,在大并发的情况下系统的端口资源很快就会被用完,导致无法建立新的连接。
像项目中的首页的大广告和商品类这些不需要经常修改的数据。如果用户每次刷新页面都要从数据库中查询,这样就会浪费资源和增加数据库的压力。所以我们想当把这些数据添加到一个缓冲区中。目前比较主流的缓存技术有Redis和Memcached,单纯从缓存命中的角度来说,Memcached要高一些,可redis和Memcache的差距其实并不大,但Redis提供的功能更加强大一些,读写速度也很快。所以我们选用了redis来缓存数据。Redis把数据以key—value的形式缓存到内存中,并提供了多种数据存储类型(string,set,list,hash等),还自身提供了持久化功能(2种),还可以把数据备份到磁盘中(Redis的SAVE命令用于创建当前 Redis 数据库的备份),,防止redis宕机时的数据丢失。(会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步)。我们使用的是spring与jedis整合的客户端,可以利用jedis做分片式集群,解决了redis内存受限的问题。