可以在Restlet Java SE中使用xml / css / json吗?

时间:2015-02-06 11:31:45

标签: java html css twitter-bootstrap restlet

我是java&的新手的Restlet。 我正在使用eclipse LUNA Java SE。 我尝试在我的Web应用程序中使用html / css / xml / bootstrap等。 我四处搜索,我能找到的所有例子都基于Java EE。 所以我想知道如果我想使用html(文件)/ css / xml / bootstrap / json等来我在Web服务中包含更多丰富的上下文,我应该使用Java EE而不是Java SE。我确实在他们的主页上阅读了Restlet用户指南/教程,甚至还阅读了Restlet in Action这本书。但我自己找不到任何答案。也许在这些材料中有答案,但我还没有想到它。 所以,在java SE restlet中,到目前为止,我正在我的java代码中进行硬编码... 但这还不够。

这可能对其他人来说非常基础。但请理解,这也可能与初学者混淆。示例将非常有用。 THX。

1 个答案:

答案 0 :(得分:2)

别担心!没有愚蠢的问题; - )

当然,您可以将Restlet与JavaSE一起用于服务器端。您可以在独立Java应用程序中定义Restlet服务器。这可以使用类Component完成。实例化后,您可以向其添加服务器。以下代码描述了这一点:

public static void main(String[] args) {
    Component component = new Component();
    component.getServers().add(Protocol.HTTP, 8080);
    (...)
    component.start();
}

在启动组件之前,您可以在其上附加您的Restlet应用程序,如下所述:

component.getDefaultHost().attach(new SampleApplication());

Restlet应用程序对应于扩展类Application的à类。下一步是重写方法createInboundRoot。此方法定义应用程序的REST路由。以下代码描述了Restlet应用程序的skelekon:

public class SampleApplication extends Application {
    @Override
    public Restlet createInboundRoot() {
        Router router = new Router(getContext());

        router.attach("/myresource", MyServerResource.class);

        (...)

        return router;
    }
}

由于您想要提供静态文件(JS,CSS,...),您可以利用类Directory。它允许自动并递归地将根文件夹中的所有文件夹和文件附加到路径。这可以按如下所述进行配置:

String rootUri = "file:///(...)/static-content";
Directory directory = new Directory(getContext(), rootUri);
directory.setListingAllowed(true);
router.attach("/static/", directory);

现在让我们关注服务器资源。我们可以根据您的情况区分两种:

  • 交换结构化数据并使用POJO及其注释方法的那些(GetPost,...)
  • 直接或基于Restlet扩展管理表示的那些

对于第一个,您可以在stackoverflow上引用此answer

第二个允许使用模板引擎生成要发送回客户端的内容。这类似于JavaEE中的JSP。我们可以采用Freemarker(http://freemarker.org/)的样本及其相应的Restlet扩展。

首先我们需要在Restlet应用程序中配置Freemarker引擎,主要是在哪里找到模板的根目录,如下所述:

public class SampleApplication extends Application {
    (...)
    private Configuration configuration;

    public static Configuration configureFreeMarker(Context context) {
        Configuration configuration = new Configuration();
        ClassTemplateLoader loader = new ClassTemplateLoader(
            SampleAppApplication.class,
            "/org/myapp/sample/server/templates/");
        configuration.setTemplateLoader(loader);
        // configuration.setCacheStorage(new StrongCacheStorage());
        return configuration;
    }

    public Configuration getConfiguration() {
        return configuration;
    }
}

然后,您可以创建Freemarker表示来利用此类模板生成输出内容(在服务器端生成的动态内容),如下所述:

private SampleApplication getSampleApplication() {
    return (SampleApplication)getApplication();
}

private Representation toRepresentation(Map<String, Object> map,
    String templateName, MediaType mediaType) {
    return new TemplateRepresentation(templateName,
        getSampleApplication().getConfiguration(), map, mediaType);
}

@Get("html")
public Representation getHtml() {
    Map<String, Object> model = new HashMap<String, Object>();

    model.put("titre", "my title");
    model.put("users", getUsers());

    return toRepresentation(model,
        "myTemplate", MediaType.TEXT_HTML);
}

以下是模板myTemplate的内容。

<html>
    <head>
        <title>${title}</title>
    </head>
    <body>
    Users:<br/><br/>
    <ul>
        <#list users as user>
        <li>${user.lastName} ${user.firstName}</li>
        </#list>
    </ul>
    </body>
</html>

希望它有所帮助。 亨利