Facebook Sharer
选择您要替换的背景颜色:
【农历新年】背景图片:
个性化设定
 注册  找回密码
查看: 1263|回复: 8
打印 上一主题 下一主题

在 Servlet 上设计简单的 URL Routing

[复制链接]

20

主题

4

好友

2395

积分

白金长老

Rank: 10

跳转到指定楼层
1#
发表于 2009-12-12 12:04 AM |只看该作者 |倒序浏览
本人初学 Java Reflection API 而设计了一个简单的 URL Routing。
它能分析URL,如 /Gift/send,而调用 GiftService class 然后调用 send() method。

本人设计了三个基本的 class,如 MainServlet.java (最主要的入口文件,也就是 Front Controller),Service.java (各 service 服务的父类),及 GiftService.class (实例服务)。

MainServlet.java

  1. package com.fyhao.test;
  2. import java.io.IOException;
  3. import java.lang.reflect.Constructor;
  4. import java.lang.reflect.Method;
  5. import javax.servlet.ServletException;
  6. import javax.servlet.http.HttpServlet;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9. public class MainServlet extends HttpServlet {
  10.     public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  11.         String path = request.getPathInfo();
  12.         try {
  13.             String[] parts = path.split("/");
  14.             if(parts.length >= 2) {
  15.                 try {
  16.                     Class iClass = Class.forName("com.fyhao.test." + parts[1] + "Service");
  17.                     Method init;
  18.                     Constructor con;
  19.                     Object myClass;
  20.                     try {
  21.                         init = iClass.getMethod("init", new Class[] {HttpServlet.class, HttpServletRequest.class, HttpServletResponse.class, String[].class});
  22.                         con = iClass.getConstructor(new Class[] {});
  23.                         myClass = con.newInstance(new Object[] {});
  24.                         init.invoke(myClass, new Object[]{this, request, response, parts});
  25.                     } catch (NoSuchMethodException ex) {
  26.                         System.err.println("Please define init method on " + parts[1] + "Service");
  27.                         return;
  28.                     } catch (Exception ex) {
  29.                         System.err.println("init exception");
  30.                         return;
  31.                     }
  32.                     Method m;
  33.                     if(parts.length >= 3) {
  34.                         try {
  35.                             m = iClass.getMethod(parts[2], null);
  36.                             m.invoke(myClass);
  37.                         } catch (NoSuchMethodException ex) {
  38.                             try {
  39.                                 m = iClass.getMethod("main", null);
  40.                                 m.invoke(myClass);
  41.                             } catch (Exception exc) {
  42.                                 System.err.println("Please define a main service method on " + parts[1] + "Service");
  43.                                 return;
  44.                             }
  45.                         } catch (Exception ex) {
  46.                             System.err.println("service method exception");
  47.                             return;
  48.                         }
  49.                     } else {
  50.                         try {
  51.                             m = iClass.getMethod("main", null);
  52.                             m.invoke(myClass);
  53.                         } catch (Exception exc) {
  54.                             System.err.println("Please define a main service method on " + parts[1] + "Service");
  55.                             return;
  56.                         }
  57.                     }
  58.                 } catch (ClassNotFoundException ex) {
  59.                     defaultAction(request, response);
  60.                 }
  61.             } else {
  62.                 defaultAction(request, response);
  63.             }
  64.         } catch (NullPointerException ex) {
  65.             defaultAction(request, response);
  66.             return;
  67.         }
  68.         //serviceclass("Gift", "send");
  69.     }
  70.     public void defaultAction(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  71.         System.out.println("default action here: " + request.getPathInfo());
  72.     }
  73.     // leave for reference
  74.     public void serviceclass(String c, String service) {
  75.         try {
  76.             Class iClass = Class.forName("com.fyhao.test." + c + "Service");
  77.             Method init = iClass.getMethod("init", null);
  78.             Method m = iClass.getMethod(service, null);
  79.             Constructor con = iClass.getConstructor(new Class[] {});
  80.             Object myClass = con.newInstance(new Object[] {});
  81.             m.invoke(myClass);
  82.         } catch( Exception ex) {}
  83.     }
  84. }
复制代码
Service.java

  1. package com.fyhao.test;
  2. import javax.servlet.http.HttpServlet;
  3. import javax.servlet.http.HttpServletRequest;
  4. import javax.servlet.http.HttpServletResponse;
  5. public class Service {
  6.     HttpServlet servlet;
  7.     HttpServletRequest request;
  8.     HttpServletResponse response;
  9.     String[] parts;
  10.     public void init(HttpServlet servlet, HttpServletRequest request, HttpServletResponse response, String[] parts) {
  11.         this.servlet = servlet;
  12.         this.request = request;
  13.         this.response = response;
  14.         this.parts = parts;
  15.     }
  16. }
复制代码
GiftService.java

  1. package com.fyhao.test;
  2. import java.io.IOException;
  3. import javax.servlet.ServletException;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. public class GiftService extends Service {
  7.     public void main() {
  8.         System.out.println("default main methods: ");
  9.     }
  10.     public void send() {
  11.         System.out.println("sending");
  12.     }
  13. }
复制代码
这篇文章的原文出自本人的部落格文章:http://fyhao.com/2009/12/computer-and-it/java/simple-url-routing-in-servlet/
由于本人初学这方面的架构知识,请各位高手给本人一些意见,或指导方向。
这样,就万分感激了。




