winform窗体模板_如何验证角模板驱动的窗体

winform窗体模板

介绍 (Introduction)

In this article, we will learn about validations in Angular template-driven forms. We will create a simple user registration form and implement some inbuilt validations on it. Along with the inbuilt validations, we will also implement some custom validations for the template-driven form.

在本文中,我们将学习Angular模板驱动形式的验证。 我们将创建一个简单的用户注册表单,并在其上实现一些内置的验证。 除了内置的验证,我们还将为模板驱动的表单实现一些自定义验证。

We will consider the following custom validations for this demo:

我们将为此演示考虑以下自定义验证:

  • Checking for user name availability

    检查用户名可用性
  • Password pattern validation

    密码模式验证
  • Matching the password entered in two different fields

    匹配在两个不同字段中输入的密码

Take a look at the application in action.

看一下实际的应用程序。

先决条件 (Prerequisites)

  • Install Visual Studio code from here

    从这里安装Visual Studio代码

  • Install the latest version of Angular CLI from here

    从此处安装最新版本的Angular CLI

  • Install the latest LTS version of Node.js from here

    从此处安装最新的LTS版本的Node.js

源代码 (Source Code)

You can get the source code from GitHub.

您可以从GitHub获取源代码。

创建Angular应用 (Create the Angular app)

Navigate to the folder where you want to create your project file. Open a command window and run the command shown below:

导航到要在其中创建项目文件的文件夹。 打开命令窗口并运行以下命令:

ng new angular-forms-validation --routing=false --style=scss

We are specifying the command to create a new Angular application. The option to create the routing module is set to false and style files extension is set to SCSS. This command will create the Angular project with the name angular-forms-validation.

我们正在指定创建新Angular应用程序的命令。 创建路由模块的选项设置为false,样式文件扩展名设置为SCSS。 此命令将使用名称angular-forms-validation创建Angular项目。

Change directories to the new project and open the project in VS Code using the set of commands below:

将目录更改为新项目,并使用以下命令集在VS Code中打开项目:

cd angular-forms-validation
code .

安装引导程序 (Install Bootstrap)

Run the following command to install Bootstrap:

运行以下命令以安装Bootstrap:

npm install bootstrap --save

Add the following import definition in the styles.scss file:

styles.scss文件中添加以下导入定义:

@import "~bootstrap/dist/css/bootstrap.css";

创建验证服务 (Create the validation service)

Run the following command to create a new service:

运行以下命令以创建新服务:

ng g s services\customvalidation

This command will create a folder named services that has two files inside it – customvalidation.service.ts and customvalidation.service.spec.ts. Open customvalidation.service.ts and put the following code inside it:

此命令将创建一个名为services的文件夹,其中有两个文件– customvalidation.service.tscustomvalidation.service.spec.ts 。 打开customvalidation.service.ts并将以下代码放入其中:

import { Injectable } from '@angular/core';
import { ValidatorFn, AbstractControl } from '@angular/forms';
import { FormGroup } from '@angular/forms';@Injectable({providedIn: 'root'
})
export class CustomvalidationService {patternValidator(): ValidatorFn {return (control: AbstractControl): { [key: string]: any } => {if (!control.value) {return null;}const regex = new RegExp('^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9]).{8,}$');const valid = regex.test(control.value);return valid ? null : { invalidPassword: true };};}MatchPassword(password: string, confirmPassword: string) {return (formGroup: FormGroup) => {const passwordControl = formGroup.controls[password];const confirmPasswordControl = formGroup.controls[confirmPassword];if (!passwordControl || !confirmPasswordControl) {return null;}if (confirmPasswordControl.errors && !confirmPasswordControl.errors.passwordMismatch) {return null;}if (passwordControl.value !== confirmPasswordControl.value) {confirmPasswordControl.setErrors({ passwordMismatch: true });} else {confirmPasswordControl.setErrors(null);}}}userNameValidator(userControl: AbstractControl) {return new Promise(resolve => {setTimeout(() => {if (this.validateUserName(userControl.value)) {resolve({ userNameNotAvailable: true });} else {resolve(null);}}, 1000);});}validateUserName(userName: string) {const UserList = ['ankit', 'admin', 'user', 'superuser'];return (UserList.indexOf(userName) > -1);}
}

The method patternValidator is used to validate the password pattern in our form. The parameter for this method is of type AbstractControl which is a base class for the FormControl.

patternValidator方法用于验证表单中的密码模式。 此方法的参数类型为AbstractControl ,它是FormControl的基类。

