可以在 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(
Get
、Post
、...)
- 直接或基于 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>
希望对您有所帮助。
蒂埃里
我完全是 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(
Get
、Post
、...) - 直接或基于 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>
希望对您有所帮助。 蒂埃里