作为程序员,大家应该都知道,电商项目对程序员的专业水平要求要求很高,我本人也是刚刚工作没多久的技术小白,因为现在做金融项目这一块,做的项目属于内部系统,总体来说对整体的水平没那么多要求,我也是做这个项目好几个月了,接触的后端代码这一块真的很少,主要是前端js的控制跟数据库的编写,可以说本来属于java的代码都拿到前端跟存储过程中实现了,所以自己也认识到了,如果在这样下去,对java只会越来越远,而我,还是很喜欢java的,它的思想,风格都是看着很舒服的。好了,开头算是一个自我介绍吧,下面总结一下本周的学习心得;
本周主要接触了几个技术:dubbox、zookeeper、angularJS、maven分布式搭建框架(ssm)、select2、spring security(安全框架)。
dubbox:有alibaba的dubbo衍变而来,现有当当网进行维护;主要功能用来实现分布式模块之前的服务调用等,
核心注解:@service 在提供方写上 @Reference 在消费方用来注入
提供方通过注册中心,将服务注册到注册中心,这个时候,提供方会暴露自己的信息,比如Ip,
消费方想要什么服务,直接去注册中心里面获取,不管是谁提供的,有就会拿出来。
调用关系说明:
0. 服务容器负责启动,加载,运行服务提供者。
1. 服务提供者在启动时,向注册中心注册自己提供的服务。
2. 服务消费者在启动时,向注册中心订阅自己所需的服务。
3. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
4. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
5. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
Zookeeper:说白了就是一个注册中心,这个要安装在linux上面,不知道window能不能安装。
注册中心负责服务地址的注册与查找,相当于目录服务,服务提供者和消费者只在启动时与注册中心交互,注册中心不转发请求,压力较小。部署后,直接在linux系统启动即可。
管理中心:这个可以去网上找一个dubbox的源码,编译后将war包放到linux上部署一下就可以访问了,账号跟密码都是root,里面可以很清楚的知道最近的服务调用情况。
因为是刚开始接触这些分布式的技术,所以还只是停留在会用的层次,里面的还有很多深奥的,只能后面学习后才能发布出来。
框架搭建:
使用maven技术来创建各自模块,然后全都包含在一个parent中即可。在学习中maven技术可以说有时候还是挺坑人的。还是那句话,只有被坑过了,才会长记性。
前端框架:AngularJS(最好使用版本1)
这个也是前几年很火热的一个前端框架,现在比较流行VUE,React等。其实他们很多公司还是使用AngularJS,所以我就打算先学这个前端框架然后在学线下比较流行的。下面说一说特点:
四大特征:
1 MVC 模式
Angular遵循MVC模式,并鼓励展现,数据,和逻辑组件之间的松耦合.通过依赖注入,Angular为客户端的Web应用带来了传统服务端的服务,例如独立于视图的控制。 因此,后端减少了许多负担,产生了更轻的Web应用。
2 双向绑定
AngularJS是建立在这样的信念上的:即声明式编程应该用于构建用户界面以及编写软件构建,而指令式编程非常适合来表示业务逻辑。框架采用并扩展了传统HTML,通过双向的数据绑定来适应动态内容,双向的数据绑定允许模型和视图之间的自动同步。因此,AngularJS使得对DOM的操作不再重要并提升了可测试性。
3 依赖注入
依赖注入(Dependency Injection,简称DI)是一种设计模式, 指某个对象依赖的其他对象无需手工创建,只需要“吼一嗓子”,则此对象在创建时,其依赖的对象由框架来自动创建并注入进来,其实就是最少知识法则;模块中所有的service和provider两类对象,都可以根据形参名称实现DI.
4 模块化设计
高内聚低耦合法则
1)官方提供的模块 ng、ngRoute、ngAnimate 一般开发使用主要用ng就可以了
2)用户自定义的模块 angular.module('模块名',[ ])
下面贴上我写的一段代码
service层
app.service("brandService",function($http){
this.findAll=function(){
return $http.get("../brand/findAll.do");
}
this.findPage=function(pageNum,pageSize,searchEntity){
return $http.post("../brand/findPage.do?pageNum="+pageNum+"&pageSize="+pageSize,searchEntity);
}
this.add=function(entity){
return $http.post("../brand/add.do",entity)
}
this.update=function(entity){
return $http.post("../brand/update.do",entity)
}
this.del=function(ids){
return $http.get("../brand/delete.do?ids="+ids);
}
this.findOne=function(id){
return $http.post("../brand/findOne.do?id="+id);
}
//品牌下拉列表
this.selectOptionList=function(){
return $http.post('../brand/selectOptionList.do');
}
});
controller层
app.controller("baseController",function($scope){
//分页控件配置
$scope.paginationConf = {
currentPage: 1, //当前页码
totalItems: 10, //总条数,初始化
itemsPerPage: 10, //每一页记录数
perPageOptions: [10, 20, 30, 40, 50], //分页每页的选项数
onChange: function(){//当前页面修改页码触发的事件所处理的方法
$scope.reloadList();//重新加载
}
};
$scope.reloadList=function(){
$scope.findPage($scope.paginationConf.currentPage,$scope.paginationConf.itemsPerPage)
}
$scope.ids = [];
$scope.addIds=function($event,id){
if($event.target.checked){
$scope.ids.push(id);
}else{
var index = $scope.ids.indexOf(id);
$scope.ids.splice(index,1);
}
}
//全选加反选
$scope.selectAll=function(){
var arr = $(".checkBoxs");
for(var i = 0;i<arr.length;i++){
var target = arr[i];
if(target.checked){
target.checked = false;
}else{
target.checked = true;
}
}
}
$scope.jsonToString=function(jsonString,key){
var value = "";
var arr = JSON.parse(jsonString);
for(var i=0;i<arr.length;i++){
if(i==0){
value = arr[i][key];
}else{
value += ","+arr[i][key];
}
}
return value;
}
});
以及页面展示表格代码:
<tbody>
<tr ng-repeat="brand in list">
<td>{{brand.id}}</td>
<td>{{brand.name}}</td>
<td>{{brand.firstChar}}</td>
<td class="text-center">
</tr>
</tbody>
总体来说,我觉得借鉴于后端的MVC模式开发,我还是很喜欢的,还有就是双向绑定的技术,也很喜欢,只要通过ng-model=" ”来绑定一个变量名,比如输入框绑定了一个变量X,当你在输入框输入了“你好”,这个时候X=“你好”,就不需要像jquery那样进行赋值,很方便。
select2插件
在项目开发中一般很容易遇见有下拉框的时候,这个时候就是到了你该用select2的时候了,并且angularJS跟select2有集成------》
angular-select2.js,select2有四种风格,因为我做的时候根据业务,选择了一种可以多选的下拉框格式。
<input select2 select2-model="entity.brandIds" config="brandList" multiple placeholder="选择品牌(可多选)" class="form-control" type="text"/>
config属性代表你的data,这里是获取brandList这个对象中的数据。数据来源是要有规定的格式:如下
$scope.brandList = {
data: [{id:1,text:'bug'},{id:2,text:'duplicate'},{id:3,text:'invalid'},{id:4,text:'wontfix'}]
};
必须是一个对象,里面是data:[]格式,数组内单元必须是id跟text作为Key.当然这个只是四个模式中的多选模式;其他不一样。
Spring Security 安全框架
Spring Security作为spring全家桶的一员就代表了有与生俱来的优势,可以跟spring完美配合。
它是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反转Inversion of Control ,DI:Dependency Injection 依赖注入)和AOP(面向切面编程)功能,为应用系统提供声明式的安全访问控制功能,减少了为企业系统安全控制编写大量重复代码的工作。
直接看demo吧,注解我都写了
<?xml version="1.0" encoding="UTF-8"?>
<bean:beans xmlns="http://www.springframework.org/schema/security"
xmlns:bean="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd">
<!-- 下面是开放的资源入口 -->
<http pattern="/*.html" security="none"></http>
<http pattern="/css/**" security="none"></http>
<http pattern="/img/**" security="none"></http>
<http pattern="/js/**" security="none"></http>
<http pattern="/plugins/**" security="none"></http>
<!-- http主要配置拦截规则 use-expressions="false"代表不启动SPEL表达式 如果启用SPEL表达式,则角色必须要hasRole('角色名')-->
<http use-expressions="false">
<!--pattern /*只包括根目录的下的入口 /**才能包括子目录的入口 -->
<!--access 就是代表角色,角色名必须用ROLE_开头 -->
<intercept-url pattern="/**" access="ROLE_ADMIN"/>
<!-- 开启表单登录功能 -->
<!-- login-page指定登录页面,斜杠开头 default-target-url指定登录成功后跳转页面 authentication-failure-url登录失败跳转的页面 -->
<form-login login-page="/login.html" default-target-url="/admin/index.html" authentication-failure-url="/login.html" always-use-default-target="true"/>
<csrf disabled="true"/>
<headers>
<frame-options policy="SAMEORIGIN"/><!-- 允许使用框架页面iframe -->
</headers>
<logout /><!-- 一键退出系统功能 -->
</http>
<!-- 认证管理器 -->
<authentication-manager>
<authentication-provider user-service-ref="userDetailService">
<password-encoder ref="bcryptEncoder"></password-encoder>
</authentication-provider>
</authentication-manager>
<!-- 认证类 -->
<beans:bean id="userDetailService" class="com.xiayu.service.UserDetailsServiceImpl">
<beans:property name="sellerService" ref="sellerService"></beans:property>
</beans:bean>
<!-- CSRF-TOKEN 防止恶意攻击 只能jsp页面才会产生或者系统生成的login页面,所以我们要关闭该功能 -->
</bean:beans>
今天学习了这个框架,还是觉得很有魅力的,值!
最重要的是,这个框架提供了一种加密算法,比MD5好很多。
BCrypt加密算法:为什么说这么好呢?因为同一个密码,每次注册到数据加密成了不同的字符,所以相当于更加了一层干扰,更加安全,而你验证密码登录时,只要在配置里面说明你是要这个加密算法进行验证的即可,大大方便工作效率,也提升了安全性,赞一个。好了,差不多了,这一周也算学习了挺多的,下周再来分享给大家!