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

Can use xml/css/json in Restlet Java SE?

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

这对其他人来说可能是非常基础的。但请理解,这也会让初学者感到困惑。示例将非常有帮助。谢谢

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

当然,您可以在服务器端使用只有 JavaSE 的 Restlet。您可以在独立的 Java 应用程序中定义 Restlet 服务器。这可以使用 class 组件来完成。实例化后,您可以向其添加服务器。以下代码对此进行了描述:

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应用程序对应于扩展classApplication的àclass。下一步包括覆盖方法 createInboundRoot。此方法定义应用程序的 REST 路由。以下代码描述了 Restlet 应用程序的框架:

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

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

        (...)

        return router;
    }
}

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

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

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

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

对于第一个,你可以在Whosebug上参考这个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>

希望对您有所帮助。 蒂埃里