这个几乎n多语言平台下n多web框架都有的功能。
近说spring mvc注解,到php中直接obj->$method_name()调用,自己突然有兴趣,看看自己能否动手写一些代码自动从request url对应到一个类的方法——又拿自己熟悉的Groovy来试了。
贴下代码
// 已有变量 moduleStr对应类对象,actionStr对应方法名,都是从request url中取得。
// scriptDir scriptFileSuffix也是字符串,都是从配置里获取
if (moduleStr == null || actionStr == null) {
warn("Param Exception: m(odule) & a(ction) are required! ", request, response);
return;
}
String scriptFile = scriptDir + moduleStr + scriptFileSuffix;
File sf = new File(request.getRealPath(scriptFile));
if (!sf.exists() || !sf.canRead() || sf.isDirectory()) {
warn("IO Exception: " + scriptFile + " is not a readable file!", request, response);
return;
}
ClassLoader cl = GroovyExeDispatcher.class.getClassLoader();
CompilerConfiguration conf = new CompilerConfiguration();
conf.setSourceEncoding(encoding);
conf.setClasspath(request.getRealPath(scriptDir));
GroovyClassLoader groovyCl = new GroovyClassLoader(cl, conf);
Map<String, Object> r = null;
try {
Class groovyClass = groovyCl.parseClass(sf);
GroovyObject obj = (GroovyObject)groovyClass.newInstance();
// init parameters
obj.invokeMethod("initMap", new Object[]{this.preHandler(request)});
r = (Map<String, Object>) obj.invokeMethod(actionStr, null);
} catch (Exception e) {
warn("Method Execute Exception: " + scriptFile + " - " + e.getMessage(), request, response);
return;
}