当前位置: 首页 > 编程日记 > 正文

SharePoint 2010中的客户端AJAX应用——ASP.NET AJAX模板

WCF Data Services是SharePoint 2010中一个极具吸引力的新特性。然而,因为它的强大,直接对其进行编程仍然会有点痛苦。幸运的是,一个新的相关技术 —— ASP.Net AJAX模板 – 可以完美的与WCF Data Service进行集成,并允许我们快速构建优雅的,可维护的和反应迅速的AJAX应用程序。

在本文中,我将详细描述ASP.Net AJAX模板,并在Visual Studio 2010中一步一步的构建一个非常简单的应用程序页面。接着使用ASP.Net AJAX模板来显示SharePoint 2010中通过WCF Data Services发布的JSON格式的列表数据。

什么不是模板?

单纯从技术层面解释什么是ASP.Net AJAX模板可能并不容易。不妨先假设没有这项技术,看看传统方式是如何解决问题的。如果SharePoint传递给你一个JavaScript中的JSON对象的数组,现在的你会如何将其转换成HTML?

最常见的答案似乎就是JQuery的.append()语句了。代码大致如下:

for (var i = 0; i < userStories.length; i++) {
$(
"#userStories").append("<div class='userStoryCard'>" +
userStories[i].Title 
+ "</div>");
}

这种类型的解决方案的问题,或者说任何没有使用模板引擎的解决方案,事实上都无法清楚的分离数据访问逻辑和界面展现。事实上,这种情形很像回到了经典的Active Server Pages风格,可维护性很差,代码一塌糊涂。随着我们不断的从SharePoint获取数据,整个代码会变得更加杂乱。

模板的目标是使你不必编写上面那样的代码,使用模板后的代码应该像下面这样::

<div class="userStoryCard">{{ Title }}</div>

整洁,漂亮。理想状态下模板应提供这样一个的解决方案:

  • 最大限度地减少管道(plumbing)代码
  • 清晰的分离数据访问逻辑和界面展示
  • 简化存回服务器端的数据
  • 并且没有ViewState!

ASP.Net AJAX模板的昨天,今天和明天

如果你读过Scott Guthrie的博文jQuery templating engine  ,或者你曾非常不容易的看到过准确介绍jQuery模板的官方文档,你就会惊讶于为什么ASP.Net AJAX模板与其如此之符合,这也正是微软构建客户端AJAX应用的愿景。
首先,在ASP.Net AJAX项目还是beta阶段时,模板就已经存在了。当ASP.Net AJAX 4.0从测试转到正式发布后,模板JavaScript文件被纳入到AJAX ControlTooklit CodePlex项目(语法稍作修改)。这就是为什么你会发现今天网上找到的大多数例子都稍微有些过时。
至于jQuery的 模板引擎,据Stephen Walther(ASP.Net MVC团队的项目经理)所说,他们“未来不会投入过多精力到[ASP.Net AJAX的模板]”,因为他们将会把重点放在jQuery模板引擎。那么我们何必学习一门不会有所发展的技术呢?原因之一是jQuery模板引擎仍非常年轻(撰写本文时还处于原型阶段),而ASP.Net AJAX模板已正式发布,可以直接用于生产环境。另一方面,其语法很接近,想必将来升级也不会成为一个大工程(理论上如此)。

Visual Studio 2010和SharePoint 2010

在进入模板学习前,让我们先来快速看一下如何在Visual Studio 2010中构建一个应用程序页面。这是我们将来编写代码的基础。当然你可以把所有代码都放在一个内容编辑器Web部件里,但是Visual Studio提供了更好的智能提示和调试的支持,因此我们选择在应用程序页中运行。

为了在Visual Studio 2010中建立一个简单的应用程序页面,先选择“新建项目”,然后导航到SharePoint 2010模板分类,选择“空白SharePoint项目”

ajaxcli01.PNG

点击确定后,Visual Studio会弹出SharePoint自定义向导:

ajaxcli02.PNG

该窗口要求你选择一个站点用于调试。当你按F5键(开始调试)时,Visual Studio 2010会进行wsp文件打包,然后将其部署到这里你填写的URL对应的站点上,同时附加上对应的w3wp进程,并打开一个浏览器显示该sharepoint站点。这样,你就立即拥有一个调试环境了。

