功能非常强大,除了支持常见的功能(字体、字号、颜色等),还支持表格、Form等。FCKeditor的官方网站在这里。在官方网站上还有一个在线的演示。FCKeditor对IE、Mozilla Firefox中的支持很好。刚才写blog的时候发现原来donews.net的HTML编辑器就是FCKeditor,不过FCKeditor可以很好的支持多语言的,怎么donews.net使用的还是英文的,怎不用中文的。
下面时首页上的特性说明:
|
||||
|
||||
windows和Linux平台下的Dotnet技术
功能非常强大,除了支持常见的功能(字体、字号、颜色等),还支持表格、Form等。FCKeditor的官方网站在这里。在官方网站上还有一个在线的演示。FCKeditor对IE、Mozilla Firefox中的支持很好。刚才写blog的时候发现原来donews.net的HTML编辑器就是FCKeditor,不过FCKeditor可以很好的支持多语言的,怎么donews.net使用的还是英文的,怎不用中文的。
下面时首页上的特性说明:
|
||||
|
||||
| DataGrid中的数据统计行包含列数据的和、平均值或者其他类型的统计信息,它是具有较多数据的DataGrid中相对独立的一行数据。我用三种方法实现过数据统计行的功能,发现它们各自有自己的优点(当然,也有各自的缺点)。在本文中,对三种实现方法,我都将给出具体的举例,然后,分析讨论在特定的情况下,每一种方法相对其他方法的优点和缺点。为了便于区别,在本文中,我姑且将这三种数据统计行的实现方法称为:RollUp、DataTable Loop和ItemDataBound。现在,我们就分别来看这三种实现方法。 |
| 一、RollUp实现方法(实例 | ASPX 代码 | CS 代码 | SQL) |
| 我们知道,RollUp是SQL语句中,使用Group By对数据进行分组时使用的一个参数。在SQL Server在线文档中,这样说明RollUp参数,“它是Group By提供的对常规数据列的一种补充,用于对数据进行汇总、统计,常被称为数据结果集。”使用RoolUp方法的最大好处就是,使用该参数以后,我们从数据库得到的的数据,看上去已经和我们需要显示在页面的差不多了。这样,我们对于数据的处理就会相对较少,我们的代码也会更加简洁、速度更快、更简单。 |
| 使用RollUp大另外一个好处是,它返回的结果不止包括一个数据统计行。在这个实例中,我们可以看到,DataGrid中不但对单个年度数据进行了平均值统计,而且,对2000年到2002年的整体平均值数据也进行了统计。而在CS 代码中,代码是很少的:只是简单的在ItemDataBound中改进了数据的显示方式,而对于数据的实质处理语句是没有的。这些功能的实现完全可以使用其他的方法,但是,使用RollUp的方法处理,相当的方便、有效。 |
| 在书《Building Web Solutions with ASP.NET and ADO.NET》中,作者Dino Esposito于该书的第六章部分”Chapter 6: Advanced Data Reporting“也提供了一个使用RollUp实现数据统计行的实例。 |
| 二、DataTable Loop(实例 | ASPX 代码 | CS 代码) |
| DataTable Loop的实现方法就是在一个DataTable数据表中,通过对DataRows进行循环运算而得到数据统计行数据,循环结束以后,一个包含统计数据的行将加入DataTable中,这样,就将DataTable数据表的最后一行数据作为统计数据行。和RollUp方法相比较,使用这种方法的好处在于,RollUp方法只能针对特定的数据库软件,比如Sql Server 6.5(或者以上)和Oracle 8i(或者以上)等可以实现它的数据统计功能。如果你要从XML取得数据,使用RollUp就无能为力了,而对于DataTable Loop方法而言,显然没有这些限制。 |
| 和下面将要介绍的ItemDataBound方法相比,DataTable Loop的另外一个优点是使用该方法的时候,可以在DataGrid的数据绑定之前取得统计数据。当你需要将统计数据显示在页面最上方的时候,这种方法是非常有用的。另外,和ItemDataBound方法不同,DataTable Loop不需要使用一个专门的全局变量。 |
| 三、ItemDataBound (实例 | ASPX 代码 | CS 代码) |
| 这种方法似乎在DataGrid的数据统计中比较通用,Dotnetjunkies guru Doug Seven在他的教程Adding a Totals Field in a DataGrid中就使用了这种方法;微软业在其知识库中介绍了这种技术:HOW TO: Create a Summary Row for a DataGrid in ASP.NET by Using Visual Basic .NET。 |
| 相对于其他两种方法,使用ItemDataBound的优点在于它使用了DataGrid的数据排序功能。因为在数据绑定之前统计数据不存在,因此,数据排序也就相对简单。和其他两种方法不同,使用这种方法实现数据排序不需要任何特殊的处理。和DataTable Loop一样,ItemDataBound也可以适用于任何数据源。 |
| 四、实现数据统计列的一个类(CS 代码) |
| 为了尽量减少代码重用,我使用了一个用于获取数据统计信息类,该类包含计算“数据和”和“数据平均值”的方法。稍微做一些修改,该类就扩展其他统计信息,比如:“取最小”“取最大”等。 |
| 下面是针对以上三种方法的简单比较表: |
|
|
表一
|
|
|
表二
|
Entities represent the business objects of an organization. They provide information and code behaviour. For example in a Bank the “Savings Account” or the “Cusomter” are Business Entities. Entities have a state component that manages it’s persistence and a dynamic component given by the operations to be performed upon them. In an Account, the account number, the currency, the opening date, the owner, are properties or attributes of the Entity. A transference, a debit, a credit, the comissions are actions to be performed on one or more Entities.
The entities according to this model are not implemented with a single .Net class, but with a set of them, linked logically in a so called “assembly”.
An entity contains at least three subcomponents:
This model of loosly coupled pieces has several advantages:
Ice为分布式开发提供了技术完善的客户-服务平台。实际上,现实的应用不仅仅只需要具备远程通讯能力,通常的,还需要随需启动服务,把代理分布到客户端,分发异步事件,配置应用,发布补丁等等。
Ice自带了一些服务,这些服务具备了上面所说的特征和一些其它的特征。这些服务实现以服务器的形式实现并向你的应用提供服务。他们分别是:
1、IcePack
IcePack是Ice的定位服务。当使用间接绑定时,用来将符号化的适配器名称转换为协议-地址对。除了定位服务之外,IcePack还提供了如下的服务:
2、IceBox
IceBox是一个简单的应用服务器,它可以协调多个应用组件启动和停止。
应用组件可以用动态链接库的形式发布而不是一个进程。这就减轻了系统的负载。例如,你可以在一个JVM中运行若干个应用组件而不是有多个进程,每一个进程都有自己的JVM。
3、IceStorm
IceStorm是一个发布-订阅服务,它减除了客户端和服务器的耦合度。本质上说,IceStorm作为一个事件分发的交换机运行。发布者将事件发给服务,IceStorm按照顺序将事件传递给订阅者。使用这种方法,一个事件发布者就可以把一个事件发布给多个订阅者。事件按照主题分类,订阅者可以指定他们感兴趣的主题。只有订阅者感兴趣的主题才会发送给订阅者。服务允许指定服务的质量,从而允许应用在可伸缩性和性能之间进行适当的折中。
如果你需要将信息发布到大量的应用组建,那么IceStorm是一个不错的选择。(一个很典型的例子就是股票报价的应用)。IceStorm减除了信息的发布者和订阅者之间的耦合,同时也能重新发布已经发布的信息。另外,IceStorm可以作为联合服务运行,即多个服务的实例可以运行在不同的机器上,从而降低了CPU的负载。
4、IcePatch
IcePatch是一个软件补丁服务。它允许你轻松的把软件的更新发布给客户。客户连接到IcePatch然后请求更新一个特定的应用。服务就自动检查客户软件的版本然后下载需要更新的组件。而这些下载的组件都是放在一个压缩包里的,从而减少了带宽的占用。软件补丁也可以通过结合Glacier服务发布,这样可以让只有经过授权的客户才能下载软件更新。
5、Glacier
Glacier是Ice防火墙服务:它允许客户和服务器通过防火墙安全的通讯。客户-服务器的通讯通过使用公钥认证完全加密,并且通讯是双向的。Glacier提供了相互认证和安全的会话管理支持。
http://www.cnblogs.com/iaxes/articles/71411.html
原文作者信息
系统需求:
概观
MyGeneration目前使用了两种脚本引擎,一个是Microsoft Scripting Engine,它提供了JScript和VBScript的生成支持;另一个是 DotNetScript ,它提供了 VB.NET 和 C# 的支持。 DotNetScript 不像Microsoft Scripting Control那样的真正的脚本。实际上,它在运行时编译代码,然后利用编译后的.NET Assembly执行代码。这个教程通过例子说明使用 DotNetScript 开发MyGeneration模板的赞成与反对的理由。在这个例子中,我将使用C#和MS SQL中附带的Northwind数据库。
创建一个新的C#模板
研究默认的模板代码
默认的模板主体代码:
不像 JScript 或VBScript,C#的的模板代码相对较少。这个默认的代码是非常重要的。一个C#模板必须有一个继承了 DotNetScriptTemplate 的名为 GeneratedTemplate 的类。 MyGeneration 通过实例化 GeneratedTemplate ,并调用Render方法开始生成过程。几乎大部分的模板开发工作都在Render方法里面完成。试试执行这个模板,你将会看到literal content goes here作为输出出现。
<%
public class GeneratedTemplate : DotNetScriptTemplate
{
public GeneratedTemplate(ZeusContext context) : base(context)
{}

public override void Render()
{
%>
Literal content goes here.
<%
}

}
%>默认的UI接口代码:
在默认的模板的接口代码中,同样需要一个名为GeneratedGui的,继承DotNetScriptGui的强制类。如同模板主体代码的Render方法一样, MyGeneration 将调用Setup方法开始显示用户接口并收集输入。
public class GeneratedGui : DotNetScriptGui
{
public GeneratedGui(ZeusContext context) : base(context)
{}

public override void Setup()
{
}
}
获取输入:用户接口的代码块
在这个例子中,用户将通过接口选择一个表。这个是接口代码块的擅长的工作。用户接口获取的输入数据,将在模板主体代码中用来生成代码。
使用MyGeneration的接口代码:
public class GeneratedGui : DotNetScriptGui
{
public GeneratedGui(ZeusContext context) : base(context)
{}

public override void Setup()
{
ui.Title = “.NetScript C# Sample: Java Class“;
ui.Width = 340;
ui.Height = 200;

// Setup Database selection combobox.
GuiLabel label_d = ui.AddLabel(“lblDatabases“, “Select a database:“, “Select a database in the dropdown below.“);
GuiComboBox cmbDatabases = ui.AddComboBox(“databaseName“, “Select a database.“);

// Setup Tables selection multi-select listbox.
GuiLabel label_t = ui.AddLabel(“lblTables“, “Select table:“, “Select table from the combobox below.“);
GuiComboBox cmbTables = ui.AddComboBox(“tableName“, “Select a table.“);

// bind data to the controls
cmbDatabases.BindData(MyMeta.Databases);
cmbDatabases.SelectedValue = MyMeta.DefaultDatabase.Name;
cmbTables.BindData( MyMeta.Databases[cmbDatabases.SelectedValue].Tables );
// Attach the onchange event to the cmbDatabases control.
cmbDatabases.AttachEvent(“onchange“, “cmbDatabases_onchange“);
ui.ShowGui = true;
}

public void cmbDatabases_onchange(GuiComboBox control)
{
GuiComboBox cmbDatabases = ui["databaseName"] as GuiComboBox;
GuiComboBox cmbTables = ui["tableName"] as GuiComboBox;

cmbTables.BindData( MyMeta.Databases[cmbDatabases.SelectedValue].Tables );
}
}使用.NET Windows Form API的接口代码:
下面的代码是不使用 MyGeneration API的替换方案,它可以达到与上面的代码同样的目的。
<%#REFERENCE System.Windows.Forms.dll %>
<%#NAMESPACE System.Windows.Forms %>
public class GeneratedGui : DotNetScriptGui
{
public GeneratedGui(ZeusContext context) : base(context)
{}

public override void Setup() 
{
AcquireInputForm form = new AcquireInputForm(MyMeta, input); 

if (form.ShowDialog() != DialogResult.OK) 
{
ui.IsCanceled = true;
}
}
}

