Ozark+Grizzly环境下MVC视图解析异常:返回JSP路径而非页面内容
解决Ozark MVC + Grizzly 视图不渲染直接返回字符串的问题
看起来你的Ozark MVC应用有几个关键配置缺失,导致控制器返回的视图路径被直接当作字符串输出,而没有触发JSP渲染。下面是针对性的解决方案:
1. 正确配置Ozark的ResourceConfig
首先,你的ApplicationResourceConfig需要注册Ozark的核心MVC特性,并配置视图前缀和后缀,让Ozark识别返回的字符串是视图名而非响应内容:
public class ApplicationResourceConfig extends ResourceConfig { public ApplicationResourceConfig() { // 扫描控制器所在的包(替换成你实际的包路径) packages("com.yourpackage.controllers"); // 注册Ozark核心MVC特性 register(MvcFeature.class); // 配置JSP视图的前缀和后缀 property(MvcFeature.VIEW_PREFIX, "/WEB-INF/"); property(MvcFeature.VIEW_SUFFIX, ".jsp"); } }
2. 补充Grizzly嵌入式服务器的JSP支持依赖
Grizzly默认的HTTP服务器不支持JSP处理,需要添加以下依赖来启用JSP渲染能力:
<!-- Grizzly Servlet Web Server 支持 --> <dependency> <groupId>org.glassfish.grizzly</groupId> <artifactId>grizzly-servlet-webserver</artifactId> <version>2.4.4</version> </dependency> <!-- JSP API 依赖 --> <dependency> <groupId>org.glassfish.web</groupId> <artifactId>javax.servlet.jsp</artifactId> <version>2.3.3</version> </dependency> <!-- Jetty JSP引擎(Grizzly可兼容使用) --> <dependency> <groupId>org.eclipse.jetty</groupId> <artifactId>apache-jsp</artifactId> <version>9.4.31.v20200723</version> </dependency>
3. 修改Grizzly服务器启动代码以支持Servlet/JSP
原来的GrizzlyHttpServerFactory创建的是基础HTTP服务器,需要换成WebServer来支持Servlet和JSP容器功能:
public class GrizzlyServer { private static final Logger LOGGER = LoggerFactory.getLogger(GrizzlyServer.class); private static final String APP_NAME = "Hello World"; private static URI baseUri; private static final String PROTOCOL = "http://"; private static final String HOST = "localhost"; private static final String PATH = "app/"; private static final int DEFAULT_PORT = 8080; private GrizzlyServer() { } private static int port(String[] args) { if (args.length > 0) { String port = args[0]; try { return Integer.valueOf(port); } catch (NumberFormatException exception) { LOGGER.error("Invalid port number {}", port); LOGGER.error("Default port number {} will be used", DEFAULT_PORT); } } return DEFAULT_PORT; } public static WebServer startServer(int port) throws Exception { baseUri = UriBuilder.fromUri(PROTOCOL + HOST).port(port).path(PATH).build(); // 创建支持Servlet/JSP的Grizzly WebServer WebServer webServer = new WebServer(port); // 注册Jersey Servlet ServletRegistration jerseyServlet = webServer.addServlet("JerseyServlet", ServletContainer.class); jerseyServlet.addMapping("/" + PATH + "*"); // 匹配app路径下的所有请求 jerseyServlet.setInitParameter(ServletProperties.JAXRS_APPLICATION_CLASS, ApplicationResourceConfig.class.getName()); // 配置JSP引擎 webServer.setJspEnginePath("org.eclipse.jetty.jsp.JettyJspServlet"); // 指定web资源根目录(对应你的项目web目录) webServer.addContext("/", new File("src/main/web")); webServer.start(); return webServer; } public static void run(String[] args) throws IOException { int port = port(args); try { final WebServer server = startServer(port); LOGGER.info("{} started at {}", APP_NAME, baseUri); LOGGER.info("Hit Enter to stop it..."); System.in.read(); server.shutdown(); } catch (Exception exception) { LOGGER.error("Server startup failed", exception); LOGGER.error("Exit..."); System.exit(1); } } }
4. 调整控制器的视图返回值
因为已经在ResourceConfig中配置了视图前缀和后缀,控制器只需返回视图名(不需要完整路径)即可:
@Controller @Path("hello-world") public class HelloWorldController { @GET public String index() { // 自动拼接为 /WEB-INF/index.jsp return "index"; } }
5. 确保Maven正确打包web资源
在pom.xml中添加资源配置,确保web目录下的文件被打包到正确的位置:
<build> <resources> <resource> <directory>src/main/web</directory> <targetPath>META-INF/resources</targetPath> </resource> </resources> </build>
做完这些配置后,重启服务器访问http://localhost:8080/app/hello-world,应该就能正确渲染index.jsp的内容了。
内容的提问来源于stack exchange,提问作者Julez
相关产品推荐
相关产品推荐