如果你对这一过程印象不深刻,那么你可能没有做过多少WSS 3.0的开发——但请相信我,这个改进大大节省了我们的时间。尽管在本例中我们不会写任何服务器端代码,但仍旧可以体会到微软在SharePoint 2010上倾注了不少的心力。

当Visual Studio完成项目初始化后,选择项目->添加新项,然后选择应用程序页。

ajaxcli03.PNG

Visual Studio接下来会自动生成一个完全套用SharePoint母版页并包含内容控件的页面。

ContractedBlock.gifExpandedBlockStart.gif代码
<%@ Assembly Name="$SharePoint.Project.AssemblyFullName$" %>
<%@ Import Namespace="Microsoft.SharePoint.ApplicationPages" %>
<%@ Register Tagprefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Register Tagprefix="Utilities" Namespace="Microsoft.SharePoint.Utilities" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Register Tagprefix="asp" Namespace="System.Web.UI" Assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" %>
<%@ Import Namespace="Microsoft.SharePoint" %>
<%@ Assembly Name="Microsoft.Web.CommandUI, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="UserStories.aspx.cs" Inherits="PreDemo.Layouts.PreDemo.UserStories" DynamicMasterPageFile="~masterurl/default.master" %>
<asp:Content ID="PageHead" ContentPlaceHolderID="PlaceHolderAdditionalPageHead" runat="server">
</asp:Content>
<asp:Content ID="Main" ContentPlaceHolderID="PlaceHolderMain" runat="server">
Hello World!
</asp:Content>
<asp:Content ID="PageTitle" ContentPlaceHolderID="PlaceHolderPageTitle" runat="server">
应用程序页
</asp:Content>
<asp:Content ID="PageTitleInTitleArea" ContentPlaceHolderID="PlaceHolderPageTitleInTitleArea" runat="server" >
我的应用程序页
</asp:Content>