We will use a regular expression to validate the password. This regular expression will check for the following four conditions in the password:

我们将使用正则表达式来验证密码。 此正则表达式将检查密码中的以下四个条件:

  • The password should be a minimum of eight characters long

    密码长度至少为八个字符
  • It should have at least one lower case letter

    至少应有一个小写字母
  • It should have at least one upper case letter

    它应该至少包含一个大写字母
  • It should have at least one number

    它应该至少有一个数字

If the password fails the regex check, we will set the invalidPassword property to true.

如果密码未通过正则表达式检查,我们会将invalidPassword属性设置为true。

The method MatchPassword is used to compare the passwords in two fields. This method will accept two parameters of type string. These parameters represent the name of the fields to be matched. We will get the FormControl for these two fields and then match the values in them. If the values do not match, we will set the passwordMismatch property to true.

MatchPassword方法用于比较两个字段中的密码。 此方法将接受两个字符串类型的参数。 这些参数表示要匹配的字段的名称。 我们将获得这两个字段的FormControl ,然后匹配它们中的值。 如果值不匹配,我们将passwordMismatch属性设置为true。

The method userNameValidator is used to verify if the username is already taken or not. This method will accept a parameter of type AbstractControl.

方法userNameValidator用于验证用户名是否已被使用。 此方法将接受类型为AbstractControl的参数。

We will check if the value of this field is present in a static array, UserList. If the value entered by the user is already present, we will set the userNameNotAvailable property to true.

我们将检查此字段的值是否存在于静态数组UserList中。 如果用户输入的值已经存在,则将userNameNotAvailable属性设置为true。

We are using the setTimeout function to invoke this check every two seconds. This will ensure that the error will be thrown after two seconds from the time the user stops typing in the field.

我们正在使用setTimeout函数每两秒钟调用一次此检查。 这将确保从用户停止在该字段中键入内容起两秒钟后将引发该错误。

For the sake of simplicity of this article, we are using a static array to search for the availability of user names. Ideally, it should be a service call to the server to search for the value in a database.

为了简化本文,我们使用静态数组来搜索用户名的可用性。 理想情况下,应该是对服务器的服务调用,以在数据库中搜索值。

创建用户模型 (Create the User model)

Create a new folder called models inside the src/app folder. Add a new file called user.ts inside the models folder. Put the following code in the user.ts file.

src/app文件夹中创建一个名为models的新文件夹。 在models文件夹中添加一个名为user.ts的新文件。 将以下代码放入user.ts文件中。

export class User {public name: string;public email: string;public username: string;public password: string;public confirmPassword: string;
}

创建自定义指令 (Create custom directives)

We will create custom directives to implement custom validators for template-driven forms.

我们将创建自定义指令,以为模板驱动的表单实现自定义验证器。

Run the command shown below to create the passwordPattern directive:

运行下面显示的命令以创建passwordPattern指令:

ng g d directives\passwordPattern

This command will create a folder named directives that has two files inside it – passwordPattern.directive.ts and passwordPattern.directive.spec.ts. Open passwordPattern.directive.ts and put the following code inside it.

此命令将创建一个名为指令的文件夹,其中有两个文件– passwordPattern.directive.tspasswordPattern.directive.spec.ts 。 打开passwordPattern.directive.ts并将以下代码放入其中。

import { Directive } from '@angular/core';
import { NG_VALIDATORS, Validator, AbstractControl } from '@angular/forms';
import { CustomvalidationService } from '../services/customvalidation.service';@Directive({selector: '[appPasswordPattern]',providers: [{ provide: NG_VALIDATORS, useExisting: PasswordPatternDirective, multi: true }]
})
export class PasswordPatternDirective implements Validator {constructor(private customValidator: CustomvalidationService) { }validate(control: AbstractControl): { [key: string]: any } | null {return this.customValidator.patternValidator()(control);}
}

This directive is used to validate the password pattern. We will implement the Validator interface on the class PasswordPatternDirective. We will override the validate method which accepts a parameter of type AbstractControl, that is the control we want to validate. We will then invoke the patternValidator method from the service.

此伪指令用于验证密码模式。 我们将在类PasswordPatternDirective上实现Validator接口。 我们将覆盖validate方法,该方法接受类型为AbstractControl的参数,这是我们要验证的控件。 然后,我们将从服务中调用patternValidator方法。

Run the command shown below to create the matchPassword directive:

运行以下所示的命令以创建matchPassword指令:

ng g d directives\matchPassword

Open matchPassword.directive.ts and put the following code inside it:

