使用Spring boot,Thymeleaf,AngularJS从零开始构建一个新的Web应用程序-第3部分

在之前的博客中,我们使用Thymeleaf,Bower和Bootstrap构建了登录页面,并将其部署到了Heroku。
在此博客中,我们将介绍用于前端的AngularJS和在后端的Spring Boot Web服务的一些功能。

我们将从“登录/注销”部分开始。 让我们开始使用Bower在我们的应用程序中安装AngularJS。

AngularJS简介

$ bower install angular --save

这将在bower_components文件夹内添加角度依赖性。 为了将角度注入到我们HTML页面中,我们需要做两件事
1)在我们的html文件中添加angular.min.js的路径

<script src="./bower_components/angular/angular.min.js" type="text/javascript"></script>

2.将主体标记为ng-app =“ myModule”,这意味着我们需要定义一个JavaScript模块,Angular将其识别为名为“ myModule”的应用程序。 Angular模块就像是应用程序不同部分的容器-控制器,服务,过滤器,指令等。

<body ng-app="myModule">

现在,我们需要在JS文件中定义该模块“ myModule”,我们可以将该文件称为具有成分的app.js:

angular.module('myModule', []).controller('home', function($http) {var self = this;$http.get('/resource/').then(function(response) {self.message = response.data;})
});

在这里,我们看到我们在“ myModule”中定义了一个名为“ home”的控制器,该控制器将用于通过数据绑定将值传递到HTML,此处的模型为“消息”。

数据将通过HTTP GET通过对我们的Spring后端进行REST调用来检索。
因此,让我们看看如何创建Spring Rest Controller:

弹簧架控制器

我们已经添加了依赖项"spring-boot-starter-web"因此我们现在不再需要任何spring boot依赖项来构建Rest Controller。

我们将创建一个LoginController

@RestController
public class LoginController {@RequestMapping("/resource")public Map<String,Object> home() {Map<String,Object> model = new HashMap<String,Object>();model.put("id", UUID.randomUUID().toString());model.put("content", "Hello World");return model;}

现在,如果将这段代码放在单独的div中的index.html中,则可以看到该div现在正在从后端动态加载数据。

要查看HTML中的数据,我们需要这样做:

<div ng-controller="home as home"><p>The ID is {{home.message.id}}</p><p>The content is {{home.message.content}}</p>
</div>

到目前为止,我们仅能在静态页面中使用angularJS并从后端Rest Controller检索一些信息并使用AngularJS进行渲染。

建筑物登录/注销

现在我们在索引页面中有了angularJS模块,让我们使用Spring Security实现登录/注销功能。

要构建登录/注销功能,我们需要制作3个HTML页面。
1)index.html –这将是登录页面,我们将在其中添加导航以登录和注销。 (我们已经有)
2)home.html –这将是用户登录后将重定向到的页面。 3)login.html –这将是带有用户名和密码字段的页面,用于输入要登录的凭据。

对于这些页面之间的路由,我们将使用ng-route 。 ngRoute模块为angular应用程序提供路由和深层链接服务和指令。 要使用bower安装ngRoute,我们将执行以下命令:

bower install angular-route@X.Y.Z

然后将其包含在index.html中:

<script src="path/to/angular.js"></script>
<script src="path/to/angular-route.js"></script>

步骤1:在index.html中添加导航

为了添加导航,我们需要在主体下面添加此代码块。

<div ng-controller="navigation as nav" class="container"><ul class="nav nav-pills" role="tablist"><li class="active"><a href="#/">home</a></li><li><a href="#/login">login</a></li><li ng-show="authenticated"><a href="" ng-click="nav.logout()">logout</a></li></ul></div><div ng-view class="container"></div>

“ ng-view”部分将显示“ login.html”部分页面。

更改app.js文件以定义路由:

angular.module('myModule', [ 'ngRoute' ]).config(function($routeProvider, $httpProvider) {$routeProvider.when('/', {templateUrl : 'home.html',controller : 'home',controllerAs: 'controller'}).when('/login', {templateUrl : 'login.html',controller : 'navigation',controllerAs: 'controller'}).otherwise('/');}).controller('home', function($http) {var self = this;$http.get('/resource/').then(function(response) {self.message = response.data;})}).controller('navigation',function($rootScope, $http, $location) {var self = thisvar authenticate = function(credentials, callback){var headers = credentials ? {authentication : "Basic "+ btoa(credentials.username + ":"+credentials.password)} : {};$http.get('user', {headers : headers}).then(function(response) {if (response.data.name) {$rootScope.authenticated = true;} else {$rootScope.authenticated = false;}callback && callback();}, function() {$rootScope.authenticated = false;callback && callback();});}authenticate();self.credentials = {};self.login = function() {authenticate(self.credentials, function() {if ($rootScope.authenticated) {$location.path("/");self.error = false;} else {$location.path("/login");self.error = true;}});};self.logout = function() {$http.post('logout', {}).finally(function() {$rootScope.authenticated = false;$location.path("/");});}});

