基于AngularJS+HTML+Groovy实现登录功能
angularjs是开发基于浏览器的响应式rwd应用程序的一个前端mvc框架,由谷歌最初开发的 开源项目,干净的架构吸引了大量粉丝,适合建立crud类型的业务应用程序,并不适合开发游戏等应用, 使用声明性编程的用户界面和命令式编程的逻辑, 支持现代桌面和移动浏览器 internet explorer版本8.0及以上。
angularjs是一款客户端mvc的javascript框架,而客户端mvc代表未来架构(为什么要使用mvc+rest+cqrs
架构),如果你有struts或springmvc等后端mvc框架编程经验,学习angular会很快,基本是按照同一个mvc思路实现的。
1 angularjs
angularjs 除了内置的指令外,我们还可以创建自定义指令。你可以使用 .directive 函数来添加自定义的指令。要调用自定义指令,html 元素上需要添加自定义指令名。使用驼峰法来命名一个指令, runoobdirective , 但在使用它时需要以 - 分割, runoob-directive :
<body ng-app="myapp"> <runoob-directive></runoob-directive> <script> var app = angular.module("myapp", []); app.directive("runoobdirective", function() { return { template : "<h>自定义指令!</h>" }; }); </script> </body>
angularjs还可以定义过滤器,如下所示:
<div ng-app="myapp" ng-controller="costctrl"> <input type="number" ng-model="quantity"> <input type="number" ng-model="price"> <p>总价 = {{ (quantity * price) | currency }}</p> </div>
angularjs 有自己的html事件处理方式:
<div ng-app="myapp" ng-controller="personctrl"> <button ng-click="toggle()">>隐藏/显示</button> <p ng-hide="myvar"> 名: <input type="text" ng-model="firstname"><br> 姓名: <input type="text" ng-model="lastname"><br> <br> full name: {{firstname + " " + lastname}} </p> </div> <script> var app = angular.module('myapp', []); app.controller('personctrl', function($scope) { $scope.firstname = "john", $scope.lastname = "doe" $scope.myvar = false; $scope.toggle = function() { $scope.myvar = !$scope.myvar; }; }); </script>
另外angularjs 的首选样式表是 twitter bootstrap, twitter bootstrap 是目前最受欢迎的前端框架。
<!doctype html> <html> <link rel="stylesheet" href="http://apps.bdimg.com/libs/bootstrap/../css/bootstrap.min.css"> <script src="http://apps.bdimg.com/libs/angular.js/../angular.min.js"></script> <body ng-app="myapp" ng-controller="userctrl"> <div class="container"> <h>users</h> <table class="table table-striped"> <thead><tr> <th>edit</th> <th>first name</th> <th>last name</th> </tr></thead> <tbody><tr ng-repeat="user in users"> <td> <button class="btn" ng-click="edituser(user.id)"> <span class="glyphicon glyphicon-pencil"></span> edit </button> </td> <td>{{ user.fname }}</td> <td>{{ user.lname }}</td> </tr></tbody> </table> <hr> <button class="btn btn-success" ng-click="edituser('new')"> <span class="glyphicon glyphicon-user"></span> create new user </button> <hr> <h ng-show="edit">create new user:</h> <h ng-hide="edit">edit user:</h> <form class="form-horizontal"> <div class="form-group"> <label class="col-sm- control-label">first name:</label> <div class="col-sm-"> <input type="text" ng-model="fname" ng-disabled="!edit" placeholder="first name"> </div> </div> <div class="form-group"> <label class="col-sm- control-label">last name:</label> <div class="col-sm-"> <input type="text" ng-model="lname" ng-disabled="!edit" placeholder="last name"> </div> </div> <div class="form-group"> <label class="col-sm- control-label">password:</label> <div class="col-sm-"> <input type="password" ng-model="passw" placeholder="password"> </div> </div> <div class="form-group"> <label class="col-sm- control-label">repeat:</label> <div class="col-sm-"> <input type="password" ng-model="passw" placeholder="repeat password"> </div> </div> </form> <hr> <button class="btn btn-success" ng-disabled="error || incomplete"> <span class="glyphicon glyphicon-save"></span> save changes </button> </div> <script src = "myusers.js"></script> </body> </html>
以上代码都是参看 ,更多的资料可以参看
2 groovy
有人说,有java就有groovy,用groovy,我们可以使用grails框架,感觉用来开发web应用非常很方便。groovy的语句和java类似,但是有一些特殊的地方。例如语句的分号是可选的。如果每行一个语句,就可以省略分号;如果一行上有多个语句,则需要用分号来分隔。 groovy中的字符串允许使用双引号和单引号。 当使用双引号时,可以在字符串内嵌入一些运算式,groovy允许您使用 与 bash 类似的 ${expression} 语法进行替换。可以在字符串中包含任意的groovy表达式。
name="james" println "my name is ${name},'00${6+1}'" //prints my name is james,'007'
如果有一大块文本,它需要类似 python 的三重引号(""")开头,并以三重引号结尾。
name = "james" text = """ hello there ${name} how are you today? """
3 登录实现
angularjs 指令是扩展的 html 属性,带有前缀 ng- 。 ng-app 指令初始化一个 angularjs 应用程序。 ng-init 指令初始化应用程序数据。 ng-model 指令把元素值(比如输入域的值)绑定到应用程序。下面的index.html定义了一个用户名和一个密码输入框控件,
angularjs 应用程序 app(实际上是app.js来处理) 由 ng-app 定义。 ng-controller="logincontroller" 属性是一个 angularjs 指令。用于定义一个控制器。 logincontroller 函数是一个 javascript 函数。angularjs 使用 $scope 对象来调用控制器,用 $scope 用来保存angularjs model(模型)的对象。控制器在作用域中创建了两个属性 ( username 和 password )。 ng-model 指令绑定输入域到控制器的属性( username 和 password )。ng-submit="login()"绑定了后台login()方法。
<!doctype html> <!--index.html --> <html ng-app="app" lang="en"> <head> <meta charset="utf-"> <title>title</title> <script src="angular.min.js"></script> <script src="scripts/app.js"></script> </head> <body ng-controller="logincontroller"> <form ng-submit="login()"> <h>用户名:</h> <input ng-model="user.username"> <h>密码:</h> <input ng-model="user.password"> <h>{{info}}</h> <br> <input type="submit" value="登陆"> </form> </body> </html>
app.js中定义了名为 app 模块,对应html页面的 ng-app="app", 其中在$scope定义了user和info可以用于前台模型绑定,另外定义了一个login()方法供前台提交调用。 $http 是 angularjs 中的一个核心服务,用于读取远程服务器的数据。
/** * app.js angular module define */ //ng-app="app" angular.module('app', []) //ng-controller="logincontroller" .controller('logincontroller', function ($scope, $http) { //user model define //ng-model="user.username" $scope.user = {} $scope.info = '欢迎登陆' //ng-submit="login()" $scope.login = function () { console.log($scope.user) //application.groovy post $http.post('/login', $scope.user).then(function (res) { console.log(res.data) if (res.status == ) { alert('登陆成功') } }, function (reason) { //{{info}} $scope.info = reason.data; }) } });
下面用groovy编写的登录后台处理逻辑:
/** * application.groovy */ import groovy.json.jsonbuilder import groovy.json.jsonslurper import groovy.sql.sql import static spark.spark.*; class application { static jsonslurper jsonslurper = new jsonslurper() static sql db = sql.newinstance("jdbc:jtds:sqlserver://...:/lrtest;instance=sql", "username", "password" , "net.sourceforge.jtds.jdbc.driver") public static void main(string[] args) { port() //default index.html staticfilelocation("/static"); get("/hello", { req, res -> "hello world" }); //app.js $http.post('/login', $scope.user) post('/login', { req, res -> //debug println(req.body()) def user = jsonslurper.parsetext(req.body()) //debug println(user) def u = db.firstrow("select * from test_user where username = ?.username and password = ?.password", user) if (u) { //return halt(, new jsonbuilder(u).tostring()) } else { halt(, '用户名密码不正确') } }) } }
为了更加直观表示各组成部分之间的关系,用下面的一张图来描述三者如何进行关联:
以上内容是基于angularjs+html+groovy实现登录功能的相关知识,希望对大家有所帮助。