我是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。
答案 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);
现在让我们关注服务器资源。我们可以根据您的情况区分两种:
Get
,Post
,...)对于第一个,您可以在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>
希望它有所帮助。 亨利