ASP.NET网页编程之从 PHP 迁徙到 ASP.NET(3)
觉得J2EE好像有很多工具,比如servlet,jboss,tomcat,ejb什么的,可是微软的.NET怎么什么也没有啊?asp.net数组PHP中的数组的功效与VisualBasic.NET中的数组的功效一模一样。PHP中的数组实践上是联系关系数组,可是能够像索引或联系关系数组那样利用。而VisualBasic.NET中的数组是索引数组。VisualBasic.NET不撑持联系关系数组(但您能够本人创立它们,请参阅上面的“汇合”)。其他ASP.NET言语撑持这些范例的数组,但VisualBasic.NET其实不撑持,这大概给PHP开辟职员提出了一个困难,由于他们其实不习气利用这类更罕见的索引数组,而且大概会但愿在VisualBasic.NET中创立联系关系数组模子。表10显现了PHP和VisualBasic.NET中的复杂数组示例。
表10:创立数组的示例
PHPVisualBasic.NET
$a=array(0,1,2);DimMySingleArraya()AsInteger=
NewInteger(2){0,1,2}
与其他变量一样,VisualBasic.NET数组中的变量也是利用Dim语句声明的。变量名前面带有一对或多对括号,标明它是数组而不是标量(包括单个值的变量)。
创立VisualBasic.NET数组时,还必需将其声明为保留特定范例的数据。假如指定的范例是Object(作为.NET中一切工具范例的基本的一般范例),则此数组能够保留任何范例的数据,可是从数组中检索值时,必需将值转换为本来的范例。
VisualBasic.NET数组能够是嵌套的数组,也能够是多维数组。VisualBasic.NET中有很多与PHP绝对应的用于处置数组的函数,但有一个破例。因为VisualBasic.NET不撑持联系关系数组,因此不存在用于依据数组的“主键”来会见、索引或实行任何操纵的函数。VisualBasic.NET中不存在如许的“主键”。
固然本文屡次提到VisualBasic.NET不撑持联系关系数组,可是能够创立汇合来取代数组。汇合与联系关系数组有些类似,可使用汇合来办理某些相似的成绩。
在某些情形下,将项目存储在汇合中要比存储在数组中更无效。
假如要处置一组小型的静态项目,则可使用汇合。要创立汇合,只需以下面的示例代码所示声明并实例化一个Collection:
DimmyCollectionAsNewCollection()
然后,您可使用Add办法向汇合中增加成员。在此示例中,我们创立了四个字符串并将它们增加到汇合中。您还能够选择增加一个独一的String值作为汇合成员的主键。该值作为Add办法的第二个参数传送给汇合。
Dimw,x,y,zAsString
w="key1"
x="key2"
y="key3"
z="key4"
myCollection.Add(w,"1")
myCollection.Add(x,"2")
myCollection.Add(y,"3")
myCollection.Add(z,"4")
固然这看起来相似于在PHP中创立联系关系数组,但汇合是一种一模一样的事物,由于它自己就是一个工具。关于转到ASP的PHP开辟职员,我们倡议在实验在VisualBasic.NET中创立联系关系数组模子之前先懂得一下Microsoft的VisualBasic.NETLanguageSpecification。
办理形态
任何Web使用程序中都很罕见的一个义务就是办理形态,该义务一般是利用Cookie或使用程序形态办理机关(如Session变量)来完成的。VisualBasic.NET具有与PHP相似的用于处置形态的办法。
设置和检索Cookie
在这两种情况中设置Cookie都是对照烦琐的。表11显现了在这两种言语中编写然后读取Cookie的示例。
表11:设置和检索Cookie
PHPVisualBasic.NET
<?php
$value=somethingfrom
somewhere;
setcookie("TestCookie",
$value,time()+3600);/*
expirein1hour*/
?>
andtoretivethesetcookie
<?
echo$_COOKIE["TestCookie"];
?>
Dimvalueasstring="somethingfrom
somewhere"
DimmyCookieAsNewHttpCookie=New
HttpCookie("Somethingfrom
somewhereTestCookie")
DimnowasDateTime=DateTime.Now
myCookie.Value=now.ToString()value
myCookie.Expires=now.AddHour(1)
Response.Cookies.Add(myCookie)
andtoretrievethesetcookie
Response.Write(Request.Cookies["Whatwe
setTestCookie"}.Value}
设置和检索Session变量
ASP.NET中的Session变量与PHP中的Session变量十分相似。这两种情况中的Session变量都为确保Web使用程序会见中的分歧性供应了响应处置和Cookie操纵。
最主要的一个不同是,当从ASP.NET的Session工具中检索值时,该值将作为一般的System.Object范例前往,而这类范例能够保留任何范例的数据。要利用该值,必需先将其从头转换为本来的基础范例。表12显现了一些Session变量的利用示例。
表12:Session变量的利用
PHPVisualBasic.NET
<?PHP
session_start();
session_register(today);
$today=getdate();
?>
<?=$today?>
Session("Today")=DateTime.Now
DimtodayAsDate
today=CDate(Session("Today"))
Response.Write(today)
Response.write(session("Today"))
ASP.NET还供应了另外一种情势的形态办理,即“使用程序形态”,它与Session变量相似,但只是在使用程序的保存期中坚持分歧。这使您能够存储各类内容,比方设置信息或数据库毗连字符串。这些内容在使用程序运转时代不会产生变更。
有关此主题的具体信息,请参阅《.NETFrameworkDevelopmentGuide》中的ApplicationState一节。
正则表达式
ASP.NET撑持其他正则表达式完成(比方Perl和awk中的正则表达式)的年夜多半罕见功效。这实践上是为了坚持与Perl5正则表达式兼容。ASP.NET还撑持其他正则表达式完成中未供应的正则表达式功效,比方从右向左婚配和及时编译。因为ASP.NET与Perl正则表达式兼容,而且年夜多半PHP开辟职员都利用了Perl兼容的正则表达式,因此一般不必将语法从一种情势转换为另外一种情势。有关.NET正则表达式撑持的具体信息,请参阅.NETFrameworkRegularExpressions。
非常处置
ASP.NET框架经由过程一种人们所熟习的言语机关Try/Catch供应了却构化的非常处置,从而可以捕捉代码中大概呈现的非常。PHP没有供应此功效,但PHP5中将增加它。
上面的示例申明了怎样在VisualBasic.NET中举行非常处置:
Try
此处是大概招致毛病的代码
CatcheAsExceptionType
用于处置毛病的代码
可选:可在此处安排更多Catch块
Finally
一直实行的代码
EndTry
要注重的是,Try块能够包括一个或多个Catch块,或包括一个Finally块,也能够同时包括二者。也就是说,假如您晓得没法改正毛病,但仍必要扫除某些工具而不论是否产生毛病,则可使用不包括Catch语句的Try...Finally块。
查询数据库
在PHP中,一般能够经由过程两种罕见办法会见数据库:利用数据库的特定扩大名或利用自力于数据库的PEARDB库。
在ASP.NET中,能够经由过程一组称为ADO.NET的工具来会见数据库,这些工具与PEARDB库的功效基础不异。数据库查询实践上是经由过程一组毗连、命令、参数和数据适配器工具完成的。个中的每一个工具都有多个版本,详细情形取决于所会见的数据库的范例。比方,有一组工具用于具有OLE-DB驱动程序的数据库(比方MicrosoftAccess),另有一组工具用于具有ODBC驱动程序而没有OLE-DB驱动程序的数据库。针对Oracle和MicrosoftSQLServer也有专门的数据供应者,它们已过优化,能够分离为每种特定的数据库供应高功能的会见。某些第三方还供应了其他数据库撑持,比方MySQL。本节中的示例将利用SQLServer工具,由于它是ASP.NET最经常使用的数据库。
System.Data、System.Data.SqlClient和System.Data.oledb是用于在ADO.NET中界说数据库会见的定名空间。要使页面可以会见这些类,您必要将System.Data和System.Data.SqlClient定名空间导进到页面中。
<%@ImportNamespace="System.Data"%>
<%@ImportNamespace="System.Data.SqlClient"%>
3显现了在这两种言语中实行查询的示例。在PHP中,我们显现了一个利用PEAR的毗连,PEAR不但是用于毗连DB的最经常使用办法之一,但仍是与ADO.NET最为相似的办法。
表13:实行查询
PHPVisualBasic.NET
<?php
//connect
require_once(DB.PHP);
$db=DB::connect
("mysql://mydbvie
w:user@localhost/mydb");
if(DB::iserror($db)){
die($db->getMessage());
$sql="select*frommytable";
$q=$db->query($sql);
if(DB::iserror($q)){
die($q->getMessage());
}
<tr>
<td><?=$row?></td>
<td><?=$row?></td>
<td><?=$row?></td>
</tr>
<scriptrunat="server">
SubPage_Load(SenderAsObject,EAs
EventArgs)
DimmyConnectionAsNew
SqlConnection("server=(local)NetSDK;
database=mydb;Trusted_Connection
=yes")
DimmyCommandAsNew
SqlDataAdapter("select*from
mytable",myConnection)
DimdsAsNewDataSet()
myCommand.Fill(ds,"myDataset")
myDataGrid.DataSource=myDataset
myDataGrid.DataBind()
EndSub
</script>
<%---输入了局---%>
<formrunat="server">
<asp:DataGridid="myDataGrid"
runat="server"/>
</form>
在PHP中,查询了局存储在一个称为resultset(了局集)的变量中,而在ADO.NET中,该变量称为Dataset工具。了局集是前往数据的只读视图,而.NETDataset实践上是前往数据在内存中的读写视图,这使.NET开辟职员可以轻松地处置从数据源前往的数据。
输入数据时,ASP.NET供应了多少办法,用于向用户或客户端显现数据。第一种办法与PHP相似,即便用SQLDataReader工具遍历了局集以写出我们要经由过程查询显现的数据。更经常使用的办法是ASP.NET的数据绑定(PHP中没有与此对应的办法)。经由过程该办法,开辟职员能够构建用户界面并显现可在使用程序中利用和重用的控件,还能够进一步依据数据和逻辑提取显现内容。数据绑定的语法很天真,您不但能够绑定到数据源,还能够绑定到复杂的属性、汇合、表达式,乃至是办法挪用前往的了局。
要利用数据绑定,您必要向某个数据辨认服务器控件(比方DataGrid)的DataSource属性指定某个数据源(比方查询了局)。您还能够选择为每一个列供应一些附加的格局化信息并挪用DataBind()办法。服务器控件将卖力完成残剩的事情。
比方,在表13中,我们利用了数据绑定语法输入查询了局,以下所示:
<%---在页面中加载事务
---%>
myDataGrid.DataSource=myDataset
myDataGrid.DataBind()
<%---输入了局---%>
<asp:DataGridid="myDataGrid"
runat="server"/>
数据辨认服务器控件将供应其他功效,比方撑持对显现的数据举行分页或内联编纂。有关具体信息和示例,请参阅DataBindingServerControls。
数据缓存和页面缓存
对常常会见的数据举行缓存能够明显延长站点的呼应工夫,由于不必要守候数据库查询即可举行页面处置。而缓存由页面哀求天生的HTML能够进一步延长呼应工夫,由于基本就无需处置缓存的页面。这两种情况均撑持上述两种缓存战略,但与PHP比拟,ASP.NET供应了更多用于缓存和办理数据的办法,从而使开辟职员能够针对本人使用程序的功能必要选择响应的办法和战略。
页面缓存
缓存某个页面哀求的HTML输入是削减Web使用程序的负载的一种经常使用办法。PHP自己不撑持页面缓存,可是能够经由过程编程的体例或下载第三方软件包来实行此操纵。一般能够在服务器上经由过程多种办法实行页面缓存,这些办法可用于缓存编译的代码,直至将页面输入写出到一个独自的文件中(该文件将随代码的更新而更新)。
在ASP.NET中,能够经由过程初级其余OutputCacheAPI或初级其余@OutputCache指令来实行页面缓存。启用输入缓存后,将在对页面举行第一个GET哀求时创立输入缓存条目。后续的GET或HEAD哀求将由输入缓存条目撑持,直到缓存的哀求过时。
输入缓存将反省页面的过时战略和考证战略。假如页面位于输入缓存中并标志了过时战略(唆使该页面自缓存时入手下手60分钟后过时),则60分钟后,该页面将从输入缓存中删除。假如在过时后收到另外一个哀求,将实行页面代码并再次缓存该页面。这类过时战略称为相对过时,即页面在某个工夫之前无效。
除对全部页面举行输入缓存外,ASP.NET还供应了一个复杂办法,使您能够只缓存页面的特定部分。这类办法称为拆分缓存。您可使用用户控件(UserControl)来指定页面地区,并利用后面先容的@OutputCache指令将这些地区标志为缓存地区。该指令指定了用户控件的输入内容在服务器上缓存的工夫(以秒为单元)和影响这一工夫的任何可选前提。
有关ASP.NET的输入缓存的具体信息,请参阅CachingASP.NETPages。
数据缓存
在PHP中,能够经由过程多种办法以编程体例将查询了局缓存到情况中,但PHP自己并未供应这类办法。在PHP中,能够创立数据缓存类或体系。关于大批信息,只需利用Session变量和/或Cookie;关于大批或庞大的信息,能够创立您本人的数据缓存类。但成绩是,当处置包括良多范例的庞大数据时,这类办法的效力会很低且简单堕落,在必定水平上会加年夜编程的难度。
ASP.NET经由过程Page.Cache工具供应了一个体系局限的数据缓存办法,可用于数据集(DataSet)、数组、汇合、XML工具等。关于必要更庞大功效的使用程序,ASP.NET缓存还撑持三种特定范例的缓存:过时、清算和文件和关头项相干性。
过时范例的缓存使开辟职员能够把持缓存项目标过时工夫。能够将该工夫界说为特定的工夫(比方01:00),也能够将其界说为相对前次利用项目时的工夫,比方自前次会见该项目时入手下手20分钟后过时。过时后的项目将从缓存中删除,今后再试图检索该项目时,将前往空值(除非再次将其拔出到缓存中)。
清算范例的缓存会在内存不敷时实验删除不常常利用或不主要的项目。开辟职员能够把持清算的实行体例,而且能够在将项目拔出到缓存中时向清算程序供应提醒,以唆使创立该项目标绝对体系开支和为使该项目无效而必需对其举行会见的绝对频次。
文件和关头项相干性范例的缓存将基于某个内部文件或另外一个缓存项目断定该缓存项目标无效性。假如相干项产生变更,缓存项目将生效并从缓存中删除。比方,假定您有一个较年夜的必要按期更新并下载给员工的呈报,则能够在使用程序中利用此功效。使用程序处置文件和呈报中的数据,然后缓存该数据并拔出对该数据的来历文件(从该文件读取数据)的相干性。当该文件更新时,数据将从缓存中删除,使用程序能够从头读取它偏重新拔出更新的数据正本。
ASP.NET数据缓存为编程职员供应了很多分歧的办法来办理使用程序并进步使用程序的呼应速率和效力。有关具体信息,请参阅CacheClass文档以懂得Cache工具。
发送电子邮件
PHP和ASP.NET都为以编程体例发送电子邮件供应了内置的撑持。要在此示例中利用ASP.NET发送电子邮件,您必要设置IISSMTP服务。由于.NET中的内置邮件工具依附于该服务包括的工具,以是您必需安装它。只管云云,与PHP一样,.NET也同意您利用任何SMTP服务器或邮件服务器。表14对这两种情况的基础语法举行了对照。
表14:发送电子邮件
PHPVisualBasic.NET
$to="test@atnoaddress.com";
$from=
"me@nosuchaddress.com";
$subject="hi";
$message="justwantedtosay
hi";
mail($to,$subject,$message,
$from)
DimmyMailAsMailMessage=New
MailMessage()
myMail.From="me@nosuchaddress.com"
myMail.To="test@atnoaddress.com"
myMail.Subect="hi"
myMail.Body="justwantedtosayhi"
SmtpMail.Send(myMail)
XML处置和Web服务
在PHP中,为剖析和处置XML所供应的内置撑持功效十分亏弱。固然开辟职员能够用它来剖析和处置XML,但它不撑持DOM剖析(该剖析只管比PHP的SAX剖析器速率慢,但更简单利用)。PHP也不撑持依据DTD或XMLSCHEME对XML文档举行当地考证,它也不撑持XSL/XSLT和市场上很多Web使用程序经常使用的各类其他手艺。固然PHP能够经由过程良多PHP软件包完成很多与XML相干的义务,但.NET和ASP.NET为处置XML供应了普遍的内置撑持。XML是.Net平台的中心手艺之一。有关Web服务的具体信息,请参阅HowASP.NETWebServicesWork。
.NETFramework为W3C界说的一切XML倡议供应了普遍的撑持,别的还撑持XSL/XSLT、XPath、XQuery和各类其他手艺,比方用于Web服务的UDDI、WSDL和SOAP。
固然能够在PHP中创立XML-RPC范例的机制,但创立Web服务(使开辟职员可以利用经常使用协定和尺度来互换数据和历程并将其用于查找、数据绑定和形貌)。.NET为Web服务和相干手艺(如SOAP、WSDL和UDDI)供应了普遍的撑持。利用.NET,开辟职员还能够轻松地创立和开辟Web服务。比方,以下代码将创立一个复杂的helloworldWeb服务:
<%@WebServiceLanguage="VB"Class="HelloWorld"%>
ImportsSystem
ImportsSystem.Web.Services
PublicClassHelloWorld:InheritsWebService
<WebMethod()>PublicFunctionSayHelloWorld()AsString
Return("HelloWorld")
EndFunction
EndClass
使用.NETFrameworkSDK,您可使用命令行Web服务形貌言语工具(WSDL.exe)天生代办署理类。要为上述示例创立一个名为HelloWorld.cs的代办署理类,能够输出:
WSDLhttp://someDomain.com/someFolder/HelloWorld.asmx?WSDL
此类与后面创立的类十分类似。它包括一个名为SayHelloWorld的办法,用于前往字符串。将此代办署理类编译到使用程序中,然后挪用此代办署理类的办法,使该代办署理类经由过程HTTP将SOAP哀求打包并吸收SOAP编码的呼应,该呼应随后被封装为字符串。
关于客户端,该代码长短常复杂的,如以下示例所示:
DimmyHelloWorldAsNewHelloWorld()
DimsReturnAsString=myHelloWorld.SayHelloWorld()
这就是创立一个复杂Web服务的全历程。有关XML的一样平常信息和Web服务的特定信息,请参阅EmployingXMLinthe.NETFramework。
小结
关于复杂的小型使用程序,从PHP迁徙到ASP.NET一般其实不庞大。关于更庞大的使用程序,因为基本系统布局的分歧和ASP.NET的OOP形式,必要举行事前计划和经心计划,以使用ASP.NET供应的将显现与逻辑和数据明白分隔的功效,和能够节俭工夫的内置功效。与PHP比拟,这些功效能够明显削减完成不异义务所需的代码数目。
你觉得学习.NET怎么样,我懂的少,问的可能很幼稚,见笑了啊:) ASP.NET可以无缝地与WYSIWYGHTML编辑器和其他编程工具(包括MicrosoftVisualStudio.NET)一起工作。这不仅使得Web开发更加方便,而且还能提供这些工具必须提供的所有优点,包括开发人员可以用来将服务器控件拖放到Web页的GUI和完全集成的调试支持。微软为ASP.net设计了这样一些策略:易于写出结构清晰的代码、代码易于重用和共享、可用编译类语言编写等等,目的是让程序员更容易开发出Web应用,满足计算向Web转移的战略需要。 HTML:当然这是网页最基本的语言,每一个服务器语言都需要它的支持,要学习,这个肯定是开始,不说了. Asp.net脚本的出现,为ASP空间带来了更高的稳定性,同时也为程序员建站提供更高环境! 在调试JSP代码时,如果程序出错,JSP服务器会返回出错信息,并在浏览器中显示。这时,由于JSP是先被转换成Servlet后再运行的,所以,浏览器中所显示的代码出错的行数并不是JSP源代码的行数。 大哥拜托,Java在95年就出来了,微软垄断个妹啊,服务器市场微软完全是后后来者,当年都是Unix的市场,现在被WindowsServer和Linux抢下大片,包括数据库也一样。 JSP/Servlet虽然在国内目前的应用并不广泛,但是其前途不可限量。 碰到复杂点的问题都不知道能不能解决,现在有点实力的公司都选择自已在开源的基础上做开发。但没听说过有人在IIS上做改进的,windows、sqlserver集群方面的应用也很少见。 微软又推出ASP.NET。这不是ASP的简单升级,而是全新一代的动态网页实现系统,用于一台WEB服务器建立强大的应用程序。是微软发展的新体系结构.NET的一部分,是ASP和.NET技术的结合。
页:
[1]