java - Spring Jersey : How to return static content?

标签 java spring jersey jersey-2.0 static-content

问题:

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

问题:

  1. 在努力解决问题 #1 时,其他项目使用过滤器 jersey.config.servlet.filter.staticContentRegex(如此处所示 Stackoverflow Question)我一直无法找到有效的依赖项正确/完全符合我的项目设置。
  2. 为了解决问题 #2,我尝试引入依赖项以使用 Viewable。问题 - 传递性依赖项对 webapp 使用适当的 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>

Controller > SpringController.java

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

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

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

最佳答案

"How do I expose my css/, images/, js/ and other static files?"

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>

"How do I return a JSP page in my controller (not a String method) for my index view?"

首先你需要的是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 和 Controller

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>

Controller

@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 知道如何从我们上面设置的属性中找到文件。

另请参阅:

关于java - Spring Jersey : How to return static content?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31883928/

相关文章:

java - JTable中的并发问题

java - 如何将月份缩写为 3 个字符?

java - 如何使用 Jackson 将嵌套的 ObjectId 序列化为 String?

java - Jersey 丢失 id 字段

exception - 在 JerseyTest 构造函数期间使用 Jersey 测试框架产生 NullPointerException

java - 展开和折叠图标

java - 使用基于 Java 的配置在服务器模式下设置 H2

java - 在处理 spring proguard 时遇到困难

java - 带 Jersey 和 JAXB 的编码列表<T>

java - 存储来自正则表达式的反向引用供以后使用