共有73篇文章被收藏推荐
鲜果标签:
java
收录于2007-12-11
认领
报错
推荐
作者: ray_linn 链接:http://www.javaeye.com/topic/266485 发表时间: 2008年11月13日
声明:本文系JavaEye网站发布的原创文章,未经作者书面许可,严禁任何网站转载本文,否则必将追究法律责任!
IronRuby是.NET下的一个Ruby实现,此外还有Ruby.net这一开源项目,二者的主要区别是IronRuby利用了Microsoft最新推出的DLR,而ruby.net则是完全利用原有的CLR实现的,二者的比较可以参考lam John的相关文章。目前IronRuby (SVN r118) 100% 兼容于Ruby 1.5.0规格书,可以顺利运行RubySpec的所有测试与例子,因此大部分Ruby程序都可以不加修改的运行在IronRuby之上,其中包括Rails.
IronRuby的一大特点是,它是基于Microsoft的DLR,因此除了分享ruby世界的资源外,它也可充分利用.NET的庞大资源,例如LINQ,这意味着.NET中的ruby世界,别有一番天地。你可以组合ASP.NET MVC和active record,或者是rails +LINQ,或者完全不需要rails,这完全取决于你的创造力。Lam John演示了如何利用ASP.NET MVC完全实现类似Rails的架构与功能.
先来个简单的"Hello,world"级别的。首先设置routes.(ASP.NET MVC的route)
$routes.map_route "{controller}/{action}/{id}"
{ :controller='Home', :action='index', id=''}
然后与rails的程序类似,开始contoller的编写:
class HomeController < Controller
def index
view HomeModel.new
end
end
和rails不一样的地方在于,其继承的父类是ASP.NET MVC的Controller类 ,而不是rails的ApplicationController.
最后在models目录下放入HomeModel.rb,我们的数据来自于内存。
class HomeModel def salutation "Hello,World" end end
然后是一个最简单的page,你可以命名成aspx,或者遵循ruby世界的规则,以rhtml为后缀,views\home\index.rhtml.
<h2>$model.saluation</h2>
这是一个最简单的MVC例子,稍后是更复杂的例子Controller它有两个action:index和list.
require "helper/contoller"
require "ProductModel"
class ProductsController < BaseController
def index
model=ProductsModel.new
@message="Hi,Mom"
@categories=mode.get_categories
return_view
end
def list
@category=params[:id]
model=ProductsModel.new
@products=mode.get_products_for_category @category
return_view
end
end
这里特别指出的,暂时我们用实例变量与view端通讯,但是Lam John承诺,目前只是作为原型来研究而已,以后必然会做出修改。接下里的model就更简单,它只是visual studio包装的northwind数据库的适配器,这里用到了我后面提到的"mokey patch"方法,从而将C#的GetCategory映射成ruby的get_category.
require "helpers/model" class ProductsModel <NorthWindDatabase //do nothing end
NorthWindDatabase是个C#的类
public class NorthWindDatabase :NorthWindResposity{
public List<Category> GetCategories(){
return Categories.ToList();
}
public Category GetCategory(String name){
return Categories.SingleOrDefault(c =>C.CategoryName==name);
}
public List<Product> getProductsForCategory(String name){
var category=GetCategory(name);
var products= from p in Products where p.CategoryId==category.CategoryId select p;
return products.ToList();
}
}
如果你觉得利用Visual studio生成NorthWind的wrapper不符合你的ruby习惯,那么完全可以把ProductsModel改成ActiveRecord的实现。
view端
<% $view_data.categories.each{|category|%>
<li> <a href="/products/list/<%=category.category_name%>">
<%=category.category_name%></a>
</li>
<%
}
%>
这次view端是完全的asp.net
已有 18 人发表回复,猛击->>这里<<-参与讨论
JavaEye推荐
- 加入阿里巴巴,发展潜力无限
- Windows7在微软WinHEC 2008上揭开神秘面纱
- 你想过自己的博客制作成书吗 - JavaEye推出博客自动生成电子书功能!
- 搜狐网站诚聘Java、PHP和C++工程师
作者: easyfinger 链接:http://www.javaeye.com/topic/264547 发表时间: 2008年11月09日
声明:本文系JavaEye网站发布的原创文章,未经作者书面许可,严禁任何网站转载本文,否则必将追究法律责任!
Merb新闻和社区站点
Merbunity - A community news site that focuses entirely on Merb. So far it's not been updated particularly often, but this is likely to change, and what they do have is great.
Merbivore - (Merb官方网站)The official Merb homepage. It provides links to all of the major things you'd need - docs , a wiki, downloads, and information on how to help the Merb project.
Merb Overheard - A "planet" / aggregation blog for Merb related content. It also features some of the latest Merb related Twitter messages. A good looking site and well worth following if you want to stay up to date on Merb news.
Planet Merb - A "planet" site for Merb-related blogs. Currently only has the blogs of several Merb developers and the official Merb blog, but it's bound to grow over time.
The Merbist - A Ruby Inside-esque blog for the Merb world. It's run by Matt Aimonetti, a Merb core team member. Well worth subscribing to if you want a look at high level news related to Merb.
Merb Google Group - A Google Groups hosted mailing list for Merb developers. It has over 800 members and is pretty busy!
#merb on irc.freenode.net - Not a Web link, but an IRC channel. If you want to chat live about Merb but aren't familiar with IRC, learn more here .
Ezra Zygmuntowicz's Brainspl.at - The personal blog of Merb creator, Ezra Zugmuntowicz. A lot of it is Merb related in some way or another.
Katz Got Your Tongue? - The personal blog of Yehuda Katz, a key Merb developer and evangelist. A lot of Merb related posts.
merb中文组 - merb中国爱好者的交流组
已有 50 人发表回复,猛击->>这里<<-参与讨论
JavaEye推荐
- 加入阿里巴巴,发展潜力无限
- 你想过自己的博客制作成书吗 - JavaEye推出博客自动生成电子书功能!
- 搜狐网站诚聘Java、PHP和C++工程师
- Windows7在微软WinHEC 2008上揭开神秘面纱
作者: ahuaxuan 链接:http://www.javaeye.com/topic/263895 发表时间: 2008年11月07日
声明:本文系JavaEye网站发布的原创文章,未经作者书面许可,严禁任何网站转载本文,否则必将追究法律责任!
/**
*作者:张荣华
*日期:2008-11-07
**/
开门见山,一刀见血,让我们说说烦人的aop cache.
aop cache解释使用aop技术的cache,可以cache被代理对象的方法返回结果,还可以通过方法的参数值来控制缓存的粒度,看上去很美,用的人估计也颇多,好东西啊,面试的时候经常有人告诉我"我用过aop cache",看来是居家必备啊.不过居家必备的东西也得升个级什么滴啊,就想汽车一样,每年拉一次皮,照卖,还自夸是新一袋.aop cache要升级得先看看它烦人得地方.看看它烦人得地方先得知道它得用法,那么就先简单介绍一下它得用法:
常见步骤,2步
1,建立一个拦截器类,环绕增强或者后增强都可以,代码如下:
/**
* @author ahuaxuan(aaron zhang) 代码原主是一个老外,不是我
* @since 2008-5-13
* @version $Id: MethodCacheInterceptor.java 814 2008-05-13 06:52:54Z aaron $
*/
@Component("methodCacheInterceptor")
@GlobalAutowired//这个是俺写的globalautowired,大家可以忽略
public class MethodCacheInterceptor implements MethodInterceptor {
private Cache methodCache;
public void setMethodCache(Cache methodCache) {
this.methodCache = methodCache;
}
public Object invoke(MethodInvocation invocation) throws Throwable {
String targetName = invocation.getThis().getClass().getName();
String methodName = invocation.getMethod().getName();
Object[] arguments = invocation.getArguments();
Object result;
String cacheKey = getCacheKey(targetName, methodName, arguments);
Element element = methodCache.get(cacheKey);
if (element == null) {
result = invocation.proceed();
element = new Element(cacheKey, (Serializable) result);
methodCache.put(element);
}
return element.getValue();
}
private String getCacheKey(String targetName, String methodName,
Object[] arguments) {
StringBuffer sb = new StringBuffer();
sb.append(targetName).append(".").append(methodName);
if ((arguments != null) && (arguments.length != 0)) {
for (int i = 0; i < arguments.length; i++) {
sb.append(".").append(arguments[i]);
}
}
return sb.toString();
}
}
这段代码很简单,就是缓存某个方法的返回结果,使用的缓存组件是ehcache,ehcache的比较详细的用法ahuaxuan在http://www.javaeye.com/topic/128458这篇文章中已经有了说明.
而配置自动代理:
<!-- method cache auto proxy, add by ahuaxuan -->
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames">
<list>
<value>aaComponent</value>
<value>bbComponent</value>
</list>
</property>
<property name="interceptorNames">
<list>
<value>methodCacheInterceptor</value>
</list>
</property>
</bean>
Over,最简单的aop cache.使用了该aop cache之后,可以缓存方法返回结果于无形,又可以根据方法参数来控制缓存粒度, 实乃居家旅行,杀人越货的必备良药
那么接下来看看这个用法有没有什么问题,相信熟悉一点的童子一眼就看出来了:”糟了,aaComponent和bbComponent所有的方法都被拦截了”.这个代码着实让我焦虑,我很焦虑.
Ok,我改,我改正则表达式还不行吗,我可以通过正则表达式让某些特定方法名的方法才被拦截处理.好啊,正统的spring用法,于是advice变成了advisor,增强变成了增强器, 但是我怎么看着就这么扭呢,难道我要缓存一个方法的结果还非得把这个方法的名字按照某个固定的格式来取, 再着,两个get方法,一个getxxx(),一个getyyy,两个之中一个需要缓存,另外一个不需要缓存(靠,真是变态),怎么办呢?正则的方式让我很烦躁,非常烦躁.
第一种方法让我焦虑,而第二种方法让我烦躁,我应该去寻找解决焦虑和烦躁的方案.
写代码需要有灵感,也需要有很强的分析能力,我们来看看我的问题是什么:
问题重新描述:不能精确的控制某个对象的某个方法需要被缓存.
思考:如何固定这个方法的标示-------------------
hardcode方法名到methodinterceptor中
hardcode缓存标示到方法上(如果该类所有方法都需要被缓存,那么hardcode缓存标示到类上)
我选第二种.那么看看实现步骤:
1.annotation类,两个:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MethodCache {
}
还有一个:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface ObjectCache {
}
看上去是多么无聊的两个annotation.
2修改methodinterceptor,加上判断逻辑
如果被代理的类加了ObjectCache,那么拦截这个对象所有的方法,如果没有类上没有加ObjectCache,那么判断method上有没有加methodcache,如果加了,拦截该方法,如果没有加,直接调用目标类的方法.
于是代码变成:
public Object invoke(MethodInvocation invocation) throws Throwable {
String targetName = invocation.getThis().getClass().getInterfaces()[0].getName();
String methodName = invocation.getMethod().getName();
Object[] arguments = invocation.getArguments();
if (invocation.getThis().getClass().isAnnotationPresent(ObjectCache.class)) {
return getResult(targetName, methodName, arguments, invocation);
} else {
if (invocation.getMethod().isAnnotationPresent(MethodCache.class)) {
return getResult(targetName, methodName, arguments, invocation);
} else {
return invocation.proceed();
}
}
}
private Object getResult(String targetName, String methodName, Object[] arguments, MethodInvocation invocation) throws Throwable {
Object result;
String cacheKey = getCacheKey(targetName, methodName, arguments);
Element element = methodCache.get(cacheKey);
if (element == null) {
result = invocation.proceed();
element = new Element(cacheKey, (Serializable) result);
methodCache.put(element);
}
return element.getValue();
}
Ok,试试把,现在我要拦截aaservice上所有的方法,那么我的代码如下:
@ObjectCache
public class AaService implement xxxxxx{
}
如果我要拦截bbservice上的b1方法,代码如下:
public class BbService implement xxxxxx{
@MethodCache
public void bb() {
}
}
好了,目的达到了,我们可以任意的指定需要要拦截某个类的全部,或者部分方法了. 可是心中好像还是很闷的慌,我很慌张,非常慌张.
有人问了:都到这个份上了还慌啥张啊.
答:它tmd什么时候过期啊.我在ehcache.xml配置的可是统一的过期时间啊.ok,想到了,改,于是俺们的annotation就长成下面这个样子了:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MethodCache {
int expire() default 0;
}
和
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface ObjectCache {
int expire() default 0;
}
再看看我们的进化过的methodInterceptor吧,大家可以详细比较一下下面这段和上面两端代码的异同之处
public Object invoke(MethodInvocation invocation) throws Throwable {
String targetName = invocation.getThis().getClass().getInterfaces()[0].getName();
String methodName = invocation.getMethod().getName();
Object[] arguments = invocation.getArguments();
Class[] cs = new Class[arguments.length];
for (int k = 0; k < arguments.length; k++) {
cs[k] = arguments[k].getClass();
}
if (invocation.getThis().getClass().getCanonicalName().contains("$Proxy")) {
if (logger.isWarnEnabled()) {
logger.warn("----- The object has been proxyed and method " +
"cache interceptor can't get the target, " +
"so the method result can't be cached which name is ------" + methodName);
}
return invocation.proceed();
} else {
if (invocation.getThis().getClass().isAnnotationPresent(ObjectCache.class)) {
ObjectCache oc = invocation.getThis().getClass().getAnnotation(ObjectCache.class);
return getResult(targetName, methodName, arguments, invocation, oc.expire());
} else {
Method[] mss = invocation.getThis().getClass().getMethods();
Method ms = null;
for (Method m : mss) {
if (m.getName().equals(methodName)) {
boolean argMatch = true;
Class[] tmpCs = m.getParameterTypes();
if (tmpCs.length != cs.length) {
argMatch = false;
continue;
}
for (int k = 0; k < cs.length; k++) {
if (!cs[k].equals(tmpCs[k])) {
argMatch = false;
break;
}
}
if (argMatch) {
ms = m;
break;
}
}
}
if (ms != null && ms.isAnnotationPresent(MethodCache.class)) {
MethodCache mc = ms.getAnnotation(MethodCache.class);
return getResult(targetName, methodName, arguments, invocation, mc.expire());
} else {
return invocation.proceed();
}
}
}
}
private Object getResult(String targetName, String methodName, Object[] arguments,
MethodInvocation invocation, int expire) throws Throwable {
Object result;
String cacheKey = getCacheKey(targetName, methodName, arguments);
Element element = methodCache.get(cacheKey);
if (element == null) {
synchronized (this) {
element = methodCache.get(cacheKey);
if (element == null) {
result = invocation.proceed();
element = new Element(cacheKey, (Serializable) result);
//annotation没有设expire值则使用ehcache.xml中自定义值
if (expire > 0) {
element.setTimeToIdle(expire);
element.setTimeToLive(expire);
}
methodCache.put(element);
}
}
}
return element.getValue();
}
童子们可以看到invoke方法加了一些判断(比如说类名中是否含有$Proxy),主要是防止越来越多的代理层次,如果被methodcacheinterceptor拦截到的类是一个代理类,那么ahuaxuan暂时还没有找到可以得到该代理类的目标类的方法(望知情者告之,不甚感激).
好了,好像可以告一段落了,因为现在既可以指定缓存某个类所有方法的返回结果,也可以只缓存某个类的某些方法的结果,而且还可以指定某个方法的结果被缓存多长的时间.嗯.
有童子说了:”等等,还有一个需求,我一个类中只有一个方法不需要缓存结果,其他都要缓存结果,怎么办?”
答:别烦了好吗,你就不能自己写一个@MethodNoCache吗,和@ObjectCache联合使用不就解决问题了吗.
文章最后,附上ahuaxuan的源代码,让各位见笑了.
已有 26 人发表回复,猛击->>这里<<-参与讨论
JavaEye推荐
- 加入阿里巴巴,发展潜力无限
- 你想过自己的博客制作成书吗 - JavaEye推出博客自动生成电子书功能!
- Windows7在微软WinHEC 2008上揭开神秘面纱
- 搜狐网站诚聘Java、PHP和C++工程师
作者: robbin 链接:http://www.javaeye.com/topic/260613 发表时间: 2008年10月31日
声明:本文系JavaEye网站发布的原创文章,未经作者书面许可,严禁任何网站转载本文,否则必将追究法律责任!
《Rails锦囊妙计》这本书是dlee发起的,旨在面向Rails中高阶开发人员、指导实战的Rails书籍。这本书现在参与编写的人员是dlee,Quake Wang,liusong111,骆古道和我。dlee主要介绍REST方面的编程,Quake写的是ActiveRecord的编程技巧,liusong111介绍Controller和View方面的实战技巧,骆老师写的是jQuery on Rails和ActionMailer,而我主要负责性能和部署方面的内容。其他同志的进度情况请咨询dlee。
我拟定了一下我负责内容的章节,总共三章内容,列举如下,请大家提提建议,看看需要删除哪些内容,需要补充哪些内容,谢谢!然后我会根据这个目录开始写。
《Rails生产环境的安装和部署章节》
一、介绍和分析主流的Rails部署运行环境
1、Rails部署运行方式介绍
2、操作系统的选择:Red Hat Linux, CentOS, SuSE Linux,Ubuntu Linux,以及Windows
3、Rails运行服务器的选择:FastCGI,Passenger,Mongrel,Thin
4、Rails可选的Web服务器介绍:Lighttpd,Nginx,Apache
5、Rails部署运行主流方式介绍
二、Lighttpd/FastCGI部署运行环境的安装和配置
1、编译安装Lighttpd
2、配置Lighttpd/FastCGI
3、监控和调优Lighttpd
三、Nginx/Mongrel部署运行环境的安装和配置
四、Apache/Passenger部署运行环境的安装和配置
五、Apache/Mongrel部署运行环境的安装和配置
《Rails的性能调优和架构设计章节》
一、Rails部署运行环境的性能调优
1、操作系统的性能调优
2、数据库的性能调优
3、文件系统的选择
二、Ruby应用代码的性能调优
三、缓存策略和实战
1、对象缓存策略
2、页面片断缓存策略
3、动态页面静态化
4、基于REST资源的缓存策略
5、Memcached介绍
1)memcached安装和配置
2)memcached监测
3)memcached原理探讨
四、和内存泄漏问题的斗争
1、Ruby VM内存分配策略分析
2、内存泄漏原因分析
3、内存泄漏监测工具介绍
4、Ruby进程的监控
5、Session问题的讨论
1)选择Session存储策略
2)基于Cookie的Session策略介绍
6、设计Rails应用的系统架构
1)多进程和多线程之争
2)如何安排合理的进程数量
3)设计可扩展性的系统架构
《Ruby on Rails实战解决方案点滴章节》
一、如何实现泛域名解析和多域名博客网站开发
二、如何集成全文检索功能
三、如何实时记录用户的在线状态
四、如何管理大量附件的下载和同步
五、如何利用好Rails的production.log
六、JavaEye网站的架构演进过程
已有 58 人发表回复,猛击->>这里<<-参与讨论
JavaEye推荐
- 加入阿里巴巴,发展潜力无限
- Windows7在微软WinHEC 2008上揭开神秘面纱
- 你想过自己的博客制作成书吗 - JavaEye推出博客自动生成电子书功能!
- 搜狐网站诚聘Java、PHP和C++工程师
作者: jindw 链接:http://www.javaeye.com/topic/259185 发表时间: 2008年10月28日
声明:本文系JavaEye网站发布的原创文章,未经作者书面许可,严禁任何网站转载本文,否则必将追究法律责任!
最近论坛里出现了不少关于此类的文章:
http://www.javaeye.com/post/711399
http://www.javaeye.com/topic/258458
忘掉普元EOS、构建自己的企业级快速应用开发平台
http://www.javaeye.com/topic/232219
我也做过类似的东西,现在也一直在用。
但是越来越感觉那是鸡肋。
http://www.javaeye.com/topic/95580
有一次,开发一个公司内部使用的图书馆里系统,前后只花了一个下午,把老板吓一跳,并支持我利用工作时间完善那套框架。
确实,在某些情况下,他可以极大的提高我们的开发效率。
但是,我们忘记了这类系统高昂的开发和推广、学习、维护成本。
刚才查了一下,我那个代码生成器,单源代码就是6.5M。
如此一个不知名的第三方开发的庞大的系统,你不搞清楚其内部逻辑你敢随便使用吗?而真正搞清楚这些东西的代价有多大,后期扩展,维护的风险多大!
从我来讲,我不敢用。
我想,做这种东西有一个强大的后台公司支持还好,如EOS后面有普元。
而作为个人开发者,我们如何能打通这条产业链,如何让别人信任,学会,并采纳你的设计思想,让足够多的人去分享去使用你的产品,这些可不是一个技术问题。
Java程序员可能都有一个好大喜功的特性,环境所致把。
但是我们还是应该充分认识到自己个人力量的有限。
要做什么东西的话,先别想着如果别人用这个东西可以提高多少多少的开发效率。
只有它能给自己带来足够的好处,你才能做下去,否则很难生存。
穷则独善其身。
有什么考虑不对的地方,大家来提提把。
已有 112 人发表回复,猛击->>这里<<-参与讨论
JavaEye推荐
- 加入阿里巴巴,发展潜力无限
- 你想过自己的博客制作成书吗 - JavaEye推出博客自动生成电子书功能!
- Windows7在微软WinHEC 2008上揭开神秘面纱
- 搜狐网站诚聘Java、PHP和C++工程师
-
搜索不到您的频道?
>立即加入 -
想与您的读者互动?快来认领您的频道
>立即认领 -
想知道您的博客详细订阅数据么?
>到FeedSky查看 -
想体验专业的博客托管服务么?
>注册BlogBus


