人无信不立/2008-04-26 22:30
永春阁
专注于技术,切不可沉湎于技术
博客园
社区
首页
新随笔
联系
管理
订阅
随笔- 233 文章- 20 评论- 1429
MonoRail学习笔记五:定制服务实现自定义功能
在上一篇
MonoRail学习笔记四:MonoRail基本流程分析
中我提到,MonoRail中可以自定义一些服务。比如可以定义自己的Url解析类,来实现
http://localhost:***/index.rails
等
http://localhost:***/*.rails
的效果。
具体步骤如下:
1、修改web.config文件,在
monorail
节中加入以下定义
<
services
>
<
service
id
="UrlTokenizer"
type
="TestSiteNVelocity.CustomUrlTokenizer, TestSiteNVelocity"
/>
</
services
>
2、编写自己的
CustomUrlTokenizer
类
这里为了方便,我直接复制默认的
Castle.MonoRail.Framework.Services.
DefaultUrlTokenizer
类,将复制好的类放入TestSiteNVelocity,改名为
CustomUrlTokenizer
,然后在此基础上修改。
当然,这个类中有很多方法,也就可以自定义很多功能,为了实现
http://localhost:***/*.rails
的效果,我们只需要修改
ExtractAreaControllerAction
方法。
原方法:
private
void
ExtractAreaControllerAction(
string
rawUrl,
out
string
area,
out
string
controller,
out
string
action)
{
string
[] parts
=
rawUrl.Split(
'
/
'
);
if
(parts.Length
<
2
)
{
throw
new
UrlTokenizerException(
"
Url smaller than 2 tokens
"
);
}
action
=
parts[parts.Length
-
1
];
int
fileNameIndex
=
action.IndexOf(
'
.
'
);
if
(fileNameIndex
!=
-
1
)
{
action
=
action.Substring(
0
, fileNameIndex);
}
controller
=
parts[parts.Length
-
2
];
area
=
string
.Empty;
if
(parts.Length
-
3
==
0
)
{
area
=
parts[parts.Length
-
3
];
}
else
if
(parts.Length
-
3
>
0
)
{
StringBuilder areaSB
=
new
StringBuilder();
for
(
int
i
=
0
; i
<=
parts.Length
-
3
; i
++
)
{
if
(parts[i]
!=
null
&&
parts[i].Length
>
0
)
{
areaSB.Append(parts[i]).Append(
'
/
'
);
}
}
if
(areaSB.Length
>
0
)
{
areaSB.Length
-=
1
;
}
area
=
areaSB.ToString();
}
}
修改后的方法:
private
void
ExtractAreaControllerAction(
string
rawUrl,
out
string
area,
out
string
controller,
out
string
action)
{
string[] parts = rawUrl.Split('/');
action = parts[parts.Length - 1];
int fileNameIndex = action.IndexOf('.');
if (fileNameIndex != -1)
{
action = action.Substring(0, fileNameIndex);
}
if (parts.Length < 2)
{
controller = "servlet"; ;
area = "";
return;
}
controller
=
parts[parts.Length
-
2
];
area
=
string
.Empty;
if
(parts.Length
-
3
==
0
)
{
area
=
parts[parts.Length
-
3
];
}
else
if
(parts.Length
-
3
>
0
)
{
StringBuilder areaSB
=
new
StringBuilder();
for
(
int
i
=
0
; i
<=
parts.Length
-
3
; i
++
)
{
if
(parts[i]
!=
null
&&
parts[i].Length
>
0
)
{
areaSB.Append(parts[i]).Append(
'
/
'
);
}
}
if
(areaSB.Length
>
0
)
{
areaSB.Length
-=
1
;
}
area
=
areaSB.ToString();
}
}
红色标示的为修改部分
其实意思很简单,就是当访问
http://localhost:***/*.rails
形式的页面时,默认的controller类为ServletController类
接下来就可以按常规方式编写ServletController类和view部分
这样之后当我们访问
http://localhost:***/index.rails
时,调用的就是ServletCOntroller类的Index方法,当访问
http://localhost:***/bag.rails
时,调用的就是ServletCOntroller类的Bag方法 ......
当然我们也同样可以定义
[DefaultAction("Index")]
public class ServletController : Controller
让所有未定义的
http://localhost:***/*.rails
访问调用ServletController的Index方法
这篇文章只是涉及了自定义服务的很小的一个点,我们还可以自定义:
ControllerFactory
ViewComponentFactory
ResourceFactory
EmailSender
EmailTemplateService
UrlBuilder
ValidatorRegistry
等很多服务,来实现特定效果
posted @ 2007-10-22 10:07
永春
阅读(2579)
评论(10)
编辑
收藏
网摘
所属分类:
MonoRail
发表评论
回复
引用
#1楼
2007-10-22 11:58 |
oyeah[未注册用户]
来实现
http://localhost
:***/index.rails 等
http://localhost
:***/*.rails 的效果。
这是个什么效果啊?
回复
引用
查看
#2楼
[
楼主
]2007-10-22 12:29 |
GSpring
@oyeah
MonoRail默认是不支持一级目录的,即http://ip/*.rails,只支持http://ip/*/*.rails这种二级目录的形式
回复
引用
查看
#3楼
2007-10-22 20:51 |
橘子&猪
@GSpring
MonoRail要支持一级目录其实挺简单的,只要在MonoRail的配置节下增加
<defaultUrls>
<add url="a.rails" controller="b" action="c" areas="d" />
</defaultUrls>
即可.
当你访问
http://localhost:xxx/a.rails时MonoRail会为你定向到
" target="_new">
http://localhost:xxx/a.rails时MonoRail会为你定向到
控制器b的c动作
回复
引用
查看
#4楼
[
楼主
]2007-10-23 08:36 |
GSpring
@橘子&猪
你提到的是一种方式
不过如果有很多一级目录的话就要配置很多了
另:我主要是以这个为例说一下定制服务-_-
回复
引用
查看
#5楼
2007-10-23 08:51 |
猪怕壮
--引用--------------------------------------------------
橘子&猪: @GSpring
MonoRail要支持一级目录其实挺简单的,只要在MonoRail的配置节下增加
<defaultUrls>
<add url="a.rails" controller="b" action="c" areas="d" />
</defaultUrls>
即可.
当你访问 <a href="
http://localhost:xxx/a.rails时MonoRail会为你定向到"
" target="_new">
http://localhost:xxx/a.rails时MonoRail会为你定向到"
target="_new">
http://localhost:xxx/a.rails时MonoRail会为你定向到</a>
" target="_new">
http://localhost:xxx/a.rails时MonoRail会为你定向到</a>
控制器b的c动作
--------------------------------------------------------
哎,这我还是第一次见,学习了
回复
引用
查看
#6楼
2007-10-23 10:33 |
橘子&猪
@GSpring
哈哈,了解!
@猪怕壮
俺们都是猪...
回复
引用
查看
#7楼
2007-10-27 16:41 |
千里不辞远
学习了
回复
引用
#8楼
2007-12-05 16:44 |
且歌[未注册用户]
顶!按楼主的方法改好了。
一点小问题, if (parts.Length < 2)应该是 if (parts.Length < 3)
回复
引用
#9楼
2009-04-21 09:56 |
springsky[未注册用户]
学习分享中····
顺便问下 DefaultUrlTokenizer 在哪里啊?
刷新评论
切换模板
发表评论
昵称:
[登录]
[注册]
主页:
邮箱:
(仅博主可见)
验证码:
看不清,换一个
评论内容:
登录
注册
[使用Ctrl+Enter键快速提交评论]
0
932768
导航:
网站首页
社区
新闻
博问
闪存
网摘
招聘
找找看
Google搜索
China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
China-Pub 计算机绝版图书按需印刷服务
相关文章:
最新IT新闻:
预测:Twitter最可能收购的十家公司
网易澄清:与暴雪合资公司仅提供技术支持
杰克逊悼念仪式或成史上最大规模Web活动
《商业周刊》:Mozilla的志愿者开发模式被复制
Mono 的Virtual PC 虚拟机
相关链接:
公告
本Blog版权均为本人所有,欢迎任何媒体和网站转载本人博客的内容。
本Blog的内容按原样提供,本人不提供任何形式的担保。
转载请注明出处
我的MVP配置
自2007年3月8日:
系列文章
1、
Sharepoint2007对象模型系列
2、
C#强化系列文章
3、
MOSS SDK学习系列
4、
IBatis.Net学习笔记系列
5、
MonoRail学习笔记系列
我的最新闪存
一切随风
<
2007年10月
>
日
一
二
三
四
五
六
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
与我联系
发短消息
搜索
常用链接
我的随笔
我的空间
我的短信
我的评论
更多链接
我的参与
我的新闻
最新评论
我的标签
留言簿
给我留言
查看留言
我参加的小组
写书译书小组
创业交流
Debug 探索团队小组
博客园精华集出版小组
iBATIS.NET
MonoRail
我参与的团队
SharePoint团队(0/0)
Ajax&Atlas技术团队(0/0)
南京.net俱乐部(0/0)
ASP.NET AJAX (Atlas)学习(0/0)
MVP(微软最有价值专家)团队(0/0)
软件项目管理团队(0/0)
Debug 探索团队(0/0)
博客园精华集出版(0/0)
随笔分类
.Net(50)
(rss)
AJax(3)
(rss)
C++/VC学习(2)
(rss)
iBATIS.NET(15)
(rss)
Java(6)
(rss)
MonoRail(25)
(rss)
OS Shell(5)
(rss)
SharePoint(42)
(rss)
Windows Server(1)
(rss)
XHTML/CSS/Script(6)
(rss)
创业(2)
(rss)
企业开发(2)
(rss)
数据库(21)
(rss)
外语(1)
(rss)
项目管理(7)
(rss)
娱乐/杂记/修养(52)
(rss)
随笔档案
2009年4月 (1)
2009年2月 (2)
2009年1月 (1)
2008年11月 (1)
2008年10月 (1)
2008年9月 (1)
2008年8月 (3)
2008年7月 (7)
2008年6月 (1)
2008年5月 (2)
2008年4月 (12)
2008年3月 (14)
2008年2月 (3)
2008年1月 (14)
2007年12月 (17)
2007年11月 (21)
2007年10月 (31)
2007年9月 (13)
2007年8月 (25)
2007年7月 (10)
2007年6月 (1)
2007年5月 (2)
2007年4月 (10)
2007年3月 (15)
2007年2月 (7)
2007年1月 (1)
2006年12月 (3)
2006年11月 (21)
2006年10月 (5)
2006年8月 (2)
SharePoint学习
Codeplex Sharepoint
jianyi @ cnblogs
Kaneboy's Blog
Patrick Tisseghem's Blog
管理相关
下载_中计在线
中国管理之家
开源社区
C#开源资源大全
Java开源大全
SourceForge主页
门户网站
南京程序员俱乐部
积分与排名
积分 - 394764
排名 - 86
最新评论
1. re: Asp.Net Forms验证(自定义、角色提供程序、单点登录)
学习ASP.NET的朋友请加QQ群:68970971 / 72308145 (Myleetle)
2. re: 换个活法
@feedback
谢谢
有道理 (永春)
3. re: 换个活法
市场+研发+培训。三人组合。先做小项目,因为大项目一般都是需要公司资质的,而目前你们的实力最好不要成立公司,要知道一个公司的开销还是蛮大的。有了稳定的客户群之后,稳定的项目以及差不多成型的产品,那就成... (feedback)
4. re: 莫名其妙的SqlServer更新错误:OleDbException 必须声明标量变量
使用参数化 DbCommand 的一个缺点是需要参数的代码将仅适用于支持相同语法的提供程序。OLEDB、SqlClient 和 Oracle 提供程序全部使用不同的语法。例如,用于命名和指定参数的 S... (弹弹)
5. re: [转载]最经典,最可怕的qq聊天记录
wuyu (1112)
阅读排行榜
1. 易经杂说—南怀瑾(9158)
2. Asp.Net Forms验证(自定义、角色提供程序、单点登录)(6710)
3. C#强化系列文章五:动态代码的使用(反射和动态生成类)(5625)
4. SQL Server2005 各版本区别(5289)
5. IBatis.Net学习笔记二--下载、编译、运行NPetShop(5167)