使用 ASP.NET Core 创建 Web UI

使用 ASP.NET Core 创建 Web UI

简介

示例方案

假设你是一家名为 Contoso Pizza 的披萨公司的雇员。 经理要求你为公司内部管理网站开发一个必备组件 - 披萨库存管理页面。 生成的应用应使视图和数据模型关注点分离。

你将做些什么?

在本模块中,你将:

  • 了解在 ASP.NET Core 应用中使用 Razor Pages 的时机和原因。
  • 查看使用 Razor Pages 的现有 ASP.NET Core 应用。
  • 创建一个支持应用的产品数据管理要求的新 Razor 页面。
  • 使用标记帮助程序减少 HTML 和 C# 之间的上下文切换。
  • 使用 Razor 页面处理程序处理 HTTP 请求。

本模块末尾提供了一些链接,可以通过其中的内容更深入地了解我们介绍的各个功能区域。

必需工具

本模块使用 .NET CLI 和 Visual Studio Code(Windows、Linux 和 macOS)来演示 ASP.NET Core Razor Pages 开发。 完成本模块后,可以使用 Visual Studio (Windows)、Visual Studio for Mac (macOS) 或 Visual Studio Code 等开发环境来应用其概念。

提示

可以根据 IDE 使用 GitHub Codespaces 跳过安装以下工具。 在另一个浏览器选项卡中,导航到包含此模块的初学者应用的 GitHub 存储库,选择“代码”按钮,并在 main 分支上创建新的 codespace。 有关详细信息,请参阅创建 Codespace。

了解使用 Razor Pages 的时机和原因

  • 5 分钟

本单元介绍在 ASP.NET Core 应用中使用 Razor Pages 的时机和原因。

Razor Pages 的优势

Razor Pages 是一种以页面为中心的服务器端编程模型,用于使用 ASP.NET Core 构建 Web UI。 优点包括:

  • 使用 HTML、CSS 和 C# 轻松设置动态 Web 应用。
  • 按功能整理文件,以便于维护。
  • 使用 Razor 语法将标记与服务器端 C# 代码相结合。

Razor Pages 使用 Razor 将基于服务器的代码嵌入到网页中。 Razor 语法结合了 HTML 和 C# 来定义动态呈现逻辑。 这意味着可以在 HTML 标记中使用 C# 变量和方法,以在运行时在服务器上生成动态 Web 内容。 请务必了解 Razor Pages 不能替代 HTML、CSS 或 JavaScript。 它们是结合这些技术创建动态 Web 内容的一种方式。

分离关注点

Razor Pages 强制使用 C# PageModel 类分离关注点,封装范围限定为其 Razor 页面的数据属性和逻辑运算,并为 HTTP 请求定义页面处理程序。 PageModel 类是由 ASP.NET Core 项目模板自动生成的分部类。 PageModel 类位于 Pages 文件夹中,以 Razor 页命名。 例如,Index.cshtml Razor 页的 PageModel 类名为 IndexModel.cs

使用 Razor Pages 的时机

在 ASP.NET Core 应用中使用 Razor Pages 的时机:

  • 想要生成动态 Web UI。
  • 首选以页面为中心的方法。
  • 希望减少部分视图的重复。

Razor Pages 通过将相关页面及其逻辑保存在其自己的命名空间和目录中来简化 ASP.NET Core 页面组织。

备注

ASP.NET Core 还支持使用模型视图控制器 (MVC) 模式来生成 web 应用。 如果希望在模型、视图和控制器之间实现清晰的分隔,可以使用 MVC。 Razor Pages 和 MVC 可以共存在同一应用中。 MVC 超出了本模块的范畴。

Razor Pages 在工作效率方面的优势是,它可将应用中的视图的更改集中在一起。

练习 - 自定义项目

让我们花一些时间来熟悉 ContosoPizza 文件夹中的现有代码。 该项目是使用 dotnet new webapp 命令创建的 ASP.NET Core Web 应用。 下面描述了你的团队成员所做的更改。

  • 已将 Models 文件夹添加到项目中。
    • 该模型文件夹包含表示披萨的 Pizza 类。
  • 已将 Data 文件夹添加到项目中。
    • 该数据文件夹包含表示数据库上下文的 PizzaContext 类。 它继承自 Entity Framework Core 中的 DbContext 类。 Entity Framework Core 是一种对象关系映射器 (ORMObject Relational Mapping:是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的–“虚拟对象数据库”。),可便于更轻松地使用数据库。
  • 已将 Services 文件夹添加到项目中。
    • 该服务文件夹包含一个 PizzaService 类,该类公开用于列出和添加披萨的方法。
    • PizzaService 类使用 PizzaContext 类在数据库中读取和写入披萨。
    • 该类在 Program.cs 中针对依赖项注入进行了注册(第 10 行)。

Entity Framework Core 也生成了一些内容:

  • 已生成 Migrations 文件夹。
    • 该迁移文件夹包含用于创建数据库架构的代码。
  • 已生成 SQLite 数据库文件 ContosoPizza.db。
    • 如果安装了 SQLite 扩展(或者使用的是 GitHub Codespaces),则可以通过右键单击该文件并选择“打开数据库”来查看数据库。 数据库架构显示在“资源管理器”窗格的“SQLite 资源管理器”选项卡中。

查看 Razor Pages 项目结构

项目中的所有其他内容与创建项目时的内容保持一致。 下表描述了由 dotnet new webapp 命令生成的项目结构。

名称 说明
Pages/ 包含 Razor Pages 和支持文件。 每个 Razor 页面都有一个 .cshtml 文件和一个 .cshtml.csPageModel 类文件。
wwwroot/ 包含静态资产文件,例如 HTML、JavaScript 和 CSS。
ContosoPizza.csproj 包含项目配置元数据,例如依赖项。
Program.cs 充当应用的入口点并配置应用行为,例如路由。

其他值得注意的观察内容:

  • Razor 页面文件及其配对的 PageModel 类文件

    Razor 页面存储在 Pages 目录中。 如上所述,每个 Razor 页面都有一个 .cshtml 文件和一个 .cshtml.csPageModel 类文件。 PageModel 类允许分离 Razor 页面的逻辑和表示形式,定义针对请求的页面处理程序,并封装范围限定为其 Razor 页面的数据属性和逻辑。

  • Pages 目录结构和路由请求

    Razor Pages 使用 Pages 目录结构作为路由请求的约定。 下表显示了 URL 如何映射到文件名:

    URL 映射到 Razor 页面
    www.domain.com Pages/Index.cshtml
    www.domain.com/Index Pages/Index.cshtml
    www.domain.com/Privacy Pages/Privacy.cshtml
    www.domain.com/Error Pages/Error.cshtml

    Pages 目录中的子文件夹用于组织 Razor 页面。 例如,如果有 Pages/Products 目录,则 URL 将反映该结构:

    URL 映射到 Razor 页面
    www.domain.com/Products Pages/Products/Index.cshtml
    www.domain.com/Products/Index Pages/Products/Index.cshtml
    www.domain.com/Products/Create Pages/Products/Create.cshtml
  • 布局和其他共享文件

    有多个文件可跨多个页面共享。 这些文件确定常见的布局元素和页面导入。 下表描述了每个文件的用途。

    文件 说明
    _ViewImports.cshtml 导入跨多个页面使用的命名空间和类。
    _ViewStart.cshtml 指定所有 Razor 页面的默认布局。
    Pages/Shared/_Layout.cshtml 这是 _ViewStart.cshtml 文件指定的布局。 在多个页面中实现公共布局元素。
    Pages/Shared/_ValidationScriptsPartial.cshtml 为所有页面提供验证功能。

首次运行项目

让我们运行该项目,这样我们可以看到它的运行情况。

  1. 右键单击“资源管理器”中的 ContosoPizza 文件夹,然后选择“在集成终端中打开”。 随即会在项目文件夹的上下文中打开一个终端窗口。
  2. 在终端窗口中,输入以下命令:
dotnet watch