收藏收藏0

10

主题

0

好友

862

积分

青铜长老

Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7

2#
发表于 2009-12-12 01:59 AM |只看该作者
强。。。!
不过那个系统在多人使用的话会当掉吗?


回复

使用道具 举报

13

主题

0

好友

2113

积分

白金长老

Rank: 10

3#
发表于 2009-12-12 12:04 PM |只看该作者
java 我不熟
但 支持


回复

使用道具 举报

8

主题

0

好友

75

积分

中级会员

Rank: 2Rank: 2

4#
发表于 2009-12-12 04:51 PM |只看该作者
java 我熟
concept 是有点像RESTful .
my msn is pig_big@hotmail.com
can try to disccus this part with me.  
i got interest . what is ur msn ?
thanks.


回复

使用道具 举报

20

主题

4

好友

2395

积分

白金长老

Rank: 10

5#
发表于 2009-12-14 01:35 AM |只看该作者
多人使用的话,暂时没有大规模测试过。。。
之前读 UCenter 的PHP代码,还是其他MVC Framework,发现他们的链接可以直接 map 在 class 和 method 的,刚好在学 appengine,就想到 java reflection 了。PHP可以直接动态的调用 class 和 method,如
$newinstance = new {$name."Service"}();
$newinstance->{$methodname}();


回复

使用道具 举报

7

主题

1

好友

5108

积分

一流名嘴

Rank: 12Rank: 12Rank: 12

6#
发表于 2009-12-14 02:42 AM |只看该作者
原帖由 fyhao 于 2009-12-12 12:04 AM 发表
本人初学 Java Reflection API 而设计了一个简单的 URL Routing。
它能分析URL,如 /Gift/send,而调用 GiftService class 然后调用 send() method。

本人设计了三个基本的 class,如 MainServlet.java (最 ...


好長沒時間看完, 大致上應該是把 url 以 / 分開之後把 array 分開呼叫對應函數或 class 等吧

原帖由 fyhao 于 2009-12-14 01:35 AM 发表
多人使用的话,暂时没有大规模测试过。。。
之前读 UCenter 的PHP代码,还是其他MVC Framework,发现他们的链接可以直接 map 在 class 和 method 的,刚好在学 appengine,就想到 java reflection 了。PHP可以直接动态的调用 class 和 method,如
$newinstance = new {$name."Service"}();
$newinstance->{$methodname}();


$newinstance = new {$name."Service"}();
變數+文字的方式沒測試過, 不過感覺好像會出問題


回复

使用道具 举报

10

主题

0

好友

862

积分

青铜长老

Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7

7#
发表于 2009-12-14 06:41 AM |只看该作者
原帖由 fyhao 于 2009-12-14 01:35 AM 发表
多人使用的话,暂时没有大规模测试过。。。
之前读 UCenter 的PHP代码,还是其他MVC Framework,发现他们的链接可以直接 map 在 class 和 method 的,刚好在学 appengine,就想到 java reflection 了。PHP可以 ...

之前看了帖后去官网参考那个reflection,发现它说 high performance 的可能会导致某些效能上的。。。拖延?它没给详细的信息,或许是我interpret wrong?


回复

使用道具 举报

8

主题

0

好友

75

积分

中级会员

Rank: 2Rank: 2

8#
发表于 2009-12-14 11:18 AM |只看该作者
效能不是问题了。

eg) jboss ,   spring 的 IOC Container 。

如还是不满意,可以用cglib 去加强。


回复

使用道具 举报

20

主题

4

好友

2395

积分

白金长老

Rank: 10

9#
发表于 2009-12-14 04:28 PM |只看该作者
效能我是不大清楚,但我在想其他专业的framework是如何实现的。即使是做配置这个 url match 去另外一个 service classes,也不大可能在 Front Controller 那边做改动。
所以有时候Business programmer应该都是做比较简单的 define Service class 及做简单的配置,效能上已经有 system programmer 设计了很强的底层系统。

回 番茄的话,
有可能 比如 $action,可以用 in_array 来判断他在不在预设范围之内 in_array($action, array('add','edit','delete')) ,则 call onadd(), onedit(), ondelete(),否则 call onerror()。
具体代码:


if(method_exists($gift, 'on'.$action)) {
    $gift->{'on'.$action}();
} else {
    $gift->onerror();
}


这样应该可以减少出错机会了。

[ 本帖最后由 fyhao 于 2009-12-14 04:29 PM 编辑 ]


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

JBTALKS.CC |联系我们 |隐私政策 |Share

GMT+8, 2024-10-25 10:27 PM , Processed in 0.126039 second(s), 28 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

Ultra High-performance Dedicated Server powered by iCore Technology Sdn. Bhd.
Domain Registration | Web Hosting | Email Hosting | Forum Hosting | ECShop Hosting | Dedicated Server | Colocation Services
本论坛言论纯属发表者个人意见,与本论坛立场无关
Copyright © 2003-2012 JBTALKS.CC All Rights Reserved
合作联盟网站:
JBTALKS 马来西亚中文论坛 | JBTALKS我的空间 | ICORE TECHNOLOGY SDN. BHD.
回顶部