简单的Java独立服务器容器/框架?

时间:2009-07-15 18:38:47

标签: java

在过去的几年中,我已经掌握了Python,其中有许多简单,最小框架的选择,这些框架允许我轻松地建立网站或服务(例如web.py)。我正在寻找类似Java的东西。

现在使用Java提供简单服务的最简单,最不移动的部分是什么?我正在寻找一些简单的东西:

  • 接收HTTP请求的能力
  • 将这些请求分派给处理程序的能力(最好是基于正则表达式的url到处理程序映射工具)
  • 设置HTTP标头并通常完全控制请求/响应的能力

如果框架与Jython配合良好,则可获得奖励。

[更新]感谢您的回复,其中一些看起来非常有趣。但是,我没有看到这些中的url调度功能。我正在寻找类似于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正则表达式以及处理它的处理程序。

6 个答案:

答案 0 :(得分:3)

我喜欢简单框架中的Simple HTTP服务器。它提供a nice Tutorial关于如何开始。

答案 1 :(得分:3)

有几种选择:

  • 的Servlet
  • restlet:轻量级REST框架
  • jax-rs:使用jersey或实现jax-rs规范的restlet模块
  • grizzly:基于NIO的服务器(具有HTTP支持+处理程序)
  • apache mina:事件驱动的异步服务器(支持HTTP)

所有这些框架都带有内置服务器。

修改

jax-rs使用url模板有类似的方法:

@Path("/users/{username}")
public class UserResource {

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

然后将处理程序放在Application对象中:

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

JAX-RS的另一个例子:

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

编辑2

Restlet在您的Application对象中支持像Django这样的集中式配置:

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

答案 2 :(得分:1)

Servlets可能是最佳选择。要做非常简单的事情,你只需要覆盖一个类的一个方法。当然,更复杂的东西是可能的,但是你可以通过一些工作做很多事情。

调查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!" );
    }
}

答案 3 :(得分:1)

注意:这是一般性讨论而不是回答。

我有类似的问题来自Python 10年以上,并且正在潜入Java中。我认为我正在学习的一件事是Python的“简单”因素与Java的非常不同。 Python充斥着高级框架 - 比如web.py,Java似乎要低得多。在过去的几个月里,我已经说过“用Python做什么简单的Python方法”到“如何用Java构建这个东西”。微妙,但似乎把我的想法从以Python为中心的观点转移到更加以Java为中心的观点。

这样做之后,我意识到站在一个网站或服务对于一个Java局外人来说并不简单,那是因为我需要(重新)了解大量信息。它不像python那么简单。您仍然需要一个Web服务器,您需要构建一个“容器”来删除您的Java代码,然后您需要Java代码(我错了,每个人?有更简单的方法吗?)。

对我来说,与Scala和Lift一起工作有帮助 - 甚至不是那些,但是这一个thread by David Pollack。这是我构建Jetty服务器所需要的。接下来,按照指示(有点模糊,但可能对你来说足够好)然后你有一个servlet容器准备好接受端口上的传入流量(或者在他的情况下是3个端口)。然后你可以使用HTTPServlet编写一些Java代码,或者继续使用其他东西。

同样,这正是我为克服这个障碍所做的,但我仍然不是Java大师。祝你好运。

答案 4 :(得分:0)

我很难:Apache Mina

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

: - /

:)

答案 5 :(得分:0)

Jetty是一个非常好的嵌入式http服务器 - 即使不可能像你描述的那样进行映射,也应该很容易实现你的目标。