此命令:

  • 生成项目。
  • 启动应用。
  • 监视文件更改,并在检测到更改时重启应用。
  1. IDE 会提示你在浏览器中打开应用。 选择“在浏览器中打开”。

  2. 将呈现的主页与 IDE 中的 Pages/Index.cshtml 进行比较:

    • 观察文件中 HTML、Razor 语法和 C# 代码的组合。

      • Razor 语法由 @ 字符表示。
      • C# 代码包含在 @{ } 块中。 记下文件顶部的指令:
      • @page 指令用于指定此文件是 Razor 页面。
      • @model 指令用于指定页面的模型类型(在此示例中为 IndexModel,这是在 Pages/Index.cshtml.cs 中定义的)。
    • 查看 C# 代码块。

      • 此代码将 ViewData 字典中 Title 项的值设置为“主页”。
      • ViewData 字典用于在 Razor 页面和 IndexModel 类之间传递数据。
      • 在运行时,Title 值用于设置页面的 </code> 元素。</li> </ul> <p>使应用在终端窗口中保持运行。 我们将在即将介绍的单元中使用它。 还需保留包含运行中的 Contoso Pizza 应用的浏览器选项卡。 你将对应用进行更改,然后浏览器将自动刷新以显示更改。</p> </li> </ul> </li> </ol> <p><a href="http://img.e-com-net.com/image/info8/58ca8c022fc84d90b3645e58d086ed90.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/58ca8c022fc84d90b3645e58d086ed90.jpg" alt="使用 ASP.NET Core 创建 Web UI_第1张图片" width="650" height="349" style="border:1px solid black;"></a></p> <h4>自定义登陆页面</h4> <p>让我们对登陆页面进行少量更改,使其与披萨应用具有更强的相关性。</p> <p>在 Pages/Index.cshtml 中,将 C# 代码块中的代码替换为以下代码:</p> <pre><code>ViewData["Title"] = "The Home for Pizza Lovers"; TimeSpan timeInBusiness = DateTime.Now - new DateTime(2018, 8, 14); </code></pre> <p>前面的代码:</p> <p>将 ViewData 字典中 Title 项的值设置为“披萨爱好者的天堂”。<br> 计算自业务开业以来已过去的时间。<br> <a href="http://img.e-com-net.com/image/info8/d5a1a04b38514dce88c936e1ffdb350a.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/d5a1a04b38514dce88c936e1ffdb350a.jpg" alt="在这里插入图片描述" width="650" height="93"></a><br> <a href="http://img.e-com-net.com/image/info8/71ccd354442d4a48a6c33aca3fac9259.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/71ccd354442d4a48a6c33aca3fac9259.jpg" alt="使用 ASP.NET Core 创建 Web UI_第2张图片" width="488" height="125" style="border:1px solid black;"></a></p> <p>按如下所示修改 HTML:</p> <p>将 <code><h1></code> 元素替换为以下代码:<br> <code><h1 class="display-4">Welcome to Contoso Pizza</h1></code></p> <p>将<code> <p></code> 元素替换为以下代码:<br> <code><p class="lead">The best pizza in town for @Convert.ToInt32(timeInBusiness.TotalDays) days!</p></code><br> 前面的代码:<br> <a href="http://img.e-com-net.com/image/info8/312fe1cc38b5407cb203b9caca2d2637.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/312fe1cc38b5407cb203b9caca2d2637.jpg" alt="使用 ASP.NET Core 创建 Web UI_第3张图片" width="650" height="349" style="border:1px solid black;"></a></p> <p>将标题更改为“欢迎光临 Contoso Pizza”。<br> 显示自业务开业以来已过去的天数。<br> @ 字符用于从 HTML 切换到 Razor 语法。<br> Convert.ToInt32 方法用于将 timeInBusiness 变量的 TotalDays 属性转换为整数。<br> Convert 类是 System 命名空间的一部分,该命名空间由 ContosoPizza.csproj 文件中的 <code><ImplicitUsings></code>元素自动导入。<br> 保存文件。 包含应用的浏览器选项卡会自动刷新以显示更改。 如果使用的是 GitHub Codespaces,则文件会自动保存,但需要手动刷新浏览器选项卡。</p> <h4>练习 - 添加新的 Razor 页面</h4> <h5>创建“披萨列表”页面</h5> <p>若要创建新的 Razor 页面,需使用 .NET CLI。</p> <p>由于终端被 dotnet watch 命令阻止,因此请通过右键单击“资源管理器”中的 ContosoPizza 文件夹以打开另一个终端,然后选择“在集成终端中打开”。</p> <p>在终端窗口中,输入以下命令:<br> <code>dotnet new page --name PizzaList --namespace ContosoPizza.Pages --output Pages</code><br> 上述命令:</p> <ul> <li> <p>将在<code>ContosoPizza.Pages</code>命名空间中创建以下文件:</p> <ul> <li> <p>PizzaList.cshtml - Razor 页面</p> </li> <li> <p>PizzaList.cshtml.cs - 随附的 <code>PageModel</code> 类</p> </li> </ul> </li> <li> <p>将两个文件存储在项目的 Pages 子目录中。</p> </li> </ul> <ol start="3"> <li>在 Pages/PizzaList.cshtml 中,在 <code>@{ }</code> 代码块中添加以下代码:</li> </ol> <p>​ <code>ViewData["Title"] = "Pizza List ";</code></p> <ol start="4"> <li>在文件末尾添加以下代码:</li> </ol> <pre><code><h1>Pizza List </h1> <!-- New Pizza form will go here --> <!-- List of pizzas will go here --> </code></pre> <p>这会向页面添加一个标题,以及两个 HTML 注释占位符,用于稍后将添加的功能。</p> <ol start="5"> <li> <p>保存文件。 如果使用的是 GitHub Codespaces,则文件会自动保存。</p> </li> <li> <p>返回到正在运行 <code>dotnet watch</code> 的终端,然后按 Ctrl+R 重新加载应用并检测新文件。</p> </li> </ol> <h4>将“披萨列表”页面添加到导航菜单</h4> <p>这是测试页面的好时机,但你还无法进行测试,因为该页面未链接到导航菜单。 你现在需要执行该操作。</p> <ol> <li> <p>打开 Pages/Shared/_Layout.cshtml。</p> </li> <li> <p>在包含 <code>navbar-nav</code> 类的 <code><ul></code> 元素中(从第 21 行开始),请注意包含指向“主页”和“隐私”页面的链接的 <code><li></code> 元素。 将以下代码添加到列表末尾处包含“隐私”链接的 <code><li></code> 元素的后面:</p> <pre><code class="prism language-razor"><li class="nav-item"> <a class="nav-link text-dark" asp-area="" asp-page="/PizzaList">Pizza List </a> </li> </code></pre> <p>这会向导航菜单添加一个指向 PizzaList 页面的链接。</p> </li> <li> <p>保存文件。 包含应用的浏览器选项卡会自动刷新以显示更改。 如果使用的是 GitHub Codespaces,则文件会自动保存,但需要手动刷新浏览器选项卡。</p> </li> <li> <p>在导航菜单中选择“披萨列表 ”链接。 随即会显示“披萨列表”页面。</p> </li> </ol> <h4>向依赖项注入容器注册 PizzaService 类</h4> <p>“披萨列表”页依赖于 <code>PizzaService</code> 对象来检索披萨列表。 你将使用依赖项注入向页面提供 <code>PizzaService</code> 对象。 为完成此操作,必须向容器注册 <code>PizzaService</code> 类。</p> <ol> <li> <p>打开 Program.cs。</p> </li> <li> <p>在将服务添加到容器的部分中,添加以下代码:</p> <pre><code class="prism language-csharp">builder<span class="token punctuation">.</span>Services<span class="token punctuation">.</span><span class="token generic-method"><span class="token function">AddScoped</span><span class="token generic class-name"><span class="token punctuation"><</span>PizzaService<span class="token punctuation">></span></span></span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p><a href="http://img.e-com-net.com/image/info8/c48015d67d984ddab88e83287b71d773.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/c48015d67d984ddab88e83287b71d773.jpg" alt="使用 ASP.NET Core 创建 Web UI_第4张图片" width="650" height="397" style="border:1px solid black;"></a></p> <p>此代码向依赖项注入容器注册 <code>PizzaService</code> 类。 <code>AddScoped</code> 方法指示应为每个 HTTP 请求创建新的 <code>PizzaService</code> 对象。 现在可以将 <code>PizzaService</code> 注入到任何 Razor 页面。</p> </li> <li> <p>保存文件。 如果使用的是 GitHub Codespaces,则文件会自动保存。</p> </li> </ol> <h4>显示披萨列表</h4> <p>让我们来修改“披萨列表”页面的 <code>PageModel</code> 类,以从 <code>PizzaService</code> 对象检索披萨列表并将其存储在属性中。</p> <ol> <li> <p>打开 Pages/PizzaList.cshtml.cs。</p> </li> <li> <p>将下列 <code>using</code> 语句添加到文件顶部:</p> <pre><code class="prism language-csharp"><span class="token keyword">using</span> <span class="token namespace">ContosoPizza<span class="token punctuation">.</span>Models</span><span class="token punctuation">;</span> <span class="token keyword">using</span> <span class="token namespace">ContosoPizza<span class="token punctuation">.</span>Services</span><span class="token punctuation">;</span> </code></pre> <p>这些语句可导入你将在页面中使用的 <code>Pizza</code> 和 <code>PizzaService</code> 类型。</p> </li> <li> <p>在 <code>ContosoPizza.Pages</code> 命名空间块中,将整个 <code>PizzaListModel</code> 类替换为以下代码:</p> <pre><code class="prism language-csharp"><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">PizzaListModel</span> <span class="token punctuation">:</span> <span class="token type-list"><span class="token class-name">PageModel</span></span> <span class="token punctuation">{</span> <span class="token keyword">private</span> <span class="token keyword">readonly</span> <span class="token class-name">PizzaService</span> _service<span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token return-type class-name">IList<span class="token punctuation"><</span>Pizza<span class="token punctuation">></span></span> PizzaList <span class="token punctuation">{</span> <span class="token keyword">get</span><span class="token punctuation">;</span><span class="token keyword">set</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token operator">=</span> <span class="token keyword">default</span><span class="token operator">!</span><span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token function">PizzaListModel</span><span class="token punctuation">(</span><span class="token class-name">PizzaService</span> service<span class="token punctuation">)</span> <span class="token punctuation">{</span> _service <span class="token operator">=</span> service<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token return-type class-name"><span class="token keyword">void</span></span> <span class="token function">OnGet</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> PizzaList <span class="token operator">=</span> _service<span class="token punctuation">.</span><span class="token function">GetPizzas</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </code></pre> <p>在上述代码中:</p> <ul> <li>已创建名为<code>_service</code> 的专用只读<code>PizzaService</code>。 此变量将保存对<code>PizzaService</code>对象的引用。 <ul> <li><code>readonly</code> 关键字指示在构造函数中设置 <code>_service</code> 变量的值之后无法对其进行更改。</li> </ul> </li> <li>定义<code>PizzaList</code>属性以保存披萨列表。 <ul> <li><code>IList<Pizza></code> 类型指示 <code>PizzaList</code> 属性将保存 <code>Pizza</code> 对象列表。</li> <li><code>PizzaList</code> 被初始化为 <code>default!</code>,以向编译器表明它稍后将被初始化,因此不需要进行 null 安全性检查。</li> </ul> </li> <li>构造函数接受<code>PizzaService</code>对象。 <ul> <li>对象 <code>PizzaService</code> 通过依赖项注入提供。</li> </ul> </li> <li>定义 <code>OnGet</code> 方法以从 <code>PizzaService</code> 对象中检索披萨列表并将其存储在 <code>PizzaList</code> 属性中。</li> </ul> <p>提示</p> <p>如果需要了解 null 安全方面的帮助,请参阅 C# 中的 null 安全。</p> </li> <li> <p>保存文件。 如果使用的是 GitHub Codespaces,则文件会自动保存。</p> </li> <li> <p>返回到正在运行 <code>dotnet watch</code> 的终端,然后按 Ctrl+R 以重新加载具有已注册服务和 <code>PizzaListModel</code> 的新构造函数的应用。</p> </li> </ol> <p>现在,可在页面上访问披萨列表,接下来需要使用该列表在页面上显示披萨。</p> <ol> <li>打开 Pages/PizzaList.cshtml。</li> <li>使用下面的代码替换 <code><!-- List of pizzas will go here --></code> 注释:</li> </ol> <pre><code><table class="table mt-5"> <thead> <tr> <th scope="col">Name</th> <th scope="col">Price</th> <th scope="col">Size</th> <th scope="col">Gluten Free</th> <th scope="col">Delete</th> </tr> </thead> <tbody> @foreach (var pizza in Model.PizzaList) { <tr> <td>@pizza.Name</td> <td>@($"{pizza.Price:C}")</td> <td>@pizza.Size</td> <td>@(pizza.IsGlutenFree ? "✔️" : string.Empty)</td> <td> <form method="post" asp-page-handler="Delete" asp-route-id="@pizza.Id"> <button class="btn btn-danger">Delete</button> </form> </td> </tr> } </tbody> </table> </code></pre> <p>在上述代码中:</p> <ul> <li>已创建 <code><table></code> 元素来显示披萨列表。</li> <li>已创建 <code><thead></code> 元素来保存表格标题。</li> <li><code><tbody></code>中的<code>@foreach</code>语句循环访问披萨列表。 <ul> <li><code>Model</code> 属性引用在代码隐藏文件中创建的 <code>PizzaListModel</code> 对象。</li> <li><code>PizzaList</code> 属性引用在代码隐藏文件中定义的 <code>PizzaList</code> 属性。</li> </ul> </li> <li><code>@foreach</code>语句的每个迭代都会创建一个<code><tr></code>元素来保存披萨数据: <ul> <li>Razor 语法用于显示 <code><td></code> 元素中的披萨数据。 此语法用于显示存储在 <code>pizza</code> 变量中的 <code>Pizza</code> 对象的属性。</li> <li><code>Price</code> 是使用 C# 字符串内插进行格式设置的。</li> <li>三元表达式用于显示 <code>IsGlutenFree</code> 属性的值(“✔️”或空白单元格)。</li> <li>已创建表单来删除披萨。 <ul> <li><code>asp-page-handler</code> 属性指示应将表单提交到代码隐藏文件中的 <code>Delete</code> 处理程序。 你将在后面的单元中创建该处理程序。</li> <li><code>asp-route-id</code> 属性指示应将 <code>Pizza</code> 对象的 <code>Id</code> 属性传递给 <code>Delete</code> 处理程序。</li> </ul> </li> </ul> </li> </ul> <ol start="3"> <li>保存文件。 在浏览器中,“披萨列表”页面会刷新以显示披萨列表。 如果使用的是 GitHub Codespaces,则文件会自动保存,但需要手动刷新浏览器选项卡。</li> </ol> <p>做得很好! 你已创建一个显示披萨列表的 Razor 页面。 在下一单元中,你将了解标记帮助程序和页面处理程序。<br> <a href="http://img.e-com-net.com/image/info8/7fc263279a6b4652af9c21f8cf4a98c5.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/7fc263279a6b4652af9c21f8cf4a98c5.jpg" alt="使用 ASP.NET Core 创建 Web UI_第5张图片" width="650" height="397" style="border:1px solid black;"></a></p> <h2>了解标记帮助器和页面处理程序</h2> <p>在上一单元中,你创建了一个显示披萨列表的 Razor 页面。你使用了 <code>@</code> 符号在 HTML 和 C# 之间切换上下文。在此单元中,你将了解标记帮助程序。标记帮助程序是一种特殊的可以包含 C# 代码的 HTML 元素。你还将了解页面处理程序。页面处理程序是处理浏览器请求的方法。你将在下一单元中使用页面处理程序来添加和删除披萨。</p> <h3>标记帮助程序</h3> <p>标记帮助程序用于解决 HTML 和 C# 之间上下文切换效率低下问题。 ASP.NET Core 内置的多数标记帮助程序都可扩展标准 HTML 元素。 标记帮助程序为 HTML 元素提供了额外的服务器端特性,使元素更加可靠。</p> <p>对于此项目,你应该知道四个标记帮助程序:Partial、Label、Input 和 Validation Summary Message。</p> <h4>分部标记帮助程序</h4> <pre><code class="prism language-cshtml"><partial name="_ValidationScriptsPartial" /> </code></pre> <p>这会将 <code>_ValidationScriptsPartial.cshtml</code> 文件的内容注入页面。 <code>_ValidationScriptsPartial.cshtml</code> 文件包含用于验证表单输入的 JavaScript,因此需要将其包含在包含表单的每个页面上。</p> <h4>标签标记帮助程序</h4> <pre><code class="prism language-cshtml"><label asp-for="Foo.Id" class="control-label"></label> </code></pre> <p>这扩展了标准 HTML <code><label></code> 元素。 与许多标记帮助程序一样,它使用 <code>asp-for</code> 特性。 特性接受来自 <code>PageModel</code> 的属性。 在本例中,<code>PageModel</code> 的 <code>Foo.Id</code> 属性的名称(具体来说,字符串 <code>"Id"</code>)将呈现为 HTML <code><label></code> 元素的内容。</p> <h4>输入标记帮助程序</h4> <pre><code class="prism language-cshtml"><input asp-for="Foo.Id" class="form-control" /> </code></pre> <p>与前面的示例类似,这会扩展标准 HTML <code><input></code> 元素。 它还使用 <code>asp-for</code> 特性来指定 <code>PageModel</code> 属性。 在本例中,<code>Foo.Id</code> 属性的值将作为 HTML <code><input></code> 元素的 <code>value</code> 特性呈现。</p> <h4>验证摘要标记帮助程序</h4> <pre><code class="prism language-cs"><span class="token operator"><</span>div asp<span class="token operator">-</span>validation<span class="token operator">-</span>summary<span class="token operator">=</span><span class="token string">"All"</span><span class="token operator">></span><span class="token operator"><</span><span class="token operator">/</span>div<span class="token operator">></span> </code></pre> <p>验证摘要标记帮助程序显示模型上单个属性的验证消息。<br> 备注:<br> 验证规则和属性显示名称等内容在 <code>PageModel</code> 类中定义。 我们将在下一单元中指出在代码中的什么位置查找它们。</p> <h3>页面处理程序</h3> <p><code>PageModel</code> 类定义 HTTP 请求的页面处理程序和用于呈现页面的数据。 在上一练习中,<code>PizzaListModel</code> 类通过将 <code>PizzaList</code> 属性的值设置为 <code>_service.GetPizzas()</code> 的值处理了 HTTP GET 请求。<br> 常见的处理程序包括用于页面初始化的 <code>OnGet</code> 和用于表单提交的 <code>OnPost</code>。 为了处理 HTTP POST,页面处理程序可能会验证用户提交的数据,如果无效,则再次显示输入表单页,或者将有效数据发送到服务或数据库进行保留。</p> <p>在下一单元中,你将添加一个表单,以使用多个标记帮助程序创建新披萨。 你还将添加页面处理程序来处理表单提交和删除披萨。</p> <h2>练习 - 添加新的披萨表单</h2> <p>在本单元中,你将完成“披萨列表”页面,方式是添加一个表单来创建新披萨。 你还将添加页面处理程序来处理表单提交和删除披萨。</p> <h3>添加表单以创建新披萨</h3> <p>首先,向 <code>PizzaListModel</code> 类添加属性以表示用户输入。 还需添加相应的页面处理程序。</p> <ol> <li>打开 Pages\PizzaList.cshtml.cs,并将以下属性添加到 <code>PizzaListModel</code> 类:</li> </ol> <pre><code class="prism language-cs"><span class="token punctuation">[</span><span class="token attribute"><span class="token class-name">BindProperty</span></span><span class="token punctuation">]</span> <span class="token keyword">public</span> <span class="token return-type class-name">Pizza</span> NewPizza <span class="token punctuation">{</span> <span class="token keyword">get</span><span class="token punctuation">;</span> <span class="token keyword">set</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token operator">=</span> <span class="token keyword">default</span><span class="token operator">!</span><span class="token punctuation">;</span> </code></pre> <p>在上述代码中:</p> <ul> <li>将名为 <code>NewPizza</code> 的属性添加到 <code>PizzaListModel</code> 类。 <ul> <li><code>NewPizza</code> 是一个 <code>Pizza</code> 对象。</li> </ul> </li> <li><code>BindProperty</code> 特性应用到 <code>NewPizza</code> 属性。 <ul> <li><code>BindProperty</code> 特性用于将 <code>NewPizza</code> 属性绑定到 Razor 页面。 发出 HTTP POST 请求时,将使用用户输入填充 <code>NewPizza</code> 属性。</li> </ul> </li> <li>将 <code>NewPizza</code> 属性初始化为 <code>default!</code>。 <ul> <li><code>default!</code> 关键字用于将 <code>NewPizza</code> 属性初始化为 <code>null</code>。这可以防止编译器生成有关 <code>NewPizza</code> 属性未初始化的警告。</li> </ul> </li> </ul> <ol start="2"> <li>现在,为 HTTP POST 添加页面处理程序。在同一文件中,将以下方法添加到 <code>PizzaListModel</code> 类:</li> </ol> <pre><code class="prism language-cs"><span class="token keyword">public</span> <span class="token return-type class-name">IActionResult</span> <span class="token function">OnPost</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>ModelState<span class="token punctuation">.</span>IsValid <span class="token operator">||</span> NewPizza <span class="token operator">==</span> <span class="token keyword">null</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token function">Page</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> _service<span class="token punctuation">.</span><span class="token function">AddPizza</span><span class="token punctuation">(</span>NewPizza<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token function">RedirectToAction</span><span class="token punctuation">(</span><span class="token string">"Get"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> <p>在上述代码中:</p> <ul> <li><code>ModelState.IsValid</code> 属性用于确定用户输入是否有效。 <ul> <li>验证规则是根据 Models\Pizza.cs 中 <code>Pizza</code> 类上的属性(例如 <code>Required</code> 和 <code>Range</code>)推断出来的。</li> <li>如果用户输入无效,则调用 <code>Page</code> 方法来重新呈现页面。</li> </ul> </li> <li><code>NewPizza</code> 属性用于向 <code>_service</code> 对象添加新的披萨。</li> <li><code>RedirectToAction</code> 方法用于将用户重定向到 <code>Get</code> 页面处理程序,该处理程序将重新呈现包含更新的披萨列表的页面。</li> </ul> <ol start="3"> <li> <p>保存文件。如果使用的是 GitHub Codespaces,则文件会自动保存。</p> </li> <li> <p>返回到正在运行 <code>dotnet watch</code> 的终端,然后按 Ctrl+R 重新加载应用。<br> <a href="http://img.e-com-net.com/image/info8/352129e549fd41c8b0b14b818756b827.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/352129e549fd41c8b0b14b818756b827.jpg" alt="使用 ASP.NET Core 创建 Web UI_第6张图片" width="650" height="711" style="border:1px solid black;"></a></p> </li> <li> <p>打开 Pages\PizzaList.cshtml 并将 <code><!-- New Pizza form will go here --></code> 替换为以下代码:</p> </li> </ol> <pre><code class="prism language-cs"><span class="token operator"><</span><span class="token class-name">form</span> method<span class="token operator">=</span><span class="token string">"post"</span><span class="token operator">></span> <span class="token operator"><</span>div asp<span class="token operator">-</span>validation<span class="token operator">-</span>summary<span class="token operator">=</span><span class="token string">"ModelOnly"</span> <span class="token keyword">class</span><span class="token operator">=</span><span class="token string">"text-danger"</span><span class="token operator">></span><span class="token operator"><</span><span class="token operator">/</span>div<span class="token operator">></span> <span class="token operator"><</span>div <span class="token keyword">class</span><span class="token operator">=</span><span class="token string">"form-group"</span><span class="token operator">></span> <span class="token operator"><</span>label asp<span class="token operator">-</span><span class="token keyword">for</span><span class="token operator">=</span><span class="token string">"NewPizza.Name"</span> <span class="token keyword">class</span><span class="token operator">=</span><span class="token string">"control-label"</span><span class="token operator">></span><span class="token operator"><</span><span class="token operator">/</span>label<span class="token operator">></span> <span class="token operator"><</span>input asp<span class="token operator">-</span><span class="token keyword">for</span><span class="token operator">=</span><span class="token string">"NewPizza.Name"</span> <span class="token keyword">class</span><span class="token operator">=</span><span class="token string">"form-control"</span> <span class="token operator">/</span><span class="token operator">></span> <span class="token operator"><</span>span asp<span class="token operator">-</span>validation<span class="token operator">-</span><span class="token keyword">for</span><span class="token operator">=</span><span class="token string">"NewPizza.Name"</span> <span class="token keyword">class</span><span class="token operator">=</span><span class="token string">"text-danger"</span><span class="token operator">></span><span class="token operator"><</span><span class="token operator">/</span>span<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">/</span>div<span class="token operator">></span> <span class="token operator"><</span>div <span class="token keyword">class</span><span class="token operator">=</span><span class="token string">"form-group"</span><span class="token operator">></span> <span class="token operator"><</span>label asp<span class="token operator">-</span><span class="token keyword">for</span><span class="token operator">=</span><span class="token string">"NewPizza.Size"</span> <span class="token keyword">class</span><span class="token operator">=</span><span class="token string">"control-label"</span><span class="token operator">></span><span class="token operator"><</span><span class="token operator">/</span>label<span class="token operator">></span> <span class="token operator"><</span><span class="token keyword">select</span> asp<span class="token operator">-</span><span class="token keyword">for</span><span class="token operator">=</span><span class="token string">"NewPizza.Size"</span> <span class="token keyword">class</span><span class="token operator">=</span><span class="token string">"form-control"</span> id<span class="token operator">=</span><span class="token string">"PizzaSize"</span><span class="token operator">></span> <span class="token operator"><</span><span class="token class-name">option</span> <span class="token keyword">value</span><span class="token operator">=</span><span class="token string">""</span><span class="token operator">></span><span class="token operator">--</span> Select Size <span class="token operator">--</span><span class="token operator"><</span><span class="token operator">/</span>option<span class="token operator">></span> <span class="token operator"><</span><span class="token class-name">option</span> <span class="token keyword">value</span><span class="token operator">=</span><span class="token string">"Small"</span><span class="token operator">></span>Small<span class="token operator"><</span><span class="token operator">/</span>option<span class="token operator">></span> <span class="token operator"><</span><span class="token class-name">option</span> <span class="token keyword">value</span><span class="token operator">=</span><span class="token string">"Medium"</span><span class="token operator">></span>Medium<span class="token operator"><</span><span class="token operator">/</span>option<span class="token operator">></span> <span class="token operator"><</span><span class="token class-name">option</span> <span class="token keyword">value</span><span class="token operator">=</span><span class="token string">"Large"</span><span class="token operator">></span>Large<span class="token operator"><</span><span class="token operator">/</span>option<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">/</span><span class="token keyword">select</span><span class="token operator">></span> <span class="token operator"><</span>span asp<span class="token operator">-</span>validation<span class="token operator">-</span><span class="token keyword">for</span><span class="token operator">=</span><span class="token string">"NewPizza.Size"</span> <span class="token keyword">class</span><span class="token operator">=</span><span class="token string">"text-danger"</span><span class="token operator">></span><span class="token operator"><</span><span class="token operator">/</span>span<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">/</span>div<span class="token operator">></span> <span class="token operator"><</span>div <span class="token keyword">class</span><span class="token operator">=</span><span class="token string">"form-group form-check"</span><span class="token operator">></span> <span class="token operator"><</span>label <span class="token keyword">class</span><span class="token operator">=</span><span class="token string">"form-check-label"</span><span class="token operator">></span> <span class="token operator"><</span>input <span class="token keyword">class</span><span class="token operator">=</span><span class="token string">"form-check-input"</span> asp<span class="token operator">-</span><span class="token keyword">for</span><span class="token operator">=</span><span class="token string">"NewPizza.IsGlutenFree"</span> <span class="token operator">/</span><span class="token operator">></span> @Html<span class="token punctuation">.</span><span class="token function">DisplayNameFor</span><span class="token punctuation">(</span>model <span class="token operator">=></span> model<span class="token punctuation">.</span>NewPizza<span class="token punctuation">.</span>IsGlutenFree<span class="token punctuation">)</span> <span class="token operator"><</span><span class="token operator">/</span>label<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">/</span>div<span class="token operator">></span> <span class="token operator"><</span>div <span class="token keyword">class</span><span class="token operator">=</span><span class="token string">"form-group"</span><span class="token operator">></span> <span class="token operator"><</span>label asp<span class="token operator">-</span><span class="token keyword">for</span><span class="token operator">=</span><span class="token string">"NewPizza.Price"</span> <span class="token keyword">class</span><span class="token operator">=</span><span class="token string">"control-label"</span><span class="token operator">></span><span class="token operator"><</span><span class="token operator">/</span>label<span class="token operator">></span> <span class="token operator"><</span>input asp<span class="token operator">-</span><span class="token keyword">for</span><span class="token operator">=</span><span class="token string">"NewPizza.Price"</span> <span class="token keyword">class</span><span class="token operator">=</span><span class="token string">"form-control"</span> <span class="token operator">/</span><span class="token operator">></span> <span class="token operator"><</span>span asp<span class="token operator">-</span>validation<span class="token operator">-</span><span class="token keyword">for</span><span class="token operator">=</span><span class="token string">"NewPizza.Price"</span> <span class="token keyword">class</span><span class="token operator">=</span><span class="token string">"text-danger"</span><span class="token operator">></span><span class="token operator"><</span><span class="token operator">/</span>span<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">/</span>div<span class="token operator">></span> <span class="token operator"><</span>div <span class="token keyword">class</span><span class="token operator">=</span><span class="token string">"form-group"</span><span class="token operator">></span> <span class="token operator"><</span><span class="token class-name">input</span> type<span class="token operator">=</span><span class="token string">"submit"</span> <span class="token keyword">value</span><span class="token operator">=</span><span class="token string">"Create"</span> <span class="token keyword">class</span><span class="token operator">=</span><span class="token string">"btn btn-primary"</span> <span class="token operator">/</span><span class="token operator">></span> <span class="token operator"><</span><span class="token operator">/</span>div<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">/</span>form<span class="token operator">></span> </code></pre> <p>在上述代码中:</p> <ul> <li><code>asp-validation-summary</code> 属性用于显示整个模型的验证错误。</li> <li>每个表单字段(<code><input></code> 和 <code><select></code> 元素)和 <code><label></code> 都使用 <code>asp-for</code> 特性绑定到 <code>NewPizza</code> 属性。</li> <li><code>asp-validation-for</code> 属性用于显示每个表单字段的验证错误。</li> <li><code>@Html.DisplayNameFor</code> 方法用于显示 <code>IsGlutenFree</code> 属性的显示名称。 这是一种 Razor 帮助程序方法,用于显示属性的显示名称。 以这种方式添加标签可确保用户单击标签时复选框处于选中状态。</li> <li>提交按钮会添加到表单中,以便将表单数据发布到服务器。在运行时,当用户单击提交按钮时,浏览器以 HTTP POST 请求的形式向服务器发送表单。<br> 在页面底部添加以下代码:</li> </ul> <pre><code class="prism language-razor">@section Scripts { <partial name="_ValidationScriptsPartial" /> } </code></pre> <p>这会将客户端验证脚本注入页面。客户端验证脚本用于在将表单提交到服务器之前验证用户输入。<br> 3. 保存文件。在浏览器中,“披萨列表”页面会刷新以显示新表单。如果使用的是 GitHub Codespaces,则文件会自动保存,但需要手动刷新浏览器选项卡。<br> 4. 输入新披萨,然后选择“创建”按钮。页面应刷新并在列表中显示新披萨。<br> <a href="http://img.e-com-net.com/image/info8/318cb9c12ee640cdaa88dc9f60e402c3.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/318cb9c12ee640cdaa88dc9f60e402c3.jpg" alt="使用 ASP.NET Core 创建 Web UI_第7张图片" width="650" height="711" style="border:1px solid black;"></a></p> <h3>添加用于删除披萨的页面处理程序</h3> <p>要添加到“披萨列表”页面的最后一项内容是:用于删除披萨的页面处理程序。 用于删除披萨的按钮已显示在页面上,但它们尚未执行任何操作。</p> <ol> <li>返回到 Pages\PizzaList. Cshtml. Cs,将以下方法添加到 <code>PizzaListModel</code> 类:</li> </ol> <pre><code class="prism language-cs"><span class="token keyword">public</span> <span class="token return-type class-name">IActionResult</span> <span class="token function">OnPostDelete</span><span class="token punctuation">(</span><span class="token class-name"><span class="token keyword">int</span></span> id<span class="token punctuation">)</span> <span class="token punctuation">{</span> _service<span class="token punctuation">.</span><span class="token function">DeletePizza</span><span class="token punctuation">(</span>id<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token function">RedirectToAction</span><span class="token punctuation">(</span><span class="token string">"Get"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> <ol> <li> <p>在上述代码中:</p> <ul> <li>当用户单击针对某个披萨的“删除”按钮时,会调用 <code>OnPostDelete</code> 方法。 <ul> <li>页面知道使用此方法,因为 Pages\PizzaList.cshtml 中“删除”按钮上的 <code>asp-page-handler</code> 属性已设置为 <code>Delete</code>。</li> </ul> </li> <li><code>id</code> 参数用于标识要删除的披萨。 <ul> <li><code>id</code> 参数绑定到 URL 中的 <code>id</code> 路由值。 此操作是通过 Pages\PizzaList.cshtml 中“删除”按钮上的 <code>asp-route-id</code> 属性完成的。</li> </ul> </li> <li>对 <code>_service</code> 对象调用 <code>DeletePizza</code> 方法以删除披萨。</li> <li><code>RedirectToAction</code> 方法用于将用户重定向到 <code>Get</code> 页面处理程序,该处理程序将重新呈现包含更新的披萨列表的页面。</li> </ul> </li> <li> <p>保存文件。 如果使用的是 GitHub Codespaces,则文件会自动保存。</p> </li> <li> <p>测试针对披萨的“删除”按钮。 页面应刷新,并且所选披萨应从列表中移除。</p> </li> </ol> <p>恭喜! 你已成功创建一个 Razor 页面,该页面显示披萨列表,并允许用户添加新披萨和删除披萨。<br> <a href="http://img.e-com-net.com/image/info8/4428fe12a8e14f7e8ba269550516700e.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/4428fe12a8e14f7e8ba269550516700e.jpg" alt="使用 ASP.NET Core 创建 Web UI_第8张图片" width="650" height="366" style="border:1px solid black;"></a></p> <h2>总结</h2> <p>在本模块中,你已了解 Razor Pages 的基础知识。你已了解如何创建 Razor 页面、添加模型和添加页面处理程序。你还了解了如何使用标记帮助程序将 HTML 元素绑定到模型属性并生成 URL。此外,你还了解了如何使用依赖项注入将服务注入到 Razor 页面。</p> <h3>后续步骤</h3> <p>深入了解文档。本模块中引入了以下 ASP.NET Core 功能和概念:</p> <ul> <li>Razor Pages</li> <li>Razor 语法参考</li> <li>标记帮助程序</li> <li>分部视图</li> <li>布局</li> <li>路由</li> <li>依赖关系注入</li> <li>使用类型化客户端模式发出 HTTP 请求</li> </ul> </div> </div>���������������� </div> </div> </div> <!--PC和WAP自适应版--> <div id="SOHUCS" sid="1751261964203474944"></div> <script type="text/javascript" src="/views/front/js/chanyan.js"></script> <!-- 文章页-底部 动态广告位 --> <div class="youdao-fixed-ad" id="detail_ad_bottom"></div> </div> <div class="col-md-3"> <div class="row" id="ad"> <!-- 文章页-右侧1 动态广告位 --> <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_1"> </div> </div> <!-- 文章页-右侧2 动态广告位 --> <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_2"></div> </div> <!-- 文章页-右侧3 动态广告位 --> <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_3"></div> </div> </div> </div> </div> </div> </div> <div class="container"> <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(.net学习,asp.net)</h4> <div id="paradigm-article-related"> <div class="recommend-post mb30"> <ul class="widget-links"> <li><a href="/article/1950233199242178560.htm" title="x86-64汇编语言训练程序与实战" target="_blank">x86-64汇编语言训练程序与实战</a> <span class="text-muted">十除以十等于一</span> <div>本文还有配套的精品资源,点击获取简介:汇编语言是一种低级语言,与机器代码紧密相关,特别适用于编写系统级代码及性能要求高的应用。nasm编译器是针对x86和x86-64架构的汇编语言编译器,支持多种语法风格和指令集。项目Euler提供数学和计算机科学问题,鼓励编程技巧应用,前100个问题的答案可共享。x86-64架构扩展了寄存器数量并引入新指令,提升了数据处理效率。学习汇编语言能够深入理解计算机底层</div> </li> <li><a href="/article/1950233072825856000.htm" title="三菱PLC全套学习资料及应用手册" target="_blank">三菱PLC全套学习资料及应用手册</a> <span class="text-muted">good2know</span> <div>本文还有配套的精品资源,点击获取简介:三菱PLC作为工业自动化领域的核心设备,其系列产品的学习和应用需要全面深入的知识。本次资料包为学习者提供从基础到进阶的全方位学习资源,包括各种型号PLC的操作手册、编程指南、软件操作教程以及实际案例分析,旨在帮助用户系统掌握PLC的编程语言、指令系统及在各类工业应用中的实施。1.三菱PLC基础知识入门1.1PLC的基本概念可编程逻辑控制器(PLC)是工业自动化</div> </li> <li><a href="/article/1950232782412247040.htm" title="日更006 终极训练营day3" target="_blank">日更006 终极训练营day3</a> <span class="text-muted">懒cici</span> <div>人生创业课(2)今天的主题:学习方法一:遇到有用的书,反复读,然后结合自身实际,列践行清单,不要再写读书笔记思考这本书与我有什么关系,我在哪些地方能用到,之后我该怎么用方法二:读完书没映像怎么办?训练你的大脑,方法:每读完一遍书,立马合上书,做一场分享,几分钟都行对自己的学习要求太低,要逼自己方法三:学习深度不够怎么办?找到细分领域的榜样,把他们的文章、书籍、产品都体验一遍,成为他们的超级用户,向</div> </li> <li><a href="/article/1950232190038110208.htm" title="day15|前端框架学习和算法" target="_blank">day15|前端框架学习和算法</a> <span class="text-muted">universe_01</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a> <div>T22括号生成先把所有情况都画出来,然后(在满足什么情况下)把不符合条件的删除。T78子集要画树状图,把思路清晰。可以用暴力法、回溯法和DFS做这个题DFS深度搜索:每个边都走完,再回溯应用:二叉树搜索,图搜索回溯算法=DFS+剪枝T200岛屿数量(非常经典BFS宽度把树状转化成队列形式,lambda匿名函数“一次性的小函数,没有名字”setup语法糖:让代码更简洁好写的语法ref创建:基本类型的</div> </li> <li><a href="/article/1950231381485350912.htm" title="《极简思维》第三部分" target="_blank">《极简思维》第三部分</a> <span class="text-muted">小洋苏兮</span> <div>整理你的人际关系如何改善人际关系?摘录:因为人际关系问题是人们生活中不快乐的主要原因。感想:感觉这个说的挺对,之前我总是埋头学习,不管舍友不管自己的合作伙伴的一些事情,但实际上,这学期关注了之后好多了摘录:“亲密关系与社交会让你健康而快乐。这是基础。太过于关注成就或不太关心人际关系的人都不怎么快乐。基本上来说,人类就是建立在人脉关系上的。”感想:但是如果有时想的太多就不太好,要以一个开放的心态跟别</div> </li> <li><a href="/article/1950230873060208640.htm" title="你要记住,最重要的是:随时做好准备,为了你可能成为更好的自己,放弃现在的自己。" target="_blank">你要记住,最重要的是:随时做好准备,为了你可能成为更好的自己,放弃现在的自己。</a> <span class="text-muted">霖霖z</span> <div>打卡人:周云日期:2018年11月09日【日精进打卡第180天】【知~学习】《六项精进》0遍共214遍《通篇》1遍共106遍《大学》2遍共347遍《坚强工作,温柔生活》ok《不抱怨的世界》104-108页《经典名句》你要记住,最重要的是:随时做好准备,为了你可能成为更好的自己,放弃现在的自己。【行~实践】一、修身:(对自己个人)1、坚持打卡二、齐家:(对家庭和家人)打扫卫生,接送孩子,洗衣做饭,陪</div> </li> <li><a href="/article/1950229986984128512.htm" title="贫穷家庭的孩子考上985以后会怎样?" target="_blank">贫穷家庭的孩子考上985以后会怎样?</a> <span class="text-muted">Mellisa蜜思言</span> <div>我出生在一个贫穷的农村家庭,据我妈说,我出生的时候才4斤多,而她生完我以后月子里就瘦到70斤。家里一直很穷,父母都是在菜市场卖菜的,家里还有几亩地种庄稼的。我很小开始就要去帮忙,暑假的生活就是帮忙去卖菜和割稻谷,那时候自己对于割稻谷这种事情有着莫名的恐惧,生怕自己长大以后还是每年都要过着割稻谷这种日子。父母因为忙于生计无暇顾及我的学习,幸好我因为看到他们这样子的生活,内心里有深深的恐惧感,驱使着我</div> </li> <li><a href="/article/1950227573938122752.htm" title="2019-06-05" target="_blank">2019-06-05</a> <span class="text-muted">第十七把巴鲁克</span> <div>今天去实验田里实习,见到了福寿螺真的可怕且牛皮,六级也快来了,说实话还是害怕。我昨天考了环工原理,真的太难了,太烦了,理工科真的难,烦。实验报告还是没写,要抓紧速度抓紧时间,还是应该学会努力学习,远离一些不上进的事物。</div> </li> <li><a href="/article/1950223878005518336.htm" title="为什么焦虑、抑郁、自残的青少年越来越多?" target="_blank">为什么焦虑、抑郁、自残的青少年越来越多?</a> <span class="text-muted">精神健康</span> <div>很多家长觉得没缺孩子吃的穿的,他们有安稳的生活,他们有什么可焦虑、抑郁的,但现在的孩子,学习压力越来越大,每天休息的时间越来越少,出现焦虑抑郁是很正常的。从发展的角度看,青少年时期,人的身体、情绪,智力、人格都急剧发展,正从未成熟走向成熟,情绪起伏不定,易冲动,再者,由于缺乏生活经验,以及来自于家长、学校、社会的各种要求和压力,从而不知所措,心中的焦虑、恐惧、彷徨得不到及时的排解,从而导致心理上的</div> </li> <li><a href="/article/1950222857124507648.htm" title="读书打卡《别想太多啦》" target="_blank">读书打卡《别想太多啦》</a> <span class="text-muted">chenchen_68ed</span> <div>第一,世间之事,不去尝试永远不知道其中的奥秘,在尝试中有失败是必然的。如果担心失败,那什么都学不会。第二,经历的失败越多,越会对失败者抱有宽容的态度,“原来如此,我也经历过类似的失败啦,那只是暂时的”。经历越多失败的长者,越能包容别人,这也就是所谓的“越年长越宽容”。成熟的人,就是在众多失败经历中不断学习,并接纳别人的失败。对于他人的小小过失不吹毛求疵,自己的心态会更加平和。在不断失败中学习,让自</div> </li> <li><a href="/article/1950222723200380928.htm" title="LVS+Keepalived实现高可用和负载均衡" target="_blank">LVS+Keepalived实现高可用和负载均衡</a> <span class="text-muted">2401_84412895</span> <a class="tag" taget="_blank" href="/search/%E7%A8%8B%E5%BA%8F%E5%91%98/1.htm">程序员</a><a class="tag" taget="_blank" href="/search/lvs/1.htm">lvs</a><a class="tag" taget="_blank" href="/search/%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1/1.htm">负载均衡</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a> <div>2、开启网卡子接口配置VIP[root@a~]#cd/etc/sysconfig/network-scripts/[root@anetwork-scripts]#cp-aifcfg-ens32ifcfg-ens32:0[root@anetwork-scripts]#catifcfg-ens32:0BOOTPROTO=staticDEVICE=ens32:0ONBOOT=yesIPADDR=10.1</div> </li> <li><a href="/article/1950222602781913088.htm" title="2023-01-26" target="_blank">2023-01-26</a> <span class="text-muted">胡喜平</span> <div>我觉得《可见的学习》一书确实从底层逻辑说清楚了,教学的本质。可是太多术语和概念,一时间难以消化啊。而且知道和懂得有距离,运用就更不行了,需要高手和专家的指导。我需要多听听新课标的讲座了,来反复印证。读论文也有了一点点灵感,明天修改我的论文。</div> </li> <li><a href="/article/1950221204333850624.htm" title="平静得接受自己的笨拙 20190118 晨间日记" target="_blank">平静得接受自己的笨拙 20190118 晨间日记</a> <span class="text-muted">吴伯符</span> <div>图片发自App最近做了一个关于微习惯的分享,这里有八个字:微量开始,超额完成。这里的言下之意其实是要你在一开始的时候,平静地接受自己的笨拙。接受自己的笨拙,理解自己的笨拙,放慢速度尝试,观察哪里可以改进,再反复练习,观察自己哪里可以再进一步改进,再反复…这是学习一切技能的必须的过程。这里的两个关键点是:1.尽快的开始这个过程,这就能够用到微习惯的微量开始。2.尽快的度过这个过程,这就需要用到超额完</div> </li> <li><a href="/article/1950219924043526144.htm" title="二十四节气组诗 谷雨" target="_blank">二十四节气组诗 谷雨</a> <span class="text-muted">离陌_6639</span> <div>图片来源网络,若侵犯了你的权益,请联系我删除6.谷雨文/离陌背上行囊背上如行囊的我从此任行程马不停蹄今天家乡的田野春雨快马加鞭播下希望的种子观音不语目送着我和夏天一道在观音山出关图片来源网络,若侵犯了你的权益,请联系我删除你好啊,我是离陌,已然在懵懂中走过了16年的岁月,为了珍惜当下的每一秒,所以立志做一名终身学习者。文学对于我来说是一种信仰,诗歌是我的生命。人生之道,四通八达,即入文学,自当持之</div> </li> <li><a href="/article/1950219036667211776.htm" title="你好,2020年" target="_blank">你好,2020年</a> <span class="text-muted">瑄瑄妍妍的妈咪</span> <div>早上好,今天是2020年的第一天,也就是元旦,新年新的一天开始了。新的开始,重新规划未来的一年。从今天开始,用了一个新的记账软件,之前的随手记软件,也没有删除,只是重新下载了一个别的软件,开始一个新的记账旅程,对于理财开支,有个新的规划。通过小红书视频软件,学习了不少育儿知识,和各种不同的美食,以后动手制作,给宝宝做健康美味的营养餐。学习方面,继续学英语吧!虽然是抽出时间学的,进度也比较慢,但是积</div> </li> <li><a href="/article/1950216170401492992.htm" title="常规笔记本和加固笔记本的区别" target="_blank">常规笔记本和加固笔记本的区别</a> <span class="text-muted">luchengtech</span> <a class="tag" taget="_blank" href="/search/%E7%94%B5%E8%84%91/1.htm">电脑</a><a class="tag" taget="_blank" href="/search/%E4%B8%89%E9%98%B2%E7%AC%94%E8%AE%B0%E6%9C%AC/1.htm">三防笔记本</a><a class="tag" taget="_blank" href="/search/%E5%8A%A0%E5%9B%BA%E8%AE%A1%E7%AE%97%E6%9C%BA/1.htm">加固计算机</a><a class="tag" taget="_blank" href="/search/%E5%8A%A0%E5%9B%BA%E7%AC%94%E8%AE%B0%E6%9C%AC/1.htm">加固笔记本</a> <div>在现代科技产品中,笔记本电脑因其便携性和功能性被广泛应用。根据使用场景和需求的不同,笔记本可分为常规笔记本和加固笔记本,二者在多个方面存在显著区别。适用场景是区分二者的重要标志。常规笔记本主要面向普通消费者和办公人群,适用于家庭娱乐、日常办公、学生学习等相对稳定的室内环境。比如,人们在家用它追剧、处理文档,学生在教室用它完成作业。而加固笔记本则专为特殊行业设计,像军事、野外勘探、工业制造、交通运输</div> </li> <li><a href="/article/1950215728720310272.htm" title="《云襄传》:云襄做的局是浑水摸鱼吗?" target="_blank">《云襄传》:云襄做的局是浑水摸鱼吗?</a> <span class="text-muted">书生号贺</span> <div>云襄入南都是要浑水摸鱼吗?他是云台的高材生吗?他为啥笃定师父一定会让他留在南都?他为啥觉得他能够做局成功?他是在经商吗?还是在经营人心与欲望?云襄是云台弟子,云台属千门的一支,另一支叫凌渊,云台教人经商之道,重智慧,凌渊以武力取胜,但倍受打压。云襄学习十五年,下高山奔越州,途经南洋,因恩人闻聪被害,囚于白驹镇,念于情分,被卷入这样一个局面里,结识了舒亚南与金十两,于是,复仇小组成立,目标是南都漕帮</div> </li> <li><a href="/article/1950214458265628672.htm" title="心力践行营十二期一阶学习打卡" target="_blank">心力践行营十二期一阶学习打卡</a> <span class="text-muted">LX_王彤彤</span> <div>姓名:王彤彤时间:2021年4月24日一:朗读师父的十大人生哲学二:师父的早安分享感悟很喜欢这句话:所有的行动都是基于目标的尝试,没有所谓的失败,只是不同尝试后得到的不同结果,让我们更好地调整下一次的行动。三:感恩日记1.我太幸福了,我很感恩姑姑,因为姑姑放假又投喂了我,还给我带了饺子回家,这让我感觉很幸福。谢谢,谢谢,谢谢。2.我太幸福了,我很感恩师父晚上的直播,因为听他的分享我知道怎么更好的去</div> </li> <li><a href="/article/1950214205252628480.htm" title="为了在未来的人工智能世界中取得成功,学生们必须学习人类写作的优点" target="_blank">为了在未来的人工智能世界中取得成功,学生们必须学习人类写作的优点</a> <span class="text-muted">睿邸管家</span> <div>澳大利亚各地的学生在新学年开始使用铅笔、钢笔和键盘学习写字。在工作场所,机器也在学习写作,如此有效,几年之内,它们可能会写得比人类更好。有时它们已经做到了,就像Grammarly这样的应用程序所展示的那样。当然,人类现在的日常写作可能很快就会由具有人工智能(AI)的机器来完成。手机和电子邮件软件常用的预测文本是无数人每天都在使用的一种人工智能写作形式。据AI行业研究机构称,到2022年,人工智能及</div> </li> <li><a href="/article/1950213434863841280.htm" title="闭组进行时..." target="_blank">闭组进行时...</a> <span class="text-muted">李亚青_强化班</span> <div>今天是2019年12月1号距离开始三月学习的日子:2019年10月07,已经过去将近两个月,回顾这一阶段的学习,收获了什么?又学会了什么呢?图片发自App我想,收获最大的就是身边这一群人吧,有和蔼可亲的学姐,贴心的学长,嬉戏打闹,玩的不亦乐乎,但也同样认真踏实学习小伙伴图片发自App本以为在这样的时刻,有太多太多话,太多太多想法想要表达,可言到此处,又觉得似乎没有什么想要说的了还是那句话,幸运遇到</div> </li> <li><a href="/article/1950213052171350016.htm" title="2021-10-23" target="_blank">2021-10-23</a> <span class="text-muted">赵甄文的幸福</span> <div>秀荣感恩日记Day42[烟花]感恩语录感恩自己有能力有好身体,可以到处走动,做自己想做的事情10.23感恩日记今天做的事情瑜伽一小时户外散步一小时泡脚20分钟学习打卡和孩子沟通[爱心]感动的瞬间今天瑜伽回来,发现老公在厨房里做鱼。每次老公有时间休息的时候都会给我做硬菜。刘姐约我一起去公园散步晒太阳。虽然完美错过,但心里还是暖暖的。每天睁开眼打开手机,先去自己的群里逛一逛,每每发现有人点赞或者互动都</div> </li> <li><a href="/article/1950212797946195968.htm" title="孤独的守候" target="_blank">孤独的守候</a> <span class="text-muted">怒吼的生命</span> <div>孤独了时光岁月了寂寞带来了惆怅那些孤独的日子里我们珍惜奋斗起来品味人生的真谛做到更好奋斗当中的你是那么努力格外自律学习起来五彩斑斓那些日子时光匆匆人生的机会很多需要把握痛苦的回忆记得住那些忧愁孤苦五一的日子寂寞当中的你时光荏苒独自带给我荒草学习起来努力奋斗可是我们做的还不够把握发展生活带给我们更多希望静静的述说你的故事你的精彩人生当中我们总是努力把握生活带给我们更多的学习生活当中我们奋斗可是做的还</div> </li> <li><a href="/article/1950209368356089856.htm" title="AI模型训练中过拟合和欠拟合的区别是什么?" target="_blank">AI模型训练中过拟合和欠拟合的区别是什么?</a> <span class="text-muted">workflower</span> <a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/1.htm">数据分析</a> <div>在AI模型训练中,过拟合和欠拟合是两种常见的模型性能问题,核心区别在于模型对数据的学习程度和泛化能力:欠拟合(Underfitting)-定义:模型未能充分学习到数据中的规律,对训练数据的拟合程度较差,在训练集和测试集上的表现都不好(如准确率低、损失值高)。-原因:-模型结构过于简单(如用线性模型解决非线性问题);-训练数据量不足或特征信息不充分;-训练时间太短,模型尚未学到有效模式。-表现:训练</div> </li> <li><a href="/article/1950208983868436480.htm" title="2018-08-29精进打卡" target="_blank">2018-08-29精进打卡</a> <span class="text-muted">米兰王</span> <div>姓名:王兰英【日精进打卡第25天】【知~学习】《六项精进》1遍共39遍《大学》1遍共50遍【经典名句分享】一切都是最好的安排。【行~实践】一、修身:(对自己个人)1,散步1小时。2,每天坚持读书。二、齐家:(对家庭和家人)1,指导孩子开车。2,和家人一起逛超市。三、建功:(对工作)用心做好每件事。{积善}:发愿从2018年8月5日起1年内365个善事。今日1善,累计27善。【省~觉悟】正人先正己。</div> </li> <li><a href="/article/1950207203017289728.htm" title="陶勇:要不要参加分班考试学习?看完再说。" target="_blank">陶勇:要不要参加分班考试学习?看完再说。</a> <span class="text-muted">陶勇</span> <div>每年到了升学季,有很多培训机构都特别忙,为什么呢?因为有成千上万的学生,会选择升学前的分班考试的培训。比如说,小升初的孩子,到了暑假,很多孩子都会去选择一个初中,初一的分班考试的培训,那考入高中的孩子也有很多孩子会选择这种新高一的分班考试的培训。当然了,我个人认为这种选择并不是孩子自身的选择,主要还是家长的选择。当然也有少数孩子会对自己有比较高的要求,他们也会主动的去选择。为什么要去上分班考试的这</div> </li> <li><a href="/article/1950204954295726080.htm" title="Anaconda 和 Miniconda:功能详解与选择建议" target="_blank">Anaconda 和 Miniconda:功能详解与选择建议</a> <span class="text-muted">古月฿</span> <a class="tag" taget="_blank" href="/search/python%E5%85%A5%E9%97%A8/1.htm">python入门</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/conda/1.htm">conda</a> <div>Anaconda和Miniconda详细介绍一、Anaconda的详细介绍1.什么是Anaconda?Anaconda是一个开源的包管理和环境管理工具,在数据科学、机器学习以及科学计算领域发挥着关键作用。它以Python和R语言为基础,为用户精心准备了大量预装库和工具,极大地缩短了搭建数据科学环境的时间。对于那些想要快速开展数据分析、模型训练等工作的人员来说,Anaconda就像是一个一站式的“数</div> </li> <li><a href="/article/1950204901929840640.htm" title="求解——妊娠纹霜哪个牌子好?皮肤专家推荐的热门秘诀!" target="_blank">求解——妊娠纹霜哪个牌子好?皮肤专家推荐的热门秘诀!</a> <span class="text-muted">zhangxing0100</span> <div>妊娠纹会严重影响女性的美观,那孕期的女性朋友该如何避免减少妊娠纹的出现呢?下面美腹丽人小编为大家分享了预防妊娠纹的方法,赶紧一起来学习吧!一、预防妊娠纹的饮食习惯1、多食用对皮肤内胶原纤维有利的食品来增强皮肤的弹性。2、控制糖分摄入,少吃色素含量高的食物。3、早晚两杯脱脂牛奶,多食用维丰富的蔬菜、水果和富含维生素及矿物质的食物,增加细胞膜的通透性和皮肤的新陈代谢功能。4、正确的喝水习惯可以提速皮肤</div> </li> <li><a href="/article/1950201221415497728.htm" title="2023-01-07" target="_blank">2023-01-07</a> <span class="text-muted">阿诗玛_6209</span> <div>姓名:赵丽娟【日精进打卡第1783天】【知~学习】读书《经营与会计》ok《活法》3-47-8【经典名句】执着追求并从中得到最大快乐的人,才是成功者。——梭罗一、修身:(对自己个人)1、保持心态平和.2、坚持打卡.坚持读书。3、早晨喝杯温水.4、坚持烫脚,养成早睡早起的习惯.二、齐家:三、建功:(对工作){积善}:发愿从2018年1月28日起见善行善,今日0善。【省~觉悟】1,睡觉时把手机放到离自己</div> </li> <li><a href="/article/1950201222665400320.htm" title="认命修运 每日一省(16)" target="_blank">认命修运 每日一省(16)</a> <span class="text-muted">星_6329</span> <div>命每个人的命都是父母带来的,我们每个人都没有权利选择父母,没有权利选择自己的出生。一个人从出生的那一刻就注定了你的命。我所说的认命,就是客观的接受自己的父母,接受自己的家庭。不对抗,不较劲。有些人是含着金汤匙出生的,有些人刚一出生拥有的财富可能是我们一生都得不到的。有些人是踩着泥坑出生的。有些人一出生就是等着继承皇位的。运在我们成长的过程当中,我们付出努力,学习知识,成长自己,帮助他人。我们有权利</div> </li> <li><a href="/article/1950201094361640960.htm" title="人工智能应用研究快讯 2021-11-30" target="_blank">人工智能应用研究快讯 2021-11-30</a> <span class="text-muted">峰谷皆平</span> <div>[HTML]ArtificialIntelligenceforSkinCancerDetection:ScopingReviewATakiddin,JSchneider,YYang,AAbd-Alrazaq...JournalofMedicalInternet...,2021ABSTACT:Background:Skincanceristhemostcommoncancertypeaffectin</div> </li> <li><a href="/article/107.htm" title="web报表工具FineReport常见的数据集报错错误代码和解释" target="_blank">web报表工具FineReport常见的数据集报错错误代码和解释</a> <span class="text-muted">老A不折腾</span> <a class="tag" taget="_blank" href="/search/web%E6%8A%A5%E8%A1%A8/1.htm">web报表</a><a class="tag" taget="_blank" href="/search/finereport/1.htm">finereport</a><a class="tag" taget="_blank" href="/search/%E4%BB%A3%E7%A0%81/1.htm">代码</a><a class="tag" taget="_blank" href="/search/%E5%8F%AF%E8%A7%86%E5%8C%96%E5%B7%A5%E5%85%B7/1.htm">可视化工具</a> <div>在使用finereport制作报表,若预览发生错误,很多朋友便手忙脚乱不知所措了,其实没什么,只要看懂报错代码和含义,可以很快的排除错误,这里我就分享一下finereport的数据集报错错误代码和解释,如果有说的不准确的地方,也请各位小伙伴纠正一下。   NS-war-remote=错误代码\:1117 压缩部署不支持远程设计 NS_LayerReport_MultiDs=错误代码</div> </li> <li><a href="/article/234.htm" title="Java的WeakReference与WeakHashMap" target="_blank">Java的WeakReference与WeakHashMap</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%BC%B1%E5%BC%95%E7%94%A8/1.htm">弱引用</a> <div>首先看看 WeakReference wiki 上 Weak reference 的一个例子: public class ReferenceTest { public static void main(String[] args) throws InterruptedException { WeakReference r = new Wea</div> </li> <li><a href="/article/361.htm" title="Linux——(hostname)主机名与ip的映射" target="_blank">Linux——(hostname)主机名与ip的映射</a> <span class="text-muted">eksliang</span> <a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/hostname/1.htm">hostname</a> <div>一、 什么是主机名 无论在局域网还是INTERNET上,每台主机都有一个IP地址,是为了区分此台主机和彼台主机,也就是说IP地址就是主机的门牌号。但IP地址不方便记忆,所以又有了域名。域名只是在公网(INtERNET)中存在,每个域名都对应一个IP地址,但一个IP地址可有对应多个域名。域名类型 linuxsir.org 这样的; 主机名是用于什么的呢? 答:在一个局域网中,每台机器都有一个主</div> </li> <li><a href="/article/488.htm" title="oracle 常用技巧" target="_blank">oracle 常用技巧</a> <span class="text-muted">18289753290</span> <div>oracle常用技巧 ①复制表结构和数据   create table  temp_clientloginUser as   select distinct userid from tbusrtloginlog ②仅复制数据 如果表结构一样 insert into  mytable  select  * &nb</div> </li> <li><a href="/article/615.htm" title="使用c3p0数据库连接池时出现com.mchange.v2.resourcepool.TimeoutException" target="_blank">使用c3p0数据库连接池时出现com.mchange.v2.resourcepool.TimeoutException</a> <span class="text-muted">酷的飞上天空</span> <a class="tag" taget="_blank" href="/search/exception/1.htm">exception</a> <div>有一个线上环境使用的是c3p0数据库,为外部提供接口服务。最近访问压力增大后台tomcat的日志里面频繁出现 com.mchange.v2.resourcepool.TimeoutException: A client timed out while waiting to acquire a resource from com.mchange.v2.resourcepool.BasicResou</div> </li> <li><a href="/article/742.htm" title="IT系统分析师如何学习大数据" target="_blank">IT系统分析师如何学习大数据</a> <span class="text-muted">蓝儿唯美</span> <a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%95%B0%E6%8D%AE/1.htm">大数据</a> <div>我是一名从事大数据项目的IT系统分析师。在深入这个项目前需要了解些什么呢?学习大数据的最佳方法就是先从了解信息系统是如何工作着手,尤其是数据库和基础设施。同样在开始前还需要了解大数据工具,如Cloudera、Hadoop、Spark、Hive、Pig、Flume、Sqoop与Mesos。系 统分析师需要明白如何组织、管理和保护数据。在市面上有几十款数据管理产品可以用于管理数据。你的大数据数据库可能</div> </li> <li><a href="/article/869.htm" title="spring学习——简介" target="_blank">spring学习——简介</a> <span class="text-muted">a-john</span> <a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a> <div>Spring是一个开源框架,是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只能由EJB完成的事情。然而Spring的用途不仅限于服务器端的开发,从简单性,可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。其主要特征是依赖注入、AOP、持久化、事务、SpringMVC以及Acegi Security 为了降低Java开发的复杂性,</div> </li> <li><a href="/article/996.htm" title="自定义颜色的xml文件" target="_blank">自定义颜色的xml文件</a> <span class="text-muted">aijuans</span> <a class="tag" taget="_blank" href="/search/xml/1.htm">xml</a> <div><?xml version="1.0" encoding="utf-8"?> <resources> <color name="white">#FFFFFF</color> <color name="black">#000000</color> &</div> </li> <li><a href="/article/1123.htm" title="运营到底是做什么的?" target="_blank">运营到底是做什么的?</a> <span class="text-muted">aoyouzi</span> <a class="tag" taget="_blank" href="/search/%E8%BF%90%E8%90%A5%E5%88%B0%E5%BA%95%E6%98%AF%E5%81%9A%E4%BB%80%E4%B9%88%E7%9A%84%EF%BC%9F/1.htm">运营到底是做什么的?</a> <div>文章来源:夏叔叔(微信号:woshixiashushu),欢迎大家关注!很久没有动笔写点东西,近些日子,由于爱狗团产品上线,不断面试,经常会被问道一个问题。问:爱狗团的运营主要做什么?答:带着用户一起嗨。为什么是带着用户玩起来呢?究竟什么是运营?运营到底是做什么的?那么,我们先来回答一个更简单的问题——互联网公司对运营考核什么?以爱狗团为例,绝大部分的移动互联网公司,对运营部门的考核分为三块——用</div> </li> <li><a href="/article/1250.htm" title="js面向对象类和对象" target="_blank">js面向对象类和对象</a> <span class="text-muted">百合不是茶</span> <a class="tag" taget="_blank" href="/search/js/1.htm">js</a><a class="tag" taget="_blank" href="/search/%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1/1.htm">面向对象</a><a class="tag" taget="_blank" href="/search/%E5%87%BD%E6%95%B0%E5%88%9B%E5%BB%BA%E7%B1%BB%E5%92%8C%E5%AF%B9%E8%B1%A1/1.htm">函数创建类和对象</a> <div>接触js已经有几个月了,但是对js的面向对象的一些概念根本就是模糊的,js是一种面向对象的语言 但又不像java一样有class,js不是严格的面向对象语言 ,js在java web开发的地位和java不相上下  ,其中web的数据的反馈现在主流的使用json,json的语法和js的类和属性的创建相似   下面介绍一些js的类和对象的创建的技术   一:类和对</div> </li> <li><a href="/article/1377.htm" title="web.xml之资源管理对象配置 resource-env-ref" target="_blank">web.xml之资源管理对象配置 resource-env-ref</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/web.xml/1.htm">web.xml</a><a class="tag" taget="_blank" href="/search/servlet/1.htm">servlet</a> <div>resource-env-ref元素来指定对管理对象的servlet引用的声明,该对象与servlet环境中的资源相关联 <resource-env-ref> <resource-env-ref-name>资源名</resource-env-ref-name> <resource-env-ref-type>查找资源时返回的资源类</div> </li> <li><a href="/article/1504.htm" title="Create a composite component with a custom namespace" target="_blank">Create a composite component with a custom namespace</a> <span class="text-muted">sunjing</span> <div>https://weblogs.java.net/blog/mriem/archive/2013/11/22/jsf-tip-45-create-composite-component-custom-namespace   When you developed a composite component the namespace you would be seeing would </div> </li> <li><a href="/article/1631.htm" title="【MongoDB学习笔记十二】Mongo副本集服务器角色之Arbiter" target="_blank">【MongoDB学习笔记十二】Mongo副本集服务器角色之Arbiter</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/mongodb/1.htm">mongodb</a> <div> 一、复本集为什么要加入Arbiter这个角色 回答这个问题,要从复本集的存活条件和Aribter服务器的特性两方面来说。 什么是Artiber? An arbiter does not have a copy of data set and cannot become a primary. Replica sets may have arbiters to add a </div> </li> <li><a href="/article/1758.htm" title="Javascript开发笔记" target="_blank">Javascript开发笔记</a> <span class="text-muted">白糖_</span> <a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a> <div> 获取iframe内的元素 通常我们使用window.frames["frameId"].document.getElementById("divId").innerHTML这样的形式来获取iframe内的元素,这种写法在IE、safari、chrome下都是通过的,唯独在fireforx下不通过。其实jquery的contents方法提供了对if</div> </li> <li><a href="/article/1885.htm" title="Web浏览器Chrome打开一段时间后,运行alert无效" target="_blank">Web浏览器Chrome打开一段时间后,运行alert无效</a> <span class="text-muted">bozch</span> <a class="tag" taget="_blank" href="/search/Web/1.htm">Web</a><a class="tag" taget="_blank" href="/search/chorme/1.htm">chorme</a><a class="tag" taget="_blank" href="/search/alert/1.htm">alert</a><a class="tag" taget="_blank" href="/search/%E6%97%A0%E6%95%88/1.htm">无效</a> <div>今天在开发的时候,突然间发现alert在chrome浏览器就没法弹出了,很是怪异。 试了试其他浏览器,发现都是没有问题的。 开始想以为是chorme浏览器有啥机制导致的,就开始尝试各种代码让alert出来。尝试结果是仍然没有显示出来。 这样开发的结果,如果客户在使用的时候没有提示,那会带来致命的体验。哎,没啥办法了 就关闭浏览器重启。   结果就好了,这也太怪异了。难道是cho</div> </li> <li><a href="/article/2012.htm" title="编程之美-高效地安排会议 图着色问题 贪心算法" target="_blank">编程之美-高效地安排会议 图着色问题 贪心算法</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B%E4%B9%8B%E7%BE%8E/1.htm">编程之美</a> <div> import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Random; public class GraphColoringProblem { /**编程之美 高效地安排会议 图着色问题 贪心算法 * 假设要用很多个教室对一组</div> </li> <li><a href="/article/2139.htm" title="机器学习相关概念和开发工具" target="_blank">机器学习相关概念和开发工具</a> <span class="text-muted">chenbowen00</span> <a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/matlab/1.htm">matlab</a><a class="tag" taget="_blank" href="/search/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/1.htm">机器学习</a> <div>基本概念: 机器学习(Machine Learning, ML)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。 它是人工智能的核心,是使计算机具有智能的根本途径,其应用遍及人工智能的各个领域,它主要使用归纳、综合而不是演绎。 开发工具 M</div> </li> <li><a href="/article/2266.htm" title="[宇宙经济学]关于在太空建立永久定居点的可能性" target="_blank">[宇宙经济学]关于在太空建立永久定居点的可能性</a> <span class="text-muted">comsci</span> <a class="tag" taget="_blank" href="/search/%E7%BB%8F%E6%B5%8E/1.htm">经济</a> <div>        大家都知道,地球上的房地产都比较昂贵,而且土地证经常会因为新的政府的意志而变幻文本格式........        所以,在地球议会尚不具有在太空行使法律和权力的力量之前,我们外太阳系统的友好联盟可以考虑在地月系的某些引力平衡点上面,修建规模较大的定居点</div> </li> <li><a href="/article/2393.htm" title="oracle 11g database control 证书错误" target="_blank">oracle 11g database control 证书错误</a> <span class="text-muted">daizj</span> <a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/%E8%AF%81%E4%B9%A6%E9%94%99%E8%AF%AF/1.htm">证书错误</a><a class="tag" taget="_blank" href="/search/oracle+11G+%E5%AE%89%E8%A3%85/1.htm">oracle 11G 安装</a> <div>oracle 11g database control 证书错误  win7 安装完oracle11后打开 Database control 后,会打开em管理页面,提示证书错误,点“继续浏览此网站”,还是会继续停留在证书错误页面 解决办法: 是 KB2661254 这个更新补丁引起的,它限制了 RSA 密钥位长度少于 1024 位的证书的使用。具体可以看微软官方公告:</div> </li> <li><a href="/article/2520.htm" title="Java I/O之用FilenameFilter实现根据文件扩展名删除文件" target="_blank">Java I/O之用FilenameFilter实现根据文件扩展名删除文件</a> <span class="text-muted">游其是你</span> <a class="tag" taget="_blank" href="/search/FilenameFilter/1.htm">FilenameFilter</a> <div>在Java中,你可以通过实现FilenameFilter类并重写accept(File dir, String name) 方法实现文件过滤功能。 在这个例子中,我们向你展示在“c:\\folder”路径下列出所有“.txt”格式的文件并删除。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 </div> </li> <li><a href="/article/2647.htm" title="C语言数组的简单以及一维数组的简单排序算法示例,二维数组简单示例" target="_blank">C语言数组的简单以及一维数组的简单排序算法示例,二维数组简单示例</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/c/1.htm">c</a><a class="tag" taget="_blank" href="/search/array/1.htm">array</a> <div># include <stdio.h> int main(void) { int a[5] = {1, 2, 3, 4, 5}; //a 是数组的名字 5是表示数组元素的个数,并且这五个元素分别用a[0], a[1]...a[4] int i; for (i=0; i<5; ++i) printf("%d\n",</div> </li> <li><a href="/article/2774.htm" title="PRIMARY, INDEX, UNIQUE 这3种是一类 PRIMARY 主键。 就是 唯一 且 不能为空。 INDEX 索引,普通的 UNIQUE 唯一索引" target="_blank">PRIMARY, INDEX, UNIQUE 这3种是一类 PRIMARY 主键。 就是 唯一 且 不能为空。 INDEX 索引,普通的 UNIQUE 唯一索引</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/primary/1.htm">primary</a> <div>PRIMARY, INDEX, UNIQUE 这3种是一类PRIMARY 主键。 就是 唯一 且 不能为空。INDEX 索引,普通的UNIQUE 唯一索引。 不允许有重复。FULLTEXT 是全文索引,用于在一篇文章中,检索文本信息的。举个例子来说,比如你在为某商场做一个会员卡的系统。这个系统有一个会员表有下列字段:会员编号   INT会员姓名  </div> </li> <li><a href="/article/2901.htm" title="java集合辅助类 Collections、Arrays" target="_blank">java集合辅助类 Collections、Arrays</a> <span class="text-muted">shuizhaosi888</span> <a class="tag" taget="_blank" href="/search/Collections/1.htm">Collections</a><a class="tag" taget="_blank" href="/search/Arrays/1.htm">Arrays</a><a class="tag" taget="_blank" href="/search/HashCode/1.htm">HashCode</a> <div>  Arrays、Collections   1 )数组集合之间转换 public static <T> List<T> asList(T... a) { return new ArrayList<>(a); }      a)Arrays.asL</div> </li> <li><a href="/article/3028.htm" title="Spring Security(10)——退出登录logout" target="_blank">Spring Security(10)——退出登录logout</a> <span class="text-muted">234390216</span> <a class="tag" taget="_blank" href="/search/logout/1.htm">logout</a><a class="tag" taget="_blank" href="/search/Spring+Security/1.htm">Spring Security</a><a class="tag" taget="_blank" href="/search/%E9%80%80%E5%87%BA%E7%99%BB%E5%BD%95/1.htm">退出登录</a><a class="tag" taget="_blank" href="/search/logout-url/1.htm">logout-url</a><a class="tag" taget="_blank" href="/search/LogoutFilter/1.htm">LogoutFilter</a> <div>       要实现退出登录的功能我们需要在http元素下定义logout元素,这样Spring Security将自动为我们添加用于处理退出登录的过滤器LogoutFilter到FilterChain。当我们指定了http元素的auto-config属性为true时logout定义是会自动配置的,此时我们默认退出登录的URL为“/j_spring_secu</div> </li> <li><a href="/article/3155.htm" title="透过源码学前端 之 Backbone 三 Model" target="_blank">透过源码学前端 之 Backbone 三 Model</a> <span class="text-muted">逐行分析JS源代码</span> <a class="tag" taget="_blank" href="/search/backbone/1.htm">backbone</a><a class="tag" taget="_blank" href="/search/%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90/1.htm">源码分析</a><a class="tag" taget="_blank" href="/search/js%E5%AD%A6%E4%B9%A0/1.htm">js学习</a> <div>Backbone 分析第三部分  Model 概述: Model 提供了数据存储,将数据以JSON的形式保存在 Model的 attributes里, 但重点功能在于其提供了一套功能强大,使用简单的存、取、删、改数据方法,并在不同的操作里加了相应的监听事件, 如每次修改添加里都会触发 change,这在据模型变动来修改视图时很常用,并且与collection建立了关联。 </div> </li> <li><a href="/article/3282.htm" title="SpringMVC源码总结(七)mvc:annotation-driven中的HttpMessageConverter" target="_blank">SpringMVC源码总结(七)mvc:annotation-driven中的HttpMessageConverter</a> <span class="text-muted">乒乓狂魔</span> <a class="tag" taget="_blank" href="/search/springMVC/1.htm">springMVC</a> <div>这一篇文章主要介绍下HttpMessageConverter整个注册过程包含自定义的HttpMessageConverter,然后对一些HttpMessageConverter进行具体介绍。 HttpMessageConverter接口介绍: public interface HttpMessageConverter<T> { /** * Indicate</div> </li> <li><a href="/article/3409.htm" title="分布式基础知识和算法理论" target="_blank">分布式基础知识和算法理论</a> <span class="text-muted">bluky999</span> <a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/zookeeper/1.htm">zookeeper</a><a class="tag" taget="_blank" href="/search/%E5%88%86%E5%B8%83%E5%BC%8F/1.htm">分布式</a><a class="tag" taget="_blank" href="/search/%E4%B8%80%E8%87%B4%E6%80%A7%E5%93%88%E5%B8%8C/1.htm">一致性哈希</a><a class="tag" taget="_blank" href="/search/paxos/1.htm">paxos</a> <div>  分布式基础知识和算法理论 BY NODEXY@2014.8.12 本文永久链接:http://nodex.iteye.com/blog/2103218   在大数据的背景下,不管是做存储,做搜索,做数据分析,或者做产品或服务本身,面向互联网和移动互联网用户,已经不可避免地要面对分布式环境。笔者在此收录一些分布式相关的基础知识和算法理论介绍,在完善自我知识体系的同</div> </li> <li><a href="/article/3536.htm" title="Android Studio的.gitignore以及gitignore无效的解决" target="_blank">Android Studio的.gitignore以及gitignore无效的解决</a> <span class="text-muted">bell0901</span> <a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/gitignore/1.htm">gitignore</a> <div>  github上.gitignore模板合集,里面有各种.gitignore : https://github.com/github/gitignore   自己用的Android Studio下项目的.gitignore文件,对github上的android.gitignore添加了       # OSX files      //mac os下      .DS_Store </div> </li> <li><a href="/article/3663.htm" title="成为高级程序员的10个步骤" target="_blank">成为高级程序员的10个步骤</a> <span class="text-muted">tomcat_oracle</span> <a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B/1.htm">编程</a> <div>What 软件工程师的职业生涯要历经以下几个阶段:初级、中级,最后才是高级。这篇文章主要是讲如何通过 10 个步骤助你成为一名高级软件工程师。   Why 得到更多的报酬!因为你的薪水会随着你水平的提高而增加 提升你的职业生涯。成为了高级软件工程师之后,就可以朝着架构师、团队负责人、CTO 等职位前进 历经更大的挑战。随着你的成长,各种影响力也会提高。 </div> </li> <li><a href="/article/3790.htm" title="mongdb在linux下的安装" target="_blank">mongdb在linux下的安装</a> <span class="text-muted">xtuhcy</span> <a class="tag" taget="_blank" href="/search/mongodb/1.htm">mongodb</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a> <div>一、查询linux版本号: lsb_release -a  LSB Version:    :base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-noa</div> </li> </ul> </div> </div> </div> <div> <div class="container"> <div class="indexes"> <strong>按字母分类:</strong> <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a> </div> </div> </div> <footer id="footer" class="mb30 mt30"> <div class="container"> <div class="footBglm"> <a target="_blank" href="/">首页</a> - <a target="_blank" href="/custom/about.htm">关于我们</a> - <a target="_blank" href="/search/Java/1.htm">站内搜索</a> - <a target="_blank" href="/sitemap.txt">Sitemap</a> - <a target="_blank" href="/custom/delete.htm">侵权投诉</a> </div> <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved. <!-- <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>--> </div> </div> </footer> <!-- 代码高亮 --> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script> <link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/> <script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script> </body> </html>