如今,NHibernate有了,NSpring有了,唯独少了个NStruts。也许是因为.net的Webform开发模式吧,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.ASPx
<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类:
TypeAction
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
/// <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.ASPx");
}
}
通过Type传值可以不需要配置文件,使用起来比较简单。
NStruts是支持配置文件的,而且还支持多个配置文件,可以避免了单个文件带来的代码过长问题,也能起到团队协作的作用。使用配置文件的好处是很多的,能够更充分地发挥NStruts的功能,虽然会麻烦了点。NStruts的配置文件格式如下:
nstruts
<?XML version="1.0" encoding="utf-8" ?>
<nstruts>
<!--设置是否自动刷新配置文件信息-->
<reflesh auto="true"/>
<!--包含其它配置文件-->
<includes>
<include file="pages/nstruts.XML"/>
</includes>
<!--定义Action映射-->
<actions>
<action name="Other" assembly="TestAction" class="TestAction.OtherAction">
<result name="success">Default3.ASPx</result>
</action>
</actions>
<!--定义全局跳转-->
<global-results>
<result name="error">Default2.aspx</result>
</global-results>
</nstruts>
如果使用配置文件,则需要创建一个默认的配置文件,并把它保存在Web应用程序的根目录下,配置文件的名字为:nstruts.xml。
如果有多个配置文件,可在include结点添加。在执行Action的Execute后,如果在result结点中没有相应的信息,则返回到方法调用处。
如下演示:
LoginAction
using 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可以只是一个普通的C#类。
继承自ActionSupport类能获得更多的功能,如表单数据验证:
OtherAction
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NStruts.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中。
http://www.cnblogs.com/weihengblogs/archive/2013/01/28/2880518.html
相关推荐
nspring+nhibernate帮助文档,用于.NET的spring和hibernate框架,期待nstruts的出现
智慧学院智能化项目规划设计方案PPT(45页).pptx
污水处理计算书
ASP+ACCESS动态网站设计与制作(源代码+设计说明书).zip
基于matlab实现的二维渗流代码,用于模拟在二维条件下,格点所受碰撞的次数.rar
基于matlab实现可实现脉冲编码调制,模拟信号的数字传输:抽样、量化、编码.rar
ASP+access网上购物系统(设计说明书+源代码).zip
Screenshot_20240503_054519.jpg
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
ASP+ACCESS软件信息发布系统设计(源代码+设计说明书+调研报告+任务书).zip
行业报告
ASP+SQL学生排课管理系统(源代码+设计说明书).zip
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
The Experiment 2 of Engineering Electromagnetics.pdf
2003-2022年上市公司管理层权力强度综合指标含原始数据+do代码(exce l+dta) 作为公司内部监督的一个重要方面,有效的内部控制能够减轻管理层与股东 之间的代理冲突,进一步保护投资者利益; 而作为公司外部监督的一个重要内容, 分析 师跟踪有助于降低管理层与外部投资者之间的信息不对称程度, 提高公司的可信度。这两 者都可以在一定程度上有效约束管理层的机会主义行为。 1、数据时间:2000-20 22年 2、数据文件:包含原始数据、do代码、参考文献及最终结果 3、数据格式: excel+dta格式 4、数据说明: ①剔除了ST、*ST、金融业、资不抵债、 关键数据缺失的观测值; ②参考了郑珊珊(2019)和刘剑民(2019)的方法,运 用主成分分析方法,构建了2个管理层权力强度的指标。 ③Powe_郑珊珊:依据两职 合一、董事会规模、 内部董事比例、股权分散度、管理层持股,运用主成分分析方法构建 而成。 ④Powe_刘剑民:依据两职合一、董事会规模、 内部董事比例、总经理任期 、管理层持股,运用主成分分析方法构建而成。 5、数据预览: 数据文件: do代码 : 运行结果:
基于matlab实现的进行渗流力学的s-w曲线,压降漏斗,相渗曲线的作图.rar
如何运行及使用 运行 用eclipse直接clone本项目,GettingStarted目录下的GettingStarted类可以直接运行,查看结果 同时jar目录下有生成的jar包,下载后也可以直接调用 使用 初次使用流程:新建知识图谱加载知识图谱添加数据添加或查询 非初次:加载知识图谱添加或查询 Geokg包中主要类与方法介绍 KnowledgeGraph类 创建知识图谱方法 调用创建图谱方法,则会在指定目录创建数据库,一个目录下只能创建一个知识图谱,否则程序报错并强制退出 创建知识图谱的方法有两个,都为静态方法,可以通过类名KnowledgeGraph直接调用,分别为: //@param iGridLevel 要构建的知识图谱网格的等级,取值范围为0-20,小于0取自动取0,大于20自动取20 //@param strDataStore 自定义的存储知识图谱的本地目录 public static boolean createKnowledgeGraph(int iGridLevel,String strDataStore){} //@param iGri
基于matlab实现的应用于配电网重构的改进二进制粒子群算法,能够取得比较理想的效果.rar
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。