高效管理ASP.NET的JavaScript库

简介

对于ASP.NET开发人员来说,管理项目中的JavaScript都很随意:

2011053117150934.png

我想这很大程度上可能是因为网上没有如何妥善处理ASP.NET中JavaScript的可靠信息。此文的目的就是提供一种最佳方案,用于管理ASP.NET中的JavaScript。该方案将能解决以下问题:

  • 内联JS:把JS直接放在页面中将导致页面臃肿不堪。
  • 发布JS:经常忘记发布JS文件。
  • 错误引用:在其它Web程序中引用JS时经常失败。
  • 依赖性:需要记住JS文件中错综复杂的依赖关系。
  • 无效引用:页面上引用的JS从来没有被用到。
  • HTTP/HTTPS:跨HTTPS页面引用HTTP的JS。
  • 重构:重构一个新版本将花费大量时间。
  • 冗余:多次引用统一个JS文件。

预备知识

确保已安装Visual Studio 2010。Express版可能不支持此文涉及到的一些概念。

概述

大部分上述问题是由把JS或JS文件引用直接放到ASPX页面引起的。对几乎所有上述问题的解决方法是使用ASP.NET的内置功能来嵌入JS文件到一个DLL,然后动态引用这些文件。本文将演示这些功能,以及一些充分使用它们的技巧。接下来我们将逐步介绍该如何实现。

开始

第一步,启动Visual Studio 2010,并新建一个名为ParchmentPurveyor空Web程序。

2011053117475863.png

接下来添加一个窗体:Default.aspx,并添加一些简单的HTML代码。大致如下:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs"
Inherits
="ParchmentPurveyor.Default" %>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Parchment Purveyor</title>
</head>
<body>
<form id="form1" runat="server">
<h1>Parchment Purveyor</h1>
<p>Paper for printers, painting, publication,
paper planes, and plenty of other plebeian projects!
</p>
</form>
</body>
</html>

添加JS

不同于在站点中添加JS文件,我们新建一个项目,用于包含我们所有的JS文件。在解决方案中添加一个新的类库项目JavaScriptLibrary

2011053118023273.png

项目添加后删除Class1.cs文件,右键项目,选择添加文件夹,并命名为JavaScript,然后在该文件夹中添加两个JS文件,分别为ShowMessage.js和GreetUser.js,下一步,在项目中添加一个类JavaScriptHelper(注意不要放到JavaScript目录下),现在解决方案目录结构如下:

2011053120334944.png

接下来编写JS,在ShowMessage.js中添加如下代码:

function ShowMessage(msg) {
alert(
"Message From Website: " + msg);
}

在GreetUser.js文件中添加如下代码:

function GreetUser() {
ShowMessage(
"Greetings and Salutations!");
}

注意,GreetUser()依赖于ShowMessage()

嵌入JS文件

相比把JS文件发布到站点,我们更乐于把它们嵌入到DLL。这样子,如果DLL被发布到站点,那么所有JS文件也被自动发布。做到一点很简单,我们只需要右键JS文件,打开属性页,为“生成操作”选择“嵌入资源”即可,如下:

2011053120431048.png

在确定JS文件嵌入DLL后,你需要使它们能够被Web用户访问。为此,需要为项目JavaScriptLibrary添加System.Web的引用:

2011053120455723.png

然后编辑JavaScriptHelper.cs,添加如下代码:

using System.Web.UI;

[assembly: WebResource(
"JavaScriptLibrary.JavaScript.ShowMessage.js", "application/x-javascript")]
[assembly: WebResource(
"JavaScriptLibrary.JavaScript.GreetUser.js", "application/x-javascript")]

这样就能保证Web用户通过客户端访问嵌入式JS文件了。

引用嵌入式JS文件

现在你已嵌入了JS文件,并能通过客户端电脑访问它们。在使用的时候,你必须在页面上引用它们。为此,需要对JavaScriptHelper类做如下修改:

using System;
using System.Web.UI;

[assembly: WebResource(
"JavaScriptLibrary.JavaScript.ShowMessage.js", "application/x-javascript")]
[assembly: WebResource(
"JavaScriptLibrary.JavaScript.GreetUser.js", "application/x-javascript")]

namespace JavaScriptLibrary
{

/// <summary>
/// 帮助页面引用嵌入式JS文件
/// </summary>
public class JavaScriptHelper{

#region 静态字段
private const string NAME_SHOW_MESSAGE = "JavaScriptLibrary.JavaScript.ShowMessage.js";
private const string NAME_GREET_USER = "JavaScriptLibrary.JavaScript.GreetUser.js";
#endregion

#region 公共方法
/// <summary>
/// 在页面上引用ShowMessage.js文件
/// </summary>
/// <param name="manager">通过Page.ClientScript访问</param>
public static void Include_ShowMessage(ClientScriptManager manager){
IncludeJavaScript(manager, NAME_SHOW_MESSAGE);
}

/// <summary>
/// 在页面上引用GreetUser.js文件 (包括所有依赖文件)
/// </summary>
/// <param name="manager">通过Page.ClientScript访问</param>
public static void Include_GreetUser(ClientScriptManager manager){
//依赖(ShowMessage.js).
Include_ShowMessage(manager);
//引用 GreetUser.js.
IncludeJavaScript(manager, NAME_GREET_USER);
}
#endregion

#region 私有方法
/// <summary>
/// 在页面上引用指定的嵌入式js文件
/// </summary>
/// <param name="manager">通过Page.ClientScript访问</param>
/// <param name="resourceName">用于标示嵌入式JS文件的名字</param>
private static void IncludeJavaScript(ClientScriptManager manager, string resourceName){
var type
= typeof(JavaScriptLibrary.JavaScriptHelper);
manager.RegisterClientScriptResource(type, resourceName);
}
#endregion
}
}

IncludeJavaScript()是关键所在。它通过调用RegisterClientScriptResource()确保为嵌入式JS文件获取一个脚本标签。Include_GreetUser()调用了IncludeJavaScript(),同时也调用了Include_ShowMessage()(用于处理依赖关系)。因此,任何页面在引用GreetUser()时也将引用ShowMessage()

现在我们有了可用的类,接下在让我们在Default.aspx页面中试用它。首先在站点ParchmentPurveyor中添加对JavaScriptLibrary的引用:

2011053120585684.png

接下来我们需要修改引用JS页面的后台代码。

using System;
using System.Web.UI;

namespace ParchmentPurveyor
{
public partial class Default : System.Web.UI.Page{
protected override void OnPreRender(EventArgs e){
base.OnPreRender(e);
JavaScriptLibrary.JavaScriptHelper.Include_GreetUser(Page.ClientScript);
}
}
}

最后,还有一件事要做——从页面调用GreetUser()。为此,我们需要在页面中添加如下JS(我选择把它添加到<head>标签中):

<head runat="server">
<title>Parchment Purveyor</title>
<script type="text/javascript">
window.onload
= function () { GreetUser(); };
</script>
</head>

好了,除了还有一些琐碎的事要处理外,我们已基本完成。在处理那些之前,让让我们看一下成果。编译整个解决方案—〉右键在浏览器中查看Default.aspx页面:

2011053121010289.png

右键查看页面源码,你可能看到如下内容(src="/WebResource.axd.."部分有删减):

<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>
Parchment Purveyor
</title>
<script type="text/javascript">
window.onload
= function () { GreetUser(); };
</script>
</head>
<body>
<form method="post" action="Default.aspx" id="form1">
<div class="aspNetHidden">
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="..." />
</div>

<script src="/WebResource.axd?d=fslk3GLsk3Slek&amp;t=1234" type="text/javascript"></script>
<script src="/WebResource.axd?d=fglk3kSl3LS5&amp;t=5678" type="text/javascript"></script>
<h1>Parchment Purveyor</h1>
<p>Paper for printers, painting, publication,
paper planes, and plenty of other plebeian projects!
</p>
</form>
</body>
</html>

请注意引用“WebResource.axd”的两个<script>标签。它提供了让客户端访问嵌入式信息的基本功能。注意,第一个<script>标签注册了ShowMessage(),第二个<script>标签注册了GreetUser()。在你的JS库中调用Include_GreetUser()时,上面所有标签都会被引入到页面中。

后期引用

有时上面技术可能会引用JS文件失败。例如当我使用第三方工具工作时,就可能在渲染阶段阻止调用.NET代码。当你在渲染阶段引用那些函数时,脚本标签不会被插入页面。这是因为页面一开始就已经呈现为HTML。对这个问题的解决方法是构造一个替换函数,并在HTML底部附近插入脚本标签。我称之为“后期引用”,为此,需要对JavaScriptHelper做一些修改:

using System;
using System.Web;
using System.Web.UI;

[assembly: WebResource(
"JavaScriptLibrary.JavaScript.ShowMessage.js", "application/x-javascript")]
[assembly: WebResource(
"JavaScriptLibrary.JavaScript.GreetUser.js", "application/x-javascript")]

namespace JavaScriptLibrary {

/// <summary>
/// 帮助页面引用嵌入式JS文件
/// </summary>
public class JavaScriptHelper {
#region Constants
private const string TEMPLATE_SCRIPT = "<script type=\"text/javascript\" src=\"{0}\"></script>\r\n";
private const string NAME_SHOW_MESSAGE = "JavaScriptLibrary.JavaScript.ShowMessage.js";
private const string NAME_GREET_USER = "JavaScriptLibrary.JavaScript.GreetUser.js";
#endregion

#region 公共方法
/// <summary>
/// 页面引用ShowMessage.js文件
/// </summary>
/// <param name="manager">通过Page.ClientScript访问</param>
/// <param name="late">是否在HTML底部引用JS</param>
public static void Include_ShowMessage(ClientScriptManager manager, bool late = false) {
IncludeJavaScript(manager, NAME_SHOW_MESSAGE, late);
}
/// <summary>
/// 页面引用GreetUser.js文件(包括所有依赖文件)
/// </summary>
/// <param name="manager">通过Page.ClientScript访问</param>
/// <param name="late">是否在HTML底部引用JS</param>
public static void Include_GreetUser(ClientScriptManager manager, bool late = false) {
// 依赖 (ShowMessage.js).
Include_ShowMessage(manager, late);
// 引用 GreetUser.js.
IncludeJavaScript(manager, NAME_GREET_USER, late);
}
#endregion

#region 私有方法
/// <summary>
/// 页面引用指定的嵌入式JS文件
/// </summary>
/// <param name="manager">通过Page.ClientScript访问</param>
/// <param name="resourceName">标示嵌入式JS文件的名字</param>
/// <param name="late">是否在HTML底部引用JS</param>
private static void IncludeJavaScript(ClientScriptManager manager, string resourceName, bool late) {
var type
= typeof(JavaScriptLibrary.JavaScriptHelper);
if (!manager.IsStartupScriptRegistered(type, resourceName)) {
if (late) {
var url
= manager.GetWebResourceUrl(type, resourceName);
var scriptBlock
= string.Format(TEMPLATE_SCRIPT, HttpUtility.HtmlEncode(url));
manager.RegisterStartupScript(type, resourceName, scriptBlock);
}
else {
manager.RegisterClientScriptResource(type, resourceName);
manager.RegisterStartupScript(type, resourceName,
string.Empty);
}
}
}
#endregion
}
}

为每个方法添加一个参数late。该参数默认值为false,因此这些方法依旧可以按照原有方式调用。该参数为false表示原有行为不变,为true时将导致在HTML结尾部分引用脚本段。可能注意到,在late=false时,我仍然调用了RegisterStartupScript(),但传入了一个空字符串(所以不会在HTML插入任何内容)。完成后IsStartupScriptRegistered()将会返回正确值。这样,即使在late被置false后调用了其中的一个函数,又把late置为true,JS也不会被多次引用。如果要看效果,注释掉后台代码OnPreRender(),并在页面中做如下修改:

<body>
<form id="form1" runat="server">
<h1>Parchment Purveyor</h1>
<p>Paper for printers, painting, publication,
paper planes, and plenty of other plebeian projects!
</p>
<% // This gets called during the render stage.
JavaScriptLibrary.JavaScriptHelper.Include_GreetUser(Page.ClientScript,
true); %>
</form>
</body>

在运行程序时,如果观察页面源码,你会发现这将调用HTML底部<script>标签引用的函数。

外部JS

到目前为止,我只是演示了如何引用嵌入式JS。然而,有时候会需要联接到外部JS文件。为此,需要在JavaScriptHelper添加一个新函数:

/// <summary>
/// 在页面里引用指定的外部JavaScript文件
/// </summary>
/// <param name="page">当前页面</param>
/// <param name="key">唯一标示外部JavaScript文件的名字</param>
/// <param name="httpUrl">外部JavaScript文件的URL地址</param>
/// <param name="httpsUrl">启用SSL时外部JavaScript文件的URL地址</param>
/// <param name="late">是否需要在HTML下面引用JavaScript</param>
private static void IncludeExternalJavaScript(Page page, string key, string httpUrl, string httpsUrl, bool late) {
var manager
= page.ClientScript;
var type
= typeof(JavaScriptLibrary.JavaScriptHelper);
bool isStartupRegistered = manager.IsStartupScriptRegistered(type, key);
bool isScriptRegistered = manager.IsClientScriptIncludeRegistered(type, key);
if (!(isStartupRegistered || isScriptRegistered)) {
string url;
if (page.Request.Url.Scheme.ToLower() == "http") {
url
= httpUrl;
}
else {
url
= httpsUrl;
}
if (late) {
manager.RegisterStartupScript(type, key,
string.Format(TEMPLATE_SCRIPT, HttpUtility.HtmlEncode(url)));
}
else {
manager.RegisterClientScriptInclude(type, key, url);
}
}
}
做为常用外部JS文件示例,我将使用微软CDN上的JS文件。如其它JS文件一样,首先在JavaScriptHelper 类中添加一个函数,供页面调用jQuery:
private const string NAME_JQUERY = "jQuery";
private const string URL_JQUERY = "http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.5.1.js";
private const string URL_JQUERY_HTTPS = "https://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.5.1.js";
/// <summary>
/// 页面引用jQuery.js
/// </summary>
/// <param name="page">当前页面.如果传入为null,则使用HTTP上下文的当前</param>
/// <param name="late">是否需要在HTML下面引用JavaScript</param>
public static void Include_jQuery(Page page,bool late=false) {
if (page == null)
page
= (Page)HttpContext.Current.Handler;
IncludeExternalJavaScript(page,NAME_JQUERY,URL_JQUERY,URL_JQUERY_HTTPS,late);
}
最后你能后在页面里通过在OnPreRender()里调用添加的方法实现对jQuery的引用。
protected override void OnPreRender(EventArgs e) {
base.OnPreRender(e);
JavaScriptLibrary.JavaScriptHelper.Include_jQuery(Page);
JavaScriptLibrary.JavaScriptHelper.Include_GreetUser(Page.ClientScript);
}
运行程序,察看页面源码,你会看到如下jQuery引用:
<script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.5.1.js" type="text/javascript"></script>

添加新的JS文件

一旦所有内容完成部署,在需要添加新的JS文件时,只需要几步即可完成,如下:

  • 在JavaScript目录中添加js文件。引用外部js文件跳过该步骤;
  • 设置“生成操作”为“嵌入资源”。引用外部js文件跳过该步骤;
  • 添加assembly属性表示js文件为Web资源。引用外部js文件跳过该步骤;
  • JavaScriptHelper类中添件一个引用JS文件的函数;
  • 从页面,控件或母版页上调用你创建的函数;

不引用JS文件

以上所做都是为了引用JS文件,但也有时候你可能不需要引用JS文件。例如,在使用第三方控件库时,它们可能通过其他方式引用了JS,这时唯一阻止某一JS文件被两次引用的方法是通过你的代码消除重复引用(由第三方库帮你引用,不需要重复引用)。这可以通过在JavaScriptHelper增加额外的函数实现。在实现之前,先让我们演示一下这些技术应用的场景。假设你的第三方控件InlineGreeting.ascx引用了jQuery,其内容大致如下:

<%@ Control Language="C#" %>

<%-- This is a bad way to do things, but we can luckily overcome this obstacle. --%>
<script type="text/javascript" src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.5.1.js"></script>
<script type="text/javascript">
$(document).ready(
function() {
$(
"#lblGreeting").text("Hello");
});
</script>
<p>
<label id="lblGreeting"></label>
</p>
现在假设我们有另一个自己的控件Hello.ascx,使用了同样的jQuery文件:
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Hello.ascx.cs" Inherits="ParchmentPurveyor.Hello" %>