在这里,我们定义了2个控制器和1个config,以及几个将由控制器使用的功能。 “ Config”用于使用ng-route定义路径和路由。 控制器“导航”用于按定义调用函数登录,注销和认证。 控制器“主页”用于在主页上发送问候语。

定义了authenticated变量以提供对页面上已认证用户的访问。

第2步:添加login.html部分页面

在这里,我们将制作一个局部页面login.html,它将在ng-view标记的div中呈现。

Login.html

<div class="alert alert-danger" ng-show="controller.error">There was a problem logging in. Please try again.
</div>
<form role="form" ng-submit="controller.login()"><div class="form-group"><label for="username">Username:</label> <input type="text"class="form-control" id="username" name="username" ng-model="controller.credentials.username"/></div><div class="form-group"><label for="password">Password:</label> <input type="password"class="form-control" id="password" name="password" ng-model="controller.credentials.password"/></div><button type="submit" class="btn btn-primary">Submit</button>
</form>

然后,我们需要RestControllers来使用Spring Security进行身份验证。 我们将使用spring安全的默认身份验证用户。 我们将使用以下方法制作一个UserController:

@RequestMapping("/user")public Principal user(Principal user) {return user;}

为了使Spring Security正常工作,我们需要在Application.java中添加它

@Configuration@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)protected static class SecurityConfiguration extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.httpBasic().and().authorizeRequests().antMatchers("/index.html", "/home.html", "/login.html", "/").permitAll().anyRequest().authenticated();}}

第3步:添加带有欢迎消息的home.html页面。

<h1>Message</h1>
<div ng-show="authenticated"><p>The ID is {{controller.message.id}}</p><p>The content is {{controller.message.content}}</p>
</div>
<div  ng-show="!authenticated"><p>Login to see your message</p>
</div>

“已认证”变量用于提供对页面的访问。

到目前为止,我们已成功使用Angular JS通过Spring Security登录和注销。 但是在实际应用中,我们需要根据用户数据库对实际用户进行身份验证。 在下一个博客中,我们将使用从用户DB进行身份验证的用户来构建应用程序。

PS:示例从Spring博客中引用: https : //spring.io/guides/tutorials/spring-security-and-angular-js/

翻译自: https://www.javacodegeeks.com/2016/05/build-new-web-application-scratch-using-spring-boot-thymeleaf-angularjs-part-3.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/353428.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nginx配置安装

安装之前准备1、依赖 gcc openssl-devel pcre-devel zlib-devel 安装&#xff1a;yum install gcc openssl-devel pcre-devel zlib-devel -y 安装Nginx./configure make && make install 默认安装目录&#xff1a;/usr/local/nginx 配置Nginx为系统服务&#xff0c;以…

matlab自定义窗口名

fg1figure(numbertitle,off,name,标题名称,color,white);saveas(fg1,保存图形的名称);clruprop 清除用户自定义属性setuprop 设置用户自定义属性getuprop 获取用户自定义属性

【从零开始搭建自己的.NET Core Api框架】(二)搭建项目的整体架构

系列目录 一. 创建项目并集成swagger 1.1 创建 1.2 完善 二. 搭建项目整体架构 三. 集成轻量级ORM框架——SqlSugar 3.1 搭建环境 3.2 实战篇&#xff1a;利用SqlSugar快速实现CRUD 3.3 生成实体类 四. 集成JWT授权验证 本来打算将搭建项目架构和集成SqlSugar放在一起讲的&…

zk 布局_ZK实际应用:样式和布局

zk 布局在先前的ZK in Action帖子中&#xff0c;我们使用ZK MVVM实现了CRUD功能 。 我们还快速浏览了一些样式代码&#xff0c;可能需要更多的解释。 在本文中&#xff0c;我们将介绍如何在ZK小部件上附加新CSS样式规则&#xff0c;以及如何覆盖现有样式。 我们还将介绍ZK中UI布…

蓝桥杯 2011年第二届C语言初赛试题(2)

6. 代码填空 &#xff08;满分9分&#xff09; 中奖计算 某抽奖活动的规则是&#xff1a;每位参与者在纸上写下一个8位数的号码。最后通过摇奖的办法随机产生一个8位数字。参与者写下的数字中最多有多少个连续位与开奖号码中的相同&#xff0c;则称为中了几个号。 例如&…

MATLAB离散一维小波函数

waveinfowfilters(wname);appcoef近似系数 detcoef详细系数dwt 单层独立1-D小波idwtupcoef 线性重建upwlev 单层重建wavedec wavelet decompositionwaverecwrcoef

使用Spring boot,Thymeleaf,AngularJS从零开始构建一个新的Web应用程序-第1部分

在这一系列博客文章中&#xff0c;我们将使用以下技术堆栈构建完整的响应式Web应用程序&#xff1a; 1&#xff09;弹簧靴 – Spring MVC网站 – Spring Data JPA –Spring安全 2&#xff09;Thymeleaf用于服务器端模板 3&#xff09;客户端MVC的Angular JS&#xff08;包括…

