在我们之前的项目中,我们使用了Viewable(当时我们有 Jersey 作为 JAX-RS 的实现)。现在我们想在 WebSphere 8.5 中运行它。它是一个JEE6服务器,JAX-RS默认不支持Viewable。由于那里使用了 JAX-RS Apache Wink 的实现。
将答案作为 HTML 与内部对象的最佳方式是什么?我们想使用渲染引擎。
谢谢罗伯特
如果您需要显示简单的jsp页面,您只需注入请求并执行正常的转发,如下所示:
@Path("/service")
public class RestService {
@Context
HttpServletRequest request;
@Context
HttpServletResponse response;
@GET
@Path("/getPage")
public void getPage() {
try {
request.getRequestDispatcher("/mypage.jsp").forward(request, response);
} catch (ServletException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
编写您自己的
Viewable
,然后编写一个知道如何使用渲染引擎渲染它的 MessageBodyWriter<Viewable>
。
例如,我写了这样的:
public record Viewable(String templateName, Map<String, Object> parameters) {}
然后是这个(省略了与模板无关的细节):
@Provider
@Produces(MediaType.TEXT_HTML)
public class ViewableMessageBodyWriter implements MessageBodyWriter<Viewable> {
@Override
public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
return type.equals(Viewable.class) && mediaType.equals(MediaType.TEXT_HTML_TYPE);
}
@Override
public void writeTo(Viewable viewable, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, Object> headers, OutputStream body) throws IOException, WebApplicationException {
String templateFileName = viewable.templateName() + ".html";
Map<String, Object> parameters = viewable.parameters();
try (Writer out = new OutputStreamWriter(body)) {
// load the template file, run the templating engine, and write the result to the output writer
}
}
}
在 Helidon MP 4.0.5 下运行良好。