永春阁
专注于技术,切不可沉湎于技术
博客园
首页
博问
闪存
新随笔
联系
订阅
管理
随笔-250 文章-0 评论-1516
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
永春
阅读(3135)
评论(10)
编辑
收藏
发表评论
1508428
回复
引用
#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会为你定向到
控制器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会为你定向到</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 在哪里啊?
注册用户登录后才能发表评论,请
登录
或
注册
,
返回博客园首页
。
首页
博问
闪存
新闻
园子
招聘
知识库
最新IT新闻
:
·
阿里巴巴云计划被指“3个臭皮匠不敌诸葛亮”
·
支付公司Stripe融资1800万美元 估值1亿美元
·
诺基亚Lumia 910第三方保护壳现身亚马逊
·
窝窝团出现访问故障 官方称网站访问量过大
·
杨致远的中国缘:退却后能否与周鸿祎一笑泯恩仇
»
更多新闻...
最新知识库文章
:
·
高级编程语言的发展历程
·
如何学习一门新的编程语言?
·
学习不同编程语言的重要性
·
为什么我喜欢富于表达性的编程语言
·
计算机专业的女生为什么要学编程
»
更多知识库文章...
China-pub 2011秋季教材巡展
China-Pub 计算机绝版图书按需印刷服务
公告
本Blog版权均为本人所有,欢迎任何媒体和网站转载本人博客的内容。
本Blog的内容按原样提供,本人不提供任何形式的担保。
转载请注明出处
本公司专注于音视频、图形图像编码转换等相关开发,承接各种相关项目。(gaochun@zhisoft.com)
自2007年3月8日:
系列文章
1、
Sharepoint2007对象模型系列
2、
C#强化系列文章
3、
MOSS SDK学习系列
4、
IBatis.Net学习笔记系列
5、
MonoRail学习笔记系列
昵称:
永春
园龄:
5年7个月
粉丝:
66
关注:
3
<
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
搜索
常用链接
我的随笔
我的评论
我的参与
最新评论
我的标签
随笔分类
.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)
创业(3)
(rss)
企业开发(2)
(rss)
数据库(21)
(rss)
外语(1)
(rss)
项目管理(7)
(rss)
音视频、图形相关开发
(rss)
娱乐/杂记/修养(54)
(rss)
随笔档案
2010年4月 (1)
2010年3月 (1)
2010年2月 (2)
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月 (20)
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主页
门户网站
南京程序员俱乐部
积分与排名
积分 - 577931
排名 - 89
最新评论
阅读排行榜