如今,N有了,NSpring有了,唯独少了个N。也许是因为的form开发模式吧,NStruts对于.net来说没有多大的实用价值,webform已经很struts了。不过,我还是觉得struts的开发模式用起来顺手一点。
当一个页面的数据项过多的时候,假如有几十个的文本输入框,在后台获取它们的数据实在是件相当痛苦的事情。如果能像struts那样,直接发送个请求就OK了,那该有多好。Webform和struts各有优点,如果能在做项目中,将起到一个互补的作用。
基于以上原因,我设计了一个.net版的struts,名字就叫NStruts。这是一个开源的项目,支持的朋友希望也加进这个项目来,共同完善它。我设计的思路是,将webform的优点和struts的优点相结合,形成一个独特的struts。
现在以上功能除了依赖注入拦截器没有做好,其它功能都已经做好了。
NStruts由三个核心类构造,Configuration, Dispatcher, ActionSupport。
Configuration:Configuration类负责获取获取配置文件的信息
Dispatcher:Dispatcher类负责请求Action,拦截Action,并执行Action内的方法等。
ActionSupport:ActionSupport类是抽象类,提供了一些方法的封装,Action类可以继承该类以获得更多的功能。
首先看一下使用示例吧
页面的代码如下:
Default.x<body> <form id="form1" runat="server"> <div> 用户名:<input name="UserName" type="text"></input><br /> 密码:<asp:TextBox ID="Password" runat="server"></asp:TextBox><br /> <asp:Button ID="Login" runat="server" Text="登录" onclick="Login_Click" /> <asp:Button ID="Other" runat="server" Text="Other" onclick="Other_Click" /> <asp:Button ID="TypeButton" runat="server" Text="Type" onclick="TypeButton_Click" /> <asp:Label ID="Label1" runat="server"></asp:Label> </div> </form></body>
表单控件可以是普通的html标签,而且不需要设置runat="server"哦。
先定义一个Action类:
TypeActionusing System;using System.Collections.Generic;using System.Linq;using System.;/// <summary>///TypeAction 的摘要说明/// </summary>public class TypeAction{ public TypeAction() { } public string Execute() { if (UserName == "demo" && Password == "demo") { Age = 22; return "success"; } return "error"; } public string UserName { get; set; } public string Password { get; set; } public int Age { get; set; }}
TypeButton在代码:
TypeButton_Click /// <summary> /// 使用Type方法请求Action,不需要配置文件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void TypeButton_Click(object sender, EventArgs e) { string result = Dispatcher.Send(this, typeof(TypeAction)); if (result == "success") { Page.Response.Redirect("Default4.x"); } }
通过Type传值可以不需要配置文件,使用起来比较简单。
N是支持配置文件的,而且还支持多个配置文件,可以避免了单个文件带来的代码过长问题,也能起到团队协作的作用。使用配置文件的好处是很多的,能够更充分地发挥NStruts的功能,虽然会麻烦了点。NStruts的配置文件格式如下:
nstruts<? version="1.0" encoding="utf-8" ?><nstruts> <!--设置是否自动刷新配置文件信息--> <reflesh auto="true"/> <!--包含其它配置文件--> <includes> <include file="pages/nstruts."/> </includes> <!--定义Action映射--> <actions> <action name="Other" assembly="TestAction" class="TestAction.OtherAction"> <result name="success">Default3.x</result> </action> </actions> <!--定义全局跳转--> <global-results> <result name="error">Default2.aspx</result> </global-results></nstruts>
如果使用配置文件,则需要创建一个默认的配置文件,并把它保存在应用程序的根目录下,配置文件的名字为:nstruts.xml。
如果有多个配置文件,可在include结点添加。在执行Action的Execute后,如果在result结点中没有相应的信息,则返回到方法调用处。
如下演示:
LoginActionusing System;using System.Collections.Generic;using System.Linq;using System.Text;namespace TestAction{ /// <summary> /// 普通的Action类 /// </summary> public class LoginAction { public string Execute() { if (UserName == "demo" && Password == "demo") { Age = 22; return "success"; } return "error"; } public string UserName { get; set; } public string Password { get; set; } public int Age { get; set; } }} Login_Click /// <summary> /// 使用普通的类作为Action /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void Login_Click(object sender, EventArgs e) { string result = Dispatcher.Send(this, "Login"); if (result == "success") { ValueTable valueTable = Page.Items["ValueTable"] as ValueTable; Label1.Text = "UserName:" + valueTable["UserName"] + ",Password:" + valueTable["Password"] + ",Age:" + valueTable["Age"];
由上面的代码可以看到,Action可以只是一个普通的类。
继承自ActionSupport类能获得更多的功能,如表单数据验证:
OtherActionusing System;using System.Collections.Generic;using System.Linq;using System.Text;using N.Pride;namespace TestAction{ public class OtherAction : ActionSupport { public string UserName { get; set; } public string Password { get; set; } public int Age { get; set; } public override string Execute() { if (UserName == "demo" && Password == "demo") { Age = 22; AddSession("UserName", "demo"); return Success; } return Error; } public override void Validate() { if (String.IsNullOrEmpty(UserName) || String.IsNullOrEmpty(Password)) { AddFieldError("LoginInfo", "LoginInfoRequired"); } } }} Other_Click /// <summary> /// 使用继承ActionSupport的类 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void Other_Click(object sender, EventArgs e) { string result = Dispatcher.Send(this, "Other"); if (result == "input") { ValueTable valueTable = Page.Items["ValueTable"] as ValueTable; FieldErrorTable fieldErrorTable = valueTable["FieldErrorTable"] as FieldErrorTable; Label1.Text = fieldErrorTable["LoginInfo"]; } }
可以看到,Action的属性值将会保存在Page.Items的ValueTable中返回到方法调用页面,表单验证的错误信息保存在ValueTable的FieldErrorTable中。
注释是非常的详细的,希望喜欢的朋友支持的朋友,一起来完善。如果有朋友对有了修改,希望能给我发一份。
我的邮箱地址是reallypride@163.com
我的是:571398367
欢迎大家提意见,也希望大家的参与。
项目会不定期地更新,下一个版本打算加入简单的依赖注入功能。