人无信不立/2008-04-26 22:30
永春阁
专注于技术,切不可沉湎于技术
博客园
社区
首页
新随笔
联系
管理
订阅
随笔- 225 文章- 20 评论- 1256
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
永春
阅读(2252)
评论(9)
编辑
收藏
所属分类:
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会为你定向到
控制器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)
社区
新闻
新用户注册
刷新评论列表
标题
姓名
主页
Email
(只有博主才能看到)
验证码
*
看不清,换一张
[
登录
][
注册
]
内容(请不要发表任何与政治相关的内容)
Remember Me?
登录
使用高级评论
新用户注册
返回页首
恢复上次提交
[使用Ctrl+Enter键可以直接提交]
相关文章:
Windows 2000 常见进程功能描述[转帖]
扩展GridView控件(索引) - 增加多个常用功能
MonoRail学习笔记系列文章
关于yahoo邮箱如何开通POP access服务
实现土豆网的视频播放
把Membership,Role包装为WCF服务
相关链接:
所属分类的其他文章:
MonoRail学习笔记二十:资源文件的使用和多语言支持
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用
MonoRail学习笔记十八:在VM中可以使用哪些系统变量
MonoRail学习笔记十七:TransformFilter的使用
MonoRail学习笔记十六:AJax在MonoRail中的使用
MonoRail学习笔记十五:文件上传
MonoRail学习笔记十四:分页功能的使用
MonoRail学习笔记十三:NVelocity的增强功能
使用NVelocity[翻译]
Velocity 《VTL语法参考指南》中文版[转]
最新IT新闻:
淘宝网合并阿里妈妈 专家称阿里巴巴或有新战略
微软研究院发布 AutoCollage - 整理并融合照片
2008年9月5日科技博客精选
SNS网站风靡影响工作效率 公司下令封杀
《孢子》正式发布
博客园新闻频道
博客园首页
社区
公告
本Blog版权均为本人所有,欢迎任何媒体和网站转载本人博客的内容。
本Blog的内容按原样提供,本人不提供任何形式的担保。
转载请注明出处
我的MVP配置
自2007年3月8日:
系列文章
1、
Sharepoint2007对象模型系列
2、
C#强化系列文章
3、
MOSS SDK学习系列
4、
IBatis.Net学习笔记系列
5、
MonoRail学习笔记系列
我的最新闪存
君子终日乾乾,夕惕若。厉无咎
8-26 18:23
<
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/731)
Ajax&Atlas技术团队(0/1149)
南京.net俱乐部(0/448)
ASP.NET AJAX (Atlas)学习(0/1346)
MVP(微软最有价值专家)团队(0/566)
Debug 探索团队(0/50)
博客园精华集出版(0/43)
随笔分类
.Net(49)
(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)
数据库(20)
(rss)
外语(1)
(rss)
项目管理(7)
(rss)
娱乐/杂记/修养(49)
(rss)
随笔档案
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主页
门户网站
南京程序员俱乐部
积分与排名
积分 - 287856
排名 - 102
最新评论
1. re: 为什么要使用MonoRail?
@拼命三郎
不客气-_- (永春)
2. re: 为什么要使用MonoRail?
我个人还是比较怀念webform,对mvc没有什么学习,毕竟微软的技术层出不穷,有些跟不上了。 (拼命三郎)
3. re: 项目经理的个人修养
第一点吧敢苟同,项目经理其实也又不懂技术的,只是很多公司把项目经理都看成技术过硬的人了。项目经理更多是管行政的、管进度,而架构师承担着管理技术的角色。很多小公司都把这两者结合了。 (拼命三郎)
4. re: [转载]最经典,最可怕的qq聊天记录
哈,好怕怕。。。 (拼命三郎)
5. re: 为什么要使用MonoRail?
太感谢您了。 (拼命三郎)
阅读排行榜
1. 这样的面试题你会吗?(4717)
2. 年终个人总结:我这五年(3965)
3. Asp.Net Forms验证(自定义、角色提供程序、单点登录)(3956)
4. 易经杂说—南怀瑾(3927)
5. 为什么要使用MonoRail?(3764)