Spring-Jersey:如何返回静态内容?

题 :

  1. 如何公开我的css/images/js/和其他静态文件?
  2. 如何为我的索引视图返回控制器(而不是String方法)中的JSP页面?

问题 :

  1. 在努力解决问题#1时,其他项目使用filterjersey.config.servlet.filter.staticContentRegex (如此处所示) Stackoverflow问题我无法在项目设置中找到正常工作的依赖项。
  2. 在努力解决问题#2时,我试图引入依赖关系来使用Viewable 。 问题 – 传递依赖关系会对使用适当的Spring和Jersey类别(将雪球变成模糊错误的兔子洞)对webapp产生负面影响

完成项目 > Github项目


依赖关系 > 完整的POM文件

  org.glassfish.jersey.containers jersey-container-servlet 2.15   org.glassfish.jersey.ext jersey-spring3 2.15   org.springframework spring-web 3.2.3.RELEASE   commons-logging commons-logging 1.1   javax.servlet servlet-api    

Web.xml > Web.xml

    org.springframework.web.context.ContextLoaderListener   contextConfigLocation classpath:applicationContext.xml   Jersey org.glassfish.jersey.servlet.ServletContainer  javax.ws.rs.Application com.component.ResourceRegister  1   Jersey /*   

Controller > SpringController.java

 @Path("/") @Component public class SpringController { @GET @Produces(MediaType.TEXT_HTML) public ?? getIndex() { //How do I return my index page?? return ?? } } 

“我如何公开我的css /,images /,js /和其他静态文件?”

jersey.config.servlet.filter.staticContentRegex属性应该可以使用,但是您需要为要提供的所有类型的文件指定所有可能的模式。 更简单的方法是使用属性jersey.config.servlet.filter.forwardOn404 ,如本答案所述 。 对两种选择都是肯定的,你需要将Jersey配置为filter,而不是servlet。 所以你的web.xml可能看起来像

  Jersey org.glassfish.jersey.servlet.ServletContainer  javax.ws.rs.Application com.component.ResourceRegister    jersey.config.servlet.filter.forwardOn404 true    /* Jersey  

“如何为我的索引视图返回控制器中的JSP页面(不是String方法)?”

你需要的第一件事是jsp mvc依赖

  org.glassfish.jersey.ext jersey-mvc-jsp 2.25  

然后,您需要注册该function

 public ResourceRegister () { ... register(JspMvcFeature.class); } 

然后,您需要为所有jsp页面指定模板基本路径。 例如,我使用/WEB-INF/jsp

 public ResourceRegister () { ... property(JspMvcFeature.TEMPLATE_BASE_PATH, "/WEB-INF/jsp"); } 

因此,对于这种情况,所有jsp文件都应位于/WEB-INF/jsp目录中。

示例jsp和控制器

index.jsp

    JSP Page    

${it.hello} ${it.world}

调节器

 @Path("/") public class HomeController { @GET @Produces(MediaType.TEXT_HTML) public Viewable index() { Map model = new HashMap<>(); model.put("hello", "Hello"); model.put("world", "World"); return new Viewable("/index", model); } } public ResourceRegister () { ... register(HomeController.class); } 

这里, Viewable/index指向index.jsp (我们不需要.jsp扩展名)。 Jersey知道如何从我们上面设置的属性中找到该文件。

也可以看看:

  • Jersey项目的完整示例
  • MVC模板文档