<?xml version="1.0" encoding="gb2312"?>
<rss version="2.0">
<channel>
<title>零度博客</title>
<link>http://0-do.com/oblog313/</link>
<description>博客,免费博客申请,新余学院,新余高专</description>
<generator>Oblog 3.0</generator>
<webMaster>mfk1231982@yahoo.com.cn</webMaster>
<item>
<title><![CDATA[Div+Css标准写法]]></title>
<link>http://0-do.com/oblog313/user1/zhouyiping/archives/2008/2472.html</link>
<author>zhouyiping</author>
<pubDate>2008-3-10 17:40:53</pubDate>
<description><![CDATA[&lt;html&gt;<BR>&lt;head&gt;<BR>&lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312"&gt;<BR>&lt;title&gt;Div+Css&lt;/title&gt;<BR>&lt;style type="text/css"&gt;<BR>&lt;!--<BR>/* Html (Begin) */<BR>* {<BR>&nbsp;&nbsp; margin: 0px;<BR>&nbsp;&nbsp; padding: 0px;<BR>}<BR>body {<BR>&nbsp;&nbsp; margin: 0px;<BR>&nbsp;&nbsp; font-size: 12px;<BR>&nbsp;&nbsp; text-align: center;<BR>}<BR>div {<BR>&nbsp;&nbsp; font-size: 12px;<BR>&nbsp;&nbsp; margin: 0px;<BR>&nbsp;&nbsp; padding: 0px;<BR>}<BR>/* Html (End) */<BR><BR>/* Head (Begin) */<BR>#body {<BR>&nbsp;&nbsp; margin-top: 0px;<BR>&nbsp;&nbsp; margin-right: auto;<BR>&nbsp;&nbsp; margin-bottom: 0px;<BR>&nbsp;&nbsp; margin-left: auto;<BR>&nbsp;&nbsp; width: 930px;<BR>&nbsp;&nbsp; text-align: center;<BR>&nbsp;&nbsp; padding: 0px;<BR>}<BR>#head {<BR>&nbsp;&nbsp; width: 100%;<BR>&nbsp;&nbsp; text-align: left;<BR>&nbsp;&nbsp; padding-top: 5px;<BR>&nbsp;&nbsp; margin-top: 10px;<BR>&nbsp;&nbsp; float: left;<BR>}<BR>#left {<BR>&nbsp;&nbsp; float: left;<BR>&nbsp;&nbsp; line-height: 20px;<BR>&nbsp;&nbsp; border: 1px solid #CCCCCC;<BR>&nbsp;&nbsp; width: 79%;<BR>}<BR>#right {<BR>&nbsp;&nbsp; float: right;<BR>&nbsp;&nbsp; line-height: 20px;<BR>&nbsp;&nbsp; width: 20%;<BR>}<BR>#left .bline {<BR>&nbsp;&nbsp; float: left;<BR>&nbsp;&nbsp; width: 12%;<BR>}<BR>#left a {<BR>&nbsp;&nbsp; display: block;<BR>&nbsp;&nbsp; color: #339900;<BR>&nbsp;&nbsp; text-decoration: none;<BR>&nbsp;&nbsp; font-weight: bold;<BR>&nbsp;&nbsp; font-family: Tahoma;<BR>&nbsp;&nbsp; width: 100%;<BR>&nbsp;&nbsp; text-align: center;<BR>}<BR>/* Head (end) */<BR>#Right ul {<BR>&nbsp;&nbsp; list-style-type: none;<BR>&nbsp;&nbsp; margin: 0px;<BR>&nbsp;&nbsp; padding: 0px;<BR>}<BR>#Right ul li {<BR>&nbsp;&nbsp; display: inline;<BR>&nbsp;&nbsp; margin: 0px;<BR>&nbsp;&nbsp; padding: 0px;<BR>}<BR>#right ul li a {<BR>&nbsp;&nbsp; font-size: 12px;<BR>&nbsp;&nbsp; color: #333333;<BR>&nbsp;&nbsp; text-decoration: none;<BR>&nbsp;&nbsp; display: block;<BR>&nbsp;&nbsp; border-bottom-width: 1px;<BR>&nbsp;&nbsp; border-bottom-style: dashed;<BR>&nbsp;&nbsp; border-bottom-color: #999999;<BR>&nbsp;&nbsp; font-family: Tahoma;<BR>&nbsp;&nbsp; padding-left: 8px;<BR>&nbsp;&nbsp; margin: 0px;<BR>&nbsp;&nbsp; width: 100%;<BR>&nbsp;&nbsp; padding-top: 3px;<BR>&nbsp;&nbsp; padding-bottom: 3px;<BR>}<BR>#Right ul li a:hover {<BR>&nbsp;&nbsp; color: #FFFFFF;<BR>&nbsp;&nbsp; text-decoration: none;<BR>&nbsp;&nbsp; background-color: #333333;<BR>&nbsp;&nbsp; padding-left: 14px;<BR>}<BR>#left a:hover {<BR>&nbsp;&nbsp; background-color: #333333;<BR>&nbsp;&nbsp; color: #FFFFFF;<BR>}<BR><BR>--&gt;<BR>&lt;/style&gt;<BR>&lt;/head&gt;<BR><BR>&lt;body&gt;<BR>&lt;div id="Body"&gt;<BR>&lt;div id="head"&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;div id="left"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;div class="bline"&gt;&lt;a href="http://www.0-do.com/oblog313/#"&gt;左边内容1&lt;/a&gt;&lt;/div&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;div class="bline"&gt;&lt;a href="http://www.0-do.com/oblog313/#"&gt;左边内容2&lt;/a&gt;&lt;/div&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;div class="bline"&gt;&lt;a href="http://www.0-do.com/oblog313/#"&gt;左边内容3&lt;/a&gt;&lt;/div&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;div class="bline"&gt;&lt;a href="http://www.0-do.com/oblog313/#"&gt;左边内容4&lt;/a&gt;&lt;/div&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;div class="bline"&gt;&lt;a href="http://www.0-do.com/oblog313/#"&gt;左边内容4&lt;/a&gt;&lt;/div&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;/div&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;div id="right"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ul&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;li&gt;&lt;a href="http://www.0-do.com/oblog313/#"&gt;About Us&lt;/a&gt;&lt;/li&gt;<BR>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;li&gt;&lt;a href="http://www.0-do.com/oblog313/#"&gt;Contact Us&lt;/a&gt;&lt;/li&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;li&gt;&lt;a href="http://www.0-do.com/oblog313/#"&gt;Enter&lt;/a&gt;&lt;/li&gt;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/ul&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;/div&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;/div&gt;<BR>&lt;/div&gt;<BR>&lt;/body&gt;<BR>&lt;/html&gt;]]></description>
</item><item>
<title><![CDATA[DIV+CSS 命名规范]]></title>
<link>http://0-do.com/oblog313/user1/zhouyiping/archives/2008/2471.html</link>
<author>zhouyiping</author>
<pubDate>2008-2-25 10:38:29</pubDate>
<description><![CDATA[<P>1.CSS&nbsp;ID&nbsp;的命名<BR>外　套：　　wrap<BR>主导航：　　mainnav<BR>子导航：　　subnav<BR>页　脚：　　footet<BR>整个页面：　content<BR>页　眉：　　header<BR>页　脚：　　footer<BR>商　标：　　label<BR>标　题：　　title<BR>主导航：　　mainbav（globalnav）<BR>顶导航：　　topnav<BR>边导航：　　sidebar<BR>左导航：　　leftsidebar<BR>右导航：　　rightsidebar<BR>旗　志：　　logo<BR>标　语：　　banner<BR>菜单内容1：&nbsp;menu1&nbsp;content<BR>菜单容量：　menu&nbsp;container<BR>子菜单：　　submenu<BR>边导航图标：sidebarIcon<BR>注释：　　　note<BR>面包屑：　　breadcrumb(即页面所处位置导航提示）<BR>容器：　　　container<BR>内容：　　　content<BR>搜索：　　　search<BR>登陆：　　　Login<BR>功能区：　　shop(如购物车，收银台)<BR>当前的　　　current<BR><BR>2.另外在编辑样式表时可用的注释可这样写：<BR>&lt;--&nbsp;Footer&nbsp;--&gt;<BR>内容区<BR>&lt;--&nbsp;End&nbsp;Footer&nbsp;--&gt;<BR><BR>3.样式文件命名<BR>主要的&nbsp;master.css<BR>布局，版面&nbsp;layout.css<BR>专栏&nbsp;columns.css<BR>文字&nbsp;font.css<BR>打印样式&nbsp;print.css<BR>主题&nbsp;themes.css&nbsp; <BR></P>
<P>&nbsp;</P>
<H1 class=ContentTitle><STRONG>CSS简略写法总结</STRONG></H1>
<P>颜色<BR>16进制的色彩值，如果每两位的值相同，可以缩写一半，例如：<BR>#000000可以缩写为#000;#336699可以缩写为#369;<BR><BR>盒尺寸<BR>通常有下面四种书写方法:<BR><BR>property:value1;&nbsp;表示所有边都是一个值value1；&nbsp;<BR>property:value1&nbsp;value2;&nbsp;表示top和bottom的值是value1,right和left的值是value2&nbsp;<BR>property:value1&nbsp;value2&nbsp;value3;&nbsp;表示top的值是value1，right和left的值是value2，bottom的值是value3&nbsp;<BR>property:value1&nbsp;value2&nbsp;value3&nbsp;value4;&nbsp;四个值依次表示top,right,bottom,left&nbsp;<BR>方便的记忆方法是顺时针，上右下左。具体应用在margin和padding的例子如下：<BR>margin:1em&nbsp;0&nbsp;2em&nbsp;0.5em;&nbsp;<BR><BR>边框(border)<BR>边框的属性如下：<BR><BR>border-width:1px;&nbsp;<BR>border-style:solid;&nbsp;<BR>border-color:#000;&nbsp;<BR>可以缩写为一句：border:1px&nbsp;solid&nbsp;#000;&nbsp;<BR><BR>语法是border:width&nbsp;style&nbsp;color;&nbsp;<BR><BR>背景(Backgrounds)<BR>背景的属性如下：<BR><BR>background-color:#f00;&nbsp;<BR>background-image:url(background.gif);&nbsp;<BR>background-repeat:no-repeat;&nbsp;<BR>background-attachment:fixed;&nbsp;<BR>background-position:0&nbsp;0;&nbsp;<BR>可以缩写为一句：background:#f00&nbsp;url(background.gif)&nbsp;no-repeat&nbsp;fixed&nbsp;0&nbsp;0;&nbsp;<BR><BR>语法是background:color&nbsp;image&nbsp;repeat&nbsp;attachment&nbsp;position;<BR><BR>你可以省略其中一个或多个属性值，如果省略，该属性值将用浏览器默认值，默认值为：<BR><BR>color:&nbsp;transparent&nbsp;<BR>image:&nbsp;none&nbsp;<BR>repeat:&nbsp;repeat&nbsp;<BR>attachment:&nbsp;scroll&nbsp;<BR>position:&nbsp;0%&nbsp;0%&nbsp;<BR>字体(fonts)<BR>字体的属性如下：<BR><BR>font-style:italic;&nbsp;<BR>font-variant:small-caps;&nbsp;<BR>font-weight:bold;&nbsp;<BR>font-size:1em;&nbsp;<BR>line-height:140%;&nbsp;<BR>font-family:"Lucida&nbsp;Grande",sans-serif;&nbsp;<BR>可以缩写为一句：font:italic&nbsp;small-caps&nbsp;bold&nbsp;1em/140%&nbsp;"Lucida&nbsp;Grande",sans-serif;<BR><BR>注意，如果你缩写字体定义，至少要定义font-size和font-family两个值。<BR><BR>列表(lists)<BR>取消默认的圆点和序号可以这样写list-style:none;,<BR><BR>list的属性如下:<BR><BR>list-style-type:square;&nbsp;<BR>list-style-position:inside;&nbsp;<BR>list-style-image:url(image.gif);&nbsp;<BR>可以缩写为一句：list-style:square&nbsp;inside&nbsp;url(image.gif); </P>
<P>&nbsp;</P>
<P>&nbsp;</P>
<P>&nbsp;</P>
<P>/*共用部分*/<BR>body&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;margin:&nbsp;0px;<BR>&nbsp;&nbsp;&nbsp;&nbsp;scrollbar-base-color:&nbsp;#F9F9F9;<BR>&nbsp;&nbsp;&nbsp;&nbsp;scrollbar-arrow-color:&nbsp;#5B5B5B;<BR>&nbsp;&nbsp;&nbsp;&nbsp;font:&nbsp;12px&nbsp;Tahoma,&nbsp;Verdana;<BR>&nbsp;&nbsp;&nbsp;&nbsp;background-color:&nbsp;#808284;<BR>&nbsp;&nbsp;&nbsp;&nbsp;color:&nbsp;#000000;<BR>}<BR><BR>table&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;font:&nbsp;12px&nbsp;Tahoma,&nbsp;Verdana;<BR>&nbsp;&nbsp;&nbsp;&nbsp;color:&nbsp;#333333;<BR>&nbsp;&nbsp;&nbsp;&nbsp;empty-cells:&nbsp;show;<BR>&nbsp;&nbsp;&nbsp;&nbsp;border-collapse:&nbsp;separate&nbsp;!important;<BR>&nbsp;&nbsp;&nbsp;&nbsp;border-collapse:&nbsp;collapse;<BR>}<BR><BR>input,&nbsp;select,&nbsp;textarea&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;font:&nbsp;12px&nbsp;Tahoma,&nbsp;Verdana;<BR>&nbsp;&nbsp;&nbsp;&nbsp;color:&nbsp;#333333;<BR>&nbsp;&nbsp;&nbsp;&nbsp;font-weight:&nbsp;normal;<BR>&nbsp;&nbsp;&nbsp;&nbsp;background-color:&nbsp;#F9F9F9;<BR>&nbsp;&nbsp;&nbsp;&nbsp;border:&nbsp;1px&nbsp;solid&nbsp;#EEEEEE;<BR>}<BR><BR>a&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;text-decoration:&nbsp;none;<BR>&nbsp;&nbsp;&nbsp;&nbsp;color:&nbsp;#000000;<BR>}<BR><BR>a:hover&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;color:#000000;<BR>&nbsp;&nbsp;&nbsp;&nbsp;text-decoration:&nbsp;none;<BR>}<BR><BR>.smalltxt&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;font:&nbsp;12px&nbsp;Arial,&nbsp;Tahoma&nbsp;!important;<BR>&nbsp;&nbsp;&nbsp;&nbsp;font:&nbsp;12px&nbsp;Arial,&nbsp;Tahoma;<BR>}<BR><BR>/*字体控制*/<BR>.bold&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;font-weight:&nbsp;bold;<BR>}<BR><BR>/*顶部背景*/<BR>.top_bg&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;float:left;<BR>&nbsp;&nbsp;&nbsp;&nbsp;width:1002px;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;background:url(../../images/default/pic/top_bg.jpg)&nbsp;repeat-x;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;height:18px;<BR>}<BR><BR>/*头部背景*/<BR>.top_head&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;float:left;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;width:1002px;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;background:url(../../images/default/pic/top_b.jpg)&nbsp;repeat-x;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;height:150px;<BR>}<BR><BR>/*菜单背景*/<BR>.menu_bg&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;float:left;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;width:1002px;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;background:url(../../images/default/pic/menu_bg.jpg)&nbsp;repeat-x;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;height:32px;<BR>}<BR><BR>/*菜单*/<BR>.menu_txt&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;float:&nbsp;center;<BR>&nbsp;&nbsp;&nbsp;&nbsp;text-align:&nbsp;center;<BR>&nbsp;&nbsp;&nbsp;&nbsp;padding-top:&nbsp;8px;<BR>}<BR><BR>/*菜单链接*/<BR>.menu_link&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;color:#FFFFFF;<BR>&nbsp;&nbsp;&nbsp;&nbsp;padding-top:&nbsp;8px&nbsp;!important;<BR>&nbsp;&nbsp;&nbsp;&nbsp;padding-top:&nbsp;8px;<BR>}<BR>.menu_link&nbsp;a&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;color:#FFFFFF;<BR>&nbsp;&nbsp;&nbsp;&nbsp;padding-top:&nbsp;8px&nbsp;!important;<BR>&nbsp;&nbsp;&nbsp;&nbsp;padding-top:&nbsp;8px;<BR>&nbsp;&nbsp;&nbsp;&nbsp;text-decoration:&nbsp;none;<BR>}<BR>.menu_link&nbsp;a:hover&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;color:#000000;<BR>&nbsp;&nbsp;&nbsp;&nbsp;padding-top:&nbsp;8px&nbsp;!important;<BR>&nbsp;&nbsp;&nbsp;&nbsp;padding-top:&nbsp;8px;<BR>&nbsp;&nbsp;&nbsp;&nbsp;text-decoration:&nbsp;none;<BR>}<BR><BR>/*&nbsp;head&nbsp;*/<BR><BR>.header&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;font:&nbsp;12px&nbsp;Arial,&nbsp;Tahoma&nbsp;!important;<BR>&nbsp;&nbsp;&nbsp;&nbsp;font-weight:&nbsp;bold&nbsp;!important;<BR>&nbsp;&nbsp;&nbsp;&nbsp;font:&nbsp;12px&nbsp;Arial,&nbsp;Tahoma;<BR>&nbsp;&nbsp;&nbsp;&nbsp;font-weight:&nbsp;bold;<BR>&nbsp;&nbsp;&nbsp;&nbsp;color:&nbsp;#FFFFFF;<BR>&nbsp;&nbsp;&nbsp;&nbsp;background-image:&nbsp;url("../../images/default/header_bg.gif");<BR>&nbsp;&nbsp;&nbsp;&nbsp;height:&nbsp;28px;<BR>&nbsp;&nbsp;&nbsp;&nbsp;padding-left:&nbsp;10px;<BR>}<BR><BR>.header&nbsp;td&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;padding-left:&nbsp;10px;<BR>}<BR><BR>.header&nbsp;a&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;color:&nbsp;#FFF;<BR>}<BR><BR>.header&nbsp;input&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;background:none;<BR>&nbsp;&nbsp;&nbsp;&nbsp;vertical-align:&nbsp;middle;<BR>&nbsp;&nbsp;&nbsp;&nbsp;height:&nbsp;16px;<BR>}<BR></P>]]></description>
</item><item>
<title><![CDATA[.NET开发人员容易犯的6大安全错误]]></title>
<link>http://0-do.com/oblog313/user1/datou/archives/2008/2468.html</link>
<author>datou</author>
<pubDate>2008-1-4 19:24:11</pubDate>
<description><![CDATA[HP的白皮书《Top six security mistakes .NET developers make : are your web applications vulnerable ?》中提到：行业分析估计超过70%的安全问题是伴随应用程序一起发生的，很多是由于代码的安全性缺陷造成的。<BR><BR>　　微软在.NET中增加了不少的安全特性来帮助开发人员创建更加安全的应用程序。但是并不是每位开发人员都很好地使用了它们。<BR><BR>　　文中列出了.NET开发者在安全性方面通常会犯的6个主要的错误：<BR><BR>1、在开发过程中没有把安全考虑进去。<BR><BR>2、SQL注入（SQL injection）。<BR><BR>3、跨站脚本（Cross-site scripting）。<BR><BR>4、把用户输入作为文件名。<BR><BR>5、不恰当地使用cookies和隐藏参数（hidden parameters）。<BR><BR>6、在Web.config文件中使debug选项可用。]]></description>
</item><item>
<title><![CDATA[ASP.NET MVC Framework与WCSF中MVP模式比较]]></title>
<link>http://0-do.com/oblog313/user1/datou/archives/2008/2467.html</link>
<author>datou</author>
<pubDate>2008-1-4 19:23:21</pubDate>
<description><![CDATA[<P>概述<BR>MVC模式已经出现了几十年了，在GUI领域已经得到了广泛的应用，由于微软ASP.NET MVC Framework的出现，致使MVC一度成为.NET社区的热名话题。作为MVC的变种MVP模式，也已经出现好几年了，在微软模式与实践小组提供的Web Client Software Factory中，给出了实现MVP模式的应用程序最佳实践，本文将试着对这两种实现比较一二。<BR><BR>MVC（Model-View-Controller，模型-视图-控制器）模式是80年代Smalltalk-80出现的一种软件设计模式，后来得到了广泛的应用，其主要目的在于促进应用中模型，视图，控制器间的关注的清晰分离。MVP（Model-View-Presenter，模型-视图-表示器）模式则是由IBM开发出来的一个针对C++和Java的编程模型，大概出现于2000年，是MVC模式的一个变种，主要用来隔离UI、UI逻辑和业务逻辑、数据。在下面的文字中，如无特别说明，MVC均指ASP.NET MVC Framework。<BR><BR>处理流程方面，在MVC中，用户的请求首先会到达Controller，由Controller从Model获取数据，选择合适的View，把处理结果呈现到View上；在MVP中，用户的请求首先会到达View，View传递请求到特定的Presenter，Presenter从Model获取数据后，再把处理结果通过接口传递到View。<BR><BR>View区别<BR>ASP.NET MVC Framework中的View可以是一个ASP.NET页面、用户控件或者是母版页。需要分别s继承于ViewPage、ViewUserControl、ViewMasterPage。示例代码：<BR><BR>public partial class Views_Blog_New : ViewPage<BR>{<BR><BR>}<BR><BR>采用行内代码进行数据的呈现，当然也可以使用服务器控件，示例代码：<BR><BR>
<H2>ASP.NET MVC Framework Sample</H2><BR>
<HR>
<BR><%=Html.ActionLink("Home", "Index")%>|<BR><%=Html.ActionLink("New Post", "New")%><BR><BR>
<DIV><BR><%foreach (Post post in ViewData)<br>      { %><BR>
<DIV class=postitem><BR><STRONG>Title</STRONG>：<%=Html.Encode(post.Title) %><BR><BR><STRONG>Author</STRONG>：<%=Html.Encode(post.Author) %><BR><BR><STRONG>PubDate</STRONG>：<%=Html.Encode(post.PubDate.ToShortDateString()) %><BR><BR><STRONG>Content</STRONG>：<%=Html.Encode(post.Description) %><BR><BR><%=Html.ActionLink("Edit", new {action="Edit", Id=post.Id })%><BR></DIV><BR><BR><% } %><BR></DIV><BR>在MVP中，仍然采用WebForm模型，其中View分为View接口和View实现两部分，实现部分可以是ASP.NET页面、用户控件或者母版页：<BR><BR>public interface IProductDetail<BR>{<BR>string Name { set; }<BR><BR>string Brand { set; }<BR>}<BR>public partial class Products_ProductDetail : Page, IProductDetail<BR>{<BR>}<BR>使用服务器控件进行呈现（也可以是HTML控件）：<BR><BR><?XML:NAMESPACE PREFIX = ASP /><ASP:CONTENT id=content ContentPlaceHolderID="DefaultContent" Runat="Server"><BR>
<H1>ProductDetail</H1><BR>
<P>名称：<ASP:LABEL id=lbl_Name runat="server" Text=""></ASP:LABEL></P><BR>
<P>品牌：<ASP:LABEL id=lbl_Brand runat="server" Text=""></ASP:LABEL></P><BR></ASP:CONTENT><BR>Controller和Presenter<BR>ASP.NET MVC Framework中，一个View在整个应用程序中可以被多个Controller所调用。<BR><BR>public class PostController : Controller<BR>{<BR>[ControllerAction]<BR>public void New()<BR>{<BR>RenderView("New"); <BR>}<BR>}<BR><BR>public class BlogController : Controller<BR>{<BR>[ControllerAction]<BR>public void New()<BR>{ <BR>RenderView("New"); <BR>}<BR>}<BR>MVP中一个View在整个应用程序中只对应一个特定的Presenter：<BR><BR>public partial class Products_ProductDetail : Page, IProductDetail<BR>{<BR>private ProductDetailPresenter _presenter; <BR>protected void Page_Load(object sender, EventArgs e)<BR>{<BR>if (!this.IsPostBack)<BR>{<BR>this._presenter.OnViewInitialized(); <BR>}<BR>this._presenter.OnViewLoaded(); <BR>}<BR><BR>[CreateNew]<BR>public ProductDetailPresenter Presenter<BR>{<BR>set<BR>{<BR>this._presenter = value; <BR>this._presenter.View = this; <BR>}<BR>}<BR>}<BR>对开发过程的影响<BR>在ASP.NET MVC Framework中，采用行内代码进行数据呈现，逻辑集中在Controller中，但是View无法完全交给UI设计人员完成。在MVP模式中，所有的业务逻辑交给Presenter去处理，这样View中代码就变得及其简洁，将可以轻易的把开发人员和UI设计人员分开，如下图所示：<BR><BR><BR><BR>对单元测试的支持<BR>在单元测试方面的支持，ASP.NET MVC Framework在出现的时候就讲促进清晰的关注分离，可测试性和TDD。MVC Framewrok中的所以核心契约都是基于接口的，可以轻易地通过Mock来模拟。可以不用在ASP.NET进程中运行控制器，就能进行单元测试。同时可以使用你想使用的任何单元测试框架来做单元测试，包括NUnit, MBUnit, MS Test等等。<BR><BR>MVP模式的出现，在一定程度上是为了便于UI的单元测试。由于所有的处理都放在了Presenter中，View中的代码变得及其干净简单，所以可以很方便的进行单元测试，Web Client Software Factory中，提供了自动化项目指导包，可以直接创建测试项目。<BR><BR>结束语<BR>对于ASP.NET MVC Framework和WCSF中的MVP模式之小小比较，到这里就结束了，不管是ASP.NET MVC Framework还是WCSF中的MVP模式，都是非常优秀的模型，值得我们更进一步去研究。]]></description>
</item><item>
<title><![CDATA[.net(C#)开发小技巧：在Web开发中绑定数据的三种方法]]></title>
<link>http://0-do.com/oblog313/user1/datou/archives/2008/2466.html</link>
<author>datou</author>
<pubDate>2008-1-4 19:22:47</pubDate>
<description><![CDATA[<P>在web开发中，数据绑定是所有程序员都会遇到，并且经常处理的问题。下面就这个小问题和大家探讨一下关于强类型支持在这个问题中的应用。拙劣不当之处，敬请各路高手斧正。<BR>　<BR>先简单说一下，在我们的数据库有这样一个Programmer表，它有两个字段Name和WebSite，类型都是字符串。我们要处理的问题即是，把这个表从数据库中读出来并在页面上显示。简单吧，让我们开始。<BR>现在我们是一个新手，对.Net数据绑定一无所知，于是我到msdn2搜索了一下，找到这么一个例子：<BR>SqlDataSource<BR><%@ page language="C#" %><BR><BR>"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;<BR><BR><BR><BR><BR><BR><BR>
<FORM id=Form1 runat="server"><BR><BR></P>
<H3>Repeater.DataSourceID Property Example</H3><BR><BR><?XML:NAMESPACE PREFIX = ASP /><ASP:REPEATER id=Repeater1 <br>datasourceid="SqlDataSource1"<BR>runat="server"&gt;<BR><BR><HEADERTEMPLATE><BR>
<TABLE border=1><BR>
<TBODY>
<TR><BR>
<TD><B>Product ID</B></TD><BR>
<TD><B>Product Name</B></TD><BR></TR><BR></HEADERTEMPLATE><BR><BR><ITEMTEMPLATE><BR>
<TR><BR>
<TD><%# Eval("ProductID") %></TD><BR>
<TD><%# Eval("ProductName") %></TD><BR></TR><BR></ITEMTEMPLATE><BR><BR><FOOTERTEMPLATE><BR></TBODY></TABLE><BR></FOOTERTEMPLATE><BR></ASP:REPEATER><BR><BR><ASP:SQLDATASOURCE id=SqlDataSource1 <br>connectionstring="<%$ ConnectionStrings:NorthWindConnection%>" <BR>selectcommand="SELECT ProductID, ProductName FROM [Products] Where ProductID &lt;= 10"<BR>runat="server"&gt;<BR></ASP:SQLDATASOURCE><BR><BR></FORM><BR><BR><BR>这个例子用Repeater的DataSourceID绑定SqlDataSource，简单好用，不需要写什么cs代码，把这个例子修改一下，就可以解决我们的问题。这是第一种方法。这种方法或许只在学校课堂里存在，.Net自学者怕也不屑于学它。<BR>第二种方法。随便在google里搜索一下，发现在页面中直接绑定数据源这种方法很幼稚，在cs中绑定数据被推荐。于是我们想了想，写了如下代码用于解决问题：<BR>页面代码：<BR><ASP:REPEATER id=ProgrammerRepeater_2 runat="server"><BR><ITEMTEMPLATE><BR>
<P><BR>Name:<%# DataBinder.Eval(Container.DataItem,"Name")  %><BR><BR>WebSite:<A href="http://www.0-do.com/oblog313/<%# DataBinder.Eval(Container.DataItem," WebSite?)%>"&gt;<BR><%# DataBinder.Eval(Container.DataItem,"WebSiteName")  %></A></P><BR></ITEMTEMPLATE><BR><SEPARATORTEMPLATE><BR>
<P><BR>--------------------------------------------</P><BR></SEPARATORTEMPLATE><BR></ASP:REPEATER>cs代码：<BR>public partial class StrongTypeDataBinding : System.Web.UI.Page<BR>{<BR>private DataTable _programmerTbl; <BR>private static object syncObj = new object(); <BR><BR>protected void Page_Load(object sender, EventArgs e)<BR>{<BR>ProgrammerRepeater_2.DataSource = ProgrammerTable; <BR>ProgrammerRepeater_2.DataBind(); <BR>}<BR><BR>public DataTable ProgrammerTable<BR>{<BR>get<BR>{<BR>if (null == _programmerTbl)<BR>{<BR>lock (syncObj)<BR>{<BR>if (null == _programmerTbl)<BR>{<BR><BR>_programmerTbl = new DataTable(); <BR>_programmerTbl.Columns.Add("Name", typeof(string)); <BR>_programmerTbl.Columns.Add("WebSite", typeof(string)); <BR><BR>_programmerTbl.Rows.Add("sban", "http://www.sban.com.cn/"); <BR>_programmerTbl.Rows.Add("8th pawnshop", <BR>"http://sban.cnblogs.com/"); <BR>}<BR>}<BR><BR>}<BR><BR>return _programmerTbl; <BR>}<BR>}<BR>}<BR>为了重点说明数据绑定，从数据库读取数据改为由代码生成数据。<BR>这便是第二种方法，编译一下，通过，没有问题。相信98%的读者都没有发现，这个程序其实是不能正常运行的。原因在呢？<BR>看这句：<BR><%# DataBinder.Eval(Container.DataItem,"WebSiteName")  %>WebSiteName这个字段其实是不存在的，但是编译器无法替我检测到这错误。这种错误，此时只能依赖于程序员的细心和严谨。但是经验告诉我们，这份依赖是不可取的。我们需要强类型支持来避免这种错误。<BR>下面我们看第三种解决方法：<BR>页面代码：<BR><ASP:REPEATER id=ProgrammerRepeater_1 runat="server"><BR><ITEMTEMPLATE><BR>
<P><BR>Name:<%# ((Sban.Lab.Programmer)Container.DataItem).Name%><BR><BR>WebSite:<A href="http://www.0-do.com/oblog313/<%# ((Sban.Lab.Programmer)Container.DataItem).WebSite%>"><BR><%# ((Sban.Lab.Programmer)Container.DataItem).WebSite%></A></P><BR></ITEMTEMPLATE><BR><SEPARATORTEMPLATE><BR>
<P><BR>--------------------------------------------</P><BR></SEPARATORTEMPLATE><BR></ASP:REPEATER>cs代码：<BR>public partial class StrongTypeDataBinding : System.Web.UI.Page<BR>{<BR>private IList<PROGRAMMER> _programmerList; <BR>private static object syncObj = new object(); <BR><BR>protected void Page_Load(object sender, EventArgs e)<BR>{<BR>ProgrammerRepeater_1.DataSource = ProgrammerList; <BR>ProgrammerRepeater_1.DataBind(); <BR>}<BR><BR>public IList<PROGRAMMER> ProgrammerList<BR>{<BR>get<BR>{<BR>if (null == _programmerList)<BR>{<BR>lock (syncObj)<BR>{<BR>if (null == _programmerList)<BR>{<BR>_programmerList = new List<PROGRAMMER>(); <BR>_programmerList.Add(new Programmer { Name = "sban", <BR>WebSite = "http://www.sban.com.cn/" }); <BR>_programmerList.Add(new Programmer { Name = "8th pawnshop", <BR>WebSite = "http://sban.cnblogs.com/" }); <BR>}<BR>}<BR><BR>}<BR><BR>return _programmerList; <BR>}<BR>}<BR>}<BR>public class Programmer<BR>{<BR>private string _name; <BR><BR>public string Name<BR>{<BR>get<BR>{<BR>return _name; <BR>}<BR>set<BR>{<BR>_name = value; <BR>}<BR>}<BR><BR>private string _webSite; <BR><BR>public string WebSite<BR>{<BR>get<BR>{<BR>return _webSite; <BR>}<BR>set<BR>{<BR>_webSite = value; <BR>}<BR>}<BR><BR>}<BR>在数据绑定中虽然有显式类型转化，但它可以给我们提供强类型支持，是可以接受的。并且Ilist代替Table，也有更灵活的编程体验。<BR>]]></description>
</item><item>
<title><![CDATA[ASP.NET 3.5 Extensions带来什么]]></title>
<link>http://0-do.com/oblog313/user1/datou/archives/2008/2465.html</link>
<author>datou</author>
<pubDate>2008-1-4 19:21:52</pubDate>
<description><![CDATA[<P>1. 概述 <BR><BR>.NET 3.5和Visual Studio 2008的发布，在微软的.NET战略具有里程碑的意义，在Web开发方面，包含了一个具有强大功能的HTML Web设计器，该设计器提供了分割视图编辑，嵌套母板页，以及完善的CSS集成，同时改进了对JavaScript的支持，包括智能提示和调试等。仅仅在.NET 3.5发布后的20天，微软推出了ASP.NET 3.5 Extensions第一个预览版本，正式版将会在2008年上半年发布，里面包括了更多的ASP.NET 的特性，主要有如下几个部分： <BR>(1) ASP.NET MVC 框架 <BR>(2) ASP.NET AJAX改进 <BR>(3) ASP.NET 动态数据支持 <BR>(4) ASP.NET Silverlight支持 <BR>(5) ADO.NET数据服务 <BR><BR>在本文中，我将通过几个简单的示例来展示ASP.NET 3.5 Extensions中的部分新特性。 <BR><BR>2. ASP.NET MVC框架 <BR><BR>MVC的概念，已经出现了很多年了，它将应用程序的实现分成三个部分，Model进行数据状态的保持，View进行用户界面的展现，Controller进行用来处理用户的交互，操作Model和选择View进行数据的显示。ASP.NET MVC Framework中第一个关注点就是分离，以便方便的进行测试。同时它把aspx页、模板页、用户控件都当作View来使用，同时它还提供了非常强大的URL路由选择引擎，接下来我们通过示例来展示这些特性。 <BR><BR>第一步：建立Model，使用LINQ to SQL类建立一个Product的数据模型 <BR><BR><BR><BR>第二步：建立View，用一个aspx页面来显示Product的详细信息，页面继承于泛型的ViewPage：<BR><BR><BR>public partial class Product_Product : ViewPage<PRODUCTINFO> { protected void Page_Load(object sender, EventArgs e) { } } <BR><BR>在aspx页中显示数据，直接使用<%=%>标记输出：<BR>
<DIV>
<H2>ProductDetail:</H2>ProductId：<%= ViewData.ProductId %><BR><BR>Name：<%= ViewData.Name %><BR><BR>Descn：<%= ViewData.Descn %> </DIV><BR><BR>第三步：建立Controller，继承于Controller基类，并且添加Action方法，同时控制用Product视图来实现数据，并传入要显示的数据对象：<BR><BR>public class ProductController : Controller { [ControllerAction] public void Index() { MSPetShopDataContext db = new MSPetShopDataContext(); ProductInfo productinfo = db.ProductInfos.Single(p =&gt; p.ProductId == "BD-03"); RenderView("Product", productinfo); } } <BR><BR>第四步：配置路径选择，在Application_Start方法中进行配置：<BR><BR>void Application_Start(object sender, EventArgs e) { RouteTable.Routes.Add( new Route { Url = "[controller]/[action].mvc", Defaults = new { action = "Index"}, RouteHandler = typeof(MvcRouteHandler) } ); } <BR><BR>建立一个基于ASP.NET MVC Framework的应用程序，基本上就分上面的四步。目前ASP.NET MVC Framework还只是实现了一些基本的功能，在正式版中，其HTML帮助方法将会有几十个之多，让我们拭目以待吧。 <BR><BR>3. ASP.NET AJAX改进 <BR><BR>在ASP.NET 3.5 Extensions中对于ASP.NET AJAX改进最重要的一点就是更好的浏览器历史的支持，是我们可以很方便的进行控制浏览器的前进、后退按钮。它提供了两种方式供我们选择，使用服务器端控件或者使用客户端脚本。下面我将用示例简单演示一下如何使用服务器段控件进行浏览器历史的控制。 <BR><BR>添加ScriptManager控件，并设置其EnableHistory属性为true，允许浏览器的历史管理，以及OnNavigate处理为OnNavigateHistory函数，以便处理导航时的事件。同时EnableStateHash属性设为了false，主要是为了便于调试，以明文的方式进行状态的查看，如果实际使用的时候可以根据需要决定是否需要对状态进行Hash加密： <BR><BR><BR><?XML:NAMESPACE PREFIX = ASP /><ASP:SCRIPTMANAGER id=ScriptManager1 runat="server" OnNavigate="OnNavigateHistory" EnableHistory="true" EnableStateHash="false"></ASP:SCRIPTMANAGER>创建浏览器历史点，在单击按钮时创建，通过AddHistoryPoint方法来添加：<BR><BR>public void ButtonClick(object sender, EventArgs e) { LabelHistoryData.Text = ((Button)sender).Text; ScriptManager.GetCurrent(this).AddHistoryPoint(key, LabelHistoryData.Text); } <BR><BR>进行导航处理：<BR><BR>public void OnNavigateHistory(object sender, HistoryEventArgs e) { LabelHistoryData.Text = Server.HtmlEncode(e.State[key]); } <BR><BR>同时为了演示，需要在页面上添加三个按钮：<BR><BR><ASP:UPDATEPANEL id=UpdatePanel1 runat="server"><TRIGGERS><ASP:ASYNCPOSTBACKTRIGGER ControlID="Button1" EventName="Click"></ASP:ASYNCPOSTBACKTRIGGER><ASP:ASYNCPOSTBACKTRIGGER ControlID="Button2" EventName="Click"></ASP:ASYNCPOSTBACKTRIGGER><ASP:ASYNCPOSTBACKTRIGGER ControlID="Button3" EventName="Click"></ASP:ASYNCPOSTBACKTRIGGER></TRIGGERS><CONTENTTEMPLATE><ASP:PANEL id=Content runat="server" CssClass="box" Height="40px">Date and Time: <%= DateTime.Now.ToLongTimeString() %><BR>Page's refresh state: <ASP:LABEL id=LabelHistoryData runat="server"></ASP:LABEL></ASP:PANEL></CONTENTTEMPLATE></ASP:UPDATEPANEL>
<P><ASP:BUTTON id=Button1 onclick=ButtonClick runat="server" Text="Key 1"></ASP:BUTTON><ASP:BUTTON id=Button2 onclick=ButtonClick runat="server" Text="Key 2"></ASP:BUTTON><ASP:BUTTON id=Button3 onclick=ButtonClick runat="server" Text="Key 3"></ASP:BUTTON><BR><BR>上面的方式主要是采用了服务器端的方式进行ASP.NET AJAX中对于浏览器历史的支持，同样你也可以采用客户端脚本对浏览器历史进行管理，这里不再说明。<BR></P>]]></description>
</item><item>
<title><![CDATA[ASP.NET WebForm Best Practice 之PostBack]]></title>
<link>http://0-do.com/oblog313/user1/datou/archives/2008/2464.html</link>
<author>datou</author>
<pubDate>2008-1-4 19:21:14</pubDate>
<description><![CDATA[关于PostBack，我曾经也写过一篇博客《深入理解 __doPostBack》。在这篇文章里有对PostBack进行了一些研究，现在看来研究的还是不够深入。不过从原理上来说，ASP.NET WebForm中的一般WEB控件（为什么是一般呢？因为如Button等少数控件不是调用__doPostBack方法的）在向服务器回发请求时，调用的就是__doPostBack方法，通过表单提交的方式来向服务器提交请求。而WebForm所提供的WEB事件模型也是以__doPostBack这个方法为基础的，往服务器传送的两个隐含变量（__EVENTTARGET，__EVENTARGUMENT）就是PostBack事件分发的根据。__EVENTTARGET保存着向服务器发出PostBack请求的控件ID，ASP.NET根据这个ID就可以找到它所对象的服务器端控件的实例。__EVENTARGUMENT保存的是当前PostBack的一些参数。除此之外，PostBack还需要什么条件呢？<BR><BR>在前段时间关于WebForm和MVC的讨论中，有人提到禁用了ViewState，也就无法使用了PostBack。这也给我提了一个醒，确实ViewState与PostBack有非常紧密的关系，在大多数情况下，如果控件的状态是动态维护的。比如说DropDownList的Items是通过下面的代码添加的：<BR><BR>1: protected void Page_Load(object sender, EventArgs e)<BR>2: {<BR>3: if (!this.IsPostBack)<BR>4: {<BR>5: DropDownList1.Items.Add(new ListItem("1", "Value1")); <BR>6: DropDownList1.Items.Add(new ListItem("2", "Value2")); <BR>7: }<BR>8: }<BR><BR>而不是在HTML页面上静态添加（或是在OnInit事件之前添加，不能加IsPostBack的判断），这时，如果禁用ViewState，那么DropDownList的SelectedIndexChanged事件将不会被正常触发，并且DropDownList的Item项将会被清空。所以从这个角度来说，如果要使用PostBack，那么ViewState势必不能被禁用。<BR><BR>除此之外，PostBack还有一些不足：<BR><BR>1）页面在PostBack后，刷新页面时会出现非常不好的用户体验。<BR><BR>2）搜索引擎的不友好。<BR><BR>3）在编写服务器端代码时要特别的小心，特别是对IsPostBack的判断。<BR><BR>尽管PostBack在WebForm的事件机制占有举足轻重的地位，它出现极大的方便了我们以事件驱动方式来开发WEB应用。从短期的入门应用中确实有它重要的意义。但从现实出发，还是必须得根据不同的应用场合有先择性的使用。在网站前台型应用中，应该消灭一切可以消灭的PostBack。因为做为前台，它的作用就是展示还有查询。而如果对查询，分页等操作使用PostBack的话，一方面搜索引擎的不友好，另一方面给大多数用户带来非常不好的用户体验，增加了整个页面的请求时间。同时，它们所传的参数又非常有限，这情况下就需要使用链接的方式来传参。<BR><BR>对于应用型的后台开发，由于在提交数据时可能会有比较多的表单数据。这时，这时结合DetailView或FormView，使用PostBack来提交数据又可以给我们带来非常大的方便，这种情况下我们不禁用ViewState也没有关系，ViewState并不会很大，而至于刷新的问题，我们可以使用UpdatePanel来帮助解决。但是如果对于浏览数据仍然是要特别注意，特别是有GridView的页面进行PostBack数据查询，分页时，尽量都能改成链接的方式来实现。<BR><BR>总体来说，PostBack的使用还是要特别注意，能少用就少用，但有时用它确实也会给我们带来非常大的方便。对于应用型的后台开发，如果使用EXT的话，那么就是可以完全摒弃WebForm，或MVC了。因为它有自己一整套完整的开发流程，从目前来看，确实是一种全新的体验。<BR><BR>连续两篇讨论的PostBack和ViewState，可能结论都是偏向消极的。它们的存在有其重要意义的同时，难免会带来一些负面影响，但这种影响的代价在很多情况下过大而导致大多数人的反唇相讥。在软件工程中，衡量软件的标准不是越快越好，而是在用户接受的合理的时间范畴内，得到正确的结果，并且它所花费的代价（包括开发，维护，部署等成本）是最少的。我相信只要使用得当，它们还是可以充分发挥它们的作用的。<BR><BR>从极端的来说，去掉PostBack和ViewState后，WebForm仍然还是WebForm。它只是少了两样两把利弊同样明显的双刃剑，它余下的事件机制，组件化开发，页面模型仍然是我们进行WebForm开发最有力的武器。<BR>]]></description>
</item><item>
<title><![CDATA[性能提升10倍的Ajax远程脚本调用引擎]]></title>
<link>http://0-do.com/oblog313/user1/datou/archives/2008/2463.html</link>
<author>datou</author>
<pubDate>2008-1-4 19:20:16</pubDate>
<description><![CDATA[EasyJWeb中已经有了一个Ajax远程脚本调用引擎，这是很早的事情了。但由于一直存在一些性能问题，所以一直没有给大家推荐，直到最近m3发布，通过对Ajax远程脚本调用引擎进行完善，把处理复杂对象的返回进行的简化，通过在以前的几个应用中进行了测试，发现性能一下子提升了至少10倍以上，并且运行比较稳定，因此在这里给大家推荐推荐。 <BR>　　Ajax远程脚本调用示例演示：http://easyjweb.demo.easyjf.com/ajax/ajax.html<BR><BR>　　完整的示例应用及源码下载：ftp://ftp1.easyjf.com/easyjweb/demo/ajax.war<BR>　　<BR><BR>　　EasyJWeb是一个提供了对Ajax远程脚本调用功能支持的框架，他帮助你完成Ajax远程脚本调用中的大多数细节工作，你基本上不用写额外的代码就能非常轻松的使用javascript来调用服务器的业务组件的相关方法，这些业务组件可以是任何java对象，比如EJB、EasyJWeb容器中的Bean、Spring容器中的Bean等等。使用EasyJWeb的Ajax远程脚本调用，需要下面的几个步骤：<BR>　　1、 在EasyJWeb容器或子容器中配置供客户端脚本调用的业务组件。比如，在easyjweb的配置文件中像下面的方式配置Bean：<BR><BR><BEAN class=easyjweb.demo.service.impl.PersonServiceImpl name="PersonService" /><BR>PersonServiceImpl的代码如下：<BR><BR>package easyjweb.demo.service.impl; <BR>import java.util.Date; <BR>import java.util.List; <BR>import java.util.Map; <BR>public class PersonServiceImpl {<BR>/**<BR>* 得到服务器当前时间<BR>* @return<BR>*/<BR>public Date getTime() {<BR>return new Date(); <BR>}<BR>}<BR>2、 在EasyJWeb的配置文件，配置要把容器中的哪些业务组件及具体方法暴露给客户端进行远程脚本调用。内容大致如下：<BR><BR><AJAX><BR><SERVICES allowName="*"><BR><SERVICE name="PersonService" /><BR></SERVICES><BR></AJAX><BR>上面的ajax配置信息表示暴PersonService的所有public方法供客户端使用javascript调用。<BR>只需要上面的两步，就完成了服务器端的相关工作。服务器端不再需要写任何Action，EasyJWeb会自动处理客户端发送来的Ajax远程脚本调用，下面我们进一步看看客户端的程序。<BR>3、为了能够在客户端页面中直接使用javascript进行对PersonService业务组件的Ajax远程脚本调用，我们需要在页面中引入下面三个js。<BR><BR>
<SCRIPT src="http://www.0-do.com/oblog313/ejf/easyajax/prototype.js" type=text/javascript></SCRIPT>
<BR>
<SCRIPT src="http://www.0-do.com/oblog313/ejf/easyajax/engine.js" type=text/javascript></SCRIPT>
<BR>
<SCRIPT src="http://www.0-do.com/oblog313/ejf/easyajax/PersonService.js" type=text/javascript></SCRIPT>
<BR>　　其中第一个ejf/easyajax/prototype.js引入的是prototype.js，这是一个javascript的基础库，提供很多对基础javascript类的扩展，并提供了ajax相关的实用组件，EasyJWeb的远程脚本调用引擎是基于prototype.js构建的。<BR>　　第二个ejf/easyajax/engine.js是EasyJWeb的远程脚本调用支持引擎，他负责处理Ajax远程脚本调用的相关的细节，如参数处理、回调处理等，同时提供了一些实用工具如EasyAjaxUtil等供客户端使用。<BR>　　第三个ejf/easyajax/PersonService.js是PersonService对象，PersonService.js的内容是根据服务器端的容器中名为PersonService的Bean及EasyJWeb的ajax配置信息生成的。只要引入了PersonService.js，我们就可以直接在页面中调用PersonService的相关方法了。<BR>　　上面的三个js文件都是服务器端动态生成的，需要我们在web.xml文件把所有/ejf/*的URL都交由EasyJWeb来处理。因此，需要在Web.xml的url中增加如下的映射内容：<BR><BR><SERVLET-MAPPING><BR><SERVLET-NAME>easyjf</SERVLET-NAME><BR><URL-PATTERN>/ejf/*</URL-PATTERN><!--所有/ejf/开头的url都由easyjweb来处理--><BR></SERVLET-MAPPING><BR><BR>4、 在页面中使用javascript调用服务器的相关方法<BR><BR>
<SCRIPT><br>function showServerTime(){<br>PersonService.getTime(showTime) ; <br>function showTime(ret){<br>alert("服务器端时间: "+ret) ; <br>}<br>}<br></SCRIPT>
<BR>　　怎么样，一切都是如此简单，不需要写任何PersonService的代码，不需要写任何Action，只需要进行非常简单的配置，就能让我们服务器上的业务组件支持Ajax远程脚本调用。<BR>]]></description>
</item><item>
<title><![CDATA[苹果即将加入蓝光阵营？]]></title>
<link>http://0-do.com/oblog313/user1/datou/archives/2008/2462.html</link>
<author>datou</author>
<pubDate>2008-1-4 19:17:22</pubDate>
<description><![CDATA[<P>来自华尔街证券研究机构American Technology Research的分析师Shaw Wu，在最新的客户报告中根据内部消息来源透露，苹果公司将在本月中旬的MacWorld展会上宣布自己的高清策略，并加入索尼领导的蓝光BD阵营。</P>
<P>实际上，苹果公司早在2005年已经加入了指定蓝光BD标准的“蓝光论坛”。苹果公司首席执行官史蒂夫乔布斯担当董事会成员的迪斯尼公司也是蓝光BD的支持者。另外值得一提的是，微软是HD DVD的阵营的一员，这可能也是苹果投向蓝光BD的原因之一。但Shaw Wu同时还表示：“尽管可能性很小，但不排除苹果可能会使用BD/HD DVD Combo光驱，以保证最大兼容性，并避免介入格式大战。”</P>
<P>苹果长期以来一直为从专业客户到家庭用户提供高清视频编辑软件，但却从未在任何一款机型中加入高清光驱。据AppleInsider网站报道的消息，苹果即将在本季度内宣布新款的Mac Pro高端工作站产品，首次提供蓝光BD光驱的配置选项。</P>
<P>另外，之前有消息称，苹果专业视频软件Final Cut Pro的用户受邀在本月16日（乔布斯MacWorld演讲后第二天），在MacWorld会场参加一次会议，到时会有“惊喜”等着他们。我们分析，同今天的消息相结合。这次会议的“惊喜”可能就同蓝光光驱或新款Mac Pro有关。</P><!-- Content End -->]]></description>
</item><item>
<title><![CDATA[宏碁笔记本在俄罗斯销量第一 市占达到42％]]></title>
<link>http://0-do.com/oblog313/user1/datou/archives/2008/2461.html</link>
<author>datou</author>
<pubDate>2008-1-4 19:16:00</pubDate>
<description><![CDATA[<P>　　网易科技讯 1月4日消息，新兴市场是笔记本销售成长最快的区域，包括IDC、GARNER等市调单位今年仍看好新兴市场的成长，宏碁在新兴市场布局也相当积极，其中俄罗斯市场第三季传来捷报，经过三年布局，宏碁俄罗斯市占率达到42％。</P>
<P>　　宏碁分家就锁定发展笔记本，另外将全力进攻欧洲市场，因此在短短几年拿下欧洲笔记本市占率第一的位置，三年前进军俄罗斯市场，与当地通路厂商合作，将欧洲成功经验复制到俄罗斯。</P>
<P>　　宏碁分析，在俄罗斯能够成功，主要是其他竞争者如戴尔之前专心直销市场，而惠普忙于并购康柏之后的整合动作，因此宏碁趁机在俄罗斯等新兴市场布局，一举拿下42％市占率，遥遥领先其他厂商。</P>
<P>　　除俄罗斯外，成长快速的东南亚市场也是宏碁目前成长快速的几个市场，也在马来西亚、泰国、菲律宾等地拿下市占率第一的位置。</P>
<P>　　宏碁高层分析，今年宏碁可以维持高速成长，推出Gemstone的新款消费性笔记本是重要原因，在品牌、代工分家之后，宏碁更可以专注在如何创造品牌价值上，这也其他有益分家的厂商可以效法的作法。针对一月起正式分家的华硕，宏碁也给予祝福。 (Ahkan)</P><!-- Content End -->]]></description>
</item><item>
<title><![CDATA[摩托罗拉推出首款电视手机 采用欧洲标准]]></title>
<link>http://0-do.com/oblog313/user1/datou/archives/2008/2460.html</link>
<author>datou</author>
<pubDate>2008-1-4 19:15:23</pubDate>
<description><![CDATA[<P>　　新浪科技讯 北京时间1月4日消息，据国外媒体报道，摩托罗拉最新推出了首款可收看电视节目的手机，希望借此扩大在便携式消费电子市场的份额。</P>
<P>　　摩托罗拉周四透露，将在下周拉斯维加斯召开的CES消费电子大展上展示这款型号为“DH01”的手机，该手机还具有视频点播等功能。DH01是摩托罗拉推出的第一款电视手机。随着手机价格的走跌，移动运营商希望通过手机电视这项新业务来增加利润。</P>
<P>　　目前，摩托罗拉以及竞争对手诺基亚、三星、LG电子已相继推出了电视手机。尽管苹果的iPod和iPhone也可以下载视频，但目前还不支持电视播放功能。</P>
<P>　　Gartner负责移动设备研究的研究总监罗琳娜·米兰尼斯(Carolina Milanesi)表示：“我认为这类产品将越来越多。”她表示，还不能确定消费者是否愿意在手机之外再携带移动电视设备。</P>
<P>　　摩托罗拉透露，DH01将于本月正式商用，预计由电视台、消费电子零售商以及移动运营商进行销售。</P>
<P>　　DH01配有4.3英寸屏幕，电池支持四小时回放，并具有5分钟电视节目暂停功能，插入存储卡后，最多可以播放90分钟视频。</P>
<P>　　DH01还兼容手机电视标准DVBH，诺基亚及欧盟委员会都是该标准的支持者。目前，意大利和芬兰均推出了基于DVBH的服务，但由于缺乏无线牌照，欧洲其它国家目前还没有推出这一服务的时间。</P>
<P>　　美国投资公司Oppenheimer的分析师劳伦斯·哈里斯(Lawrence Harris)预计，DVBH在欧洲普及还需数年。他认为，由于摩托罗拉机旗下拥有机顶盒部门，因此不需要额外的投资就可以发展移动电视设备。</P>
<P>　　去年，美国第二大移动运营商Verizon无线开始提供基于MediaFlo标准的手机电视服务，MediaFlo的开发商为高通公司。(陈晶)</P><!-- Content End -->]]></description>
</item><item>
<title><![CDATA[iPhone年底总销量有望超1200万部 或再降价]]></title>
<link>http://0-do.com/oblog313/user1/datou/archives/2008/2459.html</link>
<author>datou</author>
<pubDate>2008-1-4 19:14:52</pubDate>
<description><![CDATA[<P>　　新浪科技讯 北京时间1月4日消息，据国外媒体报道，苹果公司2007年高调推出的iPhone被分析师评为有史以来最畅销的消费电子产品，研究机构普遍预测，iPhone今年的销售将超出苹果预期。</P>
<P>　　有分析师预测，今年上半年可能不会有iPhone新机型推出。依照惯例，苹果会在年初的“Macworld展会”上发布新产品。众多苹果粉丝翘首企盼CEO史蒂夫·乔布斯(Steve Jobs)在会上推出尺寸更小的iPhone。</P>
<P>　　市场调查公司Envisioneering Group的独立分析师理查德·达赫迪(Richard Doherty)认为，苹果会对iPhone现有型号进行升级，包括支持上网速度更快的网络，且电池待机时间将有所提高。对于这些猜测，苹果拒绝发表评论。</P>
<P>　　尽管iPhone一经问世便如潮好评，但也有批评者抱怨，其合作运营商AT&amp;T的网络太慢。不过，AT&amp;T已宣布今年将对iPhone服务提速。另外，苹果表示，将在今年2月向外部软件开发者开放iPhone。此举必将使iPhone成为应用更广泛的设备。达赫迪希望在Macworld上看到新款iPhone，“你将看到，苹果与金融机构合作，把iPhone变成类似信用卡的玩意儿。”</P>
<P>　　1年前，乔布斯在Macworld上首次推出iPhone，当时他预计，截至2008年底，将售出1000万部iPhone。美国投资银行Piper Jaffray的分析师吉尼·穆斯特(Gene Munster)认为，iPhone总销量有望突破1200万部，而且销售增量主要来自今年末。穆斯特预测，届时苹果会把iPhone售价从399美元降至299美元。</P>
<P>　　据Envisioneering Group的分析师达赫迪统计，iPhone目前的销量约为300万部。苹果的官方数字显示，截至去年9月30日，iPhone在美国共售出140万部。</P>
<P>　　iPhone去年6月29日正式发售，9月10日销量便达到100万。为此，达赫迪将iPhone称为消费电子产品中的“销售之王”。达赫迪表示，苹果在手机市场所占份额已经超过采用微软Windows Mobile操作系统的智能手机，后者的用户不足100万。但iPhone较之采用Palm操作系统的手机总销量还有相当距离，因为单是“Treo”手机的用户人数就已超过200万，“但他们用了8年多的时间才取得这一成绩。”(王宇)</P><!-- Content End -->]]></description>
</item>
</channel>
</rss>
