Spring-Jersey : 如何return静态内容?
Spring-Jersey : How to return static content?
问题:
- 如何公开我的
css/
、images/
、js/
和其他静态文件?
- 如何在我的控制器中为我的索引视图 return JSP 页面(不是 String 方法)?
问题:
- 在解决问题 #1 的过程中,其他项目使用过滤器
jersey.config.servlet.filter.staticContentRegex
(如此处所见 Whosebug Question)我一直无法找到适用于 correctly/at 的依赖项我的项目设置。
- 为了解决问题 #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>
控制器 > 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和控制器
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知道如何从我们上面设置的属性中找到文件。
另请参阅:
问题:
- 如何公开我的
css/
、images/
、js/
和其他静态文件? - 如何在我的控制器中为我的索引视图 return JSP 页面(不是 String 方法)?
问题:
- 在解决问题 #1 的过程中,其他项目使用过滤器
jersey.config.servlet.filter.staticContentRegex
(如此处所见 Whosebug Question)我一直无法找到适用于 correctly/at 的依赖项我的项目设置。 - 为了解决问题 #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>
控制器 > 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和控制器
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知道如何从我们上面设置的属性中找到文件。
另请参阅: