2009-07-15 47 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服务器 - 即使它是不可能像你描述进行映射,它应该是很容易实现你正在努力。