问题描述
问题:
- 如何公开我的
css /
,images /
,js /
和其他静态文件? - 如何在我的索引视图中返回控制器(不是String方法)中的JSP页面?
- How do I expose my
css/
,images/
,js/
and other static files? - How do I return a JSP page in my controller (not a String method) for my index view?
问题:
- 在努力解决问题#1时,其他项目使用过滤器
jersey.config.servlet .filter.staticContentRegex
(如此处所示)我无法通过项目设置找到正常工作的依赖项。 - 在努力解决问题#2时我试图介绍依赖项使用
可查看
。问题 - 传递依赖关系会对使用适当的Spring和Spring类的Web应用程序产生负面影响。泽西(雪球变成了一个模糊错误的兔子洞)
- In efforts to solve question #1 other projects use a filter
jersey.config.servlet.filter.staticContentRegex
(as seen here Stackoverflow Question) I haven't been able to find dependencies that work correctly/at all with my project setup. - In efforts to solve question #2 I attempted to introduce dependencies to use
Viewable
. Problem - transitive dependencies adversely affect the webapp from using the appropriate classes for Spring & Jersey (snowballs into a rabbit hole of nebulous errors)
完成项目>
依赖关系>
<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 >
<?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>
控制器>
@Path("/")
@Component
public class SpringController {
@GET
@Produces(MediaType.TEXT_HTML)
public ?? getIndex() {
//How do I return my index page??
return ??
}
}
推荐答案
jersey.config.servlet.filter.staticContentRegex
属性应该有效,但是您需要为要提供的所有类型的文件指定所有可能的模式。更简单的方法是使用属性 jersey.config.servlet.filter.forwardOn404
,如。对两种选择都是肯定的,你需要将Jersey配置为过滤器,而不是servlet。所以你的web.xml可能看起来像
The jersey.config.servlet.filter.staticContentRegex
property should work, but you need to specify all the possible patterns for all the types of files you want to serve. The easier way is to just use the property jersey.config.servlet.filter.forwardOn404
, as pointed out in this answer. And yes with both choices, you need configure Jersey as a filter, rather than a servlet. So your web.xml might look like
<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 mvc依赖
First thing you need is the jsp mvc dependency
<dependency>
<groupId>org.glassfish.jersey.ext</groupId>
<artifactId>jersey-mvc-jsp</artifactId>
<version>2.25</version>
</dependency>
然后你需要注册这个功能
Then you need to register the feature
public ResourceRegister () {
...
register(JspMvcFeature.class);
}
然后,您需要为所有jsp页面指定模板基本路径。例如,我使用 / WEB-INF / jsp
Then you need to specify the template base path for all your jsp pages. For example I used /WEB-INF/jsp
public ResourceRegister () {
...
property(JspMvcFeature.TEMPLATE_BASE_PATH, "/WEB-INF/jsp");
}
因此,对于这种情况,所有jsp文件都应位于 / WEB-INF / jsp
目录。
So for this case, all the jsp files should be located in /WEB-INF/jsp
directory.
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);
}
这里 / index
在可查看
中指向 index.jsp
(我们不需要 .jsp
扩展名)。泽西岛知道如何从我们上面设置的房产中找到该文件。
Here the /index
in the Viewable
points the index.jsp
(we don't need the .jsp
extension). Jersey knows how to find the file from the property we set above.
另请参阅:
- Complete example from Jersey project
- MVC Templates documentation
这篇关于Spring-Jersey:如何返回静态内容?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!