2009-07-15 89 views
5

在過去的幾年裏,我的頭腦是Python,在那裏有許多簡單的,最小化的框架選擇,使我能夠輕鬆站立一個網站或服務(例如web.py)。我正在尋找類似於Java的東西。簡單的Java獨立服務器容器/框架?

這些日子裏用Java來站立簡單服務最簡單,動作最少的方法是什麼?我在尋找簡單的東西如:

  • 接收HTTP請求
  • 派遣這些請求處理程序(最好是基於正則表達式的URL處理程序映射設施)
  • 的能力,能力的能力設置HTTP標頭並且通常完全控制請求/響應

如果框架在Jython中運行良好,則爲獎勵點。

[更新]感謝您的回覆,其中一些看起來很有趣。但是,我沒有看到這些網址的調度功能。我在尋找類似Django的url.py系統的東西,它看起來像:

urlpatterns = patterns('', 
    (r'^articles/2003/$', 'news.views.special_case_2003'), 
    (r'^articles/(\d{4})/$', 'news.views.year_archive'), 
    (r'^articles/(\d{4})/(\d{2})/$', 'news.views.month_archive'), 
    (r'^articles/(\d{4})/(\d{2})/(\d+)/$', 'news.views.article_detail'), 
) 

如果你處理它的處理程序以及指定URL正則表達式。

回答

3

我喜歡從簡單框架中值得Simple HTTP服務器。它提供了關於如何開始的a nice Tutorial

+1

+1 Simple也是Java中速度最快的NIO服務器容器。此外,除了Java 5之外,它還具有最小的空間,沒有外部依賴關係。 – 2009-07-16 13:22:39

3

有幾種選擇:

  • 的servlet
  • restlet:輕量級REST框架
  • JAX-RS:使用jersey或的Restlet模塊實現JAX-RS規範
  • grizzly:NIO基於服務器(具有HTTP支持+處理程序)
  • apache mina:事件驅動的異步服務器(支持HTTP)

所有這些框架都帶有一個內置的服務器。

@Path("https://stackoverflow.com/users/{username}") 
public class UserResource { 

    @GET 
    @Produces("text/xml") 
    public String getUser(@PathParam("username") String userName) { 
    } 
} 

然後把你的處理程序在應用程序對象:

public class MyApplicaton extends Application { 
    public Set<Class> getClasses() { 
     Set<Class> s = new HashSet<Class>(); 
     s.add(UserResource.class); 
     return s; 
    } 
} 

與JAX-RS的另一個例子

編輯

JAX-RS使用URL模板也有類似的做法:

@GET 
@Produces("application/json") 
@Path("/network/{id: [0-9]+}/{nid}") 
public User getUserByNID(@PathParam("id") int id, @PathParam("nid") String nid) { 
} 

EDIT 2

的Restlet支持像Django的集中配置,在您的應用程序對象:

// Attach the handlers to the root router 
router.attach("https://stackoverflow.com/users/{user}", account); 
router.attach("https://stackoverflow.com/users/{user}/orders", orders); 
router.attach("https://stackoverflow.com/users/{user}/orders/{order}", order); 
1

的Servlet可能是要走的路。要做非常簡單的事情,你只需要重寫一個類的一個方法。更復雜的東西當然是可能的,但你可以用一點工作去做很多事情。

調查TomcatJetty - 兩者都是開源的,並得到很好的支持。

public class HelloWorldServlet extends HttpServlet { 
    public void doGet(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException 
    { 
     response.setContentType("text/plain"); 
     PrintWriter out = response.getWriter(); 
     out.print("hello world!"); 
    } 
} 
1

注意:這是比答案更一般的討論。

我有類似的問題來自Python超過10年,並潛入Java中。我認爲我學到的一件事是Python的「簡單」因素與Java的「簡單」因素非常不同。在Python中充斥着高級框架 - 比如web.py,Java看起來要低得多。在過去的幾個月裏,我從「在Python中簡單實現Java的方式是什麼」到「在Java中如何構建這個東西」。微妙,但似乎把我的想法從一個以Python爲中心的視圖轉移到一個更以Java爲中心的視圖。

這樣做之後,我意識到站在一個網站或服務對於一個Java局外人來說並不是那麼簡單,那是因爲有大量的信息需要我們重新討論。它不像Python那麼簡單。你仍然需要一個網絡服務器,你需要建立一個「容器」來丟棄你的Java代碼,然後你需要Java代碼(我錯了,每個人都有嗎?有沒有更簡單的方法?)。

對我來說,與Scala和Lift合作幫助 - 甚至不是那些,但是這一個thread by David Pollack。這就是我構建Jetty服務器所需要的。接下來,按照指示(有些模糊,但可能對你來說足夠好),然後你有一個servlet容器準備接受端口上的傳入流量(或者3個端口,在他的情況下)。然後,您可以使用HTTPServlet或其他方式編寫一些Java代碼以完成其餘任務。

再說一次,這正是我通過這個屏障所做的,但我仍然不是Java大師。祝你好運。

0

我已經認真思考:Apache Mina

但坦率地說,我甚至不知道這是否是你所需要的。

: -/

:)

0

Jetty是一個相當不錯的嵌入式HTTP服務器 - 即使它是不可能像你描述進行映射,它應該是很容易實現你正在努力。