【问题标题】:Spring-Jersey : How to return static content?Spring-Jersey:如何返回静态内容?
【发布时间】:2015-10-31 06:20:41
【问题描述】:

问题:

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

问题:

  1. 在努力解决问题 #1 时,其他项目使用过滤器 jersey.config.servlet.filter.staticContentRegex(如在此处看到的 Stackoverflow Question)我一直无法找到与我的项目设置正常工作的依赖项。
  2. 为了解决问题 #2,我尝试引入依赖项以使用 Viewable。问题 - 传递依赖对 web 应用程序使用 Spring 和 Jersey 的适当类产生不利影响(雪球进入模糊错误的兔子洞)

完成项目 > Github Project


依赖关系 > Complete POM File

<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet</artifactId>
<version>2.15</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.ext</groupId>
<artifactId>jersey-spring3</artifactId>
<version>2.15</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>3.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1</version>
<exclusions>
<exclusion>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
</exclusion>
</exclusions>
</dependency>

Web.xml > Web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<servlet>
<servlet-name>Jersey</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>com.component.ResourceRegister</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>

控制器 > SpringController.java

@Path("/")
@Component
public class SpringController {

@GET
@Produces(MediaType.TEXT_HTML)
public ?? getIndex() {

    //How do I return my index page??
    return ??
 }
}

【问题讨论】:

    标签: java spring jersey jersey-2.0 static-content


    【解决方案1】:

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

    jersey.config.servlet.filter.staticContentRegex 属性应该可以工作,但是您需要为要提供的所有文件类型指定所有可能的模式。更简单的方法是只使用属性jersey.config.servlet.filter.forwardOn404,正如this answer 中所指出的那样。是的,两种选择都需要,您需要将 Jersey 配置为过滤器,而不是 servlet。所以你的 web.xml 可能看起来像

    <filter>
        <filter-name>Jersey</filter-name>
        <filter-class>org.glassfish.jersey.servlet.ServletContainer</filter-class>
        <init-param>
            <param-name>javax.ws.rs.Application</param-name>
            <param-value>com.component.ResourceRegister</param-value>
        </init-param>
        <!-- pass to next filter if Jersey/App returns 404 -->
        <init-param>
            <param-name>jersey.config.servlet.filter.forwardOn404</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    
    <filter-mapping>
        <url-pattern>/*</url-pattern>
        <filter-name>Jersey</filter-name>
    </filter-mapping>
    

    “如何在我的控制器中为我的索引视图返回一个 JSP 页面(不是字符串方法)?”

    首先需要的是jsp mvc依赖

    <dependency>
        <groupId>org.glassfish.jersey.ext</groupId>
        <artifactId>jersey-mvc-jsp</artifactId>
        <version>2.25</version>
    </dependency>
    

    那你需要注册功能

    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

    <html>
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
            <title>JSP Page</title>
            <link href="css/styles.css" rel="stylesheet">
        </head>
        <body>
            <h1>${it.hello} ${it.world}</h1>
        </body>
    </html>
    

    控制器

    @Path("/")
    public class HomeController {
    
        @GET
        @Produces(MediaType.TEXT_HTML)
        public Viewable index() {
            Map<String, String> 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 知道如何从我们上面设置的属性中找到文件。

    另请参阅:

    【讨论】:

    • 很棒的支持和对问题的回答。如果可以的话,我会和你握手
    • 我实际上希望/blog/static/blog/index.html 上提供内容。如果不将 /static/blog/index.html 转换为 JSP,我该如何做到这一点?
    猜你喜欢
    • 2018-06-26
    • 2015-06-21
    • 2017-07-15
    • 2013-08-23
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多