(“Hello World!”是我写的)。现在如果你按F5键或者点击生成->部署解决方案,则Visual Studio会打包该应用程序页到一个wsp文件并将其部署到SharePoint。如果你导航到该应用程序页的话(例如本例中为http://contoso14/_layouts/PreDemo/UserStories.aspx)则会看到如下的显示:

ajaxcli04.PNG

很震撼吧!你真的应该如此。我们没有编写冗长的,重复的代码,或者容易出错的CAML,没有运行任何DOS(或PowerShell)脚本,没有手工部署到GAC,甚至没有注意到后台自动生成的Feature.xml文件,然而,我们已经部署完了。

安装ASP.Net AJAX模板

ASP.Net AJAX模板的安装比较棘手。为了得到它你需要先在CodePlex上下载最新推出的AJAX控件工具包源代码(本例中下载下来的是AjaxControlToolkit-9c860ac12ae9.zip)。并在Visual Studio(它的项目中包含了Visual Studio 2008和2010两个版本)中编译(编译时还需要安装Microsoft Ajax Minifier 2.0)然后将Javascript文件复制到SharePoint的layouts目录下。需要复制的目录有:

从 AjaxControlToolkit.Source\SampleWebSites\AjaxClientWebSite\Scripts; 复制到

C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\ \14\TEMPLATE\LAYOUTS\Scripts

还有从 AjaxControlToolkit.Source\Client\MicrosoftAjax\Templates; 复制到

C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\ \14\TEMPLATE\LAYOUTS\Scripts

或者采用更符合标准的做法,将其复制到Visual Studio项目的layouts目录中。

代码

Javascript文件都就位后,我们就可以编写最简单的模板页代码了:

<%@ Assembly Name="$SharePoint.Project.AssemblyFullName$" %>
<%@ Import Namespace="Microsoft.SharePoint.ApplicationPages" %>
<%@ Register Tagprefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Register Tagprefix="Utilities" Namespace="Microsoft.SharePoint.Utilities" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Register Tagprefix="asp" Namespace="System.Web.UI" Assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" %>
<%@ Import Namespace="Microsoft.SharePoint" %>
<%@ Assembly Name="Microsoft.Web.CommandUI, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="UserStories.aspx.cs" Inherits="PreDemo.Layouts.PreDemo.UserStories" DynamicMasterPageFile="~masterurl/default.master" %>

<asp:Content ID="PageHead" ContentPlaceHolderID="PlaceHolderAdditionalPageHead" runat="server">
<style type="text/css">
.sys-template 
{
    display
:none;
}
</style>
<script src="/_layouts/Scripts/MicrosoftAjax/Start.js" type="text/javascript"></script>
<script src= "/_layouts/Scripts/MicrosoftAjax/MicrosoftAjax.js" type="text/javascript"></script>
<script type="text/javascript">
Sys.require([
Sys.components.dataView,
Sys.components.openDataServiceProxy,
Sys.scripts.jQuery
]);
Sys.onReady(
function () {
    
var dataSource = Sys.create.openDataServiceProxy('/_vti_bin/ListData.svc');


    Sys.query(
"#userStoriesList").dataView({
        dataProvider: dataSource,
        fetchOperation: 
"UserStories",
        feachParameters: { orderby: 
'标题' },
        autoFetch: 
"true"
    });

});
</script>
</asp:Content>
<asp:Content ID="Main" ContentPlaceHolderID="PlaceHolderMain" runat="server">
Hello World!
<ul id="userStoriesList" class="sys-template">
<li>{{ 标题 }}</li>
</ul>
</asp:Content>
<asp:Content ID="PageTitle" ContentPlaceHolderID="PlaceHolderPageTitle" runat="server">
应用程序页
</asp:Content>
<asp:Content ID="PageTitleInTitleArea" ContentPlaceHolderID="PlaceHolderPageTitleInTitleArea" runat="server" >
我的应用程序页
</asp:Content>

其中的UserStories是我的一个任务列表。我事先填充了一些示例数据。

跳过JavaScript部分,我们先来看Main content一节中名为userStoriesList的<ul>无序列表。 其中的<li>元素包围着一个有趣的符号:{{ 标题 }}。这样就声明了一个绑定到SharePoint中ListItem的标题字段。我们也可以改成任何其他的列,如“优先级”,或者在其中添加JavaScript,如{{ String.format("{0:yyyy-M-dd}", 修改时间) }}。

注意PageHead的脚本引用。引用MicrosoftAjax.js使得我们可以使用ASP.Net AJAX的核心功能。Start.js使得我们可以使用Sys.require功能,以便导入其他具有依赖关系的Javascript。

至此,我们还没有导入足够的JavaScript以提供我们需要的模板功能。这部分工作由Sys.require来完成。声明了1.DataView对象,用于完成主要的模板工作;2.openDataServiceProxy,知道如何与SharePoint的ADO.Net Data Service进行通讯;3. jQuery。如果你用Firebug看的话就会发现Sys.require加载了哪些额外的.js文件,就像MicrosoftAjaxTemplates.js。而且是按照正确的顺序加载到页面上的。这种方式保证了页面不会放上很多不需要的Javascript。

真正的奇迹发生在Sys.onReady里,其功能是在DOM加载完成后执行一次。首先它实例化了一个openDataServiceProxy对象,负责与一个oData端点进行通讯,在我们的例子中是一个ADO.Net Data Services。

它做的第二件事情是实例化一个DataView对象,并将其关联到userStoriesList元素。fetchOperation参数告诉它从哪个列表获取ListItems(本例中为UserStories列表)。fetchParameters参数告诉它如何对数据进行排序,筛选或分页。

DataView实例化后(由于autoFetch被设为true) 会通过其dataProvider检索JSON数据,并为每个返回的行重复所关联的DOM元素的innerHTML,而且以实际的数据代替绑定语法。看起来似乎很简单,但在将来的博文中你会看到它很快会变得很复杂。

最后一个要注意的是sys-template类。这是一个在ASP.Net AJAX中预定义的CSS类,当完成渲染工作后,由ASP.Net AJAX将其设置为display:block。因此,我们需要为sys-template创建一个CSS类并设为display:none,这样在页面加载过程中最终用户就看不到你的模板代码了。

现在,如果你点击生成->部署解决方案,就会看到如下的显示:

ajaxcli05.PNG

总结

当然,可能如果用服务器端代码编写这个功能的话实现起来更容易。这个话题先搁在这儿,我们的解决方案还有很多潜力可挖。例如,从哪个层面上与jQuery结合,可以使界面更美观?如何将数据写回到上下文服务器端?如何实现主-子关系?我们将在随后的博文中一起来探讨这些问题。

参考资料

Client Side AJAX Applications in SharePoint 2010-Part3:ASP.Net AJAX Templating 101

ASP.NET AJAX: Client Postbacks cause a Sys.ArgumentTypeException

转载于:https://www.cnblogs.com/Sunmoonfire/archive/2010/07/22/1781936.html

相关文章:

如何利用Gephi可视化浏览的网站关系

Gephi 是进行数据可视化的一套开源工具。其利用图&#xff08;有向图、无向图、动态图等&#xff09;的形式来展现数据&#xff0c;方便我们对数据进行探索。今天给大家介绍利用 Gephi 来可视化我们浏览网站之间关系。 首先&#xff0c;安装 Gephi 的 Http 代理插件 HttpGraph…

nginx 启动脚本

#vim /etc/rc.d/init.d/nginx #为nginx提供SysV init脚本#!/bin/sh## nginx - this script starts and stops the nginx daemon## chkconfig: - 85 15 # description: Nginx is an HTTP(S) server, HTTP(S) reverse \# proxy and IMAP/POP3 proxy server# …

参加前端培训主要学习什么语言

web前端近几年很多人都在学习中&#xff0c;但是想要学好web前端技术&#xff0c;基础是非常重要的&#xff0c;参加web前端培训机构可以进行系统的学习&#xff0c;下面就给大家详细的介绍一下参加前端培训主要学习什么语言? 参加前端培训主要学习什么语言?前端的基础就是HT…

嘿,程序员,你该学点经济学了!

前言&#xff1a; 笔者一直认为&#xff0c;一个好的程序员。不仅仅是代码敲得好&#xff0c;其它方面的知识和能力相同非常重要。特别是随着年龄的增长。非常多人也慢慢的往管理层发展。这个时候沟通与协调能力变得更加重要&#xff0c;而一些策划。推广方面的知识也相同是必不…

记录一次自己调试代码的过程

今年年初我们做了一套防窃电的软件&#xff0c;其中通讯采取的是串口方式。前段时间&#xff0c;根据现场的反馈&#xff0c;我们增加了蓝牙通讯的功能。系统界面如下图所示&#xff1a; 今天&#xff0c;现场人员反馈说&#xff1a;“解析的数据出现问题”&#xff0c;所以我在…

CBitmapButton的使用(转)

CBitmapButton的使用 CBitmapButton作为MFC的控件类&#xff0c;并不为很多人所使用&#xff0c;因为现在网上遍布着从CButton派生的各种各样的按钮类&#xff0c;其中最为著名的就是CButtonST类了。但是最近在CSDN上看到几个问题都是使用CBitmapButton类&#xff0c;但是由于…

web前端干货:详细了解JS前端开发框架都有哪些

1. Foundation框架 Foundation框架总体来看要比Bootstrap略显高大上一点&#xff0c;但他们俩的设计理念都是非常清楚的&#xff0c;Bootstrap有引导的意思&#xff0c;尝试处理你项目中的一切所需。Foundation有基础、地基及支柱的意思&#xff0c;给项目中强有力的创造与支持…

Platform Builder 5下WinCE 5.0目录结构

Platform Builder 5下WinCE 5.0目录结构 Platform Builder 5已经自带WinCE 5.0&#xff0c;安装过程会指定WinCE 5.0的安装路径&#xff0c;默认为X:\WINCE500&#xff0c;WINCE500即为WinCE 5.0的根目录。根目录下主要有以下几个目录&#xff1a;PUBLIC, PLATFORM, PRIVATE, P…

记录一次自己清理数据的过程

今天接到一个任务&#xff0c;从原始数据&#xff08;在不同监测点对白纹伊蚊&#xff0c;18周的监测数据&#xff09;中提取监测点列表&#xff0c;然后从网上爬取各个监测点的空间信息&#xff08;经纬度&#xff09;&#xff0c;并把这些经纬度数据转换成墨卡托坐标&#xf…

man nfsd(rpc.nfsd中文手册)

本人译作集合&#xff1a;http://www.cnblogs.com/f-ck-need-u/p/7048359.html rpc.nfsd(8) System Managers Manual rpc.nfsd(8)NAMErpc.nfsd - NFS服务进程SYNOPSIS/usr/sbin/rpc.nfsd [options] nprocDESCRIPTIONrpc.nfsd程序…

Java学习从入门到精通的学习建议

想要学好java技术&#xff0c;首先打好基础很重要&#xff0c;不论学什么基础都是重中之重&#xff0c;学习Java更是如此。如&#xff1a;基础语法、核心类库、面向对象编程、异常、集合、IO流等基础如果学不好&#xff0c;那么后边更深入的语法也不容易学会。所以在学基础部分…

Automatically highlight current page in menu via Javascript

Please check the link, http://www.richnetapps.com/automatically_highlight_current_page_in/ 转载于:https://www.cnblogs.com/OceanChen/archive/2010/08/10/1796410.html

基于Vue的小日历(支持按周切换)

基于Vue的日历小功能&#xff0c;可根据实际开发情况按每年、每月、每周、进行切换 <template><div class"date"><!-- 年份 月份 --><div class"month"><p>{{ currentYear }}年{{ currentMonth }}月</p></div>&…

股市币市:数据分析与交易所公告(20190225)

沪深300 1. 沪深300分位数数据 2. 沪深300股指图 3. 沪深300分位数图 4. 沪深300筹码分布图 数据来源&#xff1a; https://finance.sina.com.cn/stock/ BTC比特币 1. 比特币分位数数据 2. 比特币交易图 3. 比特币分位数图 4. 比特币筹码分布图 数据来源&#xff1a; htt…

哪些人适合参加UI设计培训

UI设计在最近几年受到了很多人的关注&#xff0c;想要学习UI设计技术的人越来越多&#xff0c;大部分选择报UI设计培训班进行学习&#xff0c;有些人想要通过自学来学&#xff0c;那么到底哪些人适合参加UI设计培训呢?来看看下面的详细介绍。 哪些人适合参加UI设计培训? 1. 零…

java常用的7大排序算法汇总

这段时间闲了下来&#xff0c;就抽了点时间总结了下java中常用的七大排序算法&#xff0c;希望以后可以回顾&#xff01; 1.插入排序算法 插入排序的基本思想是在遍历数组的过程中&#xff0c;假设在序号 i 之前的元素即 [0..i-1] 都已经排好序&#xff0c;本趟需要找到 i 对应…

深度优先搜索算法在RPG游戏迷宫中的应用

在RPG游戏中我们经常会看到一些迷宫&#xff0c;我之前玩仙剑一的时候就经常在几个迷宫里绕来绕去也绕不出来&#xff0c;玩仙三由于游戏视角可以转&#xff0c;更是费劲。这里我们使用深度优先算法达到遍历一个迷宫的目的。 首先定义一个有序元组A:{左&#xff0c;上&#xff…

又有六所大学考研预调剂系统已开放!

距离 19 考研初试成绩的公布已经有一周了&#xff0c;成绩不错的同学就安心准备复试吧&#xff0c;全力备考&#xff0c;一定要拿到属于你的录取通知书&#xff01;成绩不满意&#xff0c;擦线或者排名靠后的同学&#xff0c;复试、调剂两手准备&#xff0c;注定咱们要花更多的…

零基础参加java培训如何学习

零基础的同学想要学好java技术&#xff0c;一定要比有基础的学员更加努力才可以&#xff0c;因为java技术要学习的东西有很多&#xff0c;在Java培训学习的过程中也是要掌握一定的技巧和方法的&#xff0c;下面就为大家详细的介绍一下零基础参加java培训如何学习? 零基础参加j…

webGL的一些咨询--web3D

来自:http://www.bumao.com/index.php/2010/06/webgl-overview.html什么是webGLWebGL是一种3D绘图标准&#xff0c;这种绘图技术标准允许把JavaScript和OpenGL ES 2.0结合在一起&#xff0c;通过增加OpenGL ES 2.0的一个JavaScript绑定&#xff0c;WebGL可以为HTML5 Canvas提供…

如何利用 C# 爬取「京东 - 计算机与互联网图书销量榜」!

当前&#xff0c;信息技术领域的知识在飞速的更新。作为一个程序爱好者&#xff0c;或者说已经超过 10年 的老码农&#xff0c;稍有懈怠就会被落下&#xff01;跟踪当前信息技术领域的畅销书&#xff0c;结合自己所做的事情买来阅读&#xff0c;以便提升技能&#xff0c;就显得…

突发!微信官方证实:“绞杀”了刷量平台

今天&#xff0c;有关微信刷量平台崩溃的新闻刷爆朋友圈。在朝阳群众的“深扒”之下&#xff0c;不少微信大号的惨淡阅读量展露出了“娇羞的真容”。 不过&#xff0c;对此事&#xff0c;微信官方一直保持了“可怕的沉默”&#xff0c;今天下午&#xff0c;微信终于做出了官方回…

Java培训一共分几个阶段

Java培训一共分几个阶段?一般培训机构的课程都是从基础知识讲起&#xff0c;千锋教育的Java培训课程也不例外&#xff0c;第一阶段为JavaEE基础&#xff0c;主要讲授Java基础语法、面向对象、核心类库、集合等等基础知识点&#xff0c;把基础打牢学习接下来的知识的时候才会更…

IE6,7,8,FF兼容总结

做到浏览器兼容需要注意的四大要素(一)2009-05-31 17:091 Css1.1 选择器 通配符 * :: IE6不支持类选择器 .class :: IE6元素的class不能超过2个属性选择器 [attvalue] [att] [att|value] [att(^|$|~)value] :: IE6不支持关系选择器 E F; E > F ; E ~ F :: IE6不支持 1.2 伪…

二叉树的路径(根节点到叶节点)Binary Tree Paths

为什么80%的码农都做不了架构师&#xff1f;>>> 问题&#xff1a; Given a binary tree, return all root-to-leaf paths. For example, given the following binary tree: 1/ \ 2 3\5 All root-to-leaf paths are: ["1->2->5", "1->…

股市币市:数据分析与交易所公告(20190226)

沪深300 1. 沪深300分位数数据 2. 沪深300股指图 3. 沪深300分位数图 4. 沪深300筹码分布图 数据来源&#xff1a; https://finance.sina.com.cn/stock/ BTC比特币 1. 比特币分位数数据 2. 比特币交易图 3. 比特币分位数图 4. 比特币筹码分布图 数据来源&#xff1a; https…

零基础怎么学UI设计

互联网的快速发展&#xff0c;给很多企业和求职人员有了更多的创业和工作机会&#xff0c;近几年&#xff0c;UI设计行业招聘需求人数就在不断上涨&#xff0c;越来越多的人想转行做UI设计。那么零基础怎么学UI设计?有哪些简单有效的学习方法?我们来看看下面的详细介绍。 零基…

原创:嵌入图片的HTML内容在FLASH AS3中正确显示的最佳解决方案

做一个项目&#xff0c;遇到这个该死的问题&#xff0c;尝试了几乎所有解决方法&#xff0c;几近崩溃&#xff0c;终于找到完美解决方案。因为在网上&#xff0c;无论中文还是英文&#xff0c;搜索了无数遍&#xff0c;都没人给出正确答案&#xff0c;所以&#xff0c;在此记下…

总结六条对我们学习Linux系统有用的忠告

接触linux需要的是端正自己的态度&#xff0c;这个玩意可不是一天两天就能拿得下的。学习个基础&#xff0c;能装系统、能装常见服务、能编译、能配置存储空间、能配置系统参数、能简单查看系统负载等基本够用。但这些只保证能做机房运维&#xff0c;真正和进阶的运维工作不在机…

一份来自上海院校的考研预调剂系统已开放名单!

距离 19 考研初试成绩的公布已经有一段时间了&#xff0c;成绩不错的同学就安心准备复试吧&#xff0c;全力备考&#xff0c;一定要拿到属于你的录取通知书&#xff01;成绩不满意&#xff0c;擦线或者排名靠后的同学&#xff0c;复试、调剂两手准备&#xff0c;注定咱们要花更…