2012-03-10 1 views
2

Я пытаюсь разработать webapp с Restlet, и у меня есть небольшая проблема для доступа к my/public/css/* и/public/js/*.Не удается получить файлы ресурсов в файлах шаблонов (используя Restlet и Freemarker)

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

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/главная/webapp/public ". Я что-то забыл?

спасибо.

Флориан.

+1

Это работает, если вы удаляете '/ public /' из URL-адресов? –

+0

- ваш css в: '/ src/main/webapp/public/css/bootstrap.min.css'? Это читаемо? Выполняется ли любой другой запрос (какой)? –

+0

Это не работает, если я удаляю '/ public /', и я не могу получить доступ к '/ src/main/webapp/public/css/bootstrap.min.css'. В настоящее время только http: // localhost: 8182/hello works – fguerin

ответ

3

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

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

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

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

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

1

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

@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; 
    } 

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

1

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

Representation indexFtl = new ClientResource(LocalReference.createClapReference(getClass().getPackage()) + "/templates/index.ftl.html").get(); 
1

фиксирующую

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

в

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

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