[C#]ASP.NET MVC:技巧:使用可扩展对象模式扩展HttpApplication

mikel阅读(760)

概述

HttpApplication对象对于做ASP.NET开发的朋友,我想没有人不熟悉它。在ASP.NET开发中,经 常避免不了要在HttpApplication中执行一些操作,如使用了ASP.NET MVC框架,就会在Application_Start 事件中避免不了这样的路由规则配置代码:

protected void Application_Start()
{
RouteTable.Routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
RouteTable.Routes.MapRoute(
"Default",                                              // Route name
"{controller}/{action}/{id}",                           // URL with parameters
new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
);
}

如果仅仅是这一条,看起来倒不觉的有什么问题,但如果同时在应用程序中使用了工作流,又避免不了在Application_Start出现启动工作流运行时的代码:

protected void Application_Start()
{
// 注册路由规则
RouteTable.Routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
RouteTable.Routes.MapRoute(
"Default",                                              // Route name
"{controller}/{action}/{id}",                           // URL with parameters
new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
);
// 启动工作流
WorkflowRuntime workflowRuntime = new WorkflowRuntime("workflowServicesConfig");
ExternalDataExchangeService externalDataExchangeService = new ExternalDataExchangeService();
workflowRuntime.AddService(externalDataExchangeService);
workflowRuntime.StartRuntime();
}

试想一下,现在我们仅仅是有了ASP.NET MVC路由规则的配置、WF运行时的启动,如果在应用程序中使用某种DI框架,如微软的Unity,是不是又避免不了要出现这样的容器初始化代码呢?

protected void Application_Start()
{
// 注册路由规则
RouteTable.Routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
RouteTable.Routes.MapRoute(
"Default",                                              // Route name
"{controller}/{action}/{id}",                           // URL with parameters
new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
);
// 启动工作流
WorkflowRuntime workflowRuntime = new WorkflowRuntime("workflowServicesConfig");
ExternalDataExchangeService externalDataExchangeService = new ExternalDataExchangeService();
workflowRuntime.AddService(externalDataExchangeService);
workflowRuntime.StartRuntime();
// 初始化DI容器
IContainerContext repositoryContainer = ContainerManager.GetContainer("repositoryContainer");
repositoryContainer.Initialize();
}

再看看Application_Start事件中的代码,有ASP.NET MVC的工作,有WF的工作,也有Unity的工作,不知道将来还会有什么?这些原本互相之间没有任何联系的代码,现在却同时堆在了一起,当每一部分(或 者说每一个框架)变化的时候,都会涉及到Application_Start中代码的修改,显然违反了OCP原则。那么有没有一种机制,让这些互不相干的 模块之间互相独立,各自发生变化时不影响对HttpApplication?此时我们就需要对HttpApplication进行扩展,提供一个扩展点, 让其他模块的程序附加到HttpApplication上面。

可扩展对象模式

我们知道WCF提供了非常完美的扩展机制,几乎在服务执行过程中的每一个环节上都提供有扩展点,如ServiceHostBase、 OperationContext、InstanceContext、IContextChannel,这些对象都属于可扩展对象,它们都通过 Extensions属性获取用于所有扩展的集合。我们能不能使用这种方式对HttpApplication也进行扩展呢,答案自然是肯定的。查阅一下 MSDN就会知道在System.ServiceModel命名空间下面提供了这样的一组接口:IExtensibleObject、 IExtension和IExtensionCollection,这是可扩展对象模式中最重要的三个接口,也只有这三个接口。

IExtensibleObject自然是定义了可扩展对象,即我们要对谁进行扩展,它的定义非常简单,仅仅是提供了一个只读的属性Extensions,用来提供所有扩展对象的集合,如下代码所示:

public interface IExtensibleObject<T> where T : IExtensibleObject<T>
{
IExtensionCollection<T> Extensions { get; }
}

IExtension定义了扩展对象的契约,使对象可以通过聚合扩展另一个对象(此处的另一个对象,就是指上面所讲的扩展宿主 IExtensibleObject),在IExtension中定义了两个非常重要的方法Attach和Detach方法,分别用来提供聚合或解聚的通 知。

public interface IExtension<T> where T : IExtensibleObject<T>
{
void Attach(T owner);
void Detach(T owner);
}

当一个扩展对象IExtension附加到可扩展对象的扩展集合中时,它的Attach方法将会被调用;反之如果从集合中移除一个扩展对象时,它的Detach方法会被调用。这一点我们可以通过Reflector来得到验证,如下代码所示:

protected override void InsertItem(int index, IExtension<T> item)
{
lock (base.SyncRoot)
{
item.Attach(this.owner);
base.InsertItem(index, item);
}
}
protected override void RemoveItem(int index)
{
lock (base.SyncRoot)
{
base.Items[index].Detach(this.owner);
base.RemoveItem(index);
}
}

最后一个接口是IExtensionCollection,它是IExtension对象的集合。

对HttpApplication进行扩展

下面我们就看一下如何使用可扩展对象模式对HttpApplication进行扩展,首先定义可扩展对象,让 ExtensibleHttpApplication派生于HttpApplication,并实现了IExtensibleObject接口,泛型的参 数类型就是它自身,如下代码所示:

public class ExtensibleHttpApplication : HttpApplication,
IExtensibleObject<ExtensibleHttpApplication>
{
private IExtensionCollection<ExtensibleHttpApplication> _extensions;
public ExtensibleHttpApplication()
{
this._extensions = new ExtensionCollection<ExtensibleHttpApplication>(this);
}
public IExtensionCollection<ExtensibleHttpApplication> Extensions
{
get
{
return this._extensions;
}
}
}

有了可扩展的HttpApplication之后,需要在HttpApplication中实现任何功能,都可以作为一个扩展附加到ExtensibleHttpApplication上去,如实现ASP.NET MVC路由,可以定义一个如下代码所示的扩展对象:

public class MvcHttpApplication : IExtension<ExtensibleHttpApplication>
{
public void Attach(ExtensibleHttpApplication owner)
{
RouteTable.Routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
RouteTable.Routes.MapRoute(
"Default",                                              // Route name
"{controller}/{action}/{id}",                           // URL with parameters
new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
);
}
public void Detach(ExtensibleHttpApplication owner)
{
//nothing
}
}

同样如果要在HttpApplication中启动Workflow,可以再针对Workflow定义一个扩展对象,如下示例代码所示:

public class WorkflowHttpApplication : IExtension<ExtensibleHttpApplication>
{
private WorkflowRuntime workflowRuntime;
public void Attach(ExtensibleHttpApplication owner)
{
workflowRuntime = new WorkflowRuntime("workflowServicesConfig");
ExternalDataExchangeService externalDataExchangeService = new ExternalDataExchangeService();
workflowRuntime.AddService(externalDataExchangeService);
workflowRuntime.StartRuntime();
}
public void Detach(ExtensibleHttpApplication owner)
{
workflowRuntime.StopRuntime();
}
}

我们已经定义好了相应的扩展对象,只需要在相应的HttpApplication把扩展对象附加到ExtensibleHttpApplication上即可,修改Global.asax中的代码如下所示:

public class MvcApplication : ExtensibleHttpApplication
{
protected void Application_Start()
{
this.Extensions.Add(new MvcHttpApplication());
this.Extensions.Add(new WorkflowHttpApplication());
}
}

现在代码是不是看起来优雅多了?现在如果要在Application_Start中,添加另外一些执行代码,只需要编写相应的扩展对象,并将其添加 到Extension集合中即可。也许有朋友会问,这样每添加一些新的代码,还是要修改Application_Start中的代码啊?别忘了,可以通过 配置可以解决这个问题,WCF中的扩展不也是可以采用配置方式实现,不是吗?同样,如果我们需要在Application_End事件中释放某些对象,可 以直接从扩展集合中移除它,此时将会调用它的Detach方法。

总结

本文介绍了如何使用WCF中提供的可扩展对象模式扩展HttpApplication,事实上可扩展对象模式的作用远不在此,它可以扩展.NET类库中任何我们想对其进行扩展的对象,或者是一个自定义的类型,都可以使用可扩展对象模式对其进行扩展。

特别鸣谢:Jesse Qu

注1:由于TerryLee最近一段时间忙于别的事务,无暇顾及Blog,所以有大量的评论和E-mail都没能回复,请大家见谅。

注2:由TerryLee撰写的《Silverlight 2完美征程》一书,即将于本月底上市,敬请期待,详情大家可以访问本书官方网站http://www.dotneteye.cn/silverlight了解。

作者:TerryLee
出处:http://terrylee.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

[SQL]SQL Server日期转换函数Convert

mikel阅读(765)

我们经常出于某种目的需要使用各种各样的日期格式,当然我们可以使用字符串操作来构造各种日期格式,但是有现成的函数为什么不用呢?
SQL Server中文版的默认的日期字段datetime格式是yyyy-mm-dd Thh:mm:ss.mmm
例如:
select getdate()
2004-09-12 11:06:08.177
整理了一下SQL Server里面可能经常会用到的日期格式转换方法:
举例如下:
select CONVERT(varchar, getdate(), 120 )
2004-09-12 11:06:08
select replace(replace(replace(CONVERT(varchar, getdate(), 120 ),'-',''),' ',''),':','')
20040912110608
select CONVERT(varchar(12) , getdate(), 111 )
2004/09/12
select CONVERT(varchar(12) , getdate(), 112 )
20040912
select CONVERT(varchar(12) , getdate(), 102 )
2004.09.12
select CONVERT(varchar(12) , getdate(), 101 )
09/12/2004
select CONVERT(varchar(12) , getdate(), 103 )
12/09/2004
select CONVERT(varchar(12) , getdate(), 104 )
12.09.2004
select CONVERT(varchar(12) , getdate(), 105 )
12-09-2004
select CONVERT(varchar(12) , getdate(), 106 )
12 09 2004
select CONVERT(varchar(12) , getdate(), 107 )
09 12, 2004
select CONVERT(varchar(12) , getdate(), 108 )
11:06:08
select CONVERT(varchar(12) , getdate(), 109 )
09 12 2004 1
select CONVERT(varchar(12) , getdate(), 110 )
09-12-2004
select CONVERT(varchar(12) , getdate(), 113 )
12 09 2004 1
select CONVERT(varchar(12) , getdate(), 114 )
11:06:08.177
帮助文档中的信息

Without century (yy) With century (yyyy) Standard Input/Output**
0 or 100 (*) Default mon dd yyyy hh:miAM (or PM)
1 101 USA mm/dd/yy
2 102 ANSI yy.mm.dd
3 103 British/French dd/mm/yy
4 104 German dd.mm.yy
5 105 Italian dd-mm-yy
6 106 dd mon yy
7 107 Mon dd, yy
8 108 hh:mm:ss
9 or 109 (*) Default + milliseconds mon dd yyyy hh:mi:ss:mmmAM (or PM)
10 110 USA mm-dd-yy
11 111 JAPAN yy/mm/dd
12 112 ISO yymmdd
13 or 113 (*) Europe default + milliseconds dd mon yyyy hh:mm:ss:mmm(24h)
14 114 hh:mi:ss:mmm(24h)
20 or 120 (*) ODBC canonical yyyy-mm-dd hh:mi:ss(24h)
21 or 121 (*) ODBC canonical (with milliseconds) yyyy-mm-dd hh:mi:ss.mmm(24h)
126(***) ISO8601 yyyy-mm-dd Thh:mm:ss:mmm(no spaces)
130* Kuwaiti dd mon yyyy hh:mi:ss:mmmAM
131* Kuwaiti dd/mm/yy hh:mi:ss:mmmAM

[UI]中文logo设计的10种秘传方法

mikel阅读(768)

1.       连接法——结合字体特征将笔画相连接的形式


2.       简化法——根据字体特点,利用视觉错觉合理地简化字体部分笔画的形式

3.       附加法——在字体外添加配合表现标示的图形的形式


4.       底图法——将字体镶嵌于色块或图案中的形式

5.       象征法——将字体的笔画进行象征性演变的形式

6.       柔美法——结合字体特征,运用波浪或卷曲的线条来表现的形式


7.       刚直法——用直线型的笔画来组成字体的形式

8.       印章法——以中国传统印章为底纹或元素的形式

9.       书法法——把中国书法融入字体设计中的形式


10.   综合元素——综合使用各种风格来修饰标志的形式

[SQL]解决ASP.NET Web Applicatio超时时间已到.在操作完成之前超时时间已过或

mikel阅读(794)

初步分析原因为对MSSQL操作时连接超时,知道这事,以前没留意,大概是在配置文件中设置连接时限,在网上找了下解决方法,大多说在数据库连接字符串里解决

SQLConnection con = new SqlConnection("server=.;database=myDB;uid=sa;pwd=password;")

改为:

SqlConnection con = new SqlConnection("server=.;database=myDB;uid=sa;pwd=password;Connect Timeout=500")

似乎没效果。依然运行30秒即报超时!
突然感觉似乎应该可以在连接数据库代码中指明,式了下con的属性,有个ConnectionTimeout,

SqlConnection con = new SqlConnection("server=.;database=myDB;uid=sa;pwd=;");
con.ConnectionTimeout 
= 180;//报错,属性ConnectionTimeout 为只读!

尝试失败,再接着看command对象属性,发现其也有类似属性!CommandTimeout设置一下:

SqlCommand cmd = new SqlCommand();
cmd.CommandTimeout 
= 180;

再运行,即解决,这里设置的时间的180秒,即三分钟!可根据需要设置,如果过长,也可以设置为0,当此属性设置为0时表示不限制时间。此属性值应该慎用。还需要在Web.config配置文件中设置http请求运行时限间

<system.web>  
<httpRuntime maxRequestLength="102400" executionTimeout="720" />
</system.web>

这里设置的为720秒,前面的属性maxRequestLength一般用于用户上传文件限制大小!默认一般为4096 KB (4 MB)。
看一下来自MSDN解释:
     httpRuntime是配置ASP.NET http运行时设置,以确定如何处理对ASP.NET应用程序的请求。
     executionTimeout:表示允许执行请求的最大时间限制,单位为秒
     maxRequestLength:指示 ASP.NET 支持的最大文件上载大小。该限制可用于防止因用户将大量文件传递到该服务器而导致的拒绝服务攻击。指定的大小以 KB 为单位。默认值为 4096 KB (4 MB)。
     useFullyQualifiedRedirectUrl:表示指示客户端重定向是否是完全限定的(采用 "http://server/path" 格式,这是某些移动控件所必需的),或者指示是否代之以将相对重定向发送到客户端。如果为 True,则所有不是完全限定的重定向都将自动转换为完全限定的格式。false 是默认选项。
     minFreeThreads:表示指定允许执行新请求的自由线程的最小数目。ASP.NET 为要求附加线程来完成其处理的请求而使指定数目的线程保持自由状态。默认值为 8。
    minLocalRequestFreeThreads:表示ASP.NET 保持的允许执行新本地请求的自由线程的最小数目。该线程数目是为从本地主机传入的请求而保留的,以防某些请求在其处理期间发出对本地主机的子请求。这避免 了可能的因递归重新进入 Web 服务器而导致的死锁。
    appRequestQueueLimit:表示ASP.NET 将为应用程序排队的请求的最大数目。当没有足够的自由线程来处理请求时,将对请求进行排队。当队列超出了该设置中指定的限制时,将通过“503 – 服务器太忙”错误信息拒绝传入的请求。
    enableVersionHeader:表示指定 ASP.NET 是否应输出版本标头。Microsoft Visual Studio 2005 使用该属性来确定当前使用的 ASP.NET 版本。对于生产环境,该属性不是必需的,可以禁用。

MSDN:MSND官方解释说明

[文档]介绍几个开源协议

mikel阅读(837)

下面列出了几个比较常见的开源协议,如果想要了解其他的协议和详细了解这些协议,我个人推荐这个网址:http://www.opensource.org/licenses/


Mozilla Public License

MPL License,允许免费重发布、免费修改,但要求修改后的代码版权归软件的发起者。这种授权维护了商业软件的利益,,它要求基于这种软件得修改无偿贡献 版权给该软件。这样,围绕该软件得所有代码得版权都集中在发起开发人得手中。但MPL是允许修改,无偿使用得。MPL软件对链接没有要求。

BSD开源协议

BSD开源协议是一个给于使用者很大自由的协议。可以自由的使用,修改源代码,也可以将修改后的代码作为开源或者专有软件再发布。 当你发布使用了BSD协议的代码,或则以BSD协议代码为基础做二次开发自己的产品时,需要满足三个条件:
1. 如果再发布的产品中包含源代码,则在源代码中必须带有原来代码中的BSD协议。
2. 如果再发布的只是二进制类库/软件,则需要在类库/软件的文档和版权声明中包含原来代码中的BSD协议。
3. 不可以用开源代码的作者/机构名字和原来产品的名字做市场推广。
BSD代码鼓励代码共享,但需要尊重代码作者的著作权。BSD由于允许使用者修改和重新发布代码,也允许使用或在BSD代码上开发商业软件发布和销售,因 此是对商业集成很友好的协议。而很多的公司企业在选用开源产品的时候都首选BSD协议,因为可以完全控制这些第三方的代码,在必要的时候可以修改或者二次 开发。

Apache Licence 2.0

Apache Licence是著名的非盈利开源组织Apache采用的协议。该协议和BSD类似,同样鼓励代码共享和尊重原作者的著作权,同样允许代码修改,再发布(作为开源或商业软件)。需要满足的条件:
1. 需要给代码的用户一份Apache Licence
2. 如果你修改了代码,需要再被修改的文件中说明。
3. 在延伸的代码中(修改和有源代码衍生的代码中)需要带有原来代码中的协议,商标,专利声明和其他原来作者规定需要包含的说明。
4. 如果再发布的产品中包含一个Notice文件,则在Notice文件中需要带有Apache Licence。你可以在Notice中增加自己的许可,但不可以表现为对Apache Licence构成更改。
Apache Licence也是对商业应用友好的许可。使用者也可以在需要的时候修改代码来满足需要并作为开源或商业产品发布/销售。

GPL

GPL许可证是自由软件的应用最广泛的软件许可证,人们可以修改程式的一个或几个副本或程式的任何部分,以此形成基於这些程式的衍生作品。必须在修 改过的档案中附有明显的说明:您修改了此一档案及任何修改的日期。您必须让您发布或出版的作品,包括本程式的全部或一部分,或内含本程式的全部或部分所衍 生的作品,允许第三方在此许可证条款下使用,并且不得因为此项授权行为而收费。
LGPL

Linux就是采用了GPL。GPL协议和BSD, Apache Licence等鼓励代码重用的许可很不一样。GPL的出发点是代码的开源/免费使用和引用/修改/衍生代码的开源/免费使用,但不允许修改后和衍生的代 码做为闭源的商业软件发布和销售。这也就是为什么我们能用免费的各种linux,包括商业公司的linux和linux上各种各样的由个人,组织,以及商 业软件公司开发的免费软件了。
GPL协议的主要内容是只要在一个软件中使用(“使用”指类库引用,修改后的代码或者衍生代码)GPL协议的产品,则该软件产品必须也采用GPL协议,既 必须也是开源和免费。这就是所谓的”传染性”。GPL协议的产品作为一个单独的产品使用没有任何问题,还可以享受免费的优势。
由于GPL严格要求使用了GPL类库的软件产品必须使用GPL协议,对于使用GPL协议的开源代码,商业软件或者对代码有保密要求的部门就不适合集成/采用作为类库和二次开发的基础。
其它细节如再发布的时候需要伴随GPL协议等和BSD/Apache等类似

Public Domain

公共域授权。将软件授权为公共域,这些软件包没有授权协议,任何人都可以随意使用它。

Artistic许可

使作者保持对进一步开发的控制。

[Asp.Net]ASP.Net获得新浪天气预报几种方式总结

mikel阅读(666)

刚赶工写了一个获取新浪天气预报的功能,顺便把代码分享了出来,以后再有这样的工作,大家可以直接把代码拿来使用。

1.利用新浪提供给的iframe直接嵌入,这种方式非常的简单,但是却没有交互性。代码如下:

<iframe frameborder="0" src="http://php.weather.sina.com.cn/widget/weather.php" scrolling="no" width="246" height="360"></iframe>

 

2.抓取当天的天气,以指定格式输出。

涉及的核心代码如下:


public static ArrayList GetWeather(string code)
        {
            
/*
            [0] "北京 "string
            [1] "雷阵雨 "string
            [2] "9℃" string
            [3] "29℃"string
            [4] "小于3级"string
            
*/
            
string html = "";
            
try
            {
                HttpWebRequest request 
= (HttpWebRequest)WebRequest.Create("http://weather.sina.com.cn/iframe/weather/" + code + "_w.html ");
                request.Method 
= "Get";
                
//request.Timeout   =   1;
                request.ContentType = "application/x-www-form-urlencoded ";
                WebResponse response 
= request.GetResponse();
                Stream s 
= response.GetResponseStream();
                StreamReader sr 
= new StreamReader(s, System.Text.Encoding.GetEncoding("GB2312"));
                html 
= sr.ReadToEnd();
                s.Close();
                sr.Close();
            }
            
catch (Exception err)
            {
                
throw new Exception("访问地址出错~~~ ");
            }
            
int count = html.Length;
            
int starIndex = html.IndexOf("<table "0, count);
            
int endIndex = html.IndexOf("</table>", starIndex, count  starIndex);
            html 
= html.Substring(starIndex, endIndex  starIndex + 8);
            
//得到城市
            int cityStartIndex = html.IndexOf("<b>"0, html.Length);
            
int cityEndIndex = html.IndexOf("</b>"0, html.Length);
            
string City = html.Substring(cityStartIndex + 3, cityEndIndex  cityStartIndex  3);
            
//得到天气
            int weatherStartIndex = html.IndexOf("<b>", cityEndIndex);
            
int weatherEndIndex = html.IndexOf("</b>", weatherStartIndex);
            
string Weather = html.Substring(weatherStartIndex + 3, weatherEndIndex  weatherStartIndex  3);
            
//得到温度

            
int temperatureStartIndex = html.IndexOf("<b", weatherEndIndex);
            
int temperatureEndIndex = html.IndexOf("</b>", weatherEndIndex + 3);
            
string Temperature = html.Substring(temperatureStartIndex + 21, temperatureEndIndex  temperatureStartIndex  21);
            
int int1 = Temperature.IndexOf(""0);
            
int int2 = Temperature.IndexOf(""0);
            
int int3 = Temperature.IndexOf("", int2);
            
string MinTemperature = Temperature.Substring(int2 + 1, int3  int2);
            
string MaxTemperature = Temperature.Substring(0, int2  int1 + 2);
            
//得到风力
            int windforceStartIndex = html.IndexOf("风力:", temperatureEndIndex);
            
int windforceEndIndex = html.IndexOf("<br>", windforceStartIndex);
            
string Windforce = html.Substring(windforceStartIndex + 3, windforceEndIndex  windforceStartIndex  3);
            
if (Windforce.Contains("小于"&& (!Windforce.Contains("等于")))                  //判断风力是否含有"小于"或"小于等于"字样将,如果有的话,将其替换为2-
            {
                
//Windforce = Windforce.Replace("小于", "2-");
                string strWindforce = Windforce.Substring(2, Windforce.Length  3);
                
int minWindforce = Int32.Parse(strWindforce)  1;
                Windforce 
= Windforce.Replace("小于", minWindforce.ToString() + "");
            }
            
else if (Windforce.Contains("小于等于"))
            {
                
string strWindforce = Windforce.Substring(4, Windforce.Length  5);
                
int minWindforce = Int32.Parse(strWindforce)  1;
                Windforce 
= Windforce.Replace("小于等于", minWindforce.ToString() + "");
            }
            ArrayList al 
= new ArrayList();
            al.Add(City);
            al.Add(Weather);
            al.Add(MinTemperature);
            al.Add(MaxTemperature);
            al.Add(Windforce);
            
return al;
        }

 这里涉及到一个ConvertCode类,它的作用是用于把城市转换为对应的全国统一的编码,代码如下:


using System;
using System.Collections.Generic;
using System.Web;
namespace WebApplication8
{
    
public class ConvertCode
    {
        
public static string ConvertCodeByCity(string City)
        {
            
string Code = "";
            
switch (City)
            {
                
case "北京":
                    Code 
= "110100";
                    
break;
                
case "天津":
                    Code 
= "120100";
                    
break;
                
case "石家庄":
                    Code 
= "130101";
                    
break;
                
case "唐山":
                    Code 
= "130201";
                    
break;
                
case "秦皇岛":
                    Code 
= "130301";
                    
break;
                
case "张家口":
                    Code 
= "130701";
                    
break;
                
case "承德":
                    Code 
= "130801";
                    
break;
                
case "廊坊":
                    Code 
= "131001";
                    
break;
                
case "邯郸":
                    Code 
= "130401";
                    
break;
                
case "邢台":
                    Code 
= "130501";
                    
break;
                
case "保定":
                    Code 
= "130601";
                    
break;
                
case "沧州":
                    Code 
= "130901";
                    
break;
                
case "衡水":
                    Code 
= "133001";
                    
break;
                
case "太原":
                    Code 
= "140101";
                    
break;
                
case "大同":
                    Code 
= "140201";
                    
break;
                
case "阳泉":
                    Code 
= "140301";
                    
break;
                
case "晋城":
                    Code 
= "140501";
                    
break;
                
case "朔州":
                    Code 
= "140601";
                    
break;
                
case "忻州":
                    Code 
= "142201";
                    
break;
                
case "离石":
                    Code 
= "142331";
                    
break;
                
case "榆次":
                    Code 
= "142401";
                    
break;
                
case "临汾":
                    Code 
= "142601";
                    
break;
                
case "运城":
                    Code 
= "142701";
                    
break;
                
case "长治":
                    Code 
= "140401";
                    
break;
                
case "呼和浩特":
                    Code 
= "150101";
                    
break;
                
case "包头":
                    Code 
= "150201";
                    
break;
                
case "乌海":
                    Code 
= "150301";
                    
break;
                
case "集宁":
                    Code 
= "152601";
                    
break;
                
case "巴彦浩特":                           //这个城市搜索不到
                    Code = "152701";
                    
break;
                
case "临河":
                    Code 
= "152801";
                    
break;
                
case "鄂尔多斯":                           //这个城市搜索不到
                    Code = "152921";
                    
break;
                
case "赤峰":
                    Code 
= "150401";
                    
break;
                
case "通辽":
                    Code 
= "152301";
                    
break;
                
case "锡林浩特":
                    Code 
= "152502";
                    
break;
                
case "海拉尔":                            //这个城市搜索不到
                    Code = "152101";
                    
break;
                
case "乌兰浩特":
                    Code 
= "152201";
                    
break;
                
case "沈阳":
                    Code 
= "210101";
                    
break;
                
case "大连":
                    Code 
= "210201";
                    
break;
                
case "鞍山":
                    Code 
= "210301";
                    
break;
                
case "抚顺":
                    Code 
= "210401";
                    
break;
                
case "本溪":
                    Code 
= "210501";
                    
break;
                
case "锦州":
                    Code 
= "210701";
                    
break;
                
case "营口":
                    Code 
= "210801";
                    
break;
                
case "阜新":
                    Code 
= "210901";
                    
break;
                
case "盘锦":
                    Code 
= "211101";
                    
break;
                
case "铁岭":
                    Code 
= "211201";
                    
break;
                
case "朝阳":
                    Code 
= "211301";
                    
break;
                
case "葫芦岛":
                    Code 
= "211401";
                    
break;
                
case "丹东":
                    Code 
= "210601";
                    
break;
                
case "长春":
                    Code 
= "220101";
                    
break;
                
case "吉林":
                    Code 
= "220201";
                    
break;
                
case "四平":
                    Code 
= "220301";
                    
break;
                
case "辽源":
                    Code 
= "220401";
                    
break;
                
case "松原":
                    Code 
= "220601";
                    
break;
                
case "白城":
                    Code 
= "222301";
                    
break;
                
case "延边":
                    Code 
= "222401";
                    
break;
                
case "通化":
                    Code 
= "220501";
                    
break;
                
case "哈尔滨":
                    Code 
= "230101";
                    
break;
                
case "鸡西":
                    Code 
= "230301";
                    
break;
                
case "鹤岗":
                    Code 
= "230401";
                    
break;
                
case "双鸭山":
                    Code 
= "230501";
                    
break;
                
case "伊春":
                    Code 
= "230701";
                    
break;
                
case "佳木斯":
                    Code 
= "230801";
                    
break;
                
case "七台河":
                    Code 
= "230901";
                    
break;
                
case "牡丹江":
                    Code 
= "231001";
                    
break;
                
case "绥化":
                    Code 
= "232301";
                    
break;
                
case "齐齐哈尔":
                    Code 
= "230201";
                    
break;
                
case "大庆":
                    Code 
= "230601";
                    
break;
                
case "黑河":
                    Code 
= "232601";
                    
break;
                
case "大兴安岭":
                    Code 
= "232700";
                    
break;
                
case "上海":
                    Code 
= "310100";
                    
break;
                
case "南京":
                    Code 
= "320101";
                    
break;
                
case "无锡":
                    Code 
= "320201";
                    
break;
                
case "徐州":
                    Code 
= "320301";
                    
break;
                
case "常州":
                    Code 
= "320401";
                    
break;
                
case "苏州":
                    Code 
= "320501";
                    
break;
                
case "南通":
                    Code 
= "320600";
                    
break;
                
case "连云港":
                    Code 
= "320701";
                    
break;
                
case "淮阴":
                    Code 
= "320801";
                    
break;
                
case "盐城":
                    Code 
= "320901";
                    
break;
                
case "扬州":
                    Code 
= "321001";
                    
break;
                
case "镇江":
                    Code 
= "321101";
                    
break;
                
case "泰州":
                    Code 
= "321102";
                    
break;
                
case "宿迁":
                    Code 
= "321103";
                    
break;
                
case "杭州":
                    Code 
= "330101";
                    
break;
                
case "宁波":
                    Code 
= "330201";
                    
break;
                
case "温州":
                    Code 
= "330301";
                    
break;
                
case "嘉兴":
                    Code 
= "330401";
                    
break;
                
case "湖州":
                    Code 
= "330501";
                    
break;
                
case "绍兴":
                    Code 
= "330601";
                    
break;
                
case "金华":
                    Code 
= "330701";
                    
break;
                
case "衢州":
                    Code 
= "330801";
                    
break;
                
case "舟山":
                    Code 
= "330901";
                    
break;
                
case "丽水":
                    Code 
= "332501";
                    
break;
                
case "台州":
                    Code 
= "332602";
                    
break;
                
case "合肥":
                    Code 
= "340101";
                    
break;
                
case "芜湖":
                    Code 
= "340201";
                    
break;
                
case "蚌埠":
                    Code 
= "340301";
                    
break;
                
case "淮南":
                    Code 
= "340401";
                    
break;
                
case "马鞍山":
                    Code 
= "340501";
                    
break;
                
case "淮北":
                    Code 
= "340601";
                    
break;
                
case "铜陵":
                    Code 
= "340701";
                    
break;
                
case "安庆":
                    Code 
= "340801";
                    
break;
                
case "黄山市":
                    Code 
= "341001";
                    
break;
                
case "阜阳":
                    Code 
= "342101";
                    
break;
                
case "宿州":
                    Code 
= "342201";
                    
break;
                
case "滁州":
                    Code 
= "342301";
                    
break;
                
case "六安":
                    Code 
= "342401";
                    
break;
                
case "宣城":
                    Code 
= "342501";
                    
break;
                
case "巢湖":
                    Code 
= "342601";
                    
break;
                
case "池州":
                    Code 
= "342901";
                    
break;
                
case "福州":
                    Code 
= "350101";
                    
break;
                
case "厦门":
                    Code 
= "350201";
                    
break;
                
case "莆田":
                    Code 
= "350301";
                    
break;
                
case "三明":
                    Code 
= "350401";
                    
break;
                
case "泉州":
                    Code 
= "350501";
                    
break;
                
case "漳州":
                    Code 
= "350601";
                    
break;
                
case "南平":
                    Code 
= "352101";
                    
break;
                
case "宁德":
                    Code 
= "352201";
                    
break;
                
case "龙岩":
                    Code 
= "352601";
                    
break;
                
case "陇南":
                    Code 
= "352602";
                    
break;
                
case "庆阳":
                    Code 
= "352603";
                    
break;
                
case "南昌":
                    Code 
= "360101";
                    
break;
                
case "景德镇":
                    Code 
= "360201";
                    
break;
                
case "赣州":
                    Code 
= "362101";
                    
break;
                
case "萍乡":
                    Code 
= "360301";
                    
break;
                
case "九江":
                    Code 
= "360401";
                    
break;
                
case "新余":
                    Code 
= "360501";
                    
break;
                
case "鹰潭":
                    Code 
= "360601";
                    
break;
                
case "宜春":
                    Code 
= "362201";
                    
break;
                
case "上饶":
                    Code 
= "362301";
                    
break;
                
case "吉安":
                    Code 
= "362401";
                    
break;
                
case "济南":
                    Code 
= "370101";
                    
break;
                
case "青岛":
                    Code 
= "370201";
                    
break;
                
case "淄博":
                    Code 
= "370301";
                    
break;
                
case "枣庄":
                    Code 
= "370401";
                    
break;
                
case "东营":
                    Code 
= "370501";
                    
break;
                
case "烟台":
                    Code 
= "370601";
                    
break;
                
case "潍坊":
                    Code 
= "370701";
                    
break;
                
case "济宁":
                    Code 
= "370801";
                    
break;
                
case "泰安":
                    Code 
= "370901";
                    
break;
                
case "威海":
                    Code 
= "371001";
                    
break;
                
case "日照":
                    Code 
= "371100";
                    
break;
                
case "滨州":
                    Code 
= "372301";
                    
break;
                
case "德州":
                    Code 
= "372401";
                    
break;
                
case "聊城":
                    Code 
= "372501";
                    
break;
                
case "临沂":
                    Code 
= "372801";
                    
break;
                
case "菏泽":
                    Code 
= "372901";
                    
break;
                
case "莱芜":
                    Code 
= "372902";
                    
break;
                
case "郑州":
                    Code 
= "410101";
                    
break;
                
case "开封":
                    Code 
= "410201";
                    
break;
                
case "洛阳":
                    Code 
= "410301";
                    
break;
                
case "平顶山":
                    Code 
= "410401";
                    
break;
                
case "安阳":
                    Code 
= "410501";
                    
break;
                
case "鹤壁":
                    Code 
= "410601";
                    
break;
                
case "新乡":
                    Code 
= "410701";
                    
break;
                
case "焦作":
                    Code 
= "410801";
                    
break;
                
case "濮阳":
                    Code 
= "410901";
                    
break;
                
case "许昌":
                    Code 
= "411001";
                    
break;
                
case "漯河":
                    Code 
= "411101";
                    
break;
                
case "三门峡":
                    Code 
= "411201";
                    
break;
                
case "商丘":
                    Code 
= "412301";
                    
break;
                
case "周口":
                    Code 
= "412701";
                    
break;
                
case "驻马店":
                    Code 
= "412801";
                    
break;
                
case "南阳":
                    Code 
= "412901";
                    
break;
                
case "信阳":
                    Code 
= "413001";
                    
break;
                
case "武汉":
                    Code 
= "420101";
                    
break;
                
case "黄石":
                    Code 
= "420201";
                    
break;
                
case "十堰":
                    Code 
= "420301";
                    
break;
                
case "随州":
                    Code 
= "420400";
                    
break;
                
case "宜昌":
                    Code 
= "420501";
                    
break;
                
case "襄樊":
                    Code 
= "420601";
                    
break;
                
case "鄂州":
                    Code 
= "420701";
                    
break;
                
case "荆门":
                    Code 
= "420801";
                    
break;
                
case "黄冈":
                    Code 
= "422103";
                    
break;
                
case "孝感":
                    Code 
= "422201";
                    
break;
                
case "咸宁":
                    Code 
= "422301";
                    
break;
                
case "荆州":
                    Code 
= "422421";
                    
break;
                
case "恩施":
                    Code 
= "422801";
                    
break;
                
case "长沙":
                    Code 
= "430101";
                    
break;
                
case "衡阳":
                    Code 
= "430401";
                    
break;
                
case "邵阳":
                    Code 
= "430501";
                    
break;
                
case "郴州":
                    Code 
= "432801";
                    
break;
                
case "永州":
                    Code 
= "432901";
                    
break;
                
case "韶山":
                    Code 
= "430801";
                    
break;
                
case "张家界":
                    Code 
= "430802";
                    
break;
                
case "怀化":
                    Code 
= "433001";
                    
break;
                
case "吉首":
                    Code 
= "433101";
                    
break;
                
case "株洲":
                    Code 
= "430201";
                    
break;
                
case "湘潭":
                    Code 
= "430301";
                    
break;
                
case "岳阳":
                    Code 
= "430601";
                    
break;
                
case "常德":
                    Code 
= "430701";
                    
break;
                
case "益阳":
                    Code 
= "432301";
                    
break;
                
case "娄底":
                    Code 
= "432501";
                    
break;
                
case "广州":
                    Code 
= "440101";
                    
break;
                
case "佛山":
                    Code 
= "440601";
                    
break;
                
case "深圳":
                    Code 
= "440301";
                    
break;
                
case "汕尾":
                    Code 
= "441501";
                    
break;
                
case "惠州":
                    Code 
= "441301";
                    
break;
                
case "河源":
                    Code 
= "441601";
                    
break;
                
case "清远":
                    Code 
= "441801";
                    
break;
                
case "东莞":
                    Code 
= "441901";
                    
break;
                
case "珠海":
                    Code 
= "440401";
                    
break;
                
case "江门":
                    Code 
= "440701";
                    
break;
                
case "肇庆":
                    Code 
= "441201";
                    
break;
                
case "中山":
                    Code 
= "442001";
                    
break;
                
case "湛江":
                    Code 
= "440801";
                    
break;
                
case "茂名":
                    Code 
= "440901";
                    
break;
                
case "韶关":
                    Code 
= "440201";
                    
break;
                
case "汕头":
                    Code 
= "440501";
                    
break;
                
case "梅州":
                    Code 
= "441401";
                    
break;
                
case "阳江":
                    Code 
= "441701";
                    
break;
                
case "潮州":
                    Code 
= "441702";
                    
break;
                
case "顺德":
                    Code 
= "441703";
                    
break;
                
case "揭阳":
                    Code 
= "441704";
                    
break;
                
case "云浮":
                    Code 
= "441705";
                    
break;
                
case "南宁":
                    Code 
= "450101";
                    
break;
                
case "梧州":
                    Code 
= "450401";
                    
break;
                
case "玉林":
                    Code 
= "452501";
                    
break;
                
case "桂林":
                    Code 
= "450301";
                    
break;
                
case "百色":
                    Code 
= "452601";
                    
break;
                
case "河池":
                    Code 
= "452701";
                    
break;
                
case "钦州":
                    Code 
= "452802";
                    
break;
                
case "柳州":
                    Code 
= "450201";
                    
break;
                
case "北海":
                    Code 
= "450501";
                    
break;
                
case "防城港":
                    Code 
= "450502";
                    
break;
                
case "贵港":
                    Code 
= "450503";
                    
break;
                
case "贺州":
                    Code 
= "450504";
                    
break;
                
case "海口":
                    Code 
= "460100";
                    
break;
                
case "三亚":
                    Code 
= "460200";
                    
break;
                
case "西沙群岛":
                    Code 
= "460300";
                    
break;
                
case "成都":
                    Code 
= "510101";
                    
break;
                
case "眉山":
                    Code 
= "513321";
                    
break;
                
case "雅安":
                    Code 
= "513101";
                    
break;
                
case "峨嵋山":
                    Code 
= "513229";
                    
break;
                
case "自贡":
                    Code 
= "510301";
                    
break;
                
case "重庆":
                    Code 
= "500100";
                    
break;
                
case "万州":
                    Code 
= "500102";
                    
break;
                
case "涪陵":
                    Code 
= "500103";
                    
break;
                
case "南充":
                    Code 
= "512901";
                    
break;
                
case "泸州":
                    Code 
= "510501";
                    
break;
                
case "德阳":
                    Code 
= "510601";
                    
break;
                
case "绵阳":
                    Code 
= "510701";
                    
break;
                
case "遂宁":
                    Code 
= "510901";
                    
break;
                
case "内江":
                    Code 
= "511001";
                    
break;
                
case "乐山":
                    Code 
= "511101";
                    
break;
                
case "宜宾":
                    Code 
= "512501";
                    
break;
                
case "广元":
                    Code 
= "510801";
                    
break;
                
case "达州":
                    Code 
= "513021";
                    
break;
                
case "资阳":
                    Code 
= "513401";
                    
break;
                
case "攀枝花":
                    Code 
= "510401";
                    
break;
                
case "阿坝":
                    Code 
= "510402";
                    
break;
                
case "甘孜":
                    Code 
= "510403";
                    
break;
                
case "凉山":
                    Code 
= "510404";
                    
break;
                
case "广安":
                    Code 
= "510405";
                    
break;
                
case "巴中":
                    Code 
= "510406";
                    
break;
                
case "黔江":
                    Code 
= "500239";
                    
break;
                
case "贵阳":
                    Code 
= "520101";
                    
break;
                
case "六盘水":
                    Code 
= "520200";
                    
break;
                
case "铜仁":
                    Code 
= "522201";
                    
break;
                
case "安顺":
                    Code 
= "522501";
                    
break;
                
case "凯里":
                    Code 
= "522601";
                    
break;
                
case "都匀":
                    Code 
= "522701";
                    
break;
                
case "兴义":
                    Code 
= "522301";
                    
break;
                
case "毕节":
                    Code 
= "522421";
                    
break;
                
case "遵义":
                    Code 
= "522101";
                    
break;
                
case "昆明":
                    Code 
= "530101";
                    
break;
                
case "德宏":
                    Code 
= "530201";
                    
break;
                
case "曲靖":
                    Code 
= "532201";
                    
break;
                
case "楚雄":
                    Code 
= "532301";
                    
break;
                
case "玉溪":
                    Code 
= "532401";
                    
break;
                
case "红河":
                    Code 
= "532501";
                    
break;
                
case "文山":
                    Code 
= "532621";
                    
break;
                
case "思茅":
                    Code 
= "532721";
                    
break;
                
case "昭通":
                    Code 
= "532101";
                    
break;
                
case "西双版纳":
                    Code 
= "532821";
                    
break;
                
case "大理":
                    Code 
= "532901";
                    
break;
                
case "保山":
                    Code 
= "533001";
                    
break;
                
case "怒江":
                    Code 
= "533121";
                    
break;
                
case "丽江":
                    Code 
= "533221";
                    
break;
                
case "迪庆":
                    Code 
= "533321";
                    
break;
                
case "临沧":
                    Code 
= "533521";
                    
break;
                
case "拉萨":
                    Code 
= "540101";
                    
break;
                
case "昌都":
                    Code 
= "542121";
                    
break;
                
case "山南":
                    Code 
= "542221";
                    
break;
                
case "日喀则":
                    Code 
= "542301";
                    
break;
                
case "那曲":
                    Code 
= "542421";
                    
break;
                
case "阿里":
                    Code 
= "542523";
                    
break;
                
case "林芝":
                    Code 
= "542621";
                    
break;
                
case "西安":
                    Code 
= "610101";
                    
break;
                
case "铜川":
                    Code 
= "610201";
                    
break;
                
case "宝鸡":
                    Code 
= "610301";
                    
break;
                
case "咸阳":
                    Code 
= "610401";
                    
break;
                
case "渭南":
                    Code 
= "612101";
                    
break;
                
case "汉中":
                    Code 
= "612301";
                    
break;
                
case "安康":
                    Code 
= "612401";
                    
break;
                
case "商洛":
                    Code 
= "612501";
                    
break;
                
case "延安":
                    Code 
= "612601";
                    
break;
                
case "榆林":
                    Code 
= "612701";
                    
break;
                
case "兰州":
                    Code 
= "620101";
                    
break;
                
case "白银":
                    Code 
= "620401";
                    
break;
                
case "金昌":
                    Code 
= "620301";
                    
break;
                
case "天水":
                    Code 
= "620501";
                    
break;
                
case "张掖":
                    Code 
= "622201";
                    
break;
                
case "武威":
                    Code 
= "622301";
                    
break;
                
case "定西":
                    Code 
= "622421";
                    
break;
                
case "平凉":
                    Code 
= "622701";
                    
break;
                
case "临夏":
                    Code 
= "622901";
                    
break;
                
case "嘉峪关":
                    Code 
= "620201";
                    
break;
                
case "酒泉":
                    Code 
= "622102";
                    
break;
                
case "西宁":
                    Code 
= "630100";
                    
break;
                
case "果洛":
                    Code 
= "632121";
                    
break;
                
case "海西":
                    Code 
= "632221";
                    
break;
                
case "格尔木":
                    Code 
= "632321";
                    
break;
                
case "海东":
                    Code 
= "632521";
                    
break;
                
case "海北":
                    Code 
= "632621";
                    
break;
                
case "玉树":
                    Code 
= "632721";
                    
break;
                
case "黄南":
                    Code 
= "632802";
                    
break;
                
case "银川":
                    Code 
= "640101";
                    
break;
                
case "石嘴山":
                    Code 
= "640201";
                    
break;
                
case "吴忠":
                    Code 
= "642101";
                    
break;
                
case "固原":
                    Code 
= "642221";
                    
break;
                
case "乌鲁木齐":
                    Code 
= "650101";
                    
break;
                
case "克拉玛依":
                    Code 
= "650201";
                    
break;
                
case "吐鲁番":
                    Code 
= "652101";
                    
break;
                
case "哈密":
                    Code 
= "652201";
                    
break;
                
case "昌吉":
                    Code 
= "652301";
                    
break;
                
case "博乐":
                    Code 
= "652701";
                    
break;
                
case "库尔勒":
                    Code 
= "652801";
                    
break;
                
case "阿克苏":
                    Code 
= "652901";
                    
break;
                
case "克州":
                    Code 
= "653001";
                    
break;
                
case "喀什":
                    Code 
= "653101";
                    
break;
                
case "伊犁":
                    Code 
= "654101";
                    
break;
                
case "石河子":
                    Code 
= "655001";
                    
break;
                
case "塔城":
                    Code 
= "655002";
                    
break;
                
case "阿勒泰":
                    Code 
= "655003";
                    
break;
                
case "台北":
                    Code 
= "710001";
                    
break;
                
case "辽阳":
                    Code 
= "211001";
                    
break;
                
case "和田":
                    Code 
= "653201";
                    
break;
                
case "澳门":
                    Code 
= "820000";
                    
break;
                
case "香港":
                    Code 
= "810000";
                    
break;
                    
                
default:
                    
break;
            }
            
return Code;
        }
    }
}

3.获取三天以内的天气,以指定格式输出。

核心代码如下:


public static ArrayList GetThreeDayWeather(string City)
        {
            ArrayList al 
= new ArrayList();
            
/*
           [0] "今天 北京"              string
           [1] "2009-04-17,星期五"     string
           [2] "晴转多云"               string
           [3] "12℃"                   string
           [4] "25℃"                   string
           [5] "2-3级"                  string
           [6] "明天 北京"              string
           [7] "2009-04-18,星期六"     string
           [8] "阴转阵雨"               string
           [9] "11℃"                   string
           [10] "21℃"                  string
           [11] "2-3级"                 string
           [12] "后天 北京"             string
           [13] "2009-04-19,星期日"    string
           [14] "多云转阵雨"            string
           [15] "9℃"                   string
           [16] "20℃"                  string
           [17] "2-3级"                 string         
           
*/
            
string Html = "";       //返回来的网页的源码
            ASCIIEncoding encoding = new ASCIIEncoding();
            
string postData = string.Format("city=" + City);
            
byte[] data = encoding.GetBytes(postData);
            
try
            {
                HttpWebRequest request 
= (HttpWebRequest)WebRequest.Create("http://php.weather.sina.com.cn/search.php?city=" + System.Web.HttpContext.Current.Server.UrlEncode(City) + "&f=1&dpc=1");
                request.Method 
= "Get";
                request.ContentType 
= "application/x-www-form-urlencoded ";
                WebResponse response 
= request.GetResponse();
                Stream s 
= response.GetResponseStream();
                StreamReader sr 
= new StreamReader(s, System.Text.Encoding.GetEncoding("GB2312"));
                Html 
= sr.ReadToEnd();
                s.Close();
                sr.Close();
            }
            
catch (Exception err)
            {
                
throw new Exception("访问地址出错~~~ ");
            }
            
//去除多余代码,便于分析跟提高效率
            int count = Html.Length;
            
int starIndex = Html.IndexOf("<div id=\"Weather3DBlk\">"0, count);
            
int endIndex = Html.IndexOf("<div id=\"SideBar\">"0);
            Html 
= Html.Substring(starIndex, endIndex  starIndex);
            
try
            {
                
#region 得到今天的天气
                
//得到今天的标识跟城市
                int firstDayAndCityStartIndex = Html.IndexOf("<h3>"0);
                
int firstDayAndCityEndIndex = Html.IndexOf("</h3>"0);
                
string FirstDayAndCity = Html.Substring(firstDayAndCityStartIndex + 4, firstDayAndCityEndIndex  firstDayAndCityStartIndex  4);
                
//得到今天的日期跟星期
                int firstDateStartIndex = Html.IndexOf("<p>", firstDayAndCityEndIndex);
                
int firstDateEndIndex = Html.IndexOf("</p>", firstDayAndCityEndIndex);
                
string FirstDate = Html.Substring(firstDateStartIndex + 3, firstDateEndIndex  firstDateStartIndex  3).Replace("&nbsp;""");
                
//得到今天的天气
                int firstWeatherStartIndex = Html.IndexOf("<div class=\"Weather_TP\">", firstDateEndIndex);
                
int firstWeatherEndIndex = Html.IndexOf(" ", firstWeatherStartIndex + 24);
                
string FirstWeather = Html.Substring(firstWeatherStartIndex + 24, firstWeatherEndIndex  firstWeatherStartIndex  24);
                
//得到今天的温度

                
int firstTemperatureStartIndex = firstWeatherEndIndex + 1;
                
int firstTemperatureEndIndex = Html.IndexOf("</div>", firstTemperatureStartIndex);
                
string FirstTemperature = Html.Substring(firstTemperatureStartIndex, firstTemperatureEndIndex  firstTemperatureStartIndex);
                
int int1 = FirstTemperature.IndexOf(""0);
                
int int2 = FirstTemperature.IndexOf(""0);
                
int int3 = FirstTemperature.IndexOf("", int2);
                
string FirstMinTemperature = FirstTemperature.Substring(int2 + 1, int3  int2);
                
string FirstMaxTemperature = FirstTemperature.Substring(0, int2  int1 + 2);
                
//得到今天的风力
                int firstWindforceStartIndex = Html.IndexOf("风力:", firstTemperatureEndIndex);
                
int firstWindforceEndIndex = Html.IndexOf("</div>", firstWindforceStartIndex);
                
string FirstWindforce = Html.Substring(firstWindforceStartIndex + 3, firstWindforceEndIndex  firstWindforceStartIndex  3);
                
if (FirstWindforce.Contains(""))
                {
                }
                
else if (FirstWindforce.Contains("<"))                  //判断风力是否含有"<"或"≤"字样将,如果有的话,将其替换为2-
                {
                    
string strWindforce = FirstWindforce.Substring(1, FirstWindforce.Length  2);
                    
int minWindforce = Int32.Parse(strWindforce)  1;
                    FirstWindforce 
= FirstWindforce.Replace("<", minWindforce.ToString() + "");
                }
                
else if (FirstWindforce.Contains(""))
                {
                    
string strWindforce = FirstWindforce.Substring(1, FirstWindforce.Length  2);
                    
int minWindforce = Int32.Parse(strWindforce)  1;
                    FirstWindforce 
= FirstWindforce.Replace("", minWindforce.ToString() + "");
                }
                
#endregion
                
#region 得到明天的天气
                
//得到明天的标识跟城市
                int secondDayAndCityStartIndex = Html.IndexOf("<h3>", firstWindforceEndIndex);
                
int secondDayAndCityEndIndex = Html.IndexOf("</h3>", secondDayAndCityStartIndex);
                
string secondDayAndCity = Html.Substring(secondDayAndCityStartIndex + 4, secondDayAndCityEndIndex  secondDayAndCityStartIndex  4);
                
//得到明天的日期跟星期
                int secondDateStartIndex = Html.IndexOf("<p>", secondDayAndCityEndIndex);
                
int secondDateEndIndex = Html.IndexOf("</p>", secondDateStartIndex);
                
string SecondDate = Html.Substring(secondDateStartIndex + 3, secondDateEndIndex  secondDateStartIndex  3).Replace("&nbsp;""");
                
//得到明天的天气
                int secondWeatherStartIndex = Html.IndexOf("<div class=\"Weather_TP\">", secondDateEndIndex);
                
int secondWeatherEndIndex = Html.IndexOf(" ", secondWeatherStartIndex + 24);
                
string SecondWeather = Html.Substring(secondWeatherStartIndex + 24, secondWeatherEndIndex  secondWeatherStartIndex  24);
                
//得到明天的温度

                
int secondTemperatureStartIndex = secondWeatherEndIndex + 1;
                
int secondTemperatureEndIndex = Html.IndexOf("</div>", secondTemperatureStartIndex);
                
string SecondTemperature = Html.Substring(secondTemperatureStartIndex, secondTemperatureEndIndex  secondTemperatureStartIndex);
                
int int4 = SecondTemperature.IndexOf(""0);
                
int int5 = SecondTemperature.IndexOf(""0);
                
int int6 = SecondTemperature.IndexOf("", int2);
                
string SecondMinTemperature = SecondTemperature.Substring(int5 + 1, int6  int5);
                
string SecondMaxTemperature = SecondTemperature.Substring(0, int5  int4 + 2);
                
//得到明天的风力
                int secondWindforceStartIndex = Html.IndexOf("风力:", secondTemperatureEndIndex);
                
int secondWindforceEndIndex = Html.IndexOf("</div>", secondWindforceStartIndex);
                
string SecondWindforce = Html.Substring(secondWindforceStartIndex + 3, secondWindforceEndIndex  secondWindforceStartIndex  3);
                
if (SecondWindforce.Contains(""))
                {
                }
                
else if (SecondWindforce.Contains("<"))                  //判断风力是否含有"<"或"≤"字样将,如果有的话,将其替换为2-
                {
                    
string strWindforce = SecondWindforce.Substring(1, FirstWindforce.Length  2);
                    
int minWindforce = Int32.Parse(strWindforce)  1;
                    SecondWindforce 
= SecondWindforce.Replace("<", minWindforce.ToString() + "");
                }
                
else if (SecondWindforce.Contains(""))
                {
                    
string strWindforce = SecondWindforce.Substring(1, SecondWindforce.Length  2);
                    
int minWindforce = Int32.Parse(strWindforce)  1;
                    SecondWindforce 
= SecondWindforce.Replace("", minWindforce.ToString() + "");
                }
                
#endregion
                
#region 得到后天的天气
                
//得到后天的标识跟城市
                int thirdDayAndCityStartIndex = Html.IndexOf("<h3>", secondWindforceEndIndex);
                
int thirdDayAndCityEndIndex = Html.IndexOf("</h3>", thirdDayAndCityStartIndex);
                
string thirdDayAndCity = Html.Substring(thirdDayAndCityStartIndex + 4, thirdDayAndCityEndIndex  thirdDayAndCityStartIndex  4);
                
//得到后天的日期跟星期
                int thirdDateStartIndex = Html.IndexOf("<p>", thirdDayAndCityEndIndex);
                
int thirdDateEndIndex = Html.IndexOf("</p>", thirdDateStartIndex);
                
string ThirdDate = Html.Substring(thirdDateStartIndex + 3, thirdDateEndIndex  thirdDateStartIndex  3).Replace("&nbsp;""");
                
//得到后天的天气
                int thirdWeatherStartIndex = Html.IndexOf("<div class=\"Weather_TP\">", thirdDateEndIndex);
                
int thirdWeatherEndIndex = Html.IndexOf(" ", thirdWeatherStartIndex + 24);
                
string ThirdWeather = Html.Substring(thirdWeatherStartIndex + 24, thirdWeatherEndIndex  thirdWeatherStartIndex  24);
                
//得到后天的温度

                
int thirdTemperatureStartIndex = thirdWeatherEndIndex + 1;
                
int thirdTemperatureEndIndex = Html.IndexOf("</div>", thirdTemperatureStartIndex);
                
string ThirdTemperature = Html.Substring(thirdTemperatureStartIndex, thirdTemperatureEndIndex  thirdTemperatureStartIndex);
                
int int7 = ThirdTemperature.IndexOf(""0);
                
int int8 = ThirdTemperature.IndexOf(""0);
                
int int9 = ThirdTemperature.IndexOf("", int2);
                
string ThirdMinTemperature = ThirdTemperature.Substring(int8 + 1, int9  int8);
                
string ThirdMaxTemperature = ThirdTemperature.Substring(0, int8  int7 + 2);
                
//得到后天的风力
                int thirdWindforceStartIndex = Html.IndexOf("风力:", thirdTemperatureEndIndex);
                
int thirdWindforceEndIndex = Html.IndexOf("</div>", thirdWindforceStartIndex);
                
string ThirdWindforce = Html.Substring(thirdWindforceStartIndex + 3, thirdWindforceEndIndex  thirdWindforceStartIndex  3);
                
if (ThirdWindforce.Contains(""))
                {
                }
                
else if (ThirdWindforce.Contains("<"))                  //判断风力是否含有"<"或"≤"字样将,如果有的话,将其替换为2-
                {
                    
string strWindforce = ThirdWindforce.Substring(1, ThirdWindforce.Length  2);
                    
int minWindforce = Int32.Parse(strWindforce)  1;
                    ThirdWindforce 
= ThirdWindforce.Replace("<", minWindforce.ToString() + "");
                }
                
else if (ThirdWindforce.Contains(""))
                {
                    
string strWindforce = ThirdWindforce.Substring(1, ThirdWindforce.Length  2);
                    
int minWindforce = Int32.Parse(strWindforce)  1;
                    ThirdWindforce 
= ThirdWindforce.Replace("", minWindforce.ToString() + "");
                }
                
#endregion
                al.Add(FirstDayAndCity);
                al.Add(FirstDate);
                al.Add(FirstWeather);
                al.Add(FirstMinTemperature);
                al.Add(FirstMaxTemperature);
                al.Add(FirstWindforce);
                al.Add(secondDayAndCity);
                al.Add(SecondDate);
                al.Add(SecondWeather);
                al.Add(SecondMinTemperature);
                al.Add(SecondMaxTemperature);
                al.Add(SecondWindforce);
                al.Add(thirdDayAndCity);
                al.Add(ThirdDate);
                al.Add(ThirdWeather);
                al.Add(ThirdMinTemperature);
                al.Add(ThirdMaxTemperature);
                al.Add(ThirdWindforce);
            }
            
catch (Exception err)
            {
            }
            
return al;
        }

代码下载:/Files/wlb/xinlangweather.rar

特 殊说明,使用第三种方法获取天气预报,输入城市的时候可能会受新浪提供的服务的影响,可能有些城市搜不到,前两种方法应该是不会受影响的。另外,由于代码 写的比较急,所以难免代码的质量就会有些问题,还请大家多多包涵。单纯从代码上看,可能确实没有什么难度,可是如果在您的工作中如果因为我的代码为您节省 了一些时间,笔者深感欣慰了。

另外,由于我的开发环境是vs2008+sp1,如果您的vs版本较低,不妨把项目文件删除掉,然后打开您的vs,选择打开网站,然后定位到本程序的目录,这样就可以进行代码的编译跟踪调试了。

再补充一点,有人可能对代码中出现的:System.Environment.NewLine 这句代码比较迷糊,因为这个是.net提供的简单的换行方法,我推荐大家以后能够使用这种.net提供给大家的高效、简便的方法。最关键的是它不容易出错。

作者:深山老林
出处:http://wlb.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

[JavaScript]简单、通用的JQuery Tab实现

mikel阅读(830)

网页上的空间是寸土寸金,虽然显示器的分辨率越来越大,可是直到今天,网页设计中仍然是以至少1024×768 像素的支持为主,也就是说,每一屏页面只有区区 955×600像素 的安全尺寸可以用而已。于是,为了在有限的空间里容纳更多的内容,滑动门式的标签切换(Tabs)方式越来越受欢迎。通过滑动门技术,可以在同一块页面区 域内放置数倍的内容。根据用户的选择来决定显示哪一部分。最近我在实际应用中,逐步完善出一种基于 jQuery,但是比 jQuery UI Tabs 插件更小巧也更通用的简单 Tabs 实现。

最早的滑动门的技术,一般都是结合 onclick 或者 onmouSEOver 事件传递一个参数给 JS 函数,根据传递的参数来决定显示哪一个标签。比如:

function showTabs(n) {
var tabsNumber = 3;
for (i = 0; i < tabsNumber; i++) {
if (i == n) {
document.getElementById("tabPanel-" + i).style.display = "block";
} else {
document.getElementById("tabPanel-" + i).style.display = "none";
}
}
}

加入有这样的一个函数,就可以在tab的标题按钮中设置 onclick = “showTabs(1)”来设置第二块内容显示,而其它块隐藏。

这种方式最大的缺点是:

  1. HTML代码和JS代码混合;
  2. 可扩展性差;

尽管可以通过window.onload绑定事件等方式来是实现JS代码从HTML中分离,也可以把函数改得更复杂以实现通用性。但是总的来说,还是很难做到一处定义到处引用。

后来随着各种JS类库的出现,更强大的Tabs出现了,最出名的就是JQuery UI中的tabs插件。一旦加载了JQuery框架和JQuery UI插件,那么要在页面中实现Tabs,就变得简单了许多。首先我们的页面中的Tabs代码这样写:

<div class="tabs">
<ul>
<li><a href="#panel-1">标签一</a></li>
<li><a href="#panel-2">标签二</a></li>
</ul>
<div id="panel-1">区域一</div>
<div id="panel-2">区域二</div>
</div>

注意:这里的代码非常干净,不含任何的JS代码或者与文档结构无关的定义。然后,在head区域,或者在页面任何地方增加一段js代码:

$(function() {
$(".tabs").tabs();
});

就实现了Tabs功能,这行JS代码执行后,上面的HTML代码就会变成:

<div class="tabs">
<ul class="ui-tabs-nav" jquery1239647486215="2">
<li class="ui-tabs-selected"><a href="#panel-1" jquery1239647486215="8">标签一</a></li>
<li><a href="#panel-2" jquery1239647486215="9">标签二</a></li>
></ul>
<div id="panel-1" class="ui-tabs-panel" jquery1239647486215="4">
区域一
</div>
<div id="panel-2" class="ui-tabs-panel ui-tabs-hide" jquery1239647486215="5">
区域二
</div>
</div>

结合我们自己编写的css,或者jQuery UI 自带的CSS,就可以实现滑动门效果。并且,由于jQuery的强大,我们可以在页面中放置多组滑动门,然后一次性设定。

要说明的是,这个地方由于只启用了jQuery UI 中的 Tabs 插件,因此生成的代码还是比较干净的,只增加了 ui-tabs-xxxx 这几个相关的css类。如果你同时包含了jQuery UI的其它插件,那么即使不启用,也会添加一堆的css定义。而且,jQuery UI Tabs 还提供了非常强大的控制功能,你可以动态地添加 tab,可以随意更改激活事件,可以定义切换效果,还可以设置默认激活状态和禁用等。

但是我在实际应用中遇到了一些问题,除了 jQuery UI 自带的js脚本很大,css不符合实际应用需求外,还有一个最大的问题,你可能已经注意到了,在作为导航的标签定义中,每个标签对应哪一个区域是用链接目 标来定义的。比如 <a href="#panel-1">标签一</a>和<div id="panel-1">区域一</div>对应,如果你的标签和区域没有对应起来,绑定tabs()就不起作用了。

而且,这种方式来带来另一个麻烦,就是当我们需要给标签加上链接的时候,没办法加。即使你将标签的激活事件设置为onmouSEOver而不是onclick,链接也不能实现,因为链接用于指定目标了。这种需求在我们的实际应用中并不是不存在的。比如:
imageimage

这两个图片中的tabs标签,都要添加到对应的新闻类别或者论坛板块的链接。这时候 jQuery UI的默认绑定就带来了麻烦。

其实分析一下,我们在实现滑动门的时候,用以下HTML结构就可以满足需要:

<div class="tabs">
<ul>
<li>标签一</li>
<li>标签二</li>
</ul>
<div>区域一</div>
<div>区域二</div>
</div>

借助 jQuery 库,我们可以通过 $(".tabs")找到要实现的标签,然后 .find("li") 来找到要添加事件的元素,绑定事件的时候,我们可以通过该元素在$(".tabs li")集合中的索引值来明确是哪一个标签被激活,然后对应索引值的panel显示。代码类似这样:

<script type="text/javascript">
$(function() {
$(".tabs").find("li").onmouseover(function(e) {
if (e.target == this) {
var tabs = $(this).parent().children("li");
var panels = $(this).parent().parent().children("div");
var index = $.inArray(this, tabs);
if (panels.eq(index)[0]) {
tabs.removeClass("ui-tabs-selected")
.eq(index).addClass("ui-tabs-selected");
panels.addClass("ui-tabs-hide")
.eq(index).removeClass("ui-tabs-hide");
}
}
});
});
</script>

这段代码只使用了两个css类来处理,并且,自动判断tabs和panels的对应状态,假如你有4个tab,但是只有前三个启用了,那么你只需要写三个panel就可以,第四个panel不存在,则第四个tab自动不生效。

在实际使用中,会遇到一个问题,一般我们会给tab中的文字加链接,那么当鼠标滑过这个tab的时候,如果指到了文字,那么激发事件的对象有可能是a元素而不是li元素,则事件就不能正确激发。所以我们改进代码如下:

<script type="text/javascript">
$(function() {
$(".ui-tabs-nav > li > a")onmouseover(function(e) {
if (e.target == this) {
var tabs = $(this).parent().parent().children("li");
var panels = $(this).parent().parent().parent().children(".ui-tabs-panel");
var index = $.inArray(this, tabs);
if (panels.eq(index)[0]) {
tabs.removeClass("ui-tabs-selected")
.eq(index).addClass("ui-tabs-selected");
panels.addClass("ui-tabs-hide")
.eq(index).removeClass("ui-tabs-hide");
}
}
});
});
</script>

与此对应的HTML结构是:

<div>
<ul class="ui-tabs-nav">
<li class="ui-tabs-selected"><a href="/bbs">论坛新帖</a></li>
<li><a href="/blog">最新博文</a></li>
</ul>
<div class="ui-tabs-panel">
<!--这里调用最新论坛文章-->
</div>
<div class="ui-tabs-panel ui-tabs-hide">
<!--这里调用最新博客文章-->
</div>
</div>

同时,我们有以下的css类定义:

.ui-tabs-nav
{
/*导航容器定义*/
}
.ui-tabs-nav li
{
/*默认标签样式*/
}
.ui-tabs-nav li.ui-tabs-selected
{
/*激活的标签样式*/
}
.ui-tabs-panel
{
/*默认的显示区域样式*/
}
.ui-tabs-hide
{
display: none;
}

这样,就可以根据你的需要,结合自己的 css,定制不同样式的滑动门了。把相应的js代码放到页面中,那么在页面里任何地方只要你按照HTML结构编写了一段html,这段html就会自动变 成滑动门。而不用在每个页面里单独指定特定的selector来应用滑动门的tabs()方法。并且,根据需要给你的滑动门标签添加需要的链接,或者不要 链接(href="#" 或者 href="JavaScript:void(0)")。

这段滑动门代码只要具有jQuery core 就可以正常运行,不需要加载jQuery UI。非常简单,而且很通用,样式上喜欢怎么扩展都可以。

具体效果可以参见 http:/www.taihainet.com , 在 台海网 首页中,我一共应用了四个样式共九组滑动门,代码就只是上面给出的那一段。四个样式列举如下:

image 
滑动门一:多个搜索表单,暂时只实现两个,后面三个由于没有对应的ui-tabs-panel,自动禁用,但是链接可以点击。

image 
滑动门二:多块商务信息区域,其中第三个由于没有对应的ui-tabs-panel,自动禁用。

 

image
滑动门三:新闻栏目切换,标签中的文字链接到对应的新闻栏目。

image
滑动门四:论坛分板块帖子调用。标签中的文字链接到对应的论坛板块。

[杂志]JavaEye论坛热点推荐-2009年3月

mikel阅读(1067)

如果无法通过大米盘下载,点击通过JavaEye本地下载:http://www.javaeye.com/topics/download/ce32dbc6-7116-3724-b3a3-e1160e6dc03e

Java编程和Java企业应用
 

  1. “山寨”框架3宗罪
  2. 刚看了个自制框架的帖子,其实之前这类帖子见得比较多,吵得也都挺厉害。好像总有人一边对提议“不要发明轮子”的同学挺反感,一边以发明家自居,把话扯到中国的软件业上去。之前还看到有人见到“只用SSH的公司“坚决不去。我想说说我的看法。
    我觉得框架这东西,首先要明白为什么要用它——这是废话,但又是最重要的。真的有些人是不知道为什么用框架,乱用一通,产品代码乱七八糟。
    然后是学习如何用好它,掌握框架后接着可能 …
       

  3. 要不要就一起升级JDK6.0?
  4.   背景音乐:《要不要就一起加入G C D》,唱:陈珊妮,词:夏宇。
      JDK5是一个巨大的转折点(泛型,Annotation,并发…),而JDK6就是一个可安全升级的加强版,对新项目是不升白不升,白升谁不升,对旧项目就是升了也白升,不升也没啥损失吧。
      稍微整理了一下官方JDK6官方Features and Enhancement说明

    比较有用的升级
    性能提升
        : …
       

  5. ConcurrentHashMap之实现细节
  6. ConcurrentHashMap是Java 5中支持高并发、高吞吐量的线程安全HashMap实现。在这之前我对ConcurrentHashMap只有一些肤浅的理解,仅知道它采用了多个锁,大 概也足够了。但是在经过一次惨痛的面试经历之后,我觉得必须深入研究它的实现。面试中被问到读是否要加锁,因为读写会发生冲突,我说必须要加锁,我和面试 官也因此发生了冲突,结果可想而知。还是闲话少说,通过仔细阅读源代码, …
       

  7. 为公司写的1个简单的WEB框架,希望大家给点意见
  8. 因公司需要,为公司写了1个很简单的WEB框架,目前已经在公司很多内部系统中使用,希望大家能多给点意见:功能简介:   1. 把前台JSP页面和后面java表单类(这个称呼是自己随便取的,对应一般MVC框架中的C)自动对应起来,比如:先假设所有的表单类都放在 jnet.forms包下,你前台有个index.jsp,那对这个index.jsp的所有操作代码必须放在 jnet.forms.index.java …
       

  9. XMemcached介绍(发布1.0-beta)
  10. xmemcached发布1.0-beta,从0.60直接到1.0-beta,主要改进如下:1、支持更多协议,在已有协议支持的基础上添加了 append、prepend、gets、批量gets、cas协议的支持,具体请查看XMemcachedClient类的实例方法。重点是cas操 作。
    2、memcached分布支持,支持连接多个memcached server,支持简单的余数分布和一致性哈希分布。

       

  11. 实际项目数据下的序列化性能对比:PHPRPC vs Hessian2 vs AMF3
  12. (最新测试结果见第二页:加入AMF3)
    实际项目中的一个企业信息表:15072条记录,测试结果令人吃惊:Hessian胜出太多,不知andot是怎么看,测试过程有误?
    测试过程很简单:读取数据表全部数据至List实例,然后序列化,并将数据保存至本地硬盘。
    测试环境:Oracle10,jdk1.5,3G内存。
    测试结果:
    引用
    开始测试,序列化后二进制数据写进本地文件…
    测试记录总数:15072条 …
       

  13. 解开 phprpc 序列化性能高于 hessian 的秘密
  14. Phprpc, 是一个声称在某些场景下, 性能比hessian还要高的协议.
    下面url是javaeye andot 写的两个协议的性能测试报告:
    http://www.javaeye.com/topic/333720
    看到这个报告是有点激动的, 那么它到底在实现上有何高明之处呢?
    在这篇文章里, 我会给大家简单阐述一下, 为什么phprpc在某些场景下, 性能 …
       

  15. 中文分词 mmseg4j
  16. 使用 paoding 的配置觉得有点复杂,而且管理词库也有点不方便,同时自己也想了解下中文分词算法,然后就想自己写个中文分词器,在lucene和solr中使用。在 javaeye 看到有关 mmseg 的简介,看了下还不错,简单方便,那就用它来写个java版吧,我搜索 mmseg的java版(好像是 solo,官方已经下载不了),弄清分词算法还是自己写写吧。
    实在想不到其它名字,就称它为 mmseg …
       

  17. Spring AOP 简单入门示例
  18. 严重提示:仅供参考
    分享一个自己写的最为简单的Spring AOP的应用,其实,本人也是学习Spring不久,只是把一些个人的理解分享下,供参考。可能很多人刚开始不太理解到底啥是AOP,其实它也是相对 OOP来说的,类似OOP其实也是一种编程思想吧。本人暂且把Spring 中的AOP理解成一种方法的拦截器(可能有所片面,主要是方便理解)。
    个人通俗理解,就好比你去自动取款机取钱,边上装了个摄像头 …
       

  19. 杰哥私房题──约瑟夫问题
  20. 问题描述
    约瑟夫问题:有n只猴子,按顺时针方向围成一圈选大王(编号从1到n),从第1号
    开始报数,一直数到m,数到m的猴子退出圈外,剩下的猴子再接着从1 开始报数。就这样,
    直到圈内只剩下一只猴子时,这个猴子就是猴王,编程求输入n,m后,输出最后猴王的编
    号。
    输入数据
    每行是用空格分开的两个整数,第一个是 n, 第二个是 m ( 0 < m, n < 300)。最后一行
    是:
    0 0

       

  21. JAVA每日一题01
  22. 还是我来继续jythoner的JAVA每日一题吧!最近比较闲哦!希望jythone不要见怪哦!
    真是不好意思啊!早上有点忙!呵呵!
    题目:一项抽奖程序要求读者从整数1-49之间选择6个不同的数字。编写一个程序来完成这项工作,并生成5组结果。
    package com.tengfei.lesson01;
    public class Lottery {
      public stati …
       

  23. jBPM工作流应用
  24. 一、 环境配置
    基础环境是eclipse3+myeclipse6+mySQL5+tomcat6 。
    首先从网站上下载jBPM开发包(jbpm-jpdl-suite-3.2.3.zip),据说现在jBPM3已经升到3.2.6了,而且据说已 经推出了jBPM4了。将jbpm-jpdl-suite-3.2.3.zip解压缩后,里面有个\designer文件夹,这个是eclipse IDE的jBPM插件,是可 …
       

  25. ibatis操作 模板基类设计 实现所有的,增,删,改,查,分页
  26. 上一篇介绍了:hibernate  模板基类设计
    这一次介绍一下 ibatis  模板基类设计 实现公共方法,减少开发工作量
    代码更整洁清淅
    EntityDAO 类代码如下:
    /**
    * (#)EntityDAO.java 1.0 2008-6-7 上午09:25:37
    *
    */
    package com.keyi.util.dao;
    import java.io.Seri …
       

  27. jBPM4.0的用户指南(一)
  28.   项目终于上线了,终于不用天天加班了,于是拿出时间来翻译了下jBPM4.0的文档。根据自己理解翻译的,如果有句子不通顺或者理解有问题的地方,大家可以踊跃提出。
    第 1 章 导言
    1.1. 许可证与最终用户许可协议
    jBPM是依据GNU Lesser General Public License(LGPL)和JBoss End User License Agreement(EULA)中的协议发布的 …
       

  29. jBPM4.0的用户指南(二)
  30. 第 2 章 安装配置
    2.1. 类库
    jBPM 不需要其他任何依赖库就可以在Java虚拟机上运行,参见开发指南的对象执行模式。但是在这个用户指南里我们将介绍使用jBPM的最常用方式。也就是让 jBPM将流程定义、流程实例、历史记录保存在关系数据库里。在这种情况下,hibernate就需要添加在classPath中了,当然还有些jPDL 的功能需要用到其他的类库。因此,将lib这个目录下所有的类库添加 …
       

  31. JAVA语言写的FTP服务器:Apache-FTP Server-1.0.0源码的初步研究
  32. 最近Apache又出了一款JAVA写的新的项目,叫Apache-FTP Server,目前的版本为1.0.0,本文是以比较基础的1.0.0版本来进行最浅白的初步研究
    在http://mina.apache.org/ftpserver/downloads.html可以下到Apache FTP Server的最新的一个版本。直接下ftpserver-1.0.0-src.zip,里面包括发布的版本和源代码 …
       

  33. Java过滤特殊字符的正则表达式
  34. 在网上找了好久也没找到个合适的正则表达式以过滤特殊字符;自己学习了下,写了两个,实现要求。
    // 过滤特殊字符
    public   static   String StringFilter(String   str)   throws   PatternSyntaxException   {  
                    // 只允许字母和数字
                    // …
       

  35. 新工具框架“仓库猫”发布,希望大家多多试用,多多提意见和BUG
  36. 大家好。这是我参考前几天在这里发帖的zhongxuchen提出的“陈氏查询”理论编写的处理动态查询语句的工具框架。因为本人极度爱猫,所以命名为“仓库猫”,英文名翻译得不好,通过金山词霸命名为“catsorage”。
    项目地址:http://code.google.com/p/catstorage/。
    不过因为我还没来得及编写使用帮助,所以目前只提供SVN源代码下载。该框架使用Apache2.0许可证 …
       

  37. 小试ThreadLocal想到“隐式参数”模式
  38. 最近同事想通过自定义函数来输出国际化文字。比如:
    ${my:i18n('login.userid')}.
    EL支持我们自定义这样的函数,问题是这个函数没法获取request对象,不知道当前页面的语言。
    由此我想到threadlocal也许可以解决这个问题。
    我的思路是做一个filter,每次都把request引用保存在一个threadlocal变量里。然后在上述的i18n自定义函数里读取这个thre …
       

  39. 环形布局管理器 + 环形弹出菜单(学习swing的一些小成果)
  40. 最近闲来无事, 学习学习swing。
    在查看JPopMenu的代码时候突发奇想, 想实现一个环形的弹出菜单,说干就干。
    我们都知道, swing 组件的位置和大小是由于layout 管理的,所以想实现环形的弹出菜单就必须实现一个环形的布局管理器。请看我的实现
    效果
    package info.mikewang.gui.layout;
    import static java.lang.Mat …
       

  41. Web Service开发指南 V2.3.1
  42. 纯自己经验的总结,不多说了,见附件吧。
          Ruby
     

  43. 请注意Rails2.3自带的memcache-client有性能问题
  44. Rails2.3版本发布了,这个版本内部的改动非常大,相关介绍可以看JavaEye这篇新闻:http://www.javaeye.com /news/5390,估计最近也有不少人开始动手升级到Rails2.3了,JavaEye也不例外,这一升级才发现性能低得令人发指。
    由于过于信任Rails框架,没有进行本地性能测试,在通过了兼容性测试就兴冲冲上线了。这一上线,动态请求立刻堵了一大堆,仔细看了看fas …
       

  45. Ruby 1.9: 中文编程
  46. 突然想起,Ruby 1.9支持中文方法名和变量名!
    def 召唤 家丁
      case 家丁
      when '阿福', '旺财'
        puts "……少爷,我系#{家丁}……"
      else
        puts '……(一段短短的沉默,然后一段长长的沉默)'
      end
    end
    家丁甲, 家丁乙 = %w[阿福 旺财]
    召唤 家丁甲
    哼哼,我们可以改造黄瓜或者阿死别克了 …
       

  47. JavaEye闲聊客户端(Ruby+Shoes版)
  48. 下载地址:http://javaeye-client-ruby.googlecode.com/files/EyeShoes-0.1-alpha.zip
    代码已经开源:http://javaeye-client-ruby.googlecode.com/svn/trunk/
       

  49. YARV和JIT,还有JRuby……
  50. 昨天承night_stalker老兄的提醒,去google了一下YARV,看看我是不是把事情记错了。记得Ruby还没1.9的时候我就稍微关注过YARV的信息,但印象中Ruby 1.9/YARV是没有JIT的……
    Hmm,我貌似是没记错。目前的Ruby 1.9.1里并没有JIT。
    首先需要定义我这里所指的JIT是什么。JIT,Just-In-Time Compiler,也就是所谓的即时编译器,其过程是 …
       

  51. 如果你升级完Rails 2.3.2 遇到了问题
  52. 最主要的提示是说:
    uninitialized constant ApplicationController
    c:/ruby/lib/ruby/gems/1.8/gems/activesupport-2.3.2/lib/active_support/dependencies.rb:443:in `load_missing_constant'
    c:/ruby/lib/ruby/gems/1.8/g …
       

  53. 建立一个典型的RubyOnRails网站(一)
  54. 写在前面:
        第一次,写连载啊,希望能对自己和各位看官有点帮助,多了解一点RubyOnRails开发上的情况吧。能够有点帮助,这就是坚持的理由。^_^
    生命百科全书:www.eol.org
    网站是基于RoR的,内容是做互动的生命百科博物馆,本文主要介绍,如果通过该网站提供的代码,建立起RoR的网站,并且学习,该网站中使用到的一些,RoR最普通的技术。
    资源地址如下,匿名svn下载。
    svn:/ …
       

  55. Ruby 和 Rails 的 chm 参考手册
  56. ruby手册的原版地址 有各种版本 http://www.ruby-doc.org/
    chm版,方便初学的不习惯rdoc的新手,进行搜索和参考
    虽然版本有点旧 rails 2.0.2 ruby 1.7
    rdoc的版本是新的 rails 2.2.2 ruby 1.8.6
    还是喜欢用chm版的,有时间了应该把另外的也生产chm
       

  57. Ubuntu Linux下ruby 1.9.1和Rails 2.3升级记录
  58. 安装ruby
    首先不再使用ubuntu的apt-get安装ruby,自己编译安装,这样虽然不能使用ubuntu系统apt-get的升级功能对ruby进行升级,但胜在自由度最高,想怎么折腾就怎么折腾.
    到 http://www.ruby-lang.org/zh_CN/downloads/
    下载ruby 1.9.1的源代码.
    #解压文件
    tar  …
          Web前端技术:AJAX和RIA
     

  59. 你应当了解的几个CSS3新技术
  60. 作为一个Web开发者,保持对未来Web标准的关注、学习和了解是很重要的。这里是一些CSS3相关的文章和资源,不管你是第一次准备去认识CSS3,还是已经略知皮毛,下面这些资源都将有助你更好的学习和理解CSS3。
    英文CSS3资源
    CSS3.info
    看域名就知道,这是一个专门介绍CSS3的网站。所有你想了解的有关CSS3的信息,都能在这里找到。CSS3.com
    又一个专门介绍CSS3的网站,包 …
       

  61. Mootools和Jquery之间的选择问题
  62.     Portotype虽然是强大的,和script.aculo.us结合可以做出很多完美的效果,可是它里面有太多我不想用的代码,或许这是我后面选择 mootools的主要原因,我只是想选择性的打包。其实当时我也很想用一下JQuery,仔细对比了一下,我还是觉得mootools更加的适合于我。 有比较,才有机会去选择,我想从下面5个方面讨论一下。
    可读性VS简洁
        在网上,很多人把mootool …
       

  63. Mootools、jQuery之说三道四
  64. 看到很多人在讨论JQuery和Mootools,但是流于分析,理论,我来说说一些实际的体会吧。
    首先摆明立场,我是倾向Mootools的,jQuery的很多东西让我觉得他只是名声在外,下面我会一一说明。
    Prototype公布1.6的时候,我就开始在同时关注jQuery和MT。当时的MT没有jQuery出名,代码也没有jQ的精彩,但是当时他具备了一些很重要的特性,比如样式转换类的CSS,缓动类的Tw …
       

  65. KindEditor 下一步开发计划
  66. KindEditor是简单的在线HTML编辑器,支持目前流行的大部分浏览器,主要优势在于简单、快速、定制方便,非常适合博客、SNS日记、WEB邮箱等互联网网站。
    3.1.1版本初始化时被GZIP压缩以后总大小为22KB,分别为1个JavaScript文件,2个CSS文件,2个gif图片,目前国内的ADSL宽带速度下基本上可以瞬间打开。
    不足的地方是:
    1. 每个浏览器生成的HTML不一致。
    2. U …
       

  67. show一下Extjs+j2ee项目成果(收集开源意见)
  68. 以下介绍的各个系统均采用extjs+easyjweb+spring+jpa+任意数据库构架开发
    蓝源SaaS开源计划:
    http://www.erpwin.com/news.ejf?cmd=showSystemAnnounce&id=7
    在开源人网站平台发布的开源问卷调查:
    http://www.vifir.com/bbs/html/20081213/3276827.html
    蓝源SAAS( …
       

  69. jquery ui 日历插件(换色+类型)
  70. 抽空把jquery ui
    里的日历做了个整理,整合了换色和几种调用方法。
    文件里的example.html是我写的调用页面,所有的颜色主题和调用方法都可以通过这个页面呈现出来。
    example页面,点击查看大图
    一共有17个颜色主题,如下图,点击查看大图
       

  71. 三、DWR配置文件详解与bean转换
  72. DWR配置文件详解与bean转换
    1、了解DWR内置配置文件
    DWR内置配置文件提供了框架配置所需要的一些内容,框架加载的时候把这些信息加载到框架中。dwr内置配置文件也为dwr.xml,和我们在外 面配置的dwr.xml是同一个dtd,但是为什么要内置?因为dwr在加载的时候会去加载这个默认的配置文件,目的是什么?我们先看一下,
    <init>
        <creator id=&q …
       

  73. Javascript工作流引擎代码及实例
  74. 最近在学习jBPM和JavaScript,所以按照一些相关概念自己写了下面的200行代码的“工作流引擎”,工作流管理系统包含了流程定义, 引擎,及应用系统三个主要部分,下面的代码实现了流程的分支合并,目前只支持一种环节上的迁移。下载html附件双击就可以跑起来。
    /*/////////流程定义///////////
      start
       / \
      1   \
    / \   \ …
          移动编程和手机应用开发
     

  75. [原创] 如何在Android Market赚钱 part 1 – paid app 付费app
  76. 随着我的第一个付费app的成功交易, 我想有必要写下Android app如何认证, 发布, 到赚钱的几个流程, 与大家共享, 也希望大家有条件的可以试试开发一些免费或者付费的Android小软件, 以后移动开发的机会会很多, 现在先练练手关于如何开发Android app, 这里就不详细叙述了, 外面相关的文章大把.
    发布app前, 你需要一个google id, 然后要注册成android de …
       

  77. [原创] 如何在Android Market赚钱 part 2 – 免费app附带广告
  78. 如果你的app用户量潜力上来说是巨大的, 而且用户会时常使用你的app的, 比如twitter客户端, SNS插件等等, 你可以考虑用广告的收入方式而发布免费的app.
    说起广告banners, 大家一定不会陌生了.  最流行的就是google adsense.  但本人对adsense的印象很不好.  自己有个adsense的帐号, 但时不时广告都会变成公益广告, 而且收入奇低, -__-#至今未 …
       

  79. [原创] 如何在iPhone AppStore赚钱 part 1 – 付费app
  80. iPhone无疑是目前最炙热的开发平台之一.  开发者只需要好好的做自己的app, 销售收款物流交易和发布渠道全部由Apple搞定, 收入37开, Apple 3, 开发者7.  比起北美这边运营商动不动就40+%强行占有开发者的收入, Apple算是很厚道了.  无疑, 初期几个很成功的app让一批人赚了第一桶金子.  当然大家都跃跃欲试的时候, iPhone的开发也就有点开始白菜化的趋势.  但 …
          Microsoft .Net
     

  81. [Ray Linn]用Visual Studio 2008开发IE BHO  (浏览器帮助对象)之一
  82. 这篇文章是应同学们的要求写的,以前都是用VC++ 6.0+Platform SDK完成的. 迁移到 VS2008之后,原来Visual Studio 6.0里的BHO向导不复存在,因此特此不厌其烦,详细说明,本文也适用于VS2005.
    首先谈BHO的开发工具,我偏向使用VC++(unmanaged C++) 作为开发工具,因为Java JVM或.Net CLR的虚拟机是个很笨重的东西,也是内存杀手, …
          Python
     

  83. 写了个开心网查看朋友果实的小程序
  84. 用python2.6写的,用2.5跑可能要改里面json相关部分
    其实就是菜园旁边那个按钮的功能,只是没那么多时间老去打开浏览器看那个东西,所以做了这个
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    # coded by Daniel King
    import re, time, thread, webbrowser
    from Tkinter i …
       

  85. python vs ruby
  86. 1.python是弱对象语言, 而ruby是纯对象语言
    python可以没有对象运行,但是ruby的根基就是Object。
    而且python对于封装的约束比较弱,而ruby相对较强。
    比如一个class的实例dog。
    python:dog.name = "dogy" 相当于给dog赋予了一个属性
    ruby: dog.name = "dogy" 报错,dog没有 …
       

  87. python vs javascript
  88. python的结构体(包括class,function 和class 实例)和JavaScript的结构体(Object和function)实现有些相似,也有些不同。
    python的class对数据和函数的存储都是维绕着__dict__.
    对象的属性和方法都存在里面。
    而javascript的对象(Object或function)应该有两个hash存储数据,一个是prototype,一个是xxx(现 …
          综合技术
     

  89. Memcached源码分析(线程模型)
  90. 目前网上关于memcached的分析主要是内存管理部分,下面对memcached的线程模型做下简单分析
    有不对的地方还请大家指正,对memcahced和libevent不熟悉的请先google之
    先看下memcahced启动时线程处理的流程
    memcached的多线程主要是通过实例化多个libevent实现的,分别是一个主线程和n个workers线程
    无论是主线程还是workers线程全部通过lib …
       

  91. D语言编译器DMD开源了!
  92.   自从1999年12月,Walter设计开发D语言以来,D语言的编译器DMD因为不开源,成了业界的诟病。Walter曾经承诺,将开放源代码。    伟大的Walter Bright在今天2009年3月5日下午18点40分(中国时间) 释放出了D1和D2的前端和后端的源代码!!开源协议为GPL1.0或者Artistic license。后端协议看了看,有Digital Mars和SYMANTEC的版 …
       

  93. KeyValue DB之redis
  94. redis,是快客王在je chat中介绍过的一个keyvalue数据库,打着在'入门级服务器'上10w/s set ops高性能头衔来忽悠众多不明真相的程序猿。
    事实上,号称的'入门级服务器'服务器是一台 Xeon X3320 2.5Ghz 的机器,在我的
    AMD Athlon(tm) 64 X2 Dual Core Processor 4000+ 台式机上,benchmark结果是
    引用==== …
       

  95. 读“DataBase Sharding at Netlog”,看DataBase Scale Out
  96.        今天看了“Database Sharding at Netlog, with MySQL and PHP”一文,和去年我们讨论扩展的思路很类似(不过这种分布式扩展,计算,存储的思路都很类似),但是这片文章的作者是在日益爆炸式增长的用户数据下实 践的分享,因此这里将文中的一些思想记录下来分享一下。
           Netlog拥有4000万活跃用户,每个月有超过5000万的独立用户访问网站 …
          软件开发和项目管理
     

  97. 一个时间进度安排比较急的项目,组员却水平有限
  98. 公司新接到一个项目,需求设计之后,便是编码阶段
    编码之前,开发成员除了美工之外有3个人,一个是我,2个同事,从需求,和设计进行了介绍,也提供了相关的文档。安排了进度之后,大家没有问题,便开始开发。
    时间安排比较紧凑,因为客户比较急。
    采用的是非常普遍的SSH,用acegi做的权限这块,另外两个组员我也不是很了解,所以安排了2个比较简单的,对数据库的一个表进行增删改查,其中有一对多或者多对一的关系,我 …
       

  99. TDD是不是以开发效率换代码质量(原标题:单元测试/TDD的成本和收益)
  100.     最近我在公司搞代码评审,做的过程中发现一个矛盾的问题:评审发现了问题,于是需要重构,可是重构需要有完善的单元测试做保障,而项目已接近开发结束,基本没有单元测试,结果发现的问题只能搁置,因为你很难下决心去为了完善一个东西而去冒毁坏它的风险!
        这样下去,代码评审将流于形式
        我意识到TDD与code review有着很紧密的联系,其实以前就听说过敏捷的十二个实践都是有内在联系的。

       

  101. 也谈IT人员流失问题 王泽宾
  102.     一个公司或者团队都会遇到过人员流失的问题,可能小公司可能更为严重。最可怕的是团队中重要成员的流失,将对公司的业务或者项目造成不小的麻烦。究竟怎么看待这个问题呢?很多人都发表过自己的见解,争论也很大。
        俗话说:“屁股决定脑袋”,其实大家的立场不同,结论自然不同。
        很多管理者,会抱怨员工没有职业道德,经不住诱惑;有的人抱怨猎头太可恨,扰乱IT就业市场;还有的人指责同行不厚道,拿高 …
          入门讨论
     

  103. 集合比较算法(Java)
  104. 最近做了一个小测试,对两个集合的比较,目的是想删除出两个集合相同的数据。
    分别用List、Map、和Set进行测试
    利用List比较
    10000用户的数据(6000相同的用户,4000不同的用户),完成比较的时间共耗时1531毫秒
    100000用户的数据(60000相同的用户,40000不同的用户),完成比较的时间共耗时143735毫秒
    利用Map比较
    10000用户的数据(60000相同的用户,4 …
       

  105. Struts+Spring+Hibernate学后感
  106.      最近利用时间好好的看了一下SSH,Struts,Spring,Hibernate,并且做了个小项目,我把我个人学习的感觉和理解记了下来,和大家讨论讨论,想来个抛砖引玉,希望大家多多讨论,理解的不对的地方还请直言赐教。
         Struts,负责表示层的,主要玩的就是MVC,主要的就是struts-config.xml配置文件,另外还有标签和验证。主要负责的就是把请求和回复分开,形成层状结 …
       

  107. javamail发送邮件
  108. 今天学习了一下JavaMail,javamail发送邮件确实是一个比较麻烦的问题。为了以后使用方便,自己写了段代码,打成jar包,以方便 以后使用。呵呵以下三段代码是我的全部代码,朋友们如果想用,直接复制即可。jar包因为我不知道怎么传到javaeye上,所以朋友们回去自己打吧。
    我的代码有三个类:
    第一个类:MailSenderInfo.java
    package com.util.mail;
    /* …
       

  109. Dtree+Jquery动态生成树节点例子《新手可参考》
  110. Dtree+Jquery动态生成树节点.
    最近有朋友问我一个动态生成树怎么做.后来就用Dtree  js组件和Jquery实现了一个demo给他.现在贴出来给初学者做些参考.
    1.先来介绍一下. dtree 的用法.(我引用了以前我收集的一篇文章.还比较详细,出处不记得啦).文章下面会附带dtree用法的例子.
             Dtree目录树的总结
                      一:函 …
       

  111. 被Groovy震的第一下
  112.     呵呵,下面这段代码,看起来很眼熟吧?猜猜输出的是什么?
    println new URL("http://manyinjin.javaeye.com").openConnection().getInputStream().getText();
        简单的一行语句,blog里面的东西都print了,重要的是,我只需要知道java里怎么做就行了。。。
        你甚至可以这 …
       

  113. 彻底被groovy折服
  114. 被groovy彻底征服:
    先瞅瞅人家groovy是怎样解析xml的:
    plan.xml
    <plan>
    <week capacity="8">
    <task done="2" total="2" title="read XML chapter" />
    <task done= …

[SQL]解决SQL Server配置管理器提示“无法连接到WMI提供程序”问题

mikel阅读(853)

出错提示:启动SQL Server 2005 配置管理器时,出现以下提示错误

              无法连接到WMI提供程序。您没有权限或者该服务器无法访问……

              Invalid class [0x80041010]

解决方法

以管理员身份运行“命令提示符”(在附件下面),进入后执行以下命令

   1)cd /d    C:\Program Files\Microsoft SQL Server\90\Shared

   2)mofcomp "C:\Program Files\Microsoft SQL Server\90\Shared\sqlmgmproviderxpsp2up.mof"

当看到有如下信息时表明操作成功

MOF file has been successfully parsed
Storing data in the repository…
Done!

参考文章http://blogs.msdn.com/echarran/archive/2006/01/03/509061.aspx