<script type="text/javascript">
$(document).ready(GreetUser);
</script>
Hello.ascx的后台代码引用了jQuery,如下:
protected override void OnPreRender(EventArgs e) {
base.OnPreRender(e);
JavaScriptLibrary.JavaScriptHelper.Include_GreetUser(Page.ClientScript);
JavaScriptLibrary.JavaScriptHelper.Include_jQuery(Page);
}

现在,如果在Default.aspx中引用上述用户控件,jQuery将会被引用两次(第三方一次,我们一次)。为避免此类情况发生,我们将在JavaScriptHelper类中添加两个方法,ExcludeJavaScript()Exclude_jQuery()
private const string NAME_DUMMY_FILE = "JavaScriptLibrary.JavaScript.DummyFile.js";
/// <summary>
/// 该页面排除jQuery.js
/// </summary>
/// <param name="manager">通过Page.ClientScript访问</param>
public static void Exclude_jQuery(ClientScriptManager manager) {
ExcludeJavaScript(manager, NAME_JQUERY);
}
/// <summary>
/// 注册一个虚假的脚本来阻止包含真实的JavaScript
/// </summary>
/// <param name="manager">通过Page.ClientScript访问</param>
/// <param name="key">唯一标示JavaScript文件的名字</param>
private static void ExcludeJavaScript(ClientScriptManager manager, string key) {
var type
= typeof(JavaScriptLibrary.JavaScriptHelper);
var url
= manager.GetWebResourceUrl(type, NAME_DUMMY_FILE);
manager.RegisterStartupScript(type, key,
string.Empty);
manager.RegisterClientScriptInclude(type, key, url);
}

注意,我们定义了一个新的常量NAME_DUMMY_FILE。上面函数假定我们按照上述步骤在JavaScript文件夹里添加了一个空JS文件,并嵌入了它。这个空虚拟JS文件可以引用在任何我们想不引用JS文件的地方。为阻止我们的库引用jQuery只需要调用在Default.aspx页面的Page_Load()中调用Exclude_jQuery()

protected void Page_Load(object sender, EventArgs e) {
//我们通过第三方控件引用了jQuery,那么将避免再一次引用
JavaScriptLibrary.JavaScriptHelper.Exclude_jQuery(Page.ClientScript);
}

现在我们要做的是修改Default.aspx引用InlineHello.ascxHello.ascx,结果如下:

...
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Parchment Purveyor</title>
<script type="text/javascript">
// window.onload = function () { GreetUser(); };
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<h1>Parchment Purveyor</h1>
<p>Paper for printers, painting, publication,
paper planes, and plenty of other plebeian projects!
</p>
<% // 这在渲染阶段调用
JavaScriptLibrary.JavaScriptHelper.Include_GreetUser(Page.ClientScript,
true); %>
</div>
<%-- An inline greeting (pretend this comes from a third-party control library. --%>
<greet:InlineHello ID="InlineHello1" runat="server" />
<%-- Our jQuery greeting. --%>
<greet:Hello runat="server" />
</form>
</body>
</html>

现在我们已清楚在调用Include_jQuery()之前先调用Exclude_jQuery(),就能够阻止我们的JS库引用jQuery.js文件。这就是说jQuery只会被我们的第三方控件引用。大多数时候这种情况可以避免。然而,有时候不可避免,这时该技术也可以让我们的HTML更加干净整洁。

你都有哪些收获?

经过这些工作,依旧有同样的HTML输出,你可能会问“通过添加这些额外的代码,我获得了什么?”。那么这里就列出几点:

  • 内联JS:通过避免把JS直接内联到页面,减小了页面尺寸。
  • 发布JS:当你发布Web站点时,你不需要发布引用的JS文件,只发布DLL就足够了。
  • 错误引用:即使改变了程序路径,你也不用为修改JS路径担忧。
  • 依赖性:文件依赖自动管理。如果你引用了GreetUser.js文件,那么ShowMessage.js文件会自动被引用。
  • 无效引用:除非你调用的函数引用了它,否则不会有JS加载到页面。这将避免页面上出现无用的JS(潜在的加快了页面载入时间)。
  • HTTP/HTTPS:脚本标记的代码输出与协议无关,因此协议对所有页面一样。
  • 重构:如果你想使用一个不同版本的脚本,你只需要在一个地方修改它。例如,如果你决定切换到CDN版本的jQuery,而不是你自己承载,这可能非常有用。更新一个新版本的jQuery时也非常有用。
  • 冗余:不管你在方法中引用多少次,该脚本标签仅会在页面上本引用一次。

转载于:https://www.cnblogs.com/niyw/archive/2011/06/02/2064937.html

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

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

相关文章

【面试】c++单例模式

1. 单例模式 #include <iostream> using namespace std;class CSingleton { private:CSingleton() {} // 构造是私有的static CSingleton *m_pInstance; public:static CSingleton *GetInstance(){if (m_pInstance NULL) {m_pInstance n…

AIX HACMP集群切换测试实际案例解析

为验证AIX HACMP集群系统的稳定性及保障其上应用的连续性和可靠性&#xff0c;决定周五晚进行集群切换测试。下面是当次过程的文档总结和记录&#xff0c;方便以后参考并备案。系统环境&#xff1a;AIX 5.3数据库&#xff1a; DB2 V8.2存储&#xff1a; IBM DS4700,为两节点配置…

jvm_2

业务线程一直在等待&#xff0c;或者一直在运行&#xff0c;如果不是自己想要的状态&#xff0c;就表明有问题 死锁问题检测 上面程序之所以会死锁&#xff0c;因为下图所示&#xff0c;在-128~127范围内&#xff0c;Integer valueOf后对相同的int值会返回相同的对象&#xff0…

视频播放器

效果图 知识要点 surfaceView.getHolder().setFixedSize(176, 144);//设置分辨率 surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);//设置surfaceview不维护自己的缓冲区&#xff0c;而是等待屏幕的渲染引擎将内容推送到用户面前 sur…

前端需要了解的http知识

http基本概念 http是一个无状态 &#xff0c;无连接的基于TCP协议的单向应用层协议 一、无连接 无连接即每次链接只处理一个请求&#xff0c;请求和应答后就断开链接 二、无状态 http的每次请求都是独立的&#xff0c;不相关的&#xff0c;协议对事物处理没有记忆功能。 HTTP无…

局域网中设备的管理之StackCluster

局域网中设备的管理通常采用 stack 、cluster和snmp等方法。 下面我们来讨论一下stack 和cluster。Stack 也叫作堆叠。堆叠是由一些通过堆叠口相连的以太网交换机组成的一个管理域&#xff0c;其中包括一个主交换机和若干个从交换机。堆叠在一起的以太网交换机可以看作为一个设…

3DMed

1. 当前 小论文&#xff0c; before 5.1 2. linux 需要十天的时间&#xff0c; 5月上旬 3. 中下旬写代码&#xff0c;提取算法 。 6月 三维 建模 7月仿真 4. very helpfully , i found this professional open software. Links 3DMed (www.3dmed.net) www.fingerpass.net MOSE…

【图像算法】彩色图像分割专题五:提取彩色图像上特定色彩

【图像算法】彩色图像分割专题五&#xff1a;提取彩色图像特定色彩 SkySeraph Jun 8th 2011 HQU Email&#xff1a;zgzhaobogmail.com QQ&#xff1a;452728574 Latest Modified Date&#xff1a;Jun 8th 2011 HQU 一 原理及说明&#xff1a; 1 RGB(red,green,blue)模式是…

k8s基础学习-存储卷

存储卷的几种类型&#xff1a; emptyDir -- 用于存储临时数据的简单空目录 hostPath -- 用于将目录从工作节点的文件系统挂载到pod中 gitRepo -- 通过检出Git仓库的内容来初始化的卷 nfs -- 挂载到pod中的NFS共享卷 configMap&#xff0c;secret&#xff0c;downwardAPI--用于将…

SharePoint里如何设置People picker值为当前登录用户值

摘要&#xff1a; 相信很多朋友都遇到过需要将某个People类型的字段值设置为当前登录用户的情况而且已经给出了解决方案&#xff0c;因此本文没有什么新意&#xff0c;算法上也比较冗余&#xff0c;仅仅在博客里算作知识的备份。 思路&#xff1a; 在画面的右上角有一个欢迎控件…

《Linux内核完全注释》《完全剖析》 » 阅读本书所需的基础知识 -- 再次强调。

转贴网址&#xff1a;http://www.oldlinux.org/oldlinux/viewthread.php?tid2551&extrapage%3D1 [这个贴子最后由redgrid在 2006/08/09 00:45pm 第 17 次编辑]Linux 0.11虽然不是什么“珠穆朗玛峰”&#xff0c;但它肯定还是“华山”或“泰山”。虽然有路但你还是需要最基…

ubuntu命令行登录

网址&#xff1a;http://hi.baidu.com/tingphoon/blog/item/9f03b41c7973a58c86d6b635.html 方法一&#xff1a; 转到kubuntu之前曾经学习了一下&#xff0c;了解到ubuntu在6.10开始用upstart替代init&#xff0c;主要脚本都在/etc/event.d下面&#xff0c;默认情况下/etc下没…

圆桌论坛对话:互联网产业革命

2019独角兽企业重金招聘Python工程师标准>>> 圆桌论坛对话&#xff1a;互联网产业革命 2012年12月18日&#xff0c;2012中国互联网经济论坛即将召开在北京万豪酒店举行。本次大会以“得势者、得天下”为主题&#xff0c;着眼于网络广告与新媒体&#xff0c;深度聚焦…

Windows PowerShell:(2)基本操作

一、启动PowerShell 2.0 打开“开始”、“所有程序”、“附件”、“Windows PowerShell”程序组&#xff0c;点击“Windows PowerShell”。 二、基本操作 1、查看可用的命令的列表 Get-Command 注&#xff1a;PowerShell有自动补齐命令的功能。例如&#xff0c;在本例中只需要输…

CMDB小计1

1.web开发&#xff08;Django&#xff0c;flask&#xff0c; tornado&#xff09;。 2.自动化运维&#xff08;CMDB项目&#xff09;。 3.爬虫 和 数据分析。 4.自动化测试。 4.人工智能&#xff0c;机械学习&#xff0c; 算法 CMDB 项目&#xff1a; 自动化运维&#xff1a; 运…

Eclipse搭建Cocos2d-x运行环境问题汇总(不含CygWin)

具体搭建方法&#xff0c;可参阅这两篇文章 http://www.cnblogs.com/ybgame/archive/2012/06/07/2540693.html http://blog.csdn.net/maojudong/article/details/7261986 首先导入Cocos2d-x下的HelloCpp项目 本文主要记录在配置的过程中遇到的问题及注意事项 问题1.jni/Android…

宋体配置JAVA j2ee (一) 轻松入门

最近使用开辟的程过中现出了一个小问题&#xff0c;顺便记录一下原因和方法--宋体配置 背景绍介我们经已学习了.NET台平环境下开辟Web目项&#xff0c;经过较长时光接触与学习&#xff0c;慢慢的对于它也熟习了&#xff0c;然而你否是对于Java熟习呢。.NET台平同Java有很多型类…

mysql数据的表分区一

当mysql中医个表的总记录数超过了1000W&#xff0c;会出现性能大幅度下降的情况&#xff0c;单性能下降的比率由系统的架构、应用程序、数据库索引、服务器硬件等多种因素而定。数据库多达上亿的数据量&#xff0c;分表之后的单个表 也已经超过了千万&#xff0c;那么单个表的更…

ZOJ-2587 Unique Attack 最小割的唯一性判定

题意&#xff1a;给定一个无向图&#xff0c;要求判定分离两个点的最小割是否唯一。 解法&#xff1a;在求出最大流的基础上&#xff0c;从源点进行一次搜索&#xff0c;搜索按照未饱和的边进行&#xff0c;得到顶点子集S的顶点个数&#xff1b;再从汇点反向搜索未饱和的边&…

dubbo与springmvc的简单使用

什么是Dubbo&#xff1f; dubbo是阿里巴巴公司开源的高性能优秀服务框架&#xff0c;通过高性能的RPC&#xff08;远程服务调用&#xff09;实现服务的输入输出功能&#xff0c;可以与spring框架无缝整合&#xff1b; 传统的架构所有的模块都在一台服务器上&#xff0c;单台服务…