Codeforces 999F Cards and Joy 【dp】【性质】

读完这道题后应该想到牌有多少张都是什么不重要&#xff0c;重要的是player的favorite number是怎么分配的。&#xff08;因为不是任何player的favorite number不能带来任何joy&#xff09;然后每个favorite number带来的joy互相不受影响&#xff0c;因为如果favorite number不…

蓝桥杯 2011年第二届C语言初赛试题(3)

1、假设有两种微生物 X 和 Y X出生后每隔3分钟分裂一次&#xff08;数目加倍&#xff09;&#xff0c;Y出生后每隔2分钟分裂一次&#xff08;数目加倍&#xff09;。 一个新出生的X&#xff0c;半分钟之后吃掉1个Y&#xff0c;并且&#xff0c;从此开始&#xff0c…

MATLAB凸包Convex hull运算

凸包Convex hull运算&#xff08;求离散点的边界&#xff09; [k,a] convhull(x,y); K convulln(X, options);[K AV] convexHull(DT);tsearch :搜索Delaunay三角形delaunay :Delaunay三角化dsearch :求最近点 (这是两个有趣的函数)inpolygon :搜索多边形…

MATLAB Floyd算法

Floyd算法 Floyd算法又称为弗洛伊德算法,插点法,是一种用于寻找给定的加权图中顶点间最短路径的算法。 核心思路 通过一个图的权值矩阵求出它的每两点间的最短路径矩阵。 从图的带权邻接矩阵A=[a(i,j)] nn开始,递归地进行n次更新,即由矩阵D(0)=A,按一个公式,构造出矩阵D(…

父组件 子组件渲染

子组件使用v-if判断后渲染。 v-if 也是惰性的&#xff1a;如果在初始渲染时条件为假&#xff0c;则什么也不做——直到条件第一次变为真时&#xff0c;才会开始渲染条件块。 转载于:https://www.cnblogs.com/mengfangui/p/9228137.html

介绍Spring Integration

在本文中&#xff0c;我们介绍Spring Integration 。 如果您以前没有使用过Spring Integration&#xff0c;那么可能会帮助您复习Gregor Hohpe的Enterprise Integration Patterns 。 我还将推荐Josh Long 撰写的这篇出色的介绍性文章 。 上下文设置 简而言之&#xff0c; 企业…

蓝桥杯 2011年第二届C语言初赛试题(4)

4、某电视台举办了低碳生活大奖赛。题目的计分规则相当奇怪&#xff1a; 每位选手需要回答10个问题&#xff08;其编号为1到10&#xff09;&#xff0c;越后面越有难度。答对的&#xff0c;当前分数翻倍&#xff1b;答错了则扣掉与题号相同的分数&#xff08;选手必须回答…

各种资源(持续更新中)

寻找网页设计灵感的27个最佳网站推荐http://www.cnblogs.com/lhb25/archive/2011/04/19/2014303.html 模板王http://www.mobanwang.com/ http://sc.chinaz.com/

Katy Perry - E.T.

作曲 : Katy Perry, Łukasz Gottwald, Max Martin, Joshua Coleman 作词 : Katy Perry, Łukasz Gottwald, Max Martin, Joshua Coleman Youre so hypnotizing // hypnotize /ˈhipnəˌtīz / v.催眠,捕捉全部注意力,吸引 Could you be the devil? 你可会是那魔鬼&#xf…

使用Gradle禁止Java和Spring Boot Web应用程序中的FindBugs警告

如何在 Spring Boot和 Java应用程序中使用注释抑制FindBugs警告 如果您的构建由于FindBugs问题而中断&#xff0c;并且是假阳性&#xff0c;或者由于其他考虑而无法解决问题&#xff0c;则可以添加注释来忽略Findbugs警告。 更新您的Gradle依赖关系 您将需要在build.gradle文…

true,false组合问题

题目&#xff1a;给定n个布尔变量x1,x2,x3…xn&#xff0c;希望输出所有可能的布尔变量组合。例如当n&#xff1d;&#xff12;时&#xff0c;有&#xff14;种组合&#xff1a;a、true,true;b、true,faulse;c、faulse,true;d、faulse,faulse。请编写一个&#xff23;程序实现这…

更改matlab默认启动路径

1. 系统默认的启动路径是“我的文档”里的work目录&#xff0c;如果想要更改启动路径&#xff0c;解决方法是修改桌面上 MATLAB 快捷方式的属性&#xff0c;将原本的参数“目标” -sd 后面的 $documents\MATLAB 替换成自己的目录即可。我试了很多种方法&#xff0c;就这个最好使…

配置gitlab通过smtp发送邮件

https://www.centos.bz/2017/08/gitlab-send-email-with-smtp/ 1. 编辑/etc/gitlab/gitlab.rb文件&#xff08;加到文件最后面就好了&#xff09;。以QQ企业邮箱为例&#xff1a; gitlab_rails[smtp_enable] truegitlab_rails[smtp_address] "smtp.exmail.qq.com"g…