上一篇文章实现Student 基本的实体CRUD操作。本文将展示如何Students Index页添加排序、筛选和分页功能。
以下是排序完成时、经过筛选和分页功能截图,您可以在列标题点击排序。
1.为 Students Index页面加入列排序链接
要为Students Index页面加入排序功能,你须要改动Student controller的Index方法,并为Student Index视图加入代码。
向Index方法加入排序功能
打开Controllers\StudentController.cs,使用以下的代码替换Index 方法
public ActionResult Index(string sortOrder)
{
ViewBag.NameSortParm = String.IsNullOrEmpty(sortOrder) ? "name_desc" : "";
ViewBag.DateSortParm = sortOrder == "Date" ?
"date_desc" : "Date"; var students = from s in db.Students select s; switch (sortOrder) { case "name_desc": students = students.OrderByDescending(s => s.LastName); break; case "Date": students = students.OrderBy(s => s.EnrollmentDate); break; case "date_desc": students = students.OrderByDescending(s => s.EnrollmentDate); break; default: students = students.OrderBy(s => s.LastName); break; } return View(students.ToList()); }
上面的代码接收URL中的查询字符串作为sortOrder參数。该參数是"Name"或"Date"。使用三元运算符推断并加下划线和"desc"来指名这是一个降序排序,默认是按升序排序。
第一次訪问Index页面时是没有查询字符串的,students依照LastName作升序排序显示。这是由switch语句中的default指定的。当用户点击某列的标题链接时,URL的查询字符串中就含有了对应的sortOrder值。
这里使用了两个ViewBag变量以便视图能够将合适的查询字符串提供给列标题链接。
ViewBag.NameSortParm = String.IsNullOrEmpty(sortOrder) ?
"name_desc" : ""; ViewBag.DateSortParm = sortOrder == "Date" ?
"date_desc" : "Date";
这里使用了三元运算符,上面第一个指明假如sortOrder參数为null或为空。则ViewBag.NameSortParm被赋值为"name_desc"。否则将其赋值为空。其排序规则为:
Current sort order
Last Name Hyperlink
Date Hyperlink
Last Name ascending
descending
ascending
Last Name descending
ascending
ascending
Date ascending
ascending
descending
Date descending
ascending
ascending
该方法使用LINQ to Entities来指明要排序的列,上面的代码在switch语句前新建了一个 IQueryable变量,然后在switch中改动它,最后在switch语句后调用ToList方法。当你创建并改动IQueryable变量时,并没有向数据库发送查询命令,直到调用ToList方法将IQueryable 对象转换为一个集合时才真正的运行查询命令。因此,直到return View语句,才会运行查询语句。
作为还有一种为每个排序编写不同的LINQ语句的替代方法。能够使用动态创建LINQ句。
为Student Index视图加入列标题链接
打开Views\Student\Index.cshtml,加入以下的代码
@Html.ActionLink("Create New", "Create")
@Html.ActionLink("Last Name", "Index", new { sortOrder = ViewBag.NameSortParm })
First Name
@Html.ActionLink("Enrollment Date", "Index", new { sortOrder = ViewBag.DateSortParm })
@foreach (var item in Model) {
上面的代码使用ViewBag属性使用对应的查询字符串来设置列标题链接的值。
执行项目,点击Last Name和Enrollment Date行标题,验证排序功能
点击Last Name标题。students 将按降序排列
2.向Students Index页面加入搜索框
要在Students Index页面中加入搜索功能,你须要在视图中加入一个文本框和一个提交button并改动Index方法,通过在文本框中输入 first name或者last name 来搜索对应的Students数据。
在Index方法中加入筛选功能
打开Controllers\StudentController.cs,使用以下的代码替换Index方法
public ViewResult Index(string sortOrder, string searchString)
{
ViewBag.NameSortParm = String.IsNullOrEmpty(sortOrder) ? "name_desc" : "";
ViewBag.DateSortParm = sortOrder == "Date" ?
"date_desc" : "Date"; var students = from s in db.Students select s; if (!String.IsNullOrEmpty(searchString)) { students = students.Where(s => s.LastName.ToUpper().Contains(searchString.ToUpper()) || s.FirstMidName.ToUpper().Contains(searchString.ToUpper())); } switch (sortOrder) { case "name_desc": students = students.OrderByDescending(s => s.LastName); break; case "Date": students = students.OrderBy(s => s.EnrollmentDate); break; case "date_desc": students = students.OrderByDescending(s => s.EnrollmentDate); break; default: students = students.OrderBy(s => s.LastName); break; } return View(students.ToList()); }
上面的代码将searchString參数加入到Index方法。你也能够向LINQ语句中加入where子句来查询那些first name 或者 last name中包括查询条件的student。
查询条件就是你所填写在Index视图的文本框中的字符串,仅仅有当文本框中由查询条件时。where语句才会运行。
注意:在非常多情况下,你能够调用不管该是Entity Framework实体集中的方法还是位于内存集合中的作为扩展的方法,得到的结果一般是一样的,可是有些情况下可能不同。
举例来说。.NET Framework实现了Contains方法,当你向该方法传递一个空字符串作为參数时,它将返回全部行,可是在SQL Server Compact 4.0的 Entity Framework提供程序中不反回不论什么行,因此上面的代码(将where语句放在if语句中)能够确保全部SQL Server版本号都能返回同样的结果。另外,.NET Framework实现的Contains方法默认是大写和小写敏感的,可是Entity Framework SQL Server 提供程序运行的比較是不区分大写和小写的。
因此。此处调用ToUpper方法来明白这里运行不区分大写和小写的比較,这样当接下来使用仓储模式时不须要改动代码就能够得到同样的结果(IEnumerable集合中的Contains方法是由 .NET Framework实现的,IQueryable对象中的Contains方法是由数据库提供程序实现的)。
对于不同的数据库提供程序或者使用IQueryable对象作比較或者使用IEnumerable集合作比較时,Null值得处理也是不同的。比如某些情况下,where条件比方table.Column !=0可能不返回那些包括null值得列。
在Student Index 视图中加入一个搜索框
打开Views\Student\Index.cshtml,加入例如以下代码
@Html.ActionLink("Create New", "Create")
@using (Html.BeginForm())
{
Find by name: @Html.TextBox("SearchString")
}
执行项目。输入要搜索的值,点击Search验证搜索功能是否正常
注意在URL中并不包括搜索字符串,这意味着假设你将此页面增加书签,然后通过书签来打开此页面。你将无法得到筛选后的结果。
在Students Index页面中加入分页功能
要向Students Index页面中加入分页,你须要安装PagedList.Mvc NuGet包。然后你能够在Index 方法中做一些改动并在Index视图中加入分页链接。PagedList.Mvc是ASP.NET MVC中众多分页和排序包中比較好的一个。这里仅仅是使用它来作为演示,并不是作为推荐选择。
安装PagedList.Mvc NuGet包
PagedList包作为PagedList.Mvc包的依赖项会自己主动安装到项目中。PagedList包为IQueryable和IEnumable集合加入了PagedList集合类型和扩展方法。
PagedList扩展方法为从IQueryabl或IEnumable集合产生的PagedList集合数据创建了一个单一的页面。而且PagedList集合提供了多个便于分页的属性和方法。PagedList.Mvc包中含有分页帮助器并可在页面中显示分页button。
依次打开Tools-> Library Package Manager-> Package Manager Console
在打开的Package Manager Console中确保Package source是nuget.org 而且Default project是 ContosoUniversity,最后输入Install-Package PagedList.Mvc命令
在Index方法中加入分页功能
打开Controllers\StudentController.cs,加入PagedList命名空间
using PagedList;
使用以下的代码替换Index方法
public ViewResult Index(string sortOrder, string currentFilter, string searchString, int? page)
{
ViewBag.CurrentSort = sortOrder;
ViewBag.NameSortParm = String.IsNullOrEmpty(sortOrder) ?
"name_desc" : ""; ViewBag.DateSortParm = sortOrder == "Date" ?
"date_desc" : "Date"; if (searchString != null) { page = 1; } else { searchString = currentFilter; } ViewBag.CurrentFilter = searchString; var students = from s in db.Students select s; if (!String.IsNullOrEmpty(searchString)) { students = students.Where(s => s.LastName.ToUpper().Contains(searchString.ToUpper()) || s.FirstMidName.ToUpper().Contains(searchString.ToUpper())); } switch (sortOrder) { case "name_desc": students = students.OrderByDescending(s => s.LastName); break; case "Date": students = students.OrderBy(s => s.EnrollmentDate); break; case "date_desc": students = students.OrderByDescending(s => s.EnrollmentDate); break; default: // Name ascending students = students.OrderBy(s => s.LastName); break; } int pageSize = 3; int pageNumber = (page ??
1); return View(students.ToPagedList(pageNumber, pageSize)); }
上面的代码加入了一个page參数,一个当前排序顺序參数,一个当前搜索条件參数
public ActionResult Index(string sortOrder, string currentFilter, string searchString, int? page)
页面第一次显示或者用户还没有点击分页或排序链接。全部參数值都为null。假设点击分页链接,page变量将包括要显示的页码。
ViewBag属性向视图提供了当前的排序顺序,由于在点击分页链接后必需要保持当前的排序顺序。
ViewBag.CurrentSort = sortOrder;
还有一个属性ViewBag.CurrentFiler向视图提供当前的搜索条件。该值必需要被包括在分页链接中以保证是针对搜索结果进行分页。同一时候在页面又一次显示时,搜索字符串必须显示在搜索框中。假设在分页时改动了搜索字符串。页码必需要被重置为1。由于新的搜索条件可导致不同的搜索结果。当向搜索框输入搜索字符串并点击提交button。这是searchString的值不为null。
if (searchString != null)
{
page = 1;
}
else
{
searchString = currentFilter;
}
在该方法的结尾部分,学生IQueryable对象的ToPagedList扩展方法将学生查询转换为一个支持分页的学生集合类型,并将该学生集合传递给视图
int pageSize = 3;
int pageNumber = (page ?
?
1); return View(students.ToPagedList(pageNumber, pageSize));
ToPagedList方法须要一个页码參数。两个问号表示空合并操作符(null-coalescing operator)。空合并操作符为nullable 类型指定默认值,表达式(page ?? 1)表示假设page值不为空就返回该值,否则返回1。
向 Student Index视图加入分页链接
打开Views\Student\Index.cshtml,使用以下的代码替换
@model PagedList.IPagedList
@using PagedList.Mvc;
@{
ViewBag.Title = "Students";
}
Students
@Html.ActionLink("Create New", "Create")
@using (Html.BeginForm("Index", "Student", FormMethod.Get))
{
Find by name: @Html.TextBox("SearchString", ViewBag.CurrentFilter as string)
}
@Html.ActionLink("Last Name", "Index", new { sortOrder = ViewBag.NameSortParm, currentFilter=ViewBag.CurrentFilter })
First Name
@Html.ActionLink("Enrollment Date", "Index", new { sortOrder = ViewBag.DateSortParm, currentFilter=ViewBag.CurrentFilter })
@foreach (var item in Model) {
@Html.DisplayFor(modelItem => item.LastName)
@Html.DisplayFor(modelItem => item.FirstMidName)
@Html.DisplayFor(modelItem => item.EnrollmentDate)
@Html.ActionLink("Edit", "Edit", new { id=item.ID }) |
@Html.ActionLink("Details", "Details", new { id=item.ID }) |
@Html.ActionLink("Delete", "Delete", new { id=item.ID })
}
Page @(Model.PageCount < Model.PageNumber ?
0 : Model.PageNumber) of @Model.PageCount @Html.PagedListPager(Model, page => Url.Action("Index", new { page, sortOrder = ViewBag.CurrentSort, currentFilter = ViewBag.CurrentFilter }))
页面顶部的@model语句指明视图如今获取的是PagedList对象而不是List对象。
using PagedList.Mvc语句能够使MVC帮助器提供分页button。
在代码中使用了 BeginForm 的重载方法并加入了FormMethod.Get 參数。
@using (Html.BeginForm("Index", "Student", FormMethod.Get))
{
Find by name: @Html.TextBox("SearchString", ViewBag.CurrentFilter as string)
}
默认情况下BeginForm 使用POST方式提交表单数据,这意味着參数通过HTTP消息正文传递而不是通过URL查询字符串。当你指定使用HTTP GET时。表单数据通过URL查询字符串来传递。这样能够同意用户将URL保存为书签。
W3C guidelines for the use of HTTP GET推荐你应该在不会更新数据的方法中使用GET方式。
搜索框使用当前的搜索字符串进行初始化,以便在分页的时候不会丢失搜索字符串。
Find by name: @Html.TextBox("SearchString", ViewBag.CurrentFilter as string)
列标题链接使用了搜索字符串并将其传递给控制器以便用户能够对搜索结果进行排序。
@Html.ActionLink("Last Name", "Index", new { sortOrder=ViewBag.NameSortParm, currentFilter=ViewBag.CurrentFilter })
显示当前页码和总页数
Page @(Model.PageCount < Model.PageNumber ? 0 : Model.PageNumber) of @Model.PageCount
假设没有要显示的页。就显示"Page 0 of 0"
PagedListPager帮助器显示分页button
@Html.PagedListPager( Model, page => Url.Action("Index", new { page }) )
PagedListPager帮助器提供了多个选项。你能够自己定义URL和样式
执行项目
使用不同的排序方式。并点击分页button跳转至不同的页码,确保分页功能正常,然后输入查询条件,再次验证分页和搜索功能正常。
3.创建显示学生统计信息的About页面
要让About页面显示在每个入学日共同拥有多少学生登记,须要将学生分组并进行简单的计算,要做到这些。须要运行下列操作:
须要为要传递给视图的数据创建一个视图模型类
改动Home控制器中的About方法
改动About视图
创建视图模型 创建一个ViewModels目录并加入名为EnrollmentDataGroup.cs的类,使用以下的代码替换
using System;
using System.ComponentModel.DataAnnotations;
namespace ContosoUniversity.ViewModels
{
public class EnrollmentDateGroup
{
[DataType(DataType.Date)]
public DateTime? EnrollmentDate { get; set; }
public int StudentCount { get; set; }
}
}
改动Home控制器
打开HomeController.cs,在文件顶部加入using语句引入命名空间
using ContosoUniversity.DAL;
using ContosoUniversity.ViewModels;
为数据库上下文加入类变量
public class HomeController : Controller
{
private SchoolContext db = new SchoolContext();
使用以下的代码替换About方法
public ActionResult About()
{
IQueryable data = from student in db.Students
group student by student.EnrollmentDate into dateGroup
select new EnrollmentDateGroup()
{
EnrollmentDate = dateGroup.Key,
StudentCount = dateGroup.Count()
};
return View(data.ToList());
}
使用LINQ语句对Student实体依照enrollment date分组。计算每一个分组的实体数量,并将结果存储在EnrollmentDateGroup视图模型对象的集合中。
加入Dispose方法
protected override void Dispose(bool disposing)
{
db.Dispose();
base.Dispose(disposing);
}
改动About视图
打开Views\Home\About.cshtml ,使用以下的代码替换
@model IEnumerable
@{
ViewBag.Title = "Student Body Statistics";
}
Student Body Statistics
Enrollment Date
Students
@foreach (var item in Model) {
@Html.DisplayFor(modelItem => item.EnrollmentDate)
@item.StudentCount
}
执行项目,点击About链接。显示学生统计信息
欢迎转载,请注明文章出处:http://blog.csdn.net/johnsonblog/article/details/38795465
还大家一个健康的网络环境,从你我做起
项目源代码:https://github.com/johnsonz/MvcContosoUniversity
THE END
你可能感兴趣的:(MVC5 Entity Framework学习参加排序、筛选和排序功能)
深入解析:Python中的决策树与随机森林
小鹿( ﹡ˆoˆ﹡ )
Python python 决策树 随机森林 Python
在这个数据驱动的时代,机器学习技术已经成为许多企业和研究机构不可或缺的一部分。其中,决策树和随机森林作为两种强大的算法,在分类和回归任务中表现尤为出色。本文将带领大家深入了解这两种算法在Python中的实现,从基础到实战,逐步揭开它们的神秘面纱。引言决策树是一种非常直观的预测模型,它通过一系列规则对数据进行分割,最终形成树状结构。而随机森林则是基于决策树的一种集成学习方法,通过构建多个决策树并取其
c++特殊类设计
pick me long
c++ c++
特殊类设计一、设计一个类不能被拷贝1.c++98的方式是只声明不定义,设置成私有;2.c++11的方式是=delete,声明为删除函数;二、设计一个类只能在堆上开辟空间new出来的空间是不会自动调用析构函数的;方法:1.将析构函数私有,然后写一个函数公有可以让类外主动去释放堆空间;2.将构造函数私有就会导致静态成员,栈上的成员和堆上的成员都不能使用,此时可以创建一个静态成员函数,专门用来初始化不同
JS求数组的最大值和最小值
天涯学馆
大前端&移动端全栈架构 javascript 前端 架构
1.使用Math.max和Math.min函数配合扩展运算符(…)constarray=[1,½,3,4.5,-2,6,-7
JS深度剖析异步编程方式
天涯学馆
大前端&移动端全栈架构 javascript ecmascript 前端 架构
目录回调函数事件监听发布/订阅Promiseasync/awaitGenerator函数与迭代器深度剖析JavaScript异步编程方式,主要涉及以下几个核心概念和技术回调函数回调函数的基本概念回调函数(CallbackFunction)是一种在特定事件或条件触发时被调用的函数,常用于处理异步操作的结果。在JavaScript中,回调函数是实现异步编程的最初也是最基础的方式。它的工作原理是:将一个
JS 深入理解代码复用模式
天涯学馆
大前端&移动端全栈架构 javascript 原型模式 前端
目录对象Object构造函数组合/混入(Mixins)模块化高阶函数装饰器设计模式其他复用技术JavaScript中的代码复用模式,需要探讨多种实现代码复用的技术手段和策略,包括但不限于原型继承、构造函数、
JS 全面解析Module模式
天涯学馆
大前端&移动端全栈架构 javascript 前端 开发语言
目录基本结构与原理优点应用场景扩展与变体JavaScriptModule模式是一种设计模式,用于封装和管理代码,提供私有变量、私有方法和公有接口,实现模块化编程。Module模式通过闭包来创建一个封装的私有作用域,同时允许对外暴露必要的接口。基本结构与原理Module模式的核心是一个自执行的匿名函数,它返回一个对象,该对象包含公有接口。基本结构如下:constMyModule=(
JS常用实践难点解析
天涯学馆
大前端&移动端全栈架构 javascript ecmascript 前端
目录浏览器类型与版本特性检测上下文和函数参数传递JSON标记及eval函数高级闭包浏览器类型与版本通过navigator对象来检测浏览器类型、版本以及其他相关信息。navigator对象是浏览器提供的一个原生对象,它包含了关于浏览器和操作系统的信息。浏览器类型与主要版本最直接的方式是查看navigator.userAgent属性
Ajax的基本使用和原理
天涯学馆
大前端&移动端全栈架构 ajax 前端 javascript
目录基础概念简单示例原理解析原理深入基础概念什么是Ajax?Ajax是一种在无需重新加载整个网页的情况下,通过JavaScript异步地从服务器获取数据并更新部分网页的技术。关键技术组成:XMLHttpRequest(XHR)对象:这是实现Ajax通信的核心对象,用于在后台与服务器交换数据。JavaScript:编写客户端逻辑,处理用户交互,发送请求和处理响应。HTML/CSS:构建和美化用户界面
JS 中的DOM 操作
天涯学馆
大前端&移动端全栈架构 javascript 前端
目录概念Node接口NodeList接口,HTMLCollection接口ParentNode接口,ChildNode接口Document节点Element节点属性的操作Text节点和DocumentFragment节点
CSS工具与工作流
天涯学馆
大前端&移动端全栈架构 css 前端
CSS工具与工作流是前端开发中的重要组成部分,它们帮助开发者提高编写、维护和优化CSS代码的效率。以下是一些关键的CSS工具与工作流实践:代码组织与结构预处理器:如Sass、Less或Stylus,提供了变量、嵌套规则、混合(mixins)、函数等特性,使得CSS更易于管理和维护。模块化:将CSS分解成小的、可管理的模块或组件,常用的方法有BEM(BlockElementModifier)、SMA
CSS实验性功能及CSS4特性
天涯学馆
大前端&移动端全栈架构 css 前端
CSS4目前仍然是一个宽泛的概念,因为CSS的发展通常是通过一系列逐步完善的模块来进行的,而不是一次性推出一个全新的“第四代”。许多所谓的“CSS4”特性实际上是正在开发或已经草案阶段的CSS模块,它们可能在未来的CSS规范中被正式采纳。选择器4::is()和:where()伪类允许动态选择一组元素。:has()伪类选择器允许基于子元素选择父元素。:scope伪类用于在ShadowDOM中选择元素
PostCSS 及其插件
天涯学馆
大前端&移动端全栈架构 postcss 前端 javascript
PostCSS及其插件PostCSS是一个工具,它允许开发者通过使用JavaScript插件来转换CSS。这些插件可以执行各种任务,如添加浏览器前缀、转换新的CSS语法、优化和压缩CSS等。1.PostCSS基本概念PostCSS是一个处理器,它接收CSS输入,然后通过一系列插件转换输出。与CSS预处理器(如Sass、Less)不同,PostCSS处理的是标准CSS,但可以扩展CSS语法。2.安装
CSS预处理器Stylus
天涯学馆
大前端&移动端全栈架构 css stylus 前端
CSS预处理器StylusStylus是一款高效的CSS预处理器,它提供了简洁灵活的语法来帮助开发者更高效地编写和管理CSS代码。下面是一些基础到进阶的Stylus代码教程,涵盖变量、嵌套、混合、继承、运算符等核心特性。1.安装Stylus在项目中使用Stylus前,你需要先安装Stylus编译器。如果你使用的是Node.js,可以通过npm安装:npminstall-Dstylus2.基本使用变
CSS性能优化
天涯学馆
大前端&移动端全栈架构 css 性能优化 前端
在构建高性能的网页时,CSS性能优化是一个至关重要的环节。它不仅影响页面的加载速度,还关系到用户体验和搜索引擎优化。下面我们将深入探讨CSS性能优化的各个方面:1.最小化HTTP请求合并CSS文件:将多个CSS文件合并成一个,减少HTTP请求次数,加快页面加载速度。内联CSS:对于小量的CSS,可以直接在HTML中内联,减少HTTP请求。使用数据URI:对于背景图片或图标,可以使用base64编码
优秀CSS3开源库
天涯学馆
大前端&移动端全栈架构 css3 前端 css
优秀CSS3开源库Bootstrap:https://getbootstrap.com/一个强大的前端框架,提供了许多用于构建响应式网站的工具和组件。Foundation:https://get.foundation/另一个流行的前端框架,也提供了许多用于构建响应式网站的工具和组件。Bulma:https://bulma.io/一个基于Flexbox的CSS框架,提供了简洁、可靠和可自定义的样式。
CSS3边框与轮廓
天涯学馆
大前端&移动端全栈架构 css3 前端 css
CSS3边框与轮廓border-radiusborder-radius属性用于设置元素边框的圆角半径。通过这个属性,您可以使元素的角呈现圆形或椭圆形外观,而不是传统的直角。其语法格式如下:.element{border-radius:[horizontal-radiusvertical-radius]|[radius];}horizontal-radius和vertical-radius分别指定水
CSS布局和定位应用方案
天涯学馆
大前端&移动端全栈架构 css 前端
目录浮动布局绝对布局表格布局响应式布局弹性布局网格布局多栏布局浮动布局CSS3浮动布局的核心在于使用float属性将元素移出文档流,通过左右浮动来排列元素,并结合clear属性或清除浮动技巧(如这里的伪元素法)来处理浮动带来的副作用。尽管浮动布局在某些简单布局中依然实用,但对于更复杂的布局需求
HTML5 性能优化和计算机硬件使用
天涯学馆
大前端&移动端全栈架构 html5 性能优化 前端
目录启用硬件加速图像与媒体优化资源加载与缓存CSS与布局优化JavaScript性能优化浏览器兼容性与特性检测启用硬件加速Canvas绘图<
HTML5 通信方式及应用
天涯学馆
大前端&移动端全栈架构 html5 前端 html
目录postMessageAPIWebSocketsServer-SentEvents(SSE)FetchAPI/XMLHttpRequest(XHR)WebWorkers&ServiceWorkersHTML5提供了多种通信方式,使得浏览器中的Web应用能够实现页面间、窗口间、甚至与外部服务的有效通信。这些通信方式大大提升了Web应用的交互性和复杂性,为构建现代、富客户端Web应用奠定了基础。以
HTML5 WebGL技术应用
天涯学馆
大前端&移动端全栈架构 前端 html5 html
目录WebGL基础知识WebGL库WebGL学习资料大型WebGL应用WebGL基础知识前端开发基础:熟悉HTML、CSS和JavaScript。数学基础:了解向量、矩阵运算、线性代数和基本几何概念。图形学基础:掌握基本的计算机图形学原理,如光照、纹理、变换、投影等。WebGLAPI的基本使用,包括创建画布、着色器、程序、缓冲区等。了解WebGL的渲染过程和管道,包括顶点处理、三角形剪裁、光照、纹
HTML5 MathML用法详解
天涯学馆
大前端&移动端全栈架构 html5 前端 html
目录MathML的基本结构MathML元素分类浏览器支持与渲染MathML与LaTeXMathML示例MathML是一种标记语言,用于在网页中表示数学公式和符号。它为数学、科学和技术出版物提供了标准化的、结构化的表示方式,使得复杂的数学表达式能够被浏览器准确解析和渲染。MathML的基本结构MathML文档由元素包裹,内部包含数学公式的所有组成部分。一个简单的MathML公式示例:
全面认识Web标准和浏览器内核引擎
天涯学馆
大前端&移动端全栈架构 前端 javascript 前端框架
全面认识Web标准和浏览器内核引擎目录Web、网页、浏览器Web网页浏览器Web标准W3C组织Web标准浏览器常见的浏览器浏览器的组成浏览器工作原理Web、网页、浏览器WebWeb(WorldWideWeb)即全球广域网,也称为万维网。我们常说的Web端就是网页端。网页网页是构成网站的基本元素。网页主要由文字、图像和超链接等元素构成。当然,除了这些元素,网页中还可以包含音频、视频以及Flash等。
Vue 3 30天精进之旅:Day 03 - Vue实例
码上飞扬
vue.js 前端 javascript
引言在前两天的学习中,我们成功搭建了Vue.js的开发环境,并创建了我们的第一个Vue项目。今天,我们将深入了解Vue的核心概念之一——Vue实例。通过学习Vue实例,你将理解Vue的基础架构,掌握数据绑定、模板语法和指令的使用方法。1.什么是Vue实例?Vue实例是Vue.js应用的根实例,作为应用的核心,它将数据与视图联系起来。每个Vue应用都是通过创建一个Vue实例来启动的。Vue实例通过配
Python的工作日判断库(含调休)——chinese_calendar
今晚务必早点睡
Python python 开发语言
chinese_calendar库使用场景chinese_calendar库主要用于处理中国农历和节假日相关的日期计算和判断。以下是一些常见的使用场景:判断日期是否为工作日:chinese_calendar提供了is_workday()函数,可以判断指定日期是否为工作日,包括周末、法定节假日等。判断日期是否为节假日:chinese_calendar提供了is_holiday()函数,可以判断指定日
无线通信与人工智能技术与发展年度总结
Loving_enjoy
实用技巧 人工智能 信息与通信
2024年,无线通信与人工智能技术取得了显著的进步和突破,这些技术的革新不仅推动了行业的数字化转型,还为全球经济的持续发展注入了新的活力。以下是对无线通信与人工智能技术在这一年发展的详细总结。####无线通信技术的飞速演进无线通信技术的历史可以追溯到19世纪末,意大利科学家马可尼成功实现无线电波传输,开启了无线通信的大门。然而,直到20世纪后期,无线通信技术才真正开始腾飞,从2G到5G不断演进,如
构建一个安全可靠的身份认证中心和资源服务中心:SpringSecurity+OAuth2.0的完美结合(一)
凛鼕将至
Java技术栈高级攻略 java 安全架构 安全
本系列文章简介:本系列文章将详细介绍如何使用SpringSecurity和OAuth2.0构建身份认证中心和资源服务中心。我们将从基本的认证和授权开始,逐步扩展到高级功能,如单点登录、多因素认证等。同时,我们还将介绍如何使用SpringSecurity和OAuth2.0提供的其他功能,如注销、记住我等。通过本系列文章的学习,大家将掌握如何使用SpringSecurity和OAuth2.0构建一个安
html自学学多久,HTML和CSS要学多久? 入门需要多长时间?
安检
html自学学多久
HTML和CSS要学多久?相信很多想要学习网页前端开发的小伙伴都会有这个疑问,今天W3Cschool小编就来和大家探讨一下这个问题。作为Web前端开发的基础,HTML和CSS是都是非常基础的语言,但是想要以此为工作的话,只是掌握HTML和CSS还是不够的,JS也需要学习。这样还不够,最好还能花一些时间学习一下近几年非常火的HTML5和CSS3,这样才能算是完全掌握了Web前端相关技术。如果单说HT
【Oracle11g SQL详解】创建与管理视图:`CREATE VIEW`、`ALTER VIEW` 和 `DROP VIEW`
爱技术的小伙子
Oracle 11g sql 数据库
创建与管理视图:CREATEVIEW、ALTERVIEW和DROPVIEW视图(View)是SQL中的一种虚拟表,是从数据库中一个或多个表的查询结果创建的。它不存储实际数据,而是存储查询的定义,用户可以像使用表一样使用视图。在实际业务中,视图被广泛用于数据抽象、权限管理、简化复杂查询等场景。一、CREATEVIEW:创建视图1.语法CREATEVIEWview_nameASSELECTcolumn
python scapy模块_python使用scapy模块实现ping扫描
漆园吏
python scapy模块
关于scapyScapy是一个可以让用户发送、侦听和解析并伪装网络报文的Python程序。这些功能可以用于制作侦测、扫描和攻击网络的工具。换言之,Scapy是一个强大的操纵报文的交互程序。它可以伪造或者解析多种协议的报文,还具有发送、捕获、匹配请求和响应这些报文以及更多的功能。Scapy可以轻松地做到像扫描(scanning)、路由跟踪(tracerouting)、探测(probing)、单元测试
【技术分享】 hysteria2从服务端到客户端部署教程
爱技术的小伙子
计算机网络
hysteria2从服务端到客户端部署教程前言在如今的网络环境中,尤其是涉及跨国访问的场景中,hysteria2作为一个新兴的传输协议工具,凭借其高效的传输能力和灵活的配置方式,受到了越来越多用户的青睐。本教程将带您一步步完成hysteria2的部署,包括在服务端和客户端的安装与配置,适用于AlmaLinux8和Ubuntu两种常用操作系统。系统要求服务端操作系统:AlmaLinux8或Ubunt
java解析APK
3213213333332132
java apk linux 解析APK
解析apk有两种方法
1、结合安卓提供apktool工具,用java执行cmd解析命令获取apk信息
2、利用相关jar包里的集成方法解析apk
这里只给出第二种方法,因为第一种方法在linux服务器下会出现不在控制范围之内的结果。
public class ApkUtil
{
/**
* 日志对象
*/
private static Logger
nginx自定义ip访问N种方法
ronin47
nginx 禁止ip访问
因业务需要,禁止一部分内网访问接口, 由于前端架了F5,直接用deny或allow是不行的,这是因为直接获取的前端F5的地址。
所以开始思考有哪些主案可以实现这样的需求,目前可实施的是三种:
一:把ip段放在redis里,写一段lua
二:利用geo传递变量,写一段
mysql timestamp类型字段的CURRENT_TIMESTAMP与ON UPDATE CURRENT_TIMESTAMP属性
dcj3sjt126com
mysql
timestamp有两个属性,分别是CURRENT_TIMESTAMP 和ON UPDATE CURRENT_TIMESTAMP两种,使用情况分别如下:
1.
CURRENT_TIMESTAMP
当要向数据库执行insert操作时,如果有个timestamp字段属性设为
CURRENT_TIMESTAMP,则无论这
struts2+spring+hibernate分页显示
171815164
Hibernate
分页显示一直是web开发中一大烦琐的难题,传统的网页设计只在一个JSP或者ASP页面中书写所有关于数据库操作的代码,那样做分页可能简单一点,但当把网站分层开发后,分页就比较困难了,下面是我做Spring+Hibernate+Struts2项目时设计的分页代码,与大家分享交流。
1、DAO层接口的设计,在MemberDao接口中定义了如下两个方法:
public in
构建自己的Wrapper应用
g21121
rap
我们已经了解Wrapper的目录结构,下面可是正式利用Wrapper来包装我们自己的应用,这里假设Wrapper的安装目录为:/usr/local/wrapper。
首先,创建项目应用
&nb
[简单]工作记录_多线程相关
53873039oycg
多线程
最近遇到多线程的问题,原来使用异步请求多个接口(n*3次请求) 方案一 使用多线程一次返回数据,最开始是使用5个线程,一个线程顺序请求3个接口,超时终止返回 缺点 测试发现必须3个接
调试jdk中的源码,查看jdk局部变量
程序员是怎么炼成的
jdk 源码
转自:http://www.douban.com/note/211369821/
学习jdk源码时使用--
学习java最好的办法就是看jdk源代码,面对浩瀚的jdk(光源码就有40M多,比一个大型网站的源码都多)从何入手呢,要是能单步调试跟进到jdk源码里并且能查看其中的局部变量最好了。
可惜的是sun提供的jdk并不能查看运行中的局部变量
Oracle RAC Failover 详解
aijuans
oracle
Oracle RAC 同时具备HA(High Availiablity) 和LB(LoadBalance). 而其高可用性的基础就是Failover(故障转移). 它指集群中任何一个节点的故障都不会影响用户的使用,连接到故障节点的用户会被自动转移到健康节点,从用户感受而言, 是感觉不到这种切换。
Oracle 10g RAC 的Failover 可以分为3种:
1. Client-Si
form表单提交数据编码方式及tomcat的接受编码方式
antonyup_2006
JavaScript tomcat 浏览器 互联网 servlet
原帖地址:http://www.iteye.com/topic/266705
form有2中方法把数据提交给服务器,get和post,分别说下吧。
(一)get提交
1.首先说下客户端(浏览器)的form表单用get方法是如何将数据编码后提交给服务器端的吧。
对于get方法来说,都是把数据串联在请求的url后面作为参数,如:http://localhost:
JS初学者必知的基础
百合不是茶
js函数 js入门基础
JavaScript是网页的交互语言,实现网页的各种效果,
JavaScript 是世界上最流行的脚本语言。
JavaScript 是属于 web 的语言,它适用于 PC、笔记本电脑、平板电脑和移动电话。
JavaScript 被设计为向 HTML 页面增加交互性。
许多 HTML 开发者都不是程序员,但是 JavaScript 却拥有非常简单的语法。几乎每个人都有能力将小的
iBatis的分页分析与详解
bijian1013
java ibatis
分页是操作数据库型系统常遇到的问题。分页实现方法很多,但效率的差异就很大了。iBatis是通过什么方式来实现这个分页的了。查看它的实现部分,发现返回的PaginatedList实际上是个接口,实现这个接口的是PaginatedDataList类的对象,查看PaginatedDataList类发现,每次翻页的时候最
精通Oracle10编程SQL(15)使用对象类型
bijian1013
oracle 数据库 plsql
/*
*使用对象类型
*/
--建立和使用简单对象类型
--对象类型包括对象类型规范和对象类型体两部分。
--建立和使用不包含任何方法的对象类型
CREATE OR REPLACE TYPE person_typ1 as OBJECT(
name varchar2(10),gender varchar2(4),birthdate date
);
drop type p
【Linux命令二】文本处理命令awk
bit1129
linux命令
awk是Linux用来进行文本处理的命令,在日常工作中,广泛应用于日志分析。awk是一门解释型编程语言,包含变量,数组,循环控制结构,条件控制结构等。它的语法采用类C语言的语法。
awk命令用来做什么?
1.awk适用于具有一定结构的文本行,对其中的列进行提取信息
2.awk可以把当前正在处理的文本行提交给Linux的其它命令处理,然后把直接结构返回给awk
3.awk实际工
JAVA(ssh2框架)+Flex实现权限控制方案分析
白糖_
java
目前项目使用的是Struts2+Hibernate+Spring的架构模式,目前已经有一套针对SSH2的权限系统,运行良好。但是项目有了新需求:在目前系统的基础上使用Flex逐步取代JSP,在取代JSP过程中可能存在Flex与JSP并存的情况,所以权限系统需要进行修改。
【SSH2权限系统的实现机制】
权限控制分为页面和后台两块:不同类型用户的帐号分配的访问权限是不同的,用户使
angular.forEach
boyitech
AngularJS AngularJS API angular.forEach
angular.forEach 描述: 循环对obj对象的每个元素调用iterator, obj对象可以是一个Object或一个Array. Iterator函数调用方法: iterator(value, key, obj), 其中obj是被迭代对象,key是obj的property key或者是数组的index,value就是相应的值啦. (此函数不能够迭代继承的属性.)
java-谷歌面试题-给定一个排序数组,如何构造一个二叉排序树
bylijinnan
二叉排序树
import java.util.LinkedList;
public class CreateBSTfromSortedArray {
/**
* 题目:给定一个排序数组,如何构造一个二叉排序树
* 递归
*/
public static void main(String[] args) {
int[] data = { 1, 2, 3, 4,
action执行2次
Chen.H
JavaScript jsp XHTML css Webwork
xwork 写道 <action name="userTypeAction"
class="com.ekangcount.website.system.view.action.UserTypeAction">
<result name="ssss" type="dispatcher">
[时空与能量]逆转时空需要消耗大量能源
comsci
能源
无论如何,人类始终都想摆脱时间和空间的限制....但是受到质量与能量关系的限制,我们人类在目前和今后很长一段时间内,都无法获得大量廉价的能源来进行时空跨越.....
在进行时空穿梭的实验中,消耗超大规模的能源是必然
oracle的正则表达式(regular expression)详细介绍
daizj
oracle 正则表达式
正则表达式是很多编程语言中都有的。可惜oracle8i、oracle9i中一直迟迟不肯加入,好在oracle10g中终于增加了期盼已久的正则表达式功能。你可以在oracle10g中使用正则表达式肆意地匹配你想匹配的任何字符串了。
正则表达式中常用到的元数据(metacharacter)如下:
^ 匹配字符串的开头位置。
$ 匹配支付传的结尾位置。
*
报表工具与报表性能的关系
datamachine
报表工具 birt 报表性能 润乾报表
在选择报表工具时,性能一直是用户关心的指标,但是,报表工具的性能和整个报表系统的性能有多大关系呢?
要回答这个问题,首先要分析一下报表的处理过程包含哪些环节,哪些环节容易出现性能瓶颈,如何优化这些环节。
一、报表处理的一般过程分析
1、用户选择报表输入参数后,报表引擎会根据报表模板和输入参数来解析报表,并将数据计算和读取请求以SQL的方式发送给数据库。
2、
初一上学期难记忆单词背诵第一课
dcj3sjt126com
word english
what 什么
your 你
name 名字
my 我的
am 是
one 一
two 二
three 三
four 四
five 五
class 班级,课
six 六
seven 七
eight 八
nince 九
ten 十
zero 零
how 怎样
old 老的
eleven 十一
twelve 十二
thirteen
我学过和准备学的各种技术
dcj3sjt126com
技术
语言VB https://msdn.microsoft.com/zh-cn/library/2x7h1hfk.aspxJava http://docs.oracle.com/javase/8/C# https://msdn.microsoft.com/library/vstudioPHP http://php.net/manual/en/Html
struts2中token防止重复提交表单
蕃薯耀
重复提交表单 struts2中token
struts2中token防止重复提交表单
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
蕃薯耀 2015年7月12日 11:52:32 星期日
ht
线性查找二维数组
hao3100590
二维数组
1.算法描述
有序(行有序,列有序,且每行从左至右递增,列从上至下递增)二维数组查找,要求复杂度O(n)
2.使用到的相关知识:
结构体定义和使用,二维数组传递(http://blog.csdn.net/yzhhmhm/article/details/2045816)
3.使用数组名传递
这个的不便之处很明显,一旦确定就是不能设置列值
//使
spring security 3中推荐使用BCrypt算法加密密码
jackyrong
Spring Security
spring security 3中推荐使用BCrypt算法加密密码了,以前使用的是md5,
Md5PasswordEncoder 和 ShaPasswordEncoder,现在不推荐了,推荐用bcrpt
Bcrpt中的salt可以是随机的,比如:
int i = 0;
while (i < 10) {
String password = "1234
学习编程并不难,做到以下几点即可!
lampcy
java html 编程语言
不论你是想自己设计游戏,还是开发iPhone或安卓手机上的应用,还是仅仅为了娱乐,学习编程语言都是一条必经之路。编程语言种类繁多,用途各 异,然而一旦掌握其中之一,其他的也就迎刃而解。作为初学者,你可能要先从Java或HTML开始学,一旦掌握了一门编程语言,你就发挥无穷的想象,开发 各种神奇的软件啦。
1、确定目标
学习编程语言既充满乐趣,又充满挑战。有些花费多年时间学习一门编程语言的大学生到
架构师之mysql----------------用group+inner join,left join ,right join 查重复数据(替代in)
nannan408
right join
1.前言。
如题。
2.代码
(1)单表查重复数据,根据a分组
SELECT m.a,m.b, INNER JOIN (select a,b,COUNT(*) AS rank FROM test.`A` A GROUP BY a HAVING rank>1 )k ON m.a=k.a
(2)多表查询 ,
使用改为le
jQuery选择器小结 VS 节点查找(附css的一些东西)
Everyday都不同
jquery css name选择器 追加元素 查找节点
最近做前端页面,频繁用到一些jQuery的选择器,所以特意来总结一下:
测试页面:
<html>
<head>
<script src="jquery-1.7.2.min.js"></script>
<script>
/*$(function() {
$(documen
关于EXT
tntxia
ext
ExtJS是一个很不错的Ajax框架,可以用来开发带有华丽外观的富客户端应用,使得我们的b/s应用更加具有活力及生命力。ExtJS是一个用 javascript编写,与后台技术无关的前端ajax框架。因此,可以把ExtJS用在.Net、Java、Php等各种开发语言开发的应用中。
ExtJs最开始基于YUI技术,由开发人员Jack
一个MIT计算机博士对数学的思考
xjnine
Math
在过去的一年中,我一直在数学的海洋中游荡,research进展不多,对于数学世界的阅历算是有了一些长进。为什么要深入数学的世界?作为计算机的学生,我没有任何企图要成为一个数学家。我学习数学的目的,是要想爬上巨人的肩膀,希望站在更高的高度,能把我自己研究的东西看得更深广一些。说起来,我在刚来这个学校的时候,并没有预料到我将会有一个深入数学的旅程。我的导师最初希望我去做的题目,是对appe