Demo中使用的工具可以在百度云下载:
Eclipse: http://pan.baidu.com/s/1c4f5zo
Tomcat: http://pan.baidu.com/s/1c1KGqPE
Maven: http://pan.baidu.com/s/1kVeKHDl
MySql服务器: http://pan.baidu.com/s/1b7ThBg
MySql客户端(sqlyog): http://pan.baidu.com/s/1hs5Vmbq
JDK1.7: http://pan.baidu.com/s/1pLBMCHH
为了更好的学习,下面先简单介绍下AngularJs
1.AngularJS
AngularJS是一个开源Web应用程序框架。它最初是由MISKO Hevery和Adam Abrons于2009年开发。现在是由谷歌维护。它的最新版本是1.3.14。项目中对AngularJS进行了集成,下载demo后可以查看, 也可以到官网: https://angularjs.org/ 进行下载
1.1AngularJs开发js库的引入:
<script type="text/javascript" src="<%=contextPath%>/jsLib/angular/angularjs.js"></script>
1.2AngularJs在html中的申明
<div ng-app='shopCarApp' ng-controller="carShopController">
一个html页面中只能有一个ng-app, 却可以有多个ng-controller
js中对ng-app和ng-controller的初始化
var appShopCar = angular.module("shopCarApp", [], function($provide){ });
appShopCar.controller("carShopController", function ($scope, $http) { });
1.3数据双向绑定:
AngularJs最大的特性便是双向绑定,也就是Js中的数据变动时,可以实时动态将数据结果根据预先写好的规则反应到界面上
比如: $scope.data = 1;
<td>{{item.data}}</td> 则页面中应该显示为1;
如果$scope.data被动态修改为 2,页面会动态显示为 2
双向绑定带来的好处是开发人员只需要专注于业务逻辑的处理,页面上元素的变化不需要过多的关注与处理
1.4数据通讯:
POST方法:
$http.post("/AngularJs/goods/saveGoods.htm", //后台URL地址 { goodsList : JSON.stringify($scope.carShop), //请求参数 }) .success(function (data, header, config, status) { if(data.stateCode == 0){ //结果处理 alert(data.desc); } }) .error(function (data, header, config, status) { console.log(data); });
GET方法:
$http.get("/AngularJs/user/get.htm", //后台URL地址 {params: {param: $scope.param}}) //请求参数 .success(function (data, header, config, status) { console.log(data); //结果处理 }) .error(function (response) { console.log(response); });
好了,有关更多的AngularJs的信息可以到网上进行查阅
2 运行效果
启动项目,访问地址: http://localhost:8080/AngularJs/jsp/shopCar.jsp
效果图:
2.1 点击清空购物车,则商品会被全部清空
2.2 点击添加商品按钮,弹出商品编辑对话框,编辑产品编辑,产品名称,购买数量,产品单价
2.3 点击提交商品按钮,将前台商品信息传到后台进行保存
2.4 点击购买数量上的+-按钮时,商品数量会相应的+1,-1, 对应的产品总价进行变化,总购买价也会进行变化
3. 代码介绍:
代码框架如图:
3.1 数据库表:
创建数据表:t_goods
CREATE TABLE `t_goods` ( `GoodsId` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '商品主键', `GoodsNo` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '商品编号', `GoodsName` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '商品名字', `GoodsNum` int(10) DEFAULT NULL COMMENT '购买数量', `GoodsPrice` decimal(10,2) DEFAULT NULL COMMENT '商品单价', PRIMARY KEY (`GoodsId`) ) ENGINE=InnoDB AUTO_INCREMENT=47 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
3.2 修改jdbc.properties连接数据库的用户名与密码
url=jdbc\:mysql\://127.0.0.1\:3306/t_angular?characterEncoding=utf-8&allowMultiQueries=true #url=jdbc:mysql://www.ad186.com:3306/hctl?characterEncoding=utf-8 username=root password=ajqnhwvia
3.2 前台代码
3.2.1 前台代码使用了bootstrap进行效果上的渲染, bootstrap下载: http://v3.bootcss.com/
3.2.2 商品列表页面代码:
<body ng-app='shopCarApp' ng-controller="carShopController"> <div class="container"> <table class="table" ng-show="carShop.length"> <thead> <tr> <th>产品编号</th> <th>产品名字</th> <th>购买数量</th> <th>产品单价</th> <th>产品总价</th> <th>操作</th> </tr> </thead> <tbody> <tr ng-repeat="item in carShop"> <td>{{item.goodsNo}}</td> <td>{{item.goodsName}}</td> <td> <form class="form-inline"> <div class="form-group"> <button type="button" ng-click="reduce(item.goodsNo)" class="btn btn-primary">-</button> <input type="text" class="form-control" id="exampleInputName2" value="{{item.goodsNum}}" ng-model="item.goodsNum" > <button type="button" ng-click="add(item.goodsNo)" class="btn btn-primary">+</button> </div> </form> </td> <td>{{item.goodsPrice}}</td> <td>{{item.goodsPrice * item.goodsNum}}</td> <td> <button type="button" ng-click="remove(item.goodsNo)" class="btn btn-danger">移除</button> </td> </tr> <tr> <td> </td> <td> </td> <td> </td> <td> </td> <td colspan="2"> </td> </tr> </tbody> </table> <b>总购买价:</b>{{totalPrice()}} <b>总购买数量:</b>{{totalQuantity()}}<br> <p ng-show="!carShop.length">您的购物车为空</p> <button type="button" ng-click="clearShop()" class="btn btn-danger">清空购物车</button> <button type="button" ng-click="addCarShop()" class="btn btn-danger">添加商品</button> <button type="button" ng-click="saveGoods()" class="btn btn-danger">提交商品</button> </div>
3.3 商品编辑框代码:
<!-- 添加商品 --> <div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> <h4 class="modal-title" id="myModalLabel" style="float: left;">新增商品</h4> <button type="button" class="close closeModel" aria-label="Close" onClick="closeMod()"><span aria-hidden="true">×</span><tton> </div> <form id="goodsInfoForm" class="form-horizontal" role="form" style="margin-left: 30px; margin:30px;"> <div class="form-group"> <label for="goodsNo" class="col-sm-3 control-label"><span class="star_tip">*</span>产品编号:</label> <div class="col-sm-8"> <input ng-model="goods.goodsNo" type="text" class="form-control" id="goodsNo" name="goodsNo" value='1111' placeholder="产品编号"/> </div> </div> <div class="form-group"> <label for="goodsName" class="col-sm-3 control-label"><span class="star_tip">*</span>产品名称:</label> <div class="col-sm-8"> <input ng-model="goods.goodsName" type="text" class="form-control" id="goodsName" name="goodsName" value='iphone8' placeholder="产品名称"> </div> </div> <div class="form-group"> <label for="goodsNum" class="col-sm-3 control-label"><span class="star_tip">*</span>购买数量:</label> <div class="col-sm-8"> <input ng-model="goods.goodsNum" type="text" class="form-control" id="goodsNum" name="goodsNum" value='12' placeholder="购买数量"> </div> </div> <div class="form-group"> <label for="goodsPrice" class="col-sm-3 control-label"><span class="star_tip">*</span>产品单价:</label> <div class="col-sm-8"> <input ng-model="goods.goodsPrice" type="text" class="form-control" id="goodsPrice" name="goodsPrice" value='12' placeholder="产品单价"> </div> </div> <div class="modal-footer" style="text-align:center;"> <button type="button" class="btn btn-primary" id="save" ng-click="addGoods()">保存<tton> <button type="button" class="btn btn-default closeModel" onClick="closeMod()">关闭<tton> </div> </form> </div> </div> </div>
3.4 js逻辑代码处理
包括:AngularJs模块初始化,商品信息的加载,商品信息的增加,删除,提交
var appShopCar = angular.module("shopCarApp", [], function($provide){ // 从服务器上获取初始化数据 $provide.service('carShop',function($http){ var carShop = []; return carShop; }) }); appShopCar.controller("carShopController", function ($scope, $http) { console.log('加载 carShopController'); $http.get("/AngularJs/goods/getGoods.htm") .success(function (data, header, config, status) { console.log(data); $scope.carShop = data.data; }) .error(function (response) { console.log(response); }); /** * 计算购物总价 */ $scope.totalPrice = function () { var total = 0; angular.forEach($scope.carShop, function (item) { total += item.goodsNum * item.goodsPrice; }) return total; } /** * 计算总购买数 */ $scope.totalQuantity = function () { var total = 0; angular.forEach($scope.carShop, function (item) { total += parseInt(item.goodsNum); }) return total; } /** * 找一个元素的索引 */ var findIndex = function (goodsNo) { var index = -1; angular.forEach($scope.carShop, function (item, key) { if (item.goodsNo === goodsNo) { index = key; return; } }); return index; } /** * 为某个产品添加一个数量 */ $scope.add = function (goodsNo) { var index = findIndex(goodsNo); if (index !== -1) { ++$scope.carShop[index].goodsNum; } } /** * 为某个产品减少一个数量 */ $scope.reduce = function (goodsNo) { var index = findIndex(goodsNo); if (index !== -1) { var item = $scope.carShop[index]; if(item.goodsNum > 1){ --item.goodsNum; }else{ var returnKey = confirm('是否从购物车内删除该产品!'); if(returnKey){ $scope.remove(goodsNo); } } } } /** * 移除一项 */ $scope.remove = function (goodsNo) { var index = findIndex(goodsNo); // 如果找到了那个item if (index !== -1) { $scope.carShop.splice(index, 1); } // 自动做脏检查 } /** * 清空购物车 */ $scope.clearShop = function(){ $scope.carShop.length = 0; } /** * 添加商品 */ $scope.addCarShop = function(){ addCarShop(); } /** * 保存商品 */ $scope.addGoods = function() { //$('#goodsInfoForm').bootstrapValidator('validate'); var bSuccess = $('#goodsInfoForm').data("bootstrapValidator").isValid(); if(bSuccess){ console.log($scope.goods); console.log(JSON.stringify($scope.goods)); /*$scope.goods.goodsNum = 4; $scope.goods.goodsPrice = 23000;*/ var goods = {}; goods.goodsNo = $scope.goods.goodsNo; goods.goodsName = $scope.goods.goodsName; goods.goodsNum = $scope.goods.goodsNum; goods.goodsPrice = $scope.goods.goodsPrice; $scope.carShop.push(goods); closeMod(); } } /** * 提交商品 */ $scope.saveGoods = function(){ if($scope.carShop.length == 0){ alert('没有商品提交'); return; } var postCfg = { headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, transformRequest: function (data) { return $.param(data); } }; $http.post("/AngularJs/goods/saveGoods.htm", { goodsList : JSON.stringify($scope.carShop), }, postCfg) .success(function (data, header, config, status) { if(data.stateCode == 0){ alert(data.desc); } }) .error(function (data, header, config, status) { console.log(data); }); } }); $(function () { //校验form表单 //校验bootstrap form表单 $('#goodsInfoForm') .bootstrapValidator({ message: 'This value is not valid', feedbackIcons: { valid: 'glyphicon glyphicon-ok', invalid: 'glyphicon glyphicon-remove', validating: 'glyphicon glyphicon-refresh' }, fields: { 'goodsNo': { validators: { notEmpty: { message: '产品编号不能为空' }, stringLength: { min: 4, message: '产品编号最少4位' }, numeric: { message: '税额只能输入数字' } } }, 'goodsName': { validators: { notEmpty: { message: '产品名称不能为空' } } }, 'goodsNum': { validators: { notEmpty: { message: '购买数量不能为空' }, numeric: { message: '税额只能输入数字' } } }, 'goodsPrice': { validators: { notEmpty: { message: '产品单价不能为空' }, numeric: { message: '税额只能输入数字' } } } } }).on('success.form.bv', function(e) { alert('aaaaa'); }); }); /** * 清除控件元素中的内容 */ function formClear() { } //添加数据 function addCarShop() { formClear(); //这个modal函数是bootstrap.js中的函数 $("#myModal").modal("show"); } /* *关闭窗口 */ function closeMod(){ //重置form表单 $('#goodsInfoForm').data('bootstrapValidator').resetForm(true); $("#myModal").modal("hide"); }
3.5 后台处理, 前台与后台通讯的数据格式为json
保存商品信息
@RequestMapping("/saveGoods.htm") @ResponseBody public Result saveGoods(ModelMap map, HttpServletRequest request) { String strGoodsList = request.getParameter("goodsList"); List<Goods> lstGoods = JSON.parseArray(strGoodsList, Goods.class); Result result = new Result(); result.setStateCode("0"); result.setDesc("提交商品成功"); int nCount = goodsService.insertBatchGoods(lstGoods); return result; }
查询商品信息
@RequestMapping("/getGoods.htm") @ResponseBody public Result getGoods(ModelMap map, HttpServletRequest request) { Goods goods = new Goods(); List<Goods> lstGoods = goodsService.selectGoods(goods); Result result = new Result(); result.setStateCode("0"); result.setDesc("查询成功"); result.setData(lstGoods); return result; }