Не могу получить файлы ресурсов в моих файлах шаблонов (используя Restlet и Freemarker) - PullRequest
2 голосов
/ 11 марта 2012

Я пытаюсь разработать веб-приложение с Restlet, и у меня есть небольшая проблема с доступом к моим / public / css / * и /public/js/*.

У меня есть такие сообщения в консоли:

INFO: 2012-03-10    23:52:59    127.0.0.1   -   -   8182    GET /public/css/bootstrap-responsive.min.css    -   404 439 0   0   http://localhost:8182   Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.11 (KHTML, like Gecko) Ubuntu/11.10 Chromium/17.0.963.65 Chrome/17.0.963.65 Safari/535.11   http://localhost:8182/hello

В настоящее время у меня только HelloWorld, использующий шаблон HTML:

public class RestletServerTest extends ServerResource {

    public static void main(String[] args) throws Exception {
        Component component = new Component();
        component.getServers().add(Protocol.HTTP, 8182);

        component.getDefaultHost().attach("/hello", new HelloWorldApplication());

        component.start();
    }
}

public class HelloWorldApplication extends Application {
    private Configuration configuration;

    @Override
    public synchronized Restlet createInboundRoot() {
        configuration = new Configuration();
        try {
            configuration.setDirectoryForTemplateLoading(new File("src/main/webapp/WEB-INF/template"));
            configuration.setObjectWrapper(new BeansWrapper());
        } catch (IOException e) {
            e.printStackTrace();
        }

        Router router = new Router(getContext());

        router.attach("", HelloWorldResource.class);

        return router;
    }

    public Configuration getConfiguration() {
        return configuration;
    }
}

public class HelloWorldResource extends ServerResource {
    @Get
    public Representation get() {
        TemplateRepresentation templateRepresentation = new TemplateRepresentation("hello.ftl", getApplication()
                .getConfiguration(), MediaType.TEXT_HTML);
        return templateRepresentation;
    }
    @Override
    public HelloWorldApplication getApplication() {
        return (HelloWorldApplication) super.getApplication();
    }
}

<!DOCTYPE html>
<html>
    <head>
        <title>Hello World</title>
        <link rel="stylesheet" href="/public/css/bootstrap-responsive.min.css" />
        <link rel="stylesheet" href="/public/css/bootstrap.min.css" />

        <script type="text/javascript" src="/public/js/bootstrap.min.js"></script>
    </head>
    <body>
        <h1>Hello World</h1>
    </body>
</html>

Файлы CSS и JS находятся в папке "/ src / main / webapp / public". Я что-то забыл?

Спасибо.

Флориан.

Ответы [ 4 ]

3 голосов
/ 12 марта 2012

Возможно, вы можете попробовать использовать один из следующих классов: ClassTemplateLoader или WebappTemplateLoader.

Например, вы можете использовать класс ClassTemplateLoader, как описано ниже:

Configuration configuration = new Configuration();
configuration.setTemplateLoader(
            new ClassTemplateLoader(ClassInTheClasspath.class,
                            "/rootpath/under/classpath/");
configuration.setObjectWrapper(new DefaultObjectWrapper());
(...)

Это позволяет найти ваши шаблоны в classpath по пути / rootpath / в / classpath /. В этом контексте первый / является корнем вашего пути к классам.

Надеюсь, это поможет вам. Thierry

1 голос
/ 31 августа 2015

исправление

733 firstDotIndex = fullEntryName.indexOf('.');

до

733 firstDotIndex = fullEntryName.lastIndexOf('.');

в DirectoryServerResource сделало работу за меня.

1 голос
/ 03 марта 2014

Я предпочитаю использовать относительный путь вместо абсолютного FileReference. Это используется в методе представить (), который возвращает представление этого ресурса:

Representation indexFtl = new ClientResource(LocalReference.createClapReference(getClass().getPackage()) + "/templates/index.ftl.html").get();
1 голос
/ 11 марта 2012

Я нашел решение:

@Override
    public synchronized Restlet createInboundRoot() {
        Directory directory = new Directory(getContext(), LocalReference.createFileReference("/home/florian/dev/wkspace/myproject/src/main/webapp/public"));
        directory.setListingAllowed(true);
        Router router = new Router(getContext());

        router.attachDefault(new HomeApplication());
        router.attach("/static", directory);
        router.attach("/hello", new HelloWorldApplication());

        return router;
    }

Но я бы хотел сделать относительный путь.

...