public class AcquireInputForm : Form
{
private ComboBox cboDatabases = new ComboBox();
private ComboBox cboTables = new ComboBox();
private Button btnOk = new Button();
private dbRoot meta;
private IZeusInput input;

public AcquireInputForm(dbRoot mymeta, IZeusInput zin)
{
this.meta = mymeta;
this.input = zin;

this.BindComboBox(cboDatabases, meta.Databases);
cboDatabases.SelectedItem = meta.DefaultDatabase.Name;
cboDatabases.Top = 10; cboDatabases.Left = 10; cboDatabases.Width = 200;
cboDatabases.SelectedIndexChanged += new EventHandler(cboDatabases_SelectedIndexChanged);

this.BindComboBox(cboTables, meta.DefaultDatabase.Tables);
cboTables.Top = 50; cboTables.Left = 10; cboTables.Width = 200;

btnOk.Text = “Ok“;
btnOk.Top = 100; btnOk.Left = 10; btnOk.Width = 200;
btnOk.Click += new EventHandler(btnOk_Click);


this.Controls.AddRange( new Control[]
{cboDatabases, cboTables, btnOk} );
this.Text = “.NetScript C# Sample: Java Class“;
this.Width = 230;
this.Height = 160;
}

public void cboDatabases_SelectedIndexChanged(object sender, EventArgs args) 
{
this.BindComboBox(
cboTables,
meta.Databases[ cboDatabases.SelectedItem.ToString() ].Tables
);
}

public void btnOk_Click(object sender, EventArgs args) 
{
if ((cboDatabases.SelectedIndex >= 0) &&
(cboTables.SelectedIndex >= 0)) 
{
input["databaseName"] = cboDatabases.SelectedItem.ToString();
input["tableName"] = cboTables.SelectedItem.ToString();
this.DialogResult = DialogResult.OK;
this.Close();
}
else 
{
MessageBox.Show(“Fill out the required fields.. PLEASE??“);
}
}

private void BindComboBox(ComboBox cbo, IEnumerable myMetaCollection)
{
cbo.Items.Clear();
foreach (INameValueItem item in myMetaCollection)
{
cbo.Items.Add(item.ItemValue);
}
}
}
模板主体
模板主体是生成代码的主要执行地。下面讲解了我如何生成代码的步骤。
1、将期望输出的代码放入到Render的方法中如下的代码,你将看到我将要生成的类。这几乎都是当我要生成一个模板是必做的第一件事情。
<%
public class GeneratedTemplate : DotNetScriptTemplate
{
public GeneratedTemplate(ZeusContext context) : base(context)
{}

public override void Render()
{
string databaseName = input["databaseName"].ToString();
string tableName = input["tableName"].ToString();
%>
/**//*
* Employee.java
*
* Created on September 23, 2002, 12:59 PM
*/

package com.mygeneration.sample;

import java.sql.*;

import com.mygeneration.businessobjects.*;
import com.mygeneration.dataaccess.*;

public class Employee extends BizObj
{
public Employee() 
{
}

// EmployeeID
public String getEmployeeID()
{
return getString(EmployeeSchema.EmployeeID.getFieldName());
}

public void setEmployeeID(String employeeID)
{
setString(EmployeeSchema.EmployeeID.getFieldName(), employeeID);
}
}<%
}

}
%>
2、添加动态代码把动态的代码添加到模板中,替换掉类名、属性名称以及数据类型。
<%
public class GeneratedTemplate : DotNetScriptTemplate
{
public GeneratedTemplate(ZeusContext context) : base(context)
{}

public override void Render()
{
string databaseName = input["databaseName"].ToString();
string tableName = input["tableName"].ToString();

IDatabase database = MyMeta.Databases[databaseName];
ITable table = database.Tables[tableName];
%>/**//*
* <%= table.Alias %>.java
*
* Created on <%= DateTime.Now.ToString() %>
*/

package com.mygeneration.sample;

import java.sql.*;

import com.mygeneration.businessobjects.*;
import com.mygeneration.dataaccess.*;

public class <%= table.Alias %> extends BizObj
{
public <%= table.Alias %>() 
{
}
<%
foreach (IColumn column in table.Columns)
{
string datatype = this.GetJavaType(column);
%>
// <%= column.Alias %>
public <%= datatype %> get<%= column.Alias %>()
{
return get<%= datatype %>(<%= table.Alias %>Schema.<%= column.Alias %>.getFieldName());
}

public void set<%= column.Alias %>(<%= datatype %> m_<%= column.Alias %>)
{
set<%= datatype %>(<%= table.Alias %>Schema.<%= column.Alias %>.getFieldName(), m_<%= column.Alias %>);
}
<%
}
%>
}<%
}

private string GetJavaType(IColumn column)
{
string sqlServerType = column.DataTypeName;
int charLength = column.CharacterMaxLength;

switch (sqlServerType) 
{
case “bit“:
return “Boolean“;
case “decimal“:
case “float“:
case “numeric“:
case “money“:
case “smallmoney“:
case “real“:
return “Decimal“;
case “tinyint“:
case “smallint“:
case “int“:
case “bigint“:
return “Integer“;
case “smalldatetime“:
case “datetime“:
return “Timestamp“;
case “varchar“:
case “char“:
case “nvarchar“:
case “nchar“:
case “text“:
if (charLength == 1)
return “Character“;
else
return “String“;
default:
return “Object“;
}
}
}
%>
总结
使用 DotNetScript ,你将会把 MyGeneration 的模板开发提升到一个新的水平,提供更强大的功能以及能开发更复杂的系统。
刚看到NHibernate推出0.6版了,并且是Beta哦,看来上半年1.0正式版有望了。:)
主要变化有:
- Added support for proxy=”" on classes. proxy=”" must either specify an Interface or the properties that need to be proxied have to be virtual.
- Added a configuration parameter “hibernate.prepare_sql” to turn on or off calls to IDbCommand.Prepare().
- Added NHibernate Type for System.SByte. (Sergey Koshcheyev)
- Added support for mapping subclasses and joined-subclasses in different files through addition of extends attribute. (Andrew Mayorov)
- Added support for LIMIT to MySQLDialect. (Sergey Koshcheyev)
- Improved error messages when IDbCommand and IDbConnection can’t be found by the IDriver.
- Improved error message when mapped class is missing a constructor with no args.
- Fixed problem with spaces in sql generated from hql and MySql.
- Fixed bug with Configuration when there is a class without a namespace.
- Fixed bug with Sql generated for an IN clause that contains a class/subclass with a discriminator-value=”null”.
- Fixed potential threading problem with QueryTranslator.
- Modified logging in Transaction to not generate as many messages.
- Modified how exceptions are rethrown so call stack of original exception is not lost.
- Moved NHibernate.Tasks and NHibernate.Tool.hbm2net to the NHibernateContrib package.
- Removed DbType {get;} from IUserType.
MyGeneration -又一个 O/R Mapping 的工具和代码产生工具,可以产生Gentle.NET和NHibernate的代码
Web编程的一个基本任务就是对用户输入到表单中的值进行检查。传统的ASP编程在这一方面并没有提供太大的支持,而是把相应的检查工作留给程序开发人员来设计和编写自己的表单检查机制。
幸运的是,ASP.NET对表单检查进行了相当大的改进。对初学者来说,以事件为基础的、以UI控件为中心的WebForm编程模式大大简化了表单检查的任务。不过,ASP.NET在原有基础之上更进一步,通过一整套服务器控件直接支持表单检查,从而几乎完全消除了自己建立表单检查机制的必要。本文的主旨即是介绍和演示ASP.NET随带的检查服务器控件。
ASP.NET检验服务器控件(validation server control)同TextBox和Label等Web服务器控件一道位于System.Web.UI.WebControls名称空间之下。ASP.NET提供了6种检验控件,如图A所示:
图A
ASP.NET检验控件
ValidationSummary控件并不执行具体的表单值检验工作。它的功能是总结页面内其他检验控件发出的错误消息。在本文的其他部分,当我提到检验控件的时候,我指的是那些执行具体检验任何的控件,也就是除了ValidationSummary之外的其他控件。
检验控件直接或者间接派生自抽象的BaseValidater类,该类又是从Label控件派生的。你可能会觉得奇怪,检验控件怎么会从Label派生呢?很快我们就会知道原因何在了。
检验控件对页面上输入服务器控件的值进行检查,从而判断出这些值是否符合特定的条件。被检查的输入控件由检验控件的ControlToValidate属性设定。你可以对检验控件编程令其调用Validate方法对数据控件的输入值进行检查,如果检验结果符合条件则该方法会把检验控件的IsValid属性设置为true,否则设置为false。你可以设置页面上的检验控件调用Page.Validate方法对所有输入控件的输入值进行检查。
Page.IsValid属性在页面内所有检验控件的检查都成功的情况下设置为true否则设置为false。假如按下了某个按钮控件,而且该控件的CausesValidation属性设置为true,那么Page.Validate方法即被调用。Reset或者clear按钮的CausesValidation属性默认设置为 false。假如页面上任何检验空间的IsValid设置为false那么按钮单击事件即被屏蔽。
如果浏览器支持ECMAScript 1.2 (JScript) 和Document Object Model (DOM) (兼容Internet Explorer 4及以后版本),那么检验控件会执行客户端脚本在客户机上进行表单检查工作而不会通过服务器进行迂回检查。这样做可以给用户提供给及时的反馈。为了对浏览器提供强度更大的支持和防止用户旁路表单检查,当页面提交之后服务器端也会执行表单检查。客户端检查可以禁用,方法是把检验控件的EnableClientScript属性设置为false。你还可以禁用页面内所有检验控件的客户端表单检查,只需要在@Page指示符内设置属性ClientTarget=”downlevel”即可。
在检查不通过的情况下,检验控件的Text属性会在页面内检验控件所在的位置显示出来,其外观形式就如同一个标签。假如没有设置Text属性则显示ErrorMessage属性。一旦检验不通过,ErrorMessage属性也会显示在ValidationSummary控件内。假如检验控件没有设置ErrorMessage则ValidationSummary上什么都不会显示。一般原则是摘要消息或者错误提示可以采取设置Text属性的方式,而较长的说明则采取设置ErrorMessage属性的方式。
不同的检验控件测试的条件是不同的:
这是缓存的问题,
在html里添加<%@ OutPutCache Location=”None”%>
ASP.NET 允许您在具有 HTTP 1.1 功能的机制上缓存动态页的整个响应内容,这些机制指浏览器、代理服务器和您的应用程序所驻留的 Web 服务器等。这为您提供了一个强有力的方式来提高 Web 应用程序的性能。此技术叫做输出缓存,它允许从缓存满足后面的对特定页的请求,这样当后面的请求发生时就不需要运行最初创建页的代码。使用该技术来缓存站点中最经常访问的页可以充分地提高 Web 服务器的吞吐量(通常以每秒的请求数计算)。
当操作页的输出缓存时,您可以选择高级别的声明性 API 或低级别的编程 API。您可以通过将@ OutputCache 指令包括在该页的 .aspx 文件中使用前者。@ OutputCache 指令可以满足当要缓存页输出时几乎所有的一般需求。下面的指令(当包括在 .aspx 文件中时)为动态生成页的缓存输出设置 60 秒的到期时间。
<%@ OutputCache Duration=”60″ VaryByParam=”None” %>
金羊网 2004-12-09 09:00:24
新快报讯(记者周继坚)广州新人办理婚姻登记将不受周末、节假日婚姻登记机关放假的影响!记者昨日从广州市民政部门获悉,广州市目前已经在五个老区试点,实行婚姻登记机关周末和法定节假日照常办理登记业务。
据了解,广东省民政厅今年10月率先在深圳市宝安区进行试点,在周末和法定节假日增加1-2天工作时间,所有申请办理婚姻登记的居民可以在当天将手续办理完毕。
据悉,广州的试点工作已经在天河、越秀、荔湾、东山、海珠等五区展开。但各个婚姻登记处的工作人员没有增加,目前尚无法进行大量的婚姻登记业务,确实有需要的市民可以先行预约。