打开matchPassword.directive.ts并将以下代码放入其中:

import { Directive, Input } from '@angular/core';
import { NG_VALIDATORS, Validator, ValidationErrors, FormGroup } from '@angular/forms';
import { CustomvalidationService } from '../services/customvalidation.service';@Directive({selector: '[appMatchPassword]',providers: [{ provide: NG_VALIDATORS, useExisting: MatchPasswordDirective, multi: true }]
})
export class MatchPasswordDirective implements Validator {@Input('appMatchPassword') MatchPassword: string[] = [];constructor(private customValidator: CustomvalidationService) { }validate(formGroup: FormGroup): ValidationErrors {return this.customValidator.MatchPassword(this.MatchPassword[0], this.MatchPassword[1])(formGroup);}
}

This directive is used to validate if the passwords entered in two fields are matching or not. This directive will accept an input of the type string array, which contains the fields to match. We will override the validate method and pass the parameter of type FormGroup. We will then invoke the MatchPassword method from the service.

此伪指令用于验证在两个字段中输入的密码是否匹配。 该指令将接受类型为字符串数组的输入,其中包含要匹配的字段。 我们将覆盖validate方法,并传递FormGroup类型的参数。 然后,我们将从服务中调用MatchPassword方法。

Run the command shown below to create the validateUserName directive:

运行下面显示的命令以创建validateUserName指令:

ng g d directives\validateUserName

Open validateUserName.directive.ts and put the following code inside it:

打开validateUserName.directive.ts并将以下代码放入其中:

import { Directive, forwardRef } from '@angular/core';
import { Validator, AbstractControl, NG_ASYNC_VALIDATORS } from '@angular/forms';
import { CustomvalidationService } from '../services/customvalidation.service';
import { Observable } from 'rxjs';@Directive({selector: '[appValidateUserName]',providers: [{ provide: NG_ASYNC_VALIDATORS, useExisting: forwardRef(() => ValidateUserNameDirective), multi: true }]})
export class ValidateUserNameDirective implements Validator {constructor(private customValidator: CustomvalidationService) { }validate(control: AbstractControl): Promise<{ [key: string]: any }> | Observable<{ [key: string]: any }> {return this.customValidator.userNameValidator(control);}
}

This directive is used to validate the availability of the user name. We will override the validate method and pass the parameter of type AbstractControl. We will then invoke the userNameValidator method from the service. This method will return a promise.

该伪指令用于验证用户名的可用性。 我们将覆盖validate方法并传递类型AbstractControl的参数。 然后,我们将从服务中调用userNameValidator方法。 此方法将返回一个承诺。

创建模板驱动的表单组件 (Create the template-driven form component)

Run the command shown below to create the template-driven-form component:

运行下面显示的命令以创建模板驱动表单组件:

ng g c template-driven-form

Open template-driven-form.component.ts and put the following code in it:

打开template-driven-form.component.ts并将以下代码放入其中:

import { Component } from '@angular/core';
import { User } from '../models/user';@Component({selector: 'app-template-driven-form',templateUrl: './template-driven-form.component.html',styleUrls: ['./template-driven-form.component.scss']
})
export class TemplateDrivenFormComponent {userModal = new User();constructor() { }onSubmit() {alert('Form Submitted succesfully!!!\n Check the values in browser console.');console.table(this.userModal);}
}

We have created an object userModal of type User. We will bind the form fields with the property of this object. The onSubmit method will show the success message on the screen and print the contents of the form to the console.

我们已经创建了类型为User的对象userModal 。 我们将表单域与该对象的属性绑定。 onSubmit方法将在屏幕上显示成功消息,并将表单内容打印到控制台。

Open template-driven-form.component.html and put the following code in it:

打开template-driven-form.component.html并将以下代码放入其中:

<div class="container"><div class="row"><div class="col-md-8 mx-auto"><div class="card"><div class="card-header"><h3>Angular Template-driven Form</h3></div><div class="card-body"><form class="form" #registerForm="ngForm" [appMatchPassword]="['password', 'confirmPassword']"(ngSubmit)="registerForm.form.valid && onSubmit()" novalidate><div class=" form-group"><label>Name</label><input type="text" class="form-control" [(ngModel)]="userModal.name" name="name"#name="ngModel" required><span class="text-danger"*ngIf="(name.touched || registerForm.submitted) && name.errors?.required">Name is required</span></div><div class="form-group"><label>Email</label><input type="text" class="form-control" [(ngModel)]="userModal.email" name="email"#email="ngModel" required email><span class="text-danger"*ngIf="(email.touched || registerForm.submitted) && email.errors?.required">Email is required</span><span class="text-danger" *ngIf="email.touched && email.errors?.email">Enter a valid email address</span></div><div class="form-group"><label>User Name</label><input type="text" class="form-control" [(ngModel)]="userModal.username" name="username"#username="ngModel" appValidateUserName required><span class="text-danger"*ngIf="(username.touched || registerForm.submitted) && username.errors?.required">User Name is required</span><span class="text-danger" *ngIf="username.touched && username.errors?.userNameNotAvailable">User Name not available</span></div><div class="form-group"><label>Password</label><input type="password" class="form-control" [(ngModel)]="userModal.password" name="password"#password="ngModel" appPasswordPattern required><span class="text-danger"*ngIf="(password.touched || registerForm.submitted) && password.errors?.required">Password is required</span><span class="text-danger" *ngIf="password.touched && password.errors?.invalidPassword">Password should have minimum 8 characters, at least 1 uppercase letter, 1 lowercaseletter and 1 number</span></div><div class="form-group"><label>Confirm Password</label><input type="password" class="form-control" [(ngModel)]="userModal.confirmPassword"name="confirmPassword" #confirmPassword="ngModel" required><span class="text-danger"*ngIf="(confirmPassword.touched || registerForm.submitted) && confirmPassword.errors?.required">Confirm Password is required</span><span class="text-danger"*ngIf="confirmPassword.touched && confirmPassword.errors?.passwordMismatch">Passwords doesnot match</span></div><div class="form-group"><button type="submit" class="btn btn-success">Register</button></div></form></div></div></div></div>
</div>

We will create a template-driven form and use the Bootstrap card for styling. The card header will contain a title whereas the card body will have the form fields.

我们将创建一个模板驱动的表单,并使用Bootstrap卡进行样式设置。 卡片标题将包含标题,而卡片正文将具有表单字段。

We will use the appMatchPassword directive on our form and pass the password and confirmPassword fields for validation. The ngModel property is used to bind the form control to the model.

我们将在appMatchPassword上使用appMatchPassword指令,并传递密码和confirmPassword字段进行验证。 ngModel属性用于将表单控件绑定到模型。

For validating the user name availability we will use the appValidateUserName directive on the username field. Similarly, we will use the appPasswordPattern directive on the password field to validate the password pattern.

为了验证用户名的可用性,我们将在用户名字appValidateUserName上使用appValidateUserName指令。 同样,我们将在密码字段上使用appPasswordPattern指令来验证密码模式。

We will check for the errors in the form controls and then display the appropriate validation error message on the screen.

我们将检查表单控件中的错误,然后在屏幕上显示相应的验证错误消息。

创建导航栏组件 (Create the nav-bar component)

Run the command shown below to create the nav-bar component:

运行下面显示的命令以创建导航栏组件:

ng g c nav-bar

Open nav-bar.component.html and put the following code in it:

打开nav-bar.component.html并将以下代码放入其中:

<nav class="navbar navbar-expand-sm navbar-dark bg-dark fixed-top"><a class="navbar-brand" [routerLink]='["/"]'>Form Validation Demo</a><div class="collapse navbar-collapse"><ul class="navbar-nav mr-auto"><li class="nav-item"><a class="nav-link" [routerLink]='["/template-form"]'>Template Form</a></li></ul></div>
</nav>

Here we are adding the navigation link to the template-driven form component.

在这里,我们将导航链接添加到模板驱动的表单组件。

更新应用程序组件 (Update the app component)

Open the app.component.html file and put the following code in it:

打开app.component.html文件,并将以下代码放入其中:

<app-nav-bar></app-nav-bar>
<div class="container"><router-outlet></router-outlet>
</div>

更新应用程序模块 (Update the App module)

We will import the forms module and also set up the routing for our application in the app module. Add the following code in the app.module.ts file. You can refer to GitHub for the complete source code of this file:

我们将导入表单模块,并在app模块中为我们的应用程序设置路由。 在app.module.ts文件中添加以下代码。 您可以参考GitHub以获得此文件的完整源代码:

import { RouterModule } from '@angular/router';
import { FormsModule } from  '@angular/forms';@NgModule({...    imports: [...FormsModule,RouterModule.forRoot([{ path: '', component: TemplateDrivenFormComponent },{ path: 'template-form', component: TemplateDrivenFormComponent }]),],
})

执行演示 (Execution demo)

Use the following command to start the webserver:

使用以下命令启动网络服务器:

ng serve -o

This command will launch the application in your default browser at http://localhost:4200/. You can perform all the form validations which we have discussed here.

此命令将在您的默认浏览器http://localhost:4200/启动应用程序。 您可以执行我们在此处讨论的所有表单验证。

This application is also hosted at https://ng-forms-validation.herokuapp.com/. Navigate to the link and play around with it for a better understanding.

此应用程序还托管在https://ng-forms-validation.herokuapp.com/上 。 导航至该链接,并对其进行处理以更好地理解。

摘要 (Summary)

We have created a sample user registration form using the template-driven form approach in Angular. We have implemented the inbuilt validations as well as custom validations to the form. The Bootstrap library is used to style the form.

我们使用Angular中的模板驱动表单方法创建了一个示例用户注册表单。 我们已经实现了表单的内置验证以及自定义验证。 Bootstrap库用于设置表单样式。

Get the source code from GitHub and play around with it for a better understanding.

从GitHub获取源代码并试用它,以更好地理解。

也可以看看 (See Also)

  • Reactive Form Validation In Angular

    Angular的React形式验证

  • Localization In Angular Using i18n Tools

    使用i18n工具在Angular中进行本地化

  • Policy-Based Authorization In Angular Using JWT

    使用JWT在Angular中基于策略的授权

  • ASP.NET Core – Using Highcharts With Angular 5

    ASP.NET Core –在Angular 5中使用Highcharts

  • ASP.NET Core – CRUD Using Angular And Entity Framework Core

    ASP.NET Core –使用Angular和Entity Framework Core的CRUD

You can find this post Template-Driven Form Validation In Angular and others like it on Ankit Sharma's Blog.

您可以在Ankit Sharma的Blog上找到这篇文章Angular中的模板驱动表单验证和其他类似文章 。

翻译自: https://www.freecodecamp.org/news/how-to-validate-angular-template-driven-forms/

winform窗体模板

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

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

相关文章

【loj6191】「美团 CodeM 复赛」配对游戏 概率期望dp

题目描述 n次向一个栈中加入0或1中随机1个&#xff0c;如果一次加入0时栈顶元素为1&#xff0c;则将这两个元素弹栈。问最终栈中元素个数的期望是多少。 输入 一行一个正整数 n 。 输出 一行一个实数&#xff0c;表示期望剩下的人数&#xff0c;四舍五入保留三位小数。 样例输入…

查找满足断言的第一个元素

问题&#xff1a;查找满足断言的第一个元素 我刚刚开始使用Java 8的lambdas&#xff0c;我尝试去实现一些我在函数式语言里面经常用的 例如&#xff0c;大部分的函数式语言里有一些查找函数&#xff0c;针对序列或者list进行操作&#xff0c;返回使得断言为真的第一个元素。我…

Lock和synchronized的选择

学习资源:http://www.cnblogs.com/dolphin0520/p/3923167.html 一.java.util.concurrent.locks包下常用的类 1.Lock public interface Lock { void lock();//用来获取锁。如果锁已被其他线程获取&#xff0c;则进行等待。void lockInterruptibly() throws InterruptedException…

python 面试问题_值得阅读的30个Python面试问题

python 面试问题Interview questions are quite tricky to predict. In most cases, even peoples with great programming ability fail to answer some simple questions. Solving the problem with your code is not enough. Often, the interviewer will expect you to hav…

spring boot中 使用http请求

因为项目需求&#xff0c;需要两个系统之间进行通信&#xff0c;经过一番调研&#xff0c;决定使用http请求。服务端没有什么好说的&#xff0c;本来就是使用web 页面进行访问的&#xff0c;所以spring boot启动后&#xff0c;controller层的接口就自动暴露出来了&#xff0c;客…

arduino joy_如何用Joy开发Kubernetes应用

arduino joyLet’s face it: Developing distributed applications is painful.让我们面对现实&#xff1a;开发分布式应用程序很痛苦。 Microservice architectures might be great for decoupling and scalability but they are intimidatingly complex when it comes to de…

怎么样得到平台相关的换行符?

问题&#xff1a;怎么样得到平台相关的换行符&#xff1f; Java里面怎么样得到平台相关的换行符。我不可能到处都用"\n" 回答一 In addition to the line.separator property, if you are using java 1.5 or later and the String.format (or other formatting me…

scrapy常用工具备忘

scrapy常用的命令分为全局和项目两种命令&#xff0c;全局命令就是不需要依靠scrapy项目&#xff0c;可以在全局环境下运行&#xff0c;而项目命令需要在scrapy项目里才能运行。一、全局命令##使用scrapy -h可以看到常用的全局命令 [rootaliyun ~]# scrapy -h Scrapy 1.5.0 - n…

机器学习模型 非线性模型_机器学习:通过预测菲亚特500的价格来观察线性模型的工作原理...

机器学习模型 非线性模型Introduction介绍 In this article, I’d like to speak about linear models by introducing you to a real project that I made. The project that you can find in my Github consists of predicting the prices of fiat 500.在本文中&#xff0c;…

NOIP赛前模拟20171027总结

题目&#xff1a; 1.寿司 给定一个环形的RB串要求经过两两互换后RB分别形成两段连续区域,求最少操作次数(算法时间O(n)) 2.金字塔 给定一个金字塔的侧面图有n层已知每一层的宽度高度均为1要求在图中取出恰好K个互不相交的矩形&#xff08;边缘可以重叠&#xff09;,求最多可以取…

虚幻引擎 js开发游戏_通过编码3游戏学习虚幻引擎4-5小时免费游戏开发视频课程

虚幻引擎 js开发游戏One of the most widely used game engines is Unreal Engine by Epic Games. On the freeCodeCamp.org YouTube channel, weve published a comprehensive course on how to use Unreal Engine with C to develop games.Epic Games的虚幻引擎是使用最广泛的…

建造者模式什么时候使用?

问题&#xff1a;建造者模式什么时候使用&#xff1f; 建造者模式在现实世界里面的使用例子是什么&#xff1f;它有啥用呢&#xff1f;为啥不直接用工厂模式 回答一 下面是使用这个模式的一些理由和Java的样例代码&#xff0c;但是它是由设计模式的4个人讨论出来的建造者模式…

TP5_学习

2017.10.27&#xff1a;1.index入口跑到public下面去了 2.不能使用 define(BIND_MODULE,Admin);自动生成模块了&#xff0c;网上查了下&#xff1a; \think\Build::module(Admin);//亲测,可用 2017.10.28:1.一直不知道怎么做查询显示和全部显示&#xff0c;原来如此简单&#x…

sql sum语句_SQL Sum语句示例说明

sql sum语句SQL中的Sum语句是什么&#xff1f; (What is the Sum statement in SQL?) This is one of the aggregate functions (as is count, average, max, min, etc.). They are used in a GROUP BY clause as it aggregates data presented by the SELECT FROM WHERE port…

10款中小企业必备的开源免费安全工具

10款中小企业必备的开源免费安全工具 secist2017-05-188共527453人围观 &#xff0c;发现 7 个不明物体企业安全工具很多企业特别是一些中小型企业在日常生产中&#xff0c;时常会因为时间、预算、人员配比等问题&#xff0c;而大大减少或降低在安全方面的投入。这时候&#xf…

为什么Java里面没有 SortedList

问题&#xff1a;为什么Java里面没有 SortedList Java 里面有SortedSet和SortedMap接口&#xff0c;它们都属于Java的集合框架和提供对元素进行排序的方法 然鹅&#xff0c;在我的认知里Java就没有SortedList这个东西。你只能使用java.util.Collections.sort()去排序一个list…

图片主成分分析后的可视化_主成分分析-可视化

图片主成分分析后的可视化If you have ever taken an online course on Machine Learning, you must have come across Principal Component Analysis for dimensionality reduction, or in simple terms, for compression of data. Guess what, I had taken such courses too …

回溯算法和递归算法_回溯算法:递归和搜索示例说明

回溯算法和递归算法Examples where backtracking can be used to solve puzzles or problems include:回溯可用于解决难题或问题的示例包括&#xff1a; Puzzles such as eight queens puzzle, crosswords, verbal arithmetic, Sudoku [nb 1], and Peg Solitaire. 诸如八个皇后…

C#中的equals()和==

using System;namespace EqualsTest {class EqualsTest{static void Main(string[] args){//值类型int x 1;int y 1;Console.WriteLine(x y);//TrueConsole.WriteLine(x.Equals(y));//True //引用类型A a new A();B b new B();//Console.WriteLine(ab);//报错…

JPA JoinColumn vs mappedBy

问题&#xff1a;JPA JoinColumn vs mappedBy 两者的区别是什么呢 Entity public class Company {OneToMany(cascade CascadeType.ALL , fetch FetchType.LAZY)JoinColumn(name "companyIdRef", referencedColumnName "companyId